1

我正在开发一款垂直射击游戏。我需要找到一种方法让随机物体(敌人)从顶部下降。目前,我有 1 个从顶部随机掉落的敌人正在工作。这是我正在使用的代码。

主要代码

// Full Screen Command
fscommand("fullscreen","true");
stop();

//center player on screen
mcMain.x = 880,45;
mcMain.y = 940,40;

//these booleans will check which keys are down
var leftDown:Boolean = false;
var upDown:Boolean = false;
var rightDown:Boolean = false;
var downDown:Boolean = false;
//how fast the character will be able to go
var mainSpeed:int = 25;

//how much time before allowed to shoot again
var cTime:int = 0;
//the time it has to reach in order to be allowed to shoot (in frames)
var cLimit:int = 12;
//whether or not the user is allowed to shoot
var shootAllow:Boolean = true;

//how much time before another enemy is made
var enemyTime:int = 0;
//how much time needed to make an enemy
//it should be more than the shooting rate
//or else killing all of the enemies would
//be impossible :O
var enemyLimit:int = 16;

//the player's score
var score:int = 0; 

//this movieclip will hold all of the bullets
var bulletContainer:MovieClip = new MovieClip();
addChild(bulletContainer);

//whether or not the game is over
var gameOver:Boolean = false;

//adding a listener to mcMain that will move the character
mcMain.addEventListener(Event.ENTER_FRAME, moveChar);
function moveChar(event:Event):void{
//checking if the key booleans are true then moving
//the character based on the keys
if(leftDown){
    mcMain.x -= mainSpeed;
}
if(upDown){
    mcMain.y -= mainSpeed;
}
if(rightDown){
    mcMain.x += mainSpeed;
}
if(downDown){
    mcMain.y += mainSpeed;
}
//keeping the main character within bounds
if(mcMain.x <= 0){
    mcMain.x += mainSpeed;
}
if(mcMain.y <= 0){
    mcMain.y += mainSpeed;
}
if(mcMain.x >= stage.stageWidth - mcMain.width){
    mcMain.x -= mainSpeed;
}
if(mcMain.y >= stage.stageHeight - mcMain.height){
    mcMain.y -= mainSpeed;
}

    //Incrementing the cTime

//checking if cTime has reached the limit yet
if(cTime < cLimit){
    cTime ++;
} else {
    //if it has, then allow the user to shoot
    shootAllow = true;
    //and reset cTime
    cTime = 0;
}
//adding enemies to stage
if(enemyTime < enemyLimit){
    //if time hasn't reached the limit, then just increment
    enemyTime ++;
} else {
//defining a variable which will hold the new enemy
var newEnemy = new Enemy();
//making the enemy offstage when it is created
newEnemy.y = -1 * newEnemy.height;
//making the enemy's x coordinates random
//the "int" function will act the same as Math.floor but a bit faster
newEnemy.x = int(Math.random()*(stage.stageWidth - newEnemy.width));
//then add the enemy to stage
addChild(newEnemy);
//and reset the enemyTime
enemyTime = 0;
}
//updating the score text
txtScore.text = 'SCORE: '+score;
}
//this listener will listen for down keystrokes
stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKeysDown);
function checkKeysDown(event:KeyboardEvent):void{
//making the booleans true based on the keycode
//WASD Keys or arrow keys
if(event.keyCode == 37 || event.keyCode == 65){
    leftDown = true;
}
if(event.keyCode == 39 || event.keyCode == 68){
    rightDown = true;
}

//checking if the space bar is pressed and shooting is allowed
if(event.keyCode == 32 && shootAllow){
//making it so the user can't shoot for a bit
shootAllow = false;
//declaring a variable to be a new Bullet
var newBullet:Bullet = new Bullet();
//changing the bullet's coordinates
newBullet.x = mcMain.x + mcMain.width/2 - newBullet.width/2;
newBullet.y = mcMain.y;
//then we add the bullet to stage
bulletContainer.addChild(newBullet);
mcMain.gotoAndPlay(1);
}
}
//this listener will listen for keys being released
stage.addEventListener(KeyboardEvent.KEY_UP, checkKeysUp);
function checkKeysUp(event:KeyboardEvent):void{
//making the booleans false based on the keycode
if(event.keyCode == 37 || event.keyCode == 65){
    leftDown = false;
}
if(event.keyCode == 39 || event.keyCode == 68){
    rightDown = false;
}

}

