diff --git a/examples/community/scrolling-background/README.md b/examples/community/scrolling-background/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..85e81cc844a8e3a9333bbfa3a57b005c91da4fe5
--- /dev/null
+++ b/examples/community/scrolling-background/README.md
@@ -0,0 +1,3 @@
+# Infinite scrolling background demo
+
+Created by [Sergio Vera](https://github.com/svera)
diff --git a/examples/community/scrolling-background/gamebackground.jpg b/examples/community/scrolling-background/gamebackground.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..e5eab2bebd9ad67b49dd7af0fc3d651405460cd0
Binary files /dev/null and b/examples/community/scrolling-background/gamebackground.jpg differ
diff --git a/examples/community/scrolling-background/main.go b/examples/community/scrolling-background/main.go
new file mode 100644
index 0000000000000000000000000000000000000000..9b402fa233eeb8bd9c5194f662bb8cfcaf27e848
--- /dev/null
+++ b/examples/community/scrolling-background/main.go
@@ -0,0 +1,77 @@
+package main
+
+import (
+	"image"
+	"os"
+
+	_ "image/jpeg"
+
+	"github.com/faiface/pixel"
+	"github.com/faiface/pixel/pixelgl"
+)
+
+func loadPicture(path string) (pixel.Picture, error) {
+	file, err := os.Open(path)
+	if err != nil {
+		return nil, err
+	}
+	defer file.Close()
+	img, _, err := image.Decode(file)
+	if err != nil {
+		return nil, err
+	}
+	return pixel.PictureDataFromImage(img), nil
+}
+
+const (
+	windowWidth  = 300
+	windowHeight = 225
+)
+
+func run() {
+	cfg := pixelgl.WindowConfig{
+		Title:  "Scrolling background demo",
+		Bounds: pixel.R(0, 0, windowWidth, windowHeight),
+		VSync:  true,
+	}
+	win, err := pixelgl.NewWindow(cfg)
+	if err != nil {
+		panic(err)
+	}
+
+	// Pic must have double the width of the window, as it will scroll to the left
+	pic, err := loadPicture("gamebackground.jpg")
+	if err != nil {
+		panic(err)
+	}
+
+	// Backgrounds are made taking the left and right halves of the image
+	background1 := pixel.NewSprite(pic, pixel.R(0, 0, windowWidth, windowHeight))
+	background2 := pixel.NewSprite(pic, pixel.R(windowWidth, 0, windowWidth*2, windowHeight))
+
+	// In the beginning, vector1 will put background1 filling the whole window, while vector2 will
+	// put background2 just at the right side of the window, out of view
+	vector1 := pixel.V(windowWidth/2, (windowHeight/2)+1)
+	vector2 := pixel.V(windowWidth+(windowWidth/2), (windowHeight/2)+1)
+
+	i := float64(0)
+	for !win.Closed() {
+		// When one of the backgrounds has completely scrolled, we swap displacement vectors,
+		// so the backgrounds will swap positions too regarding the previous iteration,
+		// thus making the background look like infinite.
+		if i == -windowWidth {
+			i = 0
+			vector1, vector2 = vector2, vector1
+		}
+		// This delta vector will move the backgrounds to the left
+		d := pixel.V(-i, 0)
+		background1.Draw(win, pixel.IM.Moved(vector1.Sub(d)))
+		background2.Draw(win, pixel.IM.Moved(vector2.Sub(d)))
+		i--
+		win.Update()
+	}
+}
+
+func main() {
+	pixelgl.Run(run)
+}