Flash Tutorial Links:
Play Games: HTML5 Tutorials:

Flash Side Scroller Tutorial

The outer space is vast ... but that only means it's an ENDLESS adventure!

History of Side Scroller Games

Most games in the olden days could only handle 1 screen at a time. Look at the classic games like Pong, Space Invaders, Pac Man, etc ... as advanced as they were back then, the player was still stuck with 1 screen. Meaning, all the action takes place without any scrolling of the game view at all.

Most of us lived and was gaming through the time when the world made the big leap from 2D games to 3D games. It was a big eye-popping experience that lead to much celebrated success all over the gaming world. We rejoiced at this wonderful gaming experience!

Similarly, the jump from a single screen to a side scrolling (or top scrolling) gaming experience was a huge leap as well. The hardware and software came out of age to handle this, and opened up many golden opportunities for gamers to experience new forms of engagement with the game.

Today, let's take a look and recreate a side scrolling experience. For the purposes of not overwhelming you in this one single tutorial again, I'll keep it simple. Don't expect to create another Zero Wing ... yet.

"All your bases are belong to me!" (hehe, couldn't help it)

Game Scenario

The player controls a space vessel flying through the far reaches of the vast galaxy. A new alien invasion is drawing close, and it is up to the player to destroy these new threats. The player has laser weapons at his disposal.

Game Details

  1. Control your space vessel with the UP, DOWN , LEFT and RIGHT keys. (WASD keys are also enabled for the same purposes)
  2. Press SPACEBAR to fire the laser weapon.

Download the Game Files

The files you need to create this game can be downloaded from here.

Step 1 - Managing your FLA file

This tutorial is closely linked with Tutorial 3, so I do recommend you check that out first before continuing here, as I will not be going into details those code that are repeated.

In this tutorial, I came up with a few photoshopped images of the space vessel and the aliens. The aliens are animated, so as to add some life to them (albeit a very short life because the player is mercilessly zapping them!). The plane controlled by the player is also animated by varying the fire at the exhausts.

flafiles

Similar to the previous tutorial, both Bullet and Enemy have an associated external .as file. You can check their linkage to see that we set Game.Bullet and Game.Enemy as per the last tutorial.

linkage

Something very unique to side scrolling games is that there usually are a few pieces of image that continously scroll. This creates that the player is moving through an endless landscape, although what is happening essentially is that there are two or more images moving from the right to the left, and when the first image go out of screen, it jumps to the position behind the last image.

This creates the illusion that the scrolling background is endless.

In this tutorial, StarField is the only image that is used. The disadvantage of using only 1 image is that it kind of gets predictable after a while, and players can somehow see through the illusion that it is not scrolling. But nevertheless, you should get the idea of how to do more than 1 image after this tutorial. An important aspect of designing the graphic for the scrolling, is to ensure that the edges of your image is seamless. Meaning, the left and right sides of the image should be able to rollover and combine with itself without any visual faults.

starfield

If you look at the StarField image above, you can see that there are no graphics at the two ends. So when another StarField is added to its right or left, the entire animation will be seamless. Compare it to another StarField image if looked something like this.

starfields2

Obviously the planet there is going to screw up the illusion and players will be able to see that it is not seamless. So factor this into your design.

Step 2 - Starting up the game in your GameController.as

Let's tackle the initial values that we have to set before the game begins. If you do a mental inspection of how this game works, you should be able to start typing out some of these initialization codes. In fact, you should find most of the codes pretty similar to what you saw in Tutorial 3. After all, the in-game assets are all about aliens, bullets and the player. Let's take a look at what goes on in the startGame function.

54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
public function startGame()
{
    //Create player
    player = new Player();
    player.x = C.PLAYER_START_X;
    player.y = C.PLAYER_START_Y;
    mcGameStage.addChild(player);
    
    playerScore = C.PLAYER_START_SCORE;
    
    moveX = 0;
    fireBullet = false;
    lastBulletTime = getTimer();
    
    enemies = new Array();
    bullets = new Array();
    
    mcBackground1 = new StarField();
    mcBackground2 = new StarField();
    mcBackground2.x = mcBackground1.width;
 
    mcGameStage.addChildAt(mcBackground1,0);
    mcGameStage.addChildAt(mcBackground2,0);
    
    mcGameStage.addEventListener(Event.ENTER_FRAME,update);
    
    //Handle event when this game is being preloaded
    addEventListener(Event.ADDED_TO_STAGE, gameAddedToStage ); 
    
    //Handle situations when this game is being run directly
    if (stage != null)
    {
        stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler);
        stage.addEventListener(KeyboardEvent.KEY_UP,keyUpHandler);
    }
}

