Programmering‎ > ‎exempel‎ > ‎

rymdspel med skjutande skepp


Detta spelet har tre olika MovieClip:
  • Bullet
  • Ship
  • Enemy
I första framen i tidslinjen ligger följande script:

från tidslinjen i

//håller reda på skott och fiender
var bullets:Array = new Array();
var enemies:Array = new Array();

//timer för att skapa fiender
var enemyTimer:Timer = new Timer(100);
enemyTimer.addEventListener(TimerEvent.TIMER, createEnemy);
enemyTimer.start();

//lyssnare för att kontroll av bullets mot fiender
addEventListener(Event.ENTER_FRAME, checkHits);

//skapar fiender
function createEnemy(e:TimerEvent) {
    var enemy:Enemy = new Enemy();
    enemy.y = -50;
    enemy.x = Math.random()*520;
    addChild(enemy);
    //lägger till fiendet i
    enemies.push(enemy);
}

//kontrollerar om någon bullet krockat med ett enemy
function checkHits(e:Event) {
    for(var i:int = bullets.length-1; i >= 0; i--) {
        for(var j:int = enemies.length-1; j >= 0; j--) {
            if(bullets[i].hitTestObject(enemies[j])) {
                bullets[i].deleteBullet();
                enemies[j].deleteEnemy();
            }
        }
    }
}

//tar bort fiende
function removeEnemy(enemy:Enemy) {
    for(var i in enemies) {
        if(enemies[i] == enemy) {
            enemies.splice(i, 1);//tar bort
            break; //objektet hittat, avbryter for-loopen
        }
    }
}

//tar bort kulan
function removeBullet(bullet:Bullet) {
    for(var i in bullets) {
        if(bullets[i] == bullet) {
            bullets.splice(i, 1);//tar bort
            break; //objektet hittat, avbryter for-loopen
        }
    }
}

I exemplet här så kontrolleras samtliga bullets mot samtliga fiender för att se om någon av dom har träffat.
Om dom träffar tas både kulan och fienden bort.

För att kunna skjuta så har lite kod lagts till i Ship.as som vi här återanvänder:

Ship.as

package {
    import flash.display.*;
    import flash.events.*;
    import flash.events.KeyboardEvent;
   
    public class Ship extends MovieClip {
        //håller redan på vilken tangent som är nedtryckt
        var leftArrow:Boolean = false;
        var rightArrow:Boolean = false;
        var upArrow:Boolean = false;
        var downArrow:Boolean = false;
       
        var fire:Boolean = false;
       
        //hastighet
        var speed_x:Number = 0;
        var speed_y:Number = 0;
       
        var acc:Number = 1.5;
       
        //kallas på när skeppet skapas
        function Ship() {
            //lyssnare för tangenter
            stage.addEventListener(KeyboardEvent.KEY_DOWN, this.keyPressedDown);
            stage.addEventListener(KeyboardEvent.KEY_UP, this.keyPressedUp);
           
            this.addEventListener(Event.ENTER_FRAME, moveShip);
        }
       
        //anropas vid enter_frame
        function moveShip(e:Event) {
            //flyttar skeppet
            this.y += speed_y;
            this.x += speed_x;
           
            if(this.x < 0){
                this.x = 1;
                speed_x = 0;
            }
           
            if(this.x > 490){
                this.x = 489;
                speed_x = 0;
            }
           
            if(this.y < 0){
                this.y = 1;
                speed_y = 0;
            }
           
            if(this.y > 332){
                this.y = 331;
                speed_y = 0;
            }
       
            //ökar eller minskar hastigheten beroende av tengent
            if (leftArrow) {
                speed_x -= acc;
            }
            if (rightArrow) {
                speed_x += acc;
            }
            if (upArrow) {
                speed_y -= acc;
            }
            if (downArrow) {
                speed_y += acc;
            }
            if(fire) {
                fireBullet();
            }

        }
       
        function fireBullet() {
            //skapar två nya skott
            var b1:Bullet = new Bullet();
            var b2:Bullet = new Bullet();
           
            //sätter ut x och y-kordinater i förhållande till skeppet
            b1.x = this.x + 15;
            b1.y = this.y;
            b1.speedX = -2;
            b1.rotation = -2;
           
            b2.x = this.x + 43.5;
            b2.y = this.y;
            b2.speedX = 2;
            b2.rotation = 2;
           
            //lägger till kulorna på scenen
            parent.addChild(b1);
            parent.addChild(b2);
           
            //lägger till b1 och b2 för att sedan kunna göra hitTest
            MovieClip(parent).bullets.push(b1);
            MovieClip(parent).bullets.push(b2);
        }

       
        function keyPressedDown(e:KeyboardEvent) {
            //kontrollerar vilken tangent som eventet gäller
            if (e.keyCode == 37) {
                leftArrow = true;
            } else if (e.keyCode == 39) {
                rightArrow = true;
            }
            if (e.keyCode == 38) {
                upArrow = true;
            }
            if (e.keyCode == 40) {
                downArrow = true;
            }
            if(e.keyCode == 32) {
                fire = true;
            }

        }
       
        function keyPressedUp(e:KeyboardEvent) {
            //kontrollerar vilken tangent som eventet gäller
            if (e.keyCode == 37) {
                leftArrow = false;
            } else if (e.keyCode == 39) {
                rightArrow = false;
            }
            if (e.keyCode == 38) {
                upArrow = false;
            }
            if (e.keyCode == 40) {
                downArrow = false;
            }
            if(e.keyCode == 32) {
                fire = false;
            }

        }
    }
}

Grunden till Bullet.as och Enemy.as ser ungefär likadana ut:

Bullet.as

package {
    import flash.display.*;
    import flash.events.*;
   
    public class Bullet extends MovieClip {
        //publika för att ge åtkomst utanför
        public var speedY = -20;
        public var speedX = 0;
       
        public function Bullet() {
            addEventListener(Event.ENTER_FRAME, moveBullet);
        }
       
        function moveBullet(e:Event) {
            this.y += speedY;
            this.x += speedX;
           
            //Om kulan lämnat skärmen ska den tas bort
            if(this.y < 0) {
                deleteBullet();
            }
        }
       
        //Tar bort kulan och lyssnaren
        public function deleteBullet() {
            MovieClip(parent).removeBullet(this);
            parent.removeChild(this);
            removeEventListener(Event.ENTER_FRAME, moveBullet);
        }
    }
}


Enemy.as

package {
    import flash.display.*;
    import flash.events.*;
   
    public class Enemy extends MovieClip {
        var speedY = 7;
       
        public function Enemy() {
            addEventListener(Event.ENTER_FRAME, moveEnemy);
        }
       
        function moveEnemy(e:Event) {
            this.y += speedY;
           
            //om fiendet lämnat skärmen ska det tas bort
            if(this.y > 400) {
                deleteEnemy();
            }
        }
       
        //Tar bort fiende och lyssnare
        public function deleteEnemy() {
            MovieClip(parent).removeEnemy(this);
            parent.removeChild(this);
            removeEventListener(Event.ENTER_FRAME, moveEnemy);
        }
    }
}


ċ
bulletexempel.zip
(11k)
Olof Olsson,
6 nov. 2008 13:16
ċ
Olof Olsson,
6 nov. 2008 13:16
Comments