Neon game

by Cheshir
♥0 | Line 289 | Modified 2015-02-12 23:13:48 | MIT License
play

ActionScript3 source code

/**
 * Copyright Cheshir ( http://wonderfl.net/user/Cheshir )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/JFdb
 */

package {
    import flash.text.TextField;
    import flash.events.TimerEvent;
    import flash.utils.Timer;
    import flash.display.AVM1Movie;
    import flash.ui.Mouse;
    import flash.events.MouseEvent;
    import flash.events.Event;
    import flash.filters.GlowFilter;
    import flash.filters.BlurFilter;
    
    import flash.display.BitmapData;
    import flash.display.Bitmap;
    import flash.display.Sprite;
    public class FlashTest extends Sprite {
        private var canvas:Sprite;
        private var cursor:Sprite;
        private var player:Sprite;
        
        private var bulletSpeed:Number = 2;    // bullet speed is bullet damage...
        private var maxBullets:Number = 5;
        private var gapBullets:Number = 500;
        private var bulletTick:Timer = new Timer(gapBullets);
        private var bullets:Array = [];
        private var enemies:Array = [];
        private var battleStyle:GlowFilter = new GlowFilter(0xffffff);
        
        private var managerEnemy:EnemyManager;
        private var message:TextField;
        public function FlashTest() {
            // write as3 code here..
            initCanvas();
            
            stage.addEventListener(MouseEvent.MOUSE_MOVE, onStage);
            stage.addEventListener(MouseEvent.MOUSE_DOWN, startShoot);
            stage.addEventListener(MouseEvent.MOUSE_UP, stopShoot);
            bulletTick.addEventListener(TimerEvent.TIMER, shoot);
            
            stage.addEventListener('enemyDead',removeDead);
            
            managerEnemy = new EnemyManager(canvas);
            enemies = managerEnemy.newWave();
            
            playGame('Start Game!');
        }
        private function playGame(reason:String):void {
            stage.addEventListener(Event.ENTER_FRAME, gameLoop);
            message.text = reason; message.alpha = 1;
        }
        private function stopGame(reason:String):void {
            stage.removeEventListener(Event.ENTER_FRAME, gameLoop);
            message.text = reason; message.alpha = 1;
        }
        
        private function onStage(e:MouseEvent):void {
            Mouse.hide();
            cursor.x = mouseX; cursor.y = mouseY;
        }
        private function removeDead(e:Event):void {
            for(var i:int=0; i<enemies.length; i++){
                if(enemies[i]==e.target){
                    enemies.splice(i,1);
                }
            }
            canvas.removeChild(e.target as Enemy); 
        }

        private function gameLoop(e:Event):void {
            cursor.rotation += 2;
            player.rotation = myMath.getRotateTo(player.x, player.y, cursor.x, cursor.y)*180/Math.PI;
            var bRotate:Number;
            for(var i:int=0; i<bullets.length; i++) {
                bRotate = bullets[i].rotation/180*Math.PI;
                if(bullets[i].x < 600 && bullets[i].x > -50 && bullets[i].y < 600 && bullets[i].y > -50){
                    bullets[i].x += Math.cos(bRotate)*bulletSpeed;
                    bullets[i].y += Math.sin(bRotate)*bulletSpeed;
                }
            }
            for(i=0; i<enemies.length; i++ ){
                (enemies[i] as Enemy).update(player);
                for(var b:int=0; b<bullets.length; b++){
                    if(myMath.getDistantion(enemies[i].x,enemies[i].y,bullets[b].x,bullets[b].y) < enemies[i].size && bullets[b].stage){
                        enemies[i].damaged(bulletSpeed);
                        canvas.removeChild(bullets[b]);
                    }
                    if(myMath.getDistantion(enemies[i].x,enemies[i].y,player.x,player.y) < enemies[i].size && enemies[i].stage ) {
                        // they got to us !!
                        stopGame('Game Over (T_T)');
                    }
                }
            }
            if(enemies.length == 0){
                stopGame('Win wave '+managerEnemy.nowWave+'\nupgrade time');
                upgradeTime();
            }
            if(message.alpha > 0.05){
                message.alpha *= 0.9;
            } else {
                message.alpha = 0;
            }
        }
        
        private function startShoot(e:MouseEvent):void {
            bulletTick.start();
            shoot();
        }
        private function stopShoot(e:MouseEvent):void {
            bulletTick.stop();
        }
        
        private function shoot(e:TimerEvent=null):void {
            var b:Sprite;
            if(bullets.length < maxBullets){
                b = getGraphics.element(2, getGraphics.BULLET_01);
            } else {
                b = bullets.splice(0,1)[0];
            }
            b.x = player.x; b.y = player.y;
            b.rotation = player.rotation;
            bullets.push(b);
            canvas.addChild(b);
        }

        private function initCanvas():void{
            this.graphics.beginFill(0);
            this.graphics.drawRect(0,0,stage.stageWidth,stage.stageHeight);
            this.graphics.endFill();
            canvas = new Sprite();
            canvas.filters = [battleStyle];
            addChild(canvas);
            cursor = getGraphics.element(2,getGraphics.FORM_CURSOR);//new Sprite();
            canvas.addChild(cursor);
            player = getGraphics.element(2, getGraphics.PLAYER_01);
            player.x = stage.stageWidth/2;
            player.y = stage.stageHeight/2;
            canvas.addChild(player);
            message = new TextField();
            message.x = 50; message.y = 50;
            message.autoSize = 'left';
            message.textColor = 0xffffff;
            message.scaleX = message.scaleY = 4;
            message.text = 'message text';
            message.mouseEnabled = false;
            canvas.addChild(message);
            upgradePanel = new Sprite();    // yes, it is a bad decision, but I am too lazy
            var bul_speed:Sprite = getGraphics.element(2, getGraphics.BULLET_SPD,true);
            bul_speed.x = 120; bul_speed.y = 220;
            upgradePanel.addChild(bul_speed);
            bul_speed.addEventListener(MouseEvent.CLICK, addSpeed);
            var bul_max:Sprite = getGraphics.element(2, getGraphics.BULLET_MAX,true);
            bul_max.x = 120; bul_max.y = 270;
            upgradePanel.addChild(bul_max);
            bul_max.addEventListener(MouseEvent.CLICK, addMax);
            var bul_gap:Sprite = getGraphics.element(2, getGraphics.BULLET_GAP,true);
            bul_gap.x = 120; bul_gap.y = 320;
            upgradePanel.addChild(bul_gap);
            bul_gap.addEventListener(MouseEvent.CLICK, removeGap);
        }
        private var upgradePanel:Sprite;
        private function upgradeTime():void {
            canvas.addChild(upgradePanel);
        }
        private function addSpeed(e:MouseEvent):void {
            bulletSpeed++;
            endUpgrade();
        }
        private function addMax(e:MouseEvent):void {
            maxBullets++
            endUpgrade();
        }
        private function removeGap(e:MouseEvent):void {
            endUpgrade();
        }

        private function endUpgrade():void {
            enemies = managerEnemy.newWave();
            canvas.removeChild(upgradePanel);
            playGame('New Wave:'+managerEnemy.nowWave);
        }
        
        public function changeButtleStyle(color:uint=0xffffff):void{
            battleStyle.color = color;
            canvas.filters = [battleStyle];
        }
    }
}
import flash.events.Event;
import flash.display.Sprite;
Class {
    
    class getGraphics {
        public static const PLAYER_01:String = "cir 0 0 8,lin 0 -2 12 -2,lin 0 2 12 2";
        public static const BULLET_01:String = "lin 0 0 10 0";
        
        public static const FORM_CURSOR:String = "lin 4 0 10 0,lin 0 4 0 10,lin -4 0 -10 0,lin 0 -4 0 -10";
        public static const BULLET_SPD:String = "cir 0 0 20,lin 8 0 -6 -6,lin 8 0 -6 6";
        public static const BULLET_MAX:String = "cir 0 0 20,lin -10 0 10 0,lin 0 -10 0 10";
        public static const BULLET_GAP:String = "cir 0 0 20,lin -8 -8 -8 8,lin 0 -10 0 10,lin 8 -8 8 8";
        
        public static const ENEMY_01:String = "lin 20 0 -20 -20,lin -20 -20 -20 20,lin -20 20 20 0";
        public static const ENEMY_02:String = "lin 20 0 -20 -20,lin -20 20 20 0,lin 0 -30 0 30,cir -30 0 10,cir 30 0 10";
       
        public static function element(lineWi:Number, data:String="cir 0 0 4", fill:Boolean=false):Sprite{
            var elements:Array = data.split(',');    // Для каждого должна быть вызванна отрисовка
            var graph:Array;
            var el:Sprite = new Sprite();
            el.graphics.lineStyle(lineWi,0xffffff);
            if(fill){
                el.graphics.beginFill(0xffffff,0.3);
                el.graphics.lineStyle(lineWi,0xff0000);
            }
            for(var e:int=0; e<elements.length; e++){
                // теперь выбираем свойство отрисовки
                
                graph = elements[e].split(" ");
                if(graph[0]=="lin"){
                    el.graphics.moveTo(graph[1],graph[2]);
                    el.graphics.lineTo(graph[3],graph[4]);
                } else if(graph[0]=='cir') {
                    el.graphics.drawCircle(graph[1],graph[2],graph[3]);
                }
                el.graphics.endFill();
            }
            return el;
        }
    }
    class myMath {
        public static function getRotateTo(x1:Number=0,y1:Number=0,x2:Number=0,y2:Number=0):Number{
            var dx:Number = x2-x1;
            var dy:Number = y2-y1;
            return Math.atan2(dy,dx);
        }
        public static function getDistantion(x1:Number=0,y1:Number=0,x2:Number=0,y2:Number=0):Number{
            var dx:Number = x2-x1;
            var dy:Number = y2-y1;
            return Math.sqrt(dx*dx+dy*dy);
        }
    }
    class EnemyManager {
        public var enemyWaves:Array = [waveEnemies.SINGLE_WARIOR, waveEnemies.GANG_OF_FOUR, waveEnemies.MATHER_SHEEP];
        public var nowWave:int = 0;
        
        private var world:Sprite;
        public function EnemyManager(world:Sprite, dificulty:String='normal') {
            this.world = world;
        }
        public function newWave():Array {
            var enemies:Array = waveEnemies.enemies( enemyWaves[nowWave] ); //.SINGLE_WARIOR );
            for(var i:int=0; i<enemies.length; i++){
                world.addChild(enemies[i]);
            }
            nowWave++;
            return enemies;
        }
    }
    class waveEnemies {                        // type x y speed life
        public static const SINGLE_WARIOR:String = 'enemy_1 200 -20 1 12';
        public static const GANG_OF_FOUR:String = 'enemy_1 100 -20 2 5,enemy_1 200 -20 2 5,enemy_1 250 -20 2 5,enemy_1 300 -20 2 5';
        public static const MATHER_SHEEP:String = 'enemy_2 -20 -20 1 26';
        public static function enemies(data:String):Array {
            var enemiesArr:Array = data.split(',');
            var enemy:Array;
            var resultEnemy:Array = [];
            for(var i:int=0; i<enemiesArr.length; i++){
                enemy = enemiesArr[i].split(" ");
                var en:Enemy;
                if(enemy[0]=='enemy_1'){
                    en = new Enemy(getGraphics.element(2,getGraphics.ENEMY_01), enemy[4]);    // set graphics and life
                } else if(enemy[0]=='enemy_2'){
                    en = new Enemy(getGraphics.element(2,getGraphics.ENEMY_02), enemy[4]);
                }
                en.x = enemy[1]; en.y = enemy[2];
                en.speed = enemy[3];
                resultEnemy.push(en);
            }
            return resultEnemy;
        }
    }
    class Enemy extends Sprite {
        public var size:Number = 0;
        public var speed:Number = 2;
        public var life:Number = 5;
        public function Enemy(spr:Sprite, life:Number):void {
           // spr.x = -spr.width;
           // spr.y = -spr.height;
            this.life = life;
            this.size = spr.width*spr.height/(spr.width+spr.height);    // радиус вписанной окружности равен площади / полупериметр
            addChild(spr);
            this.graphics.lineStyle(1,0xffffff);
            this.graphics.drawCircle(0,0,size);
            this.graphics.lineStyle(1,0xff0000);
            this.graphics.drawCircle(0,0,life);
        }
        private var direct:Number;
        public function update(player:Sprite):void {
            direct = myMath.getRotateTo(this.x, this.y, player.x, player.y);
            this.rotation = direct*180/Math.PI;
            this.x += Math.cos(direct)*speed;
            this.y += Math.sin(direct)*speed;
        }
        public function damaged(d:Number):void {
            life -= d;
            this.rotation += speed;
            this.graphics.clear();
            this.graphics.lineStyle(1,0xffffff);
            this.graphics.drawCircle(0,0,size);
            this.graphics.lineStyle(1,0xff0000);
            this.graphics.drawCircle(0,0,life);
            if(life <= 0){
                dispatchEvent(new Event('enemyDead',true));
            }
        }
    }
}