Lines 71 and 72 is where we create the scrolling background images. As discussed earlier, we're using the single StarField image as both. If you have designers designing more than 1 or 2 images, then just append them accordingly here. In line 73, we place the 2nd star field image at the back of the first. This will sort of "stitch" them up together.

Remember that as with any other movie clips we're bringing onto the stage, we need to use addChild to make them visible. addChildAt is used here because we've already added the player onto the stage, and we want the background to be behind the player.

 

Step 3 - Key Handlers

We provide the standard UP, DOWN, LEFT and RIGHT keys for motion. For players who prefer to use the WASD keys, it will be good to provide that support as well. The code below shows how two sets of keys can be used for this same motion control.

97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
private function keyDownHandler(evt:KeyboardEvent):void
{
    if (evt.keyCode == 32) //spacebar 
    {
        //Fire bullet
        fireBullet = true;
    }
    else if ((evt.keyCode == 37) || (evt.keyCode == 65))
    {
        //Move player left
        moveX = -1;
    }
    else if ((evt.keyCode == 39) || (evt.keyCode == 68))
    {
        //Move player right
        moveX = 1;
    }    
    
    if ((evt.keyCode == 38) || (evt.keyCode == 87)) 
    {
        //Move player up
        moveY = -1;
    }
    else if ((evt.keyCode == 40) || (evt.keyCode == 83))
    {
        //Move player down
        moveY = 1;
    }
}

For the keyUpHandler, you need to reset moveX and moveY by listening to the two sets of keyCodes accordingly.

127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
private function keyUpHandler(evt:KeyboardEvent):void
{
    if ((evt.keyCode == 37) || (evt.keyCode == 65))
    {

        moveX = 0;
    }
    else if ((evt.keyCode == 39) || (evt.keyCode == 68))
    {
        moveX = 0;
    }   
    else if ((evt.keyCode == 38) || (evt.keyCode == 87)) 
    {
        moveY = 0;
    }
    else if ((evt.keyCode == 40) || (evt.keyCode == 83))
    {
        moveY = 0;
    }
}

Step 4 - Game Loop - User Input

And now, for the main game loop. As usual, we'll respond to the user input first.

