1 /**
2 A class to represent the player on the screen
3 @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
4 @class
5 */
6 function Player()
7 {
8 /** The speed that the player moves at
9 @type Number
10 */
11 this.speed = 75;
12 /** True if the player is moving left, false otherwise
13 @type Boolean
14 */
15 this.left = false;
16 /** True if the player is moving right, false otherwise
17 @type Boolean
18 */
19 this.right = false;
20 /** A reference to the level object
21 @type Level
22 */
23 this.level = null;
24
25 /**
26 Initialises this object
27 */
28 this.startupPlayer = function(level)
29 {
30 this.startupAnimatedGameObject(g_idle_left, 300, 400 - 48 - 48, 4, 6, 20);
31 this.level = level;
32 return this;
33 }
34
35 /**
36 Called when a key is pressed
37 @param event Event Object
38 */
39 this.keyDown = function(event)
40 {
41 var updateRequired = false;
42
43 // left
44 if (event.keyCode == 37 && !this.left)
45 {
46 this.left = true;
47 updateRequired = true;
48 }
49 // right
50 if (event.keyCode == 39 && !this.right)
51 {
52 this.right = true;
53 updateRequired = true;
54 }
55
56 if (updateRequired)
57 this.updateAnimation();
58
59 }
60
61 /**
62 Called when a key is pressed
63 @param event Event Object
64 */
65 this.keyUp = function(event)
66 {
67 // left
68 if (event.keyCode == 37)
69 {
70 this.left = false;
71 this.setAnimation(g_idle_left, 6, 20);
72 }
73 // right
74 if (event.keyCode == 39)
75 {
76 this.right = false;
77 this.setAnimation(g_idle_right, 6, 20);
78 }
79
80 this.updateAnimation();
81 }
82
83 /**
84 Updates the current animation depending on the movement
85 of the player. This accounts for the fact that both
86 the left and right arrow keys can be pressed at the
87 same time.
88 */
89 this.updateAnimation = function()
90 {
91 if (this.right && this.left)
92 this.setAnimation(g_idle_left, 6, 20);
93 else if (this.right)
94 this.setAnimation(g_run_right, 12, 20);
95 else if (this.left)
96 this.setAnimation(g_run_left, 12, 20);
97 }
98
99 /**
100 Updates the object
101 @param dt The time since the last frame in seconds
102 @param context The drawing context
103 @param xScroll The global scrolling value of the x axis
104 @param yScroll The global scrolling value of the y axis
105 */
106 this.update = function (/**Number*/ dt, /**CanvasRenderingContext2D*/context, /**Number*/ xScroll, /**Number*/ yScroll)
107 {
108 if (this.left)
109 this.x -= this.speed * dt;
110 if (this.right)
111 this.x += this.speed * dt;
112
113 // XOR operation
114 // only test for a collision if the player is moving left or right (and not trying to do both at
115 // the same time)
116 if ((this.right || this.left) && !(this.left && this.right))
117 {
118 // this will be true until the player is no longer colliding
119 var collision = false;
120 // the player may have to be pushed back through several block stacks (especially if the
121 // frame rate is very slow)
122 do
123 {
124 // the current position of the player (test the left side if running left
125 // and the right side if running right)
126 var xPos = this.left ? this.x : this.x + this.frameWidth;
127 // the index of stack of blocks that the player is standing on/in
128 var currentBlock = this.level.currentBlock(xPos);
129 // the height of the stack of blocks that the player is standing on/in
130 var groundHeight = this.level.groundHeight(currentBlock);
131 // the height of the player (we need the height from the ground up,
132 // whereas the this.y value reprents the position of the player
133 // from the "sky" down).
134 var playerHeight = context.canvas.height - (this.y + this.image.height);
135 // if the player is not higher than the stack of blocks, it must be colliding
136 if (playerHeight < groundHeight)
137 {
138 collision = true;
139 // we are moving right, so push the player left
140 if (this.right)
141 this.x = this.level.blockWidth * currentBlock - this.frameWidth - 1;
142 // we are moving left, push the player right
143 else
144 this.x = this.level.blockWidth * (currentBlock + 1);
145 }
146 else
147 {
148 collision = false;
149 }
150 } while (collision)
151 }
152
153 // keep the player bound to the level
154 if (this.x > this.level.blocks.length * this.level.blockWidth - this.frameWidth - 1)
155 this.x = this.level.blocks.length * this.level.blockWidth - this.frameWidth - 1;
156 if (this.x > context.canvas.width - this.frameWidth + xScroll)
157 g_GameObjectManager.xScroll = this.x - (context.canvas.width - this.frameWidth);
158 // modify the xScroll value to keep the player on the screen
159 if (this.x < 0)
160 this.x = 0;
161 if (this.x < xScroll)
162 g_GameObjectManager.xScroll = this.x;
163
164 // modify the xScroll value to keep the player on the screen
165 if (this.x > context.canvas.width - this.frameWidth + xScroll)
166 g_GameObjectManager.xScroll = this.x - (context.canvas.width - this.frameWidth);
167 if (this.x < xScroll)
168 g_GameObjectManager.xScroll = this.x;
169 }
170 }
171
172 Player.prototype = new AnimatedGameObject;
Top