敌对阶级

package{
//we have to import certain display objects and events
import flash.display.MovieClip;
import flash.events.*;
//this just means that Enemy will act like a MovieClip
public class Enemy extends MovieClip{
    //VARIABLES
    //this will act as the root of the document
    //so we can easily reference it within the class
    private var _root:Object;
    //how quickly the enemy will move
    private var speed:int = 5;
    //this function will run every time the Bullet is added
    //to the stage
    public function Enemy(){
        //adding events to this class
        //functions that will run only when the MC is added
        addEventListener(Event.ADDED, beginClass);
        //functions that will run on enter frame
        addEventListener(Event.ENTER_FRAME, eFrame);
    }
    private function beginClass(event:Event):void{
        _root = MovieClip(root);
    }
    private function eFrame(event:Event):void{
        //moving the bullet up screen
        y += speed;
        //making the bullet be removed if it goes off stage
        if(this.y > stage.stageHeight){
            removeEventListener(Event.ENTER_FRAME, eFrame);
            _root.removeChild(this);
        }
        //checking if it is touching any bullets
        //we will have to run a for loop because there will be multiple bullets
        for(var i:int = 0;i<_root.bulletContainer.numChildren;i++){
            //numChildren is just the amount of movieclips within 
            //the bulletContainer.

            //we define a variable that will be the bullet that we are currently
            //hit testing.
            var bulletTarget:MovieClip = _root.bulletContainer.getChildAt(i);

            //now we hit test
            if(hitTestObject(bulletTarget)){
                //remove this from the stage if it touches a bullet
                removeEventListener(Event.ENTER_FRAME, eFrame);
                _root.removeChild(this);
                //also remove the bullet and its listeners
                _root.bulletContainer.removeChild(bulletTarget);
                bulletTarget.removeListeners();
                //up the score
                _root.score += 5;
            }
        }

        //hit testing with the user
        if(hitTestObject(_root.deadLine)){
            //losing the game
            _root.gameOver = true;
            _root.gotoAndStop('lose');
        }

        //checking if game is over
        if(_root.gameOver){
            removeEventListener(Event.ENTER_FRAME, eFrame);
            this.parent.removeChild(this);
        }

    }
}
}

我正在使用这里的教程:http: //www.flashgametuts.com/tutorials/as3/how-to-make-a-vertical-shooter-in-as3-part-1/

任何帮助都非常受欢迎。

4

3 回答 3

1

我曾经在 Flash 中制作游戏,并利用这种情况在我的游戏中不断添加敌人。

if (Math.floor(Math.random() * 90) == 5){

在这种情况下,您可以使用您的代码随机添加 1 个敌人

于 2012-12-03T13:17:47.290 回答
1

我认为你应该得到一个连接到你的主代码的计时器类。

获取全局计数器。

   int count=0;
   int timeElapsedToNewEnemy = int((Math.random()*10+1)*10);
   //get u a number from 10 to 100

得到你的计时器

   var time:Timer=new Timer(100,0);// each 1/10 seconds 
   time.start();
   time.addEventListener(TimerEvent.TIMER, countTime);

获取计时器的功能

   function countTime(e:TimerEvent):void
   {//increment ur timer
    count++;
if  (cont == timeElapsedToNewEnemy)
     {
    cont=0;//restar ur counter..
            //createUrNewEnemyHere  
            //get a new timeElapsedToEnemy
            timeElapsedToNewEnemy = int((Math.random()*10+1)*10);
     }
    }

现在你可以很容易地调整它以在每个随机 x 时间创建随机敌人。

让我知道它是否适合你

于 2012-12-03T15:30:00.670 回答
1

谢谢大家,但我找到了解决方案。

var newEnemy = new (getDefinitionByName("Enemy"+Math.floor(Math.random()*4)));

然后创建敌人的不同电影剪辑作为敌人

于 2012-12-05T08:22:22.933 回答