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.aspackage { 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.aspackage { 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.aspackage { 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); } } } |
Programmering > exempel >
rymdspel med skjutande skepp
I första framen i tidslinjen ligger följande script: 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: Grunden till Bullet.as och Enemy.as ser ungefär likadana ut: |