1     /**
2         A class that display a repeating texture that can optionall be offset in either
3        the x or y axis
4         @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
5         @class
6     */
7     function RepeatingGameObject()
8 {
9 /** The width that the final image will take up 10 @type Number 11 */ 12 this.width = 0;
13 /** The height that the final image will take up 14 @type Number 15 */ 16 this.height = 0;
17 /** How much of the scrollX and scrollY to apply when drawing 18 @type Number 19 */ 20 this.scrollFactor = 1;
21 22 /** 23 Initialises this object 24 @return A reference to the initialised object 25 */ 26 this.startupRepeatingGameObject = function(image, x, y, z, width, height, scrollFactor)
27 {
28 this.startupVisualGameObject(image, x, y, z);
29 this.width = width;
30 this.height = height;
31 this.scrollFactor = scrollFactor;
32 return this;
33 }
34 35 /** 36 Clean this object up 37 */ 38 this.shutdownstartupRepeatingGameObject = function()
39 {
40 this.shutdownVisualGameObject();
41 }
42 43 /** 44 Draws this element to the back buffer 45 @param dt Time in seconds since the last frame 46 @param context The context to draw to 47 @param xScroll The global scrolling value of the x axis 48 @param yScroll The global scrolling value of the y axis 49 */ 50 this.draw = function(dt, canvas, xScroll, yScroll)
51 {
52 var areaDrawn = [0, 0];
53 54 for (var y = 0; y < this.height; y += areaDrawn[1])
55 {
56 for (var x = 0; x < this.width; x += areaDrawn[0])
57 {
58 // the top left corner to start drawing the next tile from 59 var newPosition = [this.x + x, this.y + y];
60 // the amount of space left in which to draw 61 var newFillArea = [this.width - x, this.height - y];
62 // the first time around you have to start drawing from the middle of the image 63 // subsequent tiles alwyas get drawn from the top or left 64 var newScrollPosition = [0, 0];
65 if (x==0) newScrollPosition[0] = xScroll * this.scrollFactor;
66 if (y==0) newScrollPosition[1] = yScroll * this.scrollFactor;
67 areaDrawn = this.drawRepeat(canvas, newPosition, newFillArea, newScrollPosition);
68 }
69 }
70 }
71 72 this.drawRepeat = function(canvas, newPosition, newFillArea, newScrollPosition)
73 {
74 // find where in our repeating texture to start drawing (the top left corner) 75 var xOffset = Math.abs(newScrollPosition[0]) % this.image.width;
76 var yOffset = Math.abs(newScrollPosition[1]) % this.image.height;
77 var left = newScrollPosition[0]<0?this.image.width-xOffset:xOffset;
78 var top = newScrollPosition[1]<0?this.image.height-yOffset:yOffset;
79 var width = newFillArea[0] < this.image.width-left?newFillArea[0]:this.image.width-left;
80 var height = newFillArea[1] < this.image.height-top?newFillArea[1]:this.image.height-top;
81 82 // draw the image 83 canvas.drawImage(this.image, left, top, width, height, newPosition[0], newPosition[1], width, height);
84 85 return [width, height];
86 }
87 88 89 }
90 RepeatingGameObject.prototype = new VisualGameObject();
Top