I receive almost daily requests to port the old AS2 survival horror game in AS3, so here it is.
Since it was an easy conversion, I decided to add two features:
* Adjustable torch power using keys 1 and 2
* A flicker variable to set torch flickering rate (0-100)
So we can also have an upgradable torch…
To know the whole concept behind this, I recommend you to read step 1.
Here it is the AS3 example:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 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 90 91 92 93 94 95 96 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 |
package { import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; public class survival extends Sprite { public var ground:ground_mc = new ground_mc(); public var environment:environment_mc = new environment_mc(); public var player:player_mc = new player_mc(); public var light:Sprite=new Sprite ; public var key_pressed:int=0; public var radius:int=8; public var player_speed:int=2; public var torch_power:int=100; public var torch_step:int=100; public var torch_angle:int=60; public var torch_angle_step:int=20; public var up,down,left,right:Boolean=false; public var flicker=20; public function survival():void { addChild(ground); addChild(environment); addChild(light); addChild(player); player.x=250; player.y=200; ground.mask=light; addEventListener(Event.ENTER_FRAME,on_enter_frame); stage.addEventListener(KeyboardEvent.KEY_DOWN, on_key_down); stage.addEventListener(KeyboardEvent.KEY_UP, on_key_up); } public function on_enter_frame(e:Event):void { if (up) { player.y-=player_speed; } if (down) { player.y+=player_speed; } if (left) { player.x-=player_speed; } if (right) { player.x+=player_speed; } while (environment.hitTestPoint(player.x, player.y+radius, true)) { player.y--; } while (environment.hitTestPoint(player.x, player.y-radius, true)) { player.y++; } while (environment.hitTestPoint(player.x-radius, player.y, true)) { player.x++; } while (environment.hitTestPoint(player.x+radius, player.y, true)) { player.x--; } var dist_x:Number=player.x-mouseX; var dist_y:Number=player.y-mouseY; var angle:Number=- Math.atan2(dist_x,dist_y); player.rotation=to_degrees(angle); light.graphics.clear(); if (Math.random()*100>flicker) { light.graphics.beginFill(0xffffff, 100); light.graphics.moveTo(player.x, player.y); for (var i:int=0; i<=torch_angle; i+=(torch_angle/torch_angle_step)) { ray_angle = to_radians((to_degrees(angle)-90-(torch_angle/2)+i)); for (var j:int=1; j<=torch_step; j++) { if (environment.hitTestPoint(player.x+(torch_power/torch_step*j)*Math.cos(ray_angle), player.y+(torch_power/torch_step*j)*Math.sin(ray_angle), true)) { break; } } light.graphics.lineTo(player.x+(torch_power/torch_step*j)*Math.cos(ray_angle), player.y+(torch_power/torch_step*j)*Math.sin(ray_angle)); } light.graphics.lineTo(player.x, player.y); light.graphics.endFill(); } } public function on_key_down(e:KeyboardEvent):void { switch (e.keyCode) { case 37 : left=true; break; case 38 : up=true; break; case 39 : right=true; break; case 40 : down=true; break; case 49 : torch_power++; break; case 50 : torch_power--; break; } } public function on_key_up(e:KeyboardEvent):void { switch (e.keyCode) { case 37 : left=false; break; case 38 : up=false; break; case 39 : right=false; break; case 40 : down=false; break; } } public function to_radians(n:Number):Number { return (n*0.0174532925); } public function to_degrees(n:Number):Number { return (n*57.2957795); } } } |
And this is the result:
Move the player with arrow keys, aim the torch with the mouse and increase/decrease its power with 1 and 2.




Comments 24
I made a great game using this tecnique. http://www.games121.com/2009/06/ultimate-assassin-2.html
Grazie mille!
Quando riuscirò a farlo da solo probabilmente esisterà l’ActionScript 8.0
Grazie!
Spero che si potrà creare un bel gioco!
Secondo me però devi aggiungere anche qualche potenziamento (vita ecc.) e armi per uccidere i nemici
light.graphics.beginFill(0xffffff, 100);
I think that should be light.graphics.beginFill(0xffffff, 1) (the alpha value should be 1, not 100)
Pingback: Ganalot! » Blog Archive » Resident Evil 5 (PC) Review
Pingback: Create a Flash racing game tutorial – Artificial intelligence - Emanuele Feronato
ThankyouThankyouThankyouThankyouThankyouThankyouThankyouThankyou
Pingback: Call of Cthulhu survival horror game prototype
i noticed a glitch in this: if you continue to decrease the power of the flashlight, it eventually will shine behind the player. How do you fix this?
Hi, I believe modifying the switch case (case 50) to this should help
case 50 :
If(torch_power>0){torch_power–;}
break;
He i can really use this for a school project but how do i get this to work? i got flashdevelop and flash builder installed but i cant seem to open the .fla file. what do i need to open it so i can see all of the source code?
thanks in advance.
is it possible to convert this into code that would work on an individual frame?
sorry for double post, where is ray_angle defined?
Hi…I think I saw it in the for-loop where each ray is being drawn (if this is what you’re looking for)
ray_angle = to_radians((to_degrees(angle)-90-(torch_angle/2)+i));
Could you explain what to do if the walls aren’t completely black? I want them to be visible only when you look at them.
Is it possible to have the same kind of movement/collision detection system when the level is moving around a character instead of character moving around a level?
Have you considered using the Point.polar(distance, angle) and drawing a line to that point? A lot less trigo required.
Can I please have a tutorial on enemies and weapons?
I held down 2 for a long time and the light came out of its butt?!
Can you please show us how to give the light a gradient? So it fades out, rather than ends on a hard edge. THANKS!
Do the next part on enemies and power ups!
Game is good, but did what happened to that second part? plus you may want to put a limit on how far backthe light can go. hold 2 long and you get light shining out your ass somehow.
where do i put this text , sorry im begineer!
Pingback: A quick HTML5 survival horror prototype made with Phaser | Emanuele Feronato