147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
private function update(evt:Event)
{
    //******************			
    //Handle User Input
    //******************
    //Handle Player User Input
    if (moveX > 0)
    {
        if (player.x <= C.PLAYER_RIGHT_BOUND)
            player.x += C.PLAYER_SPEED;
    }
    else if (moveX < 0)
    {
        if (player.x > C.PLAYER_LEFT_BOUND)
            player.x -= C.PLAYER_SPEED;	
    }
    if (moveY > 0)
    {
        if (player.y <= C.PLAYER_DOWN_BOUND)
            player.y += C.PLAYER_SPEED;
    }
    else if (moveY < 0)
    {
        if (player.y > C.PLAYER_UP_BOUND)
            player.y -= C.PLAYER_SPEED;	
    }

The code above checks whether the player pressed the keys to move the space vessel. Since we do not want the space vessel controlled by the player to move off the screen, the checks in lines 155, 160, 165 and 170 ensure that the player does not move his space vessel off screen.

The firing logic is exactly the same as that of Tutorial 3. The BULLET_DELAY constant is still used to control how much lag time there should be between each firing of the bullet.

174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
//Handle Firing of bullets
if (fireBullet)
{
    var currTime = getTimer();
    
    if (currTime - lastBulletTime > C.BULLET_DELAY)
    {
        lastBulletTime = currTime;
        
        var newBullet = new Bullet(player.x, player.y);
        bullets.push(newBullet);
        mcGameStage.addChild(newBullet);
    }
    
    fireBullet = false;
}

Likewise, we are using the Bullet.as to handle the movieclips, so you can find under the constructor of Bullet the following code. This positions the bullet immediately at the specified coordinates, which is the player's x and y location once it is created.

7
8
9
10
11
public function Bullet(xPos:Number, yPos:Number)
{
    this.x = xPos;
    this.y = yPos;
}

For those who need a little refresher, the this keyword is a self reference back to the current object that the code is executing for. When a new bullet is created inside GameController.as, these lines of code above (lines 7 to 11) will be executed. How Flash knows that it must position this latest bullet at the specified position and not reposition all the other bullets in the game instead is because this refers to the current context, which is the latest bullet to be created.

Step 5 - Game Loop - Game Logic

Next, we move on to the actual game logic that takes place every tick of the game loop.

191
192
193
194
195
196
197
198
199
200
201
//******************
//Handle Game Logic
//******************
//Check to spawn new enemies

if (Math.random() < C.SPAWN_ENEMY_CHANCE)
{
    //Create a new enemy
    var newEnemy = new Enemy();
    enemies.push(newEnemy);
    mcGameStage.addChild(newEnemy);
}

The logic used to spawn the aliens is very similar to how it's done in the previous tutorials. During each tick of the game loop, a random number is checked against the constant value we specified in C.as under SPAWN_ENEMY_CHANCE. Here, I set it to 0.03, but you're free to experiment with what you want by changing that value.

When this condition is met in line 155 (meaning a random number under 0.03 is generated), we create a new enemy in line 198, push it into the enemies array and add it onto the mcGameStage in line 200.

Do note again that the constructor Enemy is no longer the default one that Flash creates for us. You may be puzzled how the game knows where to position each enemy once they spawn since we didn't specify the .x and .y coordinates this time.

To solve the mystery, let's open up Enemy.as and see what is happening there.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package Game
{
    import flash.display.MovieClip;
    
    public class Enemy extends MovieClip
    {
        private var speed:Number;
        private var score:Number;
        
        public function Enemy()
        {
            this.x = C.ENEMY_START_X;
            this.y = Math.floor(Math.random() * 400) + 50;
            
            this.speed = C.ENEMY_SPEED;
            
            //Set enemy score
            this.score = C.ENEMY_POINTS;
        }

These lines 10 to 19 will be executed immediately when the code var newEnemy = new Enemy(); is executed back in the GameController.as. As you can see, we actually set the x and y position over here in lines 12 and 13. The starting x-coordinate of the enemy is fixed as we want it to come from the right. However, the y-coordinate is varied here by generating a random number from 50 to about 450. This makes the enemy a little less predictable.

There isn't any special rules to handle the scoring since it is equally difficult to shoot an alien at any y position, so to speak. We set it to a flat score specified by ENEMY_POINTS in C.as in line 18.

Let's head back briefly to the GameController.as.

163
164
165
166
167
//Update enemies
for (var i=enemies.length - 1; i >= 0; i--)
{
    enemies[i].update();
}

The next few lines of codes that follow loops through the enemies array to update their game state. We merely execute enemies[i].update() and write all the logic involved inside Enemy.as instead of cramming up the GameController.as.

Let's see what this update function does here. The code below is what you see in the update function of Enemy.as. Do not confuse this update with the main game loop we always see in the GameController.as.

21
22
23
24
25
public function update()
{
    //enemy is moving to the left, hence -
    this.x -= this.speed;
}

Line 24 moves the alien in the x axis by reducing its x position by its speed. Remember that earlier on we set it to C.ENEMY_SPEED, which is 5. This makes all the aliens move to the left always. For a more complex movement, the sine or cosine functions can be used here to modify the y position as well. But, let's leave that to another tutorial. =)

Now, let's head back to the GameController.as again.

209
210
211
212
213
214
215
216
217
218
219
//Update bullets
for (var i=bullets.length - 1; i >= 0; i--)
{
    bullets[i].update();
    
    if (bullets[i].notInScreen())
    {
        mcGameStage.removeChild(bullets[i]);
        bullets.splice(i,1);
    }
}

After we are done updating the enemies, we update the bullets. There isn't any change here from Tutorial 3, except the fact that in the update function for bullets, they are now all moving to the right instead.

Lines 214 to 218 checks if the bullets have gone off the game stage, and hence should be removed. The notInScreen function that is defined in Bullet.as now checks if the x coordinate of the current bullet is greater than the constant GAME_WIDTH, which is essentially 600. If so, it is considered off screen (remember that our bullets are now moving from left to right, not skywards anymore). Then we remove it from the mcGameStage with line 216, and remove it from the bullets array in line 217.

Step 6 - Checking for Collisions

I'll leave out the entire chunk of code that does the check for collision because they are exactly the same as that for tutorial 3. Please head over to tutorial 3 to learn about it if you need a refresher.

Step 7 - Handling Display

This is where something unique to this tutorial comes into play.

262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
//******************
//Handle Display
//******************
//Update scrolling of background image
mcBackground1.x -= C.SCROLL_SPEED;
mcBackground2.x -= C.SCROLL_SPEED;
if (mcBackground1.x <= -mcBackground1.width)
{
    //switch it to the back of background 2
    mcBackground1.x = mcBackground2.x + mcBackground2.width;
}
else if (mcBackground2.x <= -mcBackground2.width)
{
    //switch it to the back of background 1
    mcBackground2.x = mcBackground1.x + mcBackground1.width;
}
 
//Display new Score
txtScorePlayer.text = String(playerScore);

We handle the scrolling logic at the portion in the game loop where we handle display. To create the illusion of the player moving through space from the left to the right, we scroll the background images from the right to the left. This is the concept of relative motion. Lines 266 and 267 accomplish this.

Since our StarField, the background image, is limited in its width, we have to eventually loop it around to make the entire scrolling seamless. Lines 268 to 272 checks if the background referred to by mcBackground1 has already moved totally off stage and if so, teleport it to the back of mcBackground2.

The conditional in 268 checks for the x position of mcBackground1 to be less than the negative value of its width. This is essentially checking if mcBackground1 has totally moved off the stage. The images below should illustrate this point.

scroll off stage

Consider only 1 scrolling image to make the illustration easier. Each star field image is 800 pixels wide, and the stage is 600 pixels wide. The red box denotes the area of the stage.

At the start, the StarField image completely covers the stage, and it's .x value is 0. As it scrolls, its x position decreases continously.

When it reaches the last diagram above, it's x position has hit -800 pixels, which means that it is completely off the stage. In line 268 of the codes, the condition is fulfilled, and hence, this image is moved to the rightmost side of the last background to continue the scrolling effect.

Step 8 - Game Over

283
284
285
286
287
288
289
290
291
292
private function gameOver()
{
    player = null;
    bullets = null;
    enemies = null;    
    
    mcGameStage.removeEventListener(Event.ENTER_FRAME,update);
    stage.removeEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler);
    stage.removeEventListener(KeyboardEvent.KEY_UP,keyUpHandler);
}

Over at the gameOver function, we remove all the listeners, as well as set some of the variables used to null, so that the Garbage Collector can clean up the memory use.

I missed out cleaning up bullets and enemies in the previous tutorial, so I'm adding it in here.

The Game

And here you have it ... the working game! If you like it ... share it!

Download the Game Files

The files you need to create this game can be downloaded from here.

How To Play

Objective: Hit as many aliens as you can.

Controls: Press UP, DOWN, LEFT and RIGHT keys to move the ship. Press SPACEBAR to fire.


Content on this page requires a newer version of Adobe Flash Player.

Get Adobe Flash player


Flash Resources
Preloader FPS Display Sounds & Music
Keycodes Name Generator
Game Development Resources
Sprite Sheets


Posted by AceOfSpadesProduc100

on 2014-05-03 17:33:12

I want a video tutorial on how to make side-scrolling shooting/flying games (so I can make Gradius Flash) and there are no tutorials on YouTube yet, so can you make the first video tutorial for making these games?


Posted by Joseph

on 2013-12-14 17:47:41

Most likely the text properties. Check that it is "Use Device Fonts" when you select the score TextField.


Posted by Jesse

on 2013-12-10 08:05:17

I have another question. When I open the file and save it, for some reason it no longer keeps score. I checked it alongside a newly downloaded file, and the coding (aside from my custom changes) is identical. The game runs perfectly when I open the file without opening it in dreamweaver, but if I save it and the swf is updated, it no longer keeps score. Why might this be?


Posted by Jesse

on 2013-12-10 07:19:21

Thanks, that helps!


Posted by Joseph

on 2013-12-08 14:27:02

Jesse, you can refer to my later tutorials like: http://www.makeflashgames.com/tutorialsplus/tutorial-frogger.php to see how there is a title screen and game over screen added.


Posted by Jesse

on 2013-12-03 08:35:06

Was curious as to how I might go about adding a title screen and game over screen to this game?


Posted by Joseph

on 2013-10-04 18:46:02

If I understand you correctly Guest, you want to play a firing animation when the plane fires? Maybe you can try adding in new frames in your player movie clip, and gotoAndPlay that when you press down.

I guess the other problem with using key up for firing is, if a player presses down the firing key but does not lift it, there will be no bullet, which may seem weird.


Posted by Guest

on 2013-09-21 23:31:27

Sory for posting a couple posts, I wasnt sure if I submited.


Posted by Guest

on 2013-09-21 23:30:12

Yes I already know that,
why I cant use key_up function, cause I need to play shooting animation when firing, so I need it only when x is pressed,
I cant play animation if x is false, cause it is always false if you dont touch it.
So it will play fireball animation even if I dont throw fireballs.


Posted by Joseph

on 2013-09-21 11:56:49

Hi Guest, try using the key_up listener instead. It'll probably work better since you want it to fire a fireball every time the player hits the key.


Posted by Guest

on 2013-09-21 05:41:59

Hello,

Im creating a Mario game and I shoot fireballs on X key.
In function key_down, if event.keyCode == X I set xKey to true, and then I create fireballs using onEnterFrame function,and just like you, after I create fireball and add it to stage I set xKey = false.
Why it wont disable automatic shooting?
When I hold x key it creating fireballs without stoping.


Posted by hadi

on 2013-08-13 16:49:03

hi, this good game learning!

just this error show when open file fla in adobe flash



Desktop\MakeFlashGames_4\src\GameController.as, Line 226 Warning: 3596: Duplicate variable definition.
Desktop\MakeFlashGames_4\src\GameController.as, Line 224 Warning: 3596: Duplicate variable definition.
Desktop\MakeFlashGames_4\src\GameController.as, Line 210 Warning: 3596: Duplicate variable definition.


but your swf work true !!!????


Posted by Andi Tafilaj

on 2013-08-06 15:28:10

Hey Joseph! Me and my cousin are making a hard sidescroller. But we get errors everytime!
The errors are

public function startGame()
private function keyDownHandler(evt:KeyboardEvent):void
private function keyUpHandler(evt:KeyboardEvent):void

I dont see how its not working, so im wondering if you know!

Thanks! -Andi


Posted by Joseph

on 2013-06-19 16:11:43

Hi, if you mean keeping a local storage for the player himself, you can explore further on SharedObjects.

If you want a leaderboard for everybody to compete against, I'm afraid that will be harder as you need to do some server and database coding.


Posted by Claudia

on 2013-06-05 01:49:43

Hi nice tuto!! I am new in this, my question, how can we keep the score if i try to add any button or something to play again!! But i want to keep the score over and over again!!.. Thanks again and you rock.


Posted by Jim Bob

on 2013-05-16 00:11:32

Thanks


Posted by Joseph

on 2013-05-16 00:09:20

Hope I understand you correctly.
You can loop through the entire enemies array and set their .visible property to false.


Posted by Mohammed

on 2013-05-14 23:16:22

Hey Joseph :-)

its me again...I have to ask you something maybe you can help me.

How can I set the hole enemies array to false? So its off and there is nothing to see?


Posted by Mohammed

on 2013-05-03 02:44:04

Hey You dont have to reply to my question earlier...i did it on my own :-)

but still thank you very much!


Posted by Mohammed

on 2013-05-02 22:23:15

Hey Joseph :-)

thank you again...Yes I checked out the frogger game and now I have my level 2 ....but when my player and my enemie hit each other and the frame jumps to the game over frame on frame 2...my enemies dont disapear...the player does but the enemie ist just frozen...maybe you know why?....yes you were right with the proper clean up....I will do all your tutorials :-)

for (var j=enemies.length - 1; j >= 0; j--)
{
if (player.collisionArea.hitTestObject(enemies[j].collisionArea))
{

mcGameStage.removeChild(player);
mcGameStage.removeChild(enemies[j]);

enemies.splice(j,1);
enemies = null;
player = null;


gotoAndStop(2);


gameOver();


break;
}


Posted by Joseph

on 2013-05-02 20:25:37

Hey Mohammed,

Thanks for dropping by again.

Ok, for a level 2 game screen, you will need to have a proper structure around it.

Did you check out my later tutorials on say Simon, Frogger, etc? You can see how I use the main timeline to carve out different sections of the game. So, if you want to jump to other levels, you should have labelled that frame, and inserted the necessary code for them. After that, it'll be as simple as gotoAndStop("level2") for example.

But things are just a little messier because you have to do some proper clean up ... like whatever bullets or enemies you added in, you have to clear them away.

This is as detailed as I can be through this comment box, haha. Really hope this helps you.


Posted by Mohammed

on 2013-05-01 22:19:27

Thank you Joseph for the quick reply! =)

I tried enemies[j].gotoAndPlay an it worked the animation of the explosion started. You was right with the removing of the stage but I took mcGameStage.removeChild(enemies[j]); line away and after the explosion I had an empty keyframe so you cant see the enemy...this is ok for the start.

But now I got another problem...I want to make a level 2 or game over screen...so when the hero hits the enemy it should go on frame two...but when I put gotoAndStop(2); under the

Player and Enemy collisions

nothing happens...can you help me again? :-)


Posted by Joseph

on 2013-05-01 11:50:49

Hi Mohammed,

enemies is an array, so ... gotoAndPlay doesn't work for it. gotoAndPlay is only for movieclips. =)
You could have used enemies[j].gotoAndPlay ... but that wouldn't work too because you will immediately be splicing it away, and removing it from stage.

If you want to add an explosion, you need to structure your game in a different way. I introduced a way to do this in the Tower Defense tutorial. You can check it out.

In that flash game tutorial, you can see that when the enemies' health drops to zero, it doesn't vanish immediately, but slowly gets flattened. Try that out.


Posted by mohammed

on 2013-04-30 00:17:55

hey great tutorial

my question is....when the bullet hits the collision area from the enemies i want to play an explosion so i wrote this

//Bullet and Enemy collisions
for (var i=bullets.length - 1; i >= 0; i--)
{ for (var j=enemies.length - 1; j >= 0; j--)

{
if (bullets[i].hitTestObject(enemies[j].collisionArea))
{
//Increase player score
playerScore += enemies[j].getPointsWorth();
enemies.gotoAndPlay("enemies");
//Remove bullet and enemy
mcGameStage.removeChild(bullets[i]);
mcGameStage.removeChild(enemies[j]);
bullets.splice(i,1);
enemies.splice(j,1);

break;

it tells me that gotoAndPlay is not an function...can you help me?
}


Posted by Joseph

on 2013-03-12 21:54:10

Hi David, you can do it by adding a death animation to the ships. Maybe you can try checking out my Tower Defence tutorial? I added how to do it there.


Posted by David

on 2013-03-07 09:00:41

I was trying to make the ship explode. I created a new movieclip with the explosion animation, but how do I tell it to replace an enemy with the explosion when the collision is detected, and then remove the explosion movieclip after it plays through?


Posted by Joseph

on 2013-02-15 23:34:21

You can add them the same way we created an Enemy.as. You can create more Enemy2.as or Enemy3.as, and link them up via new Movieclips in your library.


Posted by John

on 2013-02-01 00:10:21

how would you add new enemies other than the monsters?


Posted by Joseph

on 2012-12-19 23:56:55

Using alternate keys is described in one of my other tutorials: http://www.makeflashgames.com/resources/keycodes.php

Head over! =)


Posted by someone

on 2012-11-05 18:23:29

Uh, so I already created a game custom, but i want to change the controls instead of the arrow keys to wasd. Can you help me please?

Thanks

p.s my name is timothy not someone got bored :)


Posted by someone

on 2012-11-05 18:10:08

Uh, so I already created a game custom, but i want to change the controls instead of the arrow keys to wasd. Can you help me please?

Thanks

p.s my name is timothy not someone got bored :)


Posted by Adrean Stylez

on 2011-01-24 10:38:02


Posted by Joseph

on 2010-08-22 09:21:11

Hi, thanks for dropping by!
As far as I tested, they work fine and are playable. What's the problem that you are encountering?


Posted by kz

on 2010-08-10 13:07:45

hi, I find these tutorials helpful, though why don't your games work?


Flash Tutorial Links:
Play Games: HTML5 Tutorials:
gaming tools download on app store now!
Home | About Us | Contact Us
Powered by Make Flash Games. All Rights Reserved.
By Joseph Tan