игра Tower Defense в as3 добавление противника - PullRequest
0 голосов
/ 30 сентября 2011

хорошо, поэтому я создаю игру Tower Defense из учебника. Я закончил урок, и он работал нормально, но я не мог понять, как его использовать. Поэтому я начал все сначала и построил больше башен и второго врага, но проблема в том, что на первом уровне это работает, а на втором - нет. Я работал с этим часами, я ничего не нашел. так что я спрашиваю, может ли кто-нибудь дать мне учебник или что-нибудь, что может помочь в массивах и играх Tower Defense в as3, это своего рода большой код, поэтому я не буду публиковать его сейчас, если он вам действительно не нужен

вот учебник http://www.flashgametuts.com/tutorials/as3/how-to-create-a-tower-defense-game-in-as3-part-1/

stop();
//othervariables
var money:int=100;//how much money the player has to spend on turrets
var lives:int=20;//how many lives the player has
//lvlarray
var S:String = 'START';
var F:String = 'FINISH';
var U:String = 'UP';
var R:String = 'RIGHT';
var D:String = 'DOWN';
var L:String = 'LEFT';

var startDir:String;//the direction the enemies go when they enter
var finDir:String;//the direction the enemies go when they exit
var startCoord:int;//the coordinates of the beginning of the road
var lvlArray:Array = new Array();//this array will hold the formatting of the roads

lvlArray = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
            0,0,0,0,R,1,1,D,0,0,R,1,1,D,0,0,R,1,1,D,0,0,
            0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,
            0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,
            S,D,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,R,1,F,
            0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,
            0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,
            0,R,1,1,U,0,0,R,1,1,U,0,0,R,1,1,U,0,0,0,0,0,
            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
            ];
//enemy1array
var currentLvl:int = 1;
var gameOver:Boolean = false;

var currentEnemy:int = 0;//the current enemy that we're creating from the array
var enemyTime:int = 0;//how many frames have elapsed since the last enemy was created
var enemyLimit:int = 12;//how many frames are allowed before another enemy is created
var enemyArray:Array = new Array();//this array will tell the function when to create an enemy
var enemiesLeft:int;//how many enemies are left on the field
enemyArray = [//defining the array
            [2,2,1,1,1],//1's will just represent an enemy to be created
            [1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],//another row means another level
            [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
              ];

function startGame():void{//we'll run this function every time a new level begins
    for(var i:int=0;i<enemyArray[currentLvl-1].length;i++){
        if(enemyArray[currentLvl-1][i] == 1){
            enemiesLeft ++;
        }
    }
}
//enemy2array
var currentEnemy2:int = 0;//the current enemy that we're creating from the array
var enemy2Time:int = 0;//how many frames have elapsed since the last enemy was created
var enemy2Limit:int = 15;//how many frames are allowed before another enemy is created


function start2Game():void{//we'll run this function every time a new level begins
    for(var i:int=0;i<enemyArray[currentLvl-1].length;i++){
        if(enemyArray[currentLvl-1][i] == 1){
            enemiesLeft ++;
        }
    }
}
//lvlcreate
var roadHolder:Sprite = new Sprite();//create an object that will hold all parts of the road
addChild(roadHolder);//add it to the stage
function makeRoad():void{
    var row:int = 0;//the current row we're working on
    var block;//this will act as the block that we're placing down
    for(var i:int=0;i<lvlArray.length;i++){//creating a loop that'll go through the level array
        if(lvlArray[i] == 0){//if the current index is set to 0
            block = new EmptyBlock();//create a gray empty block
            block.graphics.beginFill(0x333333);
            block.graphics.drawRect(0,0,25,25);
            block.graphics.endFill();
            addChild(block);
            //and set the coordinates to be relative to the place in the array
            block.x= (i-row*22)*25;
            block.y = row*25;
        } else if(lvlArray[i] == 1){//if there is supposed to be a row
            //just add a box that will be a darker color and won't have any actions
            block = new Shape();
            block.graphics.beginFill(0x111111);
            block.graphics.drawRect(0,0,25,25);
            block.graphics.endFill();       
            block.x= (i-row*22)*25;
            block.y = row*25;   
            roadHolder.addChild(block);//add it to the roadHolder
        } else if(lvlArray[i] is String){//if it's a string, meaning a special block
            //then create a special block
            block = new DirectBlock(lvlArray[i],(i-row*22)*25,row*25);
            addChild(block);
        }
        for(var c:int = 1;c<=16;c++){
            if(i == c*22-1){
                //if 22 columns have gone by, then we move onto the next row
                row++;
            }
        }
    }
}
//towers
function makeTurret(xValue:int,yValue:int):void{//this will need to be told the x and y values
    var turret:Turret = new Turret();//creating a variable to hold the Turret
    //changing the coordinates
    turret.x = xValue+12.5;
    turret.y = yValue+12.5;
    addChild(turret);//add it to the stage
}

function makeTurret2(xValue:int,yValue:int):void{//this will need to be told the x and y values
    var turret2:Turret2 = new Turret2();//creating a variable to hold the Turrettwo
    //changing the coordinates
    turret2.x = xValue+12.5;
    turret2.y = yValue+12.5;
    addChild(turret2);//add it to the stage
}
//enemy1
addEventListener(Event.ENTER_FRAME, eFrame);//adding an eFrame function
function eFrame(e:Event):void{
    //if there aren't any levels left
if(currentLvl > enemyArray.length){
    gameOver=true;//set the game to be over

    //reset all the stats
    currentLvl = 1;
    currentEnemy = 0;
    enemyTime = 0;
    enemyLimit = 12;
    enemiesLeft = 0;

    removeEventListener(Event.ENTER_FRAME, eFrame);//remove this listener
    removeChild(roadHolder);//remove the pieces of road
    gotoAndStop('win');//go to the win frame
}
if(lives<=0){//if the user runs out of lives
    gameOver=true;//set the game to be over

    //reset all the stats
    currentLvl = 1;
    currentEnemy = 0;
    enemyTime = 0;
    enemyLimit = 12;
    enemiesLeft = 0;

    removeEventListener(Event.ENTER_FRAME, eFrame);//remove this listener
    removeChild(roadHolder);//remove the pieces of road
    gotoAndStop('lose');//go to the lose frame
}
    makeEnemies();//we'll just make some enemies
    if(enemiesLeft==0){//if there are no more enemies left
    currentLvl ++;//continue to the next level
    currentEnemy = 0;//reset the amount of enemies there are
    start2Game();
    startGame();//restart the game
}
//Updating the text fields
txtLevel.text = 'Level '+currentLvl;
txtMoney.text = '$'+money;
txtLives.text = 'Lives: '+lives;
txtEnemiesLeft.text = 'Enemies Left:  '+enemiesLeft;

}

function makeEnemies():void{//this function will add enemies to the field
    if(enemyTime < enemyLimit){//if it isn't time to make them yet
        enemyTime ++;//then keep on waiting
    } else {//otherwise
        var theCode:int = enemyArray[currentLvl-1][currentEnemy];//get the code from the array
        if(theCode == 2){//if it's set as 1
            var newEnemy:Enemy = new Enemy();//then create a new enemy
            enemyHolder.addChild(newEnemy);//and add it to the enemyholder
        }
        currentEnemy ++;//move on to the next enemy
        enemyTime = 0;//and reset the time
    }
}
//enemy2
addEventListener(Event.ENTER_FRAME, e2Frame);//adding an eFrame function
function e2Frame(e:Event):void{
    //if there aren't any levels left
if(currentLvl > enemyArray.length){
    gameOver=true;//set the game to be over

    //reset all the stats
    currentLvl = 1;
    currentEnemy2 = 0;
    enemy2Time = 0;
    enemy2Limit = 12;
    enemiesLeft = 0;

    removeEventListener(Event.ENTER_FRAME, eFrame);//remove this listener
    removeChild(roadHolder);//remove the pieces of road
    gotoAndStop('win');//go to the win frame
}
if(lives<=0){//if the user runs out of lives
    gameOver=true;//set the game to be over

    //reset all the stats
    currentLvl = 1;
    currentEnemy2 = 0;
    enemy2Time = 0;
    enemy2Limit = 12;
    enemiesLeft = 0;

    removeEventListener(Event.ENTER_FRAME, e2Frame);//remove this listener
    removeChild(roadHolder);//remove the pieces of road
    gotoAndStop('lose');//go to the lose frame
}
    makeEnemies2();//we'll just make some enemies

    if(enemiesLeft==0){//if there are no more enemies left
    currentLvl ++;//continue to the next level
    currentEnemy2 = 0;//reset the amount of enemies there are
    start2Game();
    startGame();//restart the game
}
    //Updating the text fields
txtLevel.text = 'Level '+currentLvl;
txtMoney.text = '$'+money;
txtLives.text = 'Lives: '+lives;
txtEnemiesLeft.text = 'Enemies Left:  '+enemiesLeft;

}

function makeEnemies2():void{//this function will add enemies to the field
    if(enemy2Time < enemy2Limit){//if it isn't time to make them yet
        enemy2Time ++;//then keep on waiting
    } else {//otherwise
        var theCode:int = enemyArray[currentLvl-1][currentEnemy2];//get the code from the array
        if(theCode == 2){//if it's set as 1
            var newEnemy2:Enemy2 = new Enemy2();//then create a new enemy
            enemyHolder.addChild(newEnemy2);//and add it to the enemyholder
        }
        currentEnemy2 ++;//move on to the next enemy
        enemy2Time = 0;//and reset the time
    }
}
//other
//run these functions at the start
makeRoad();
var enemyHolder:Sprite = new Sprite();
addChild(enemyHolder);
startGame();
start2Game();

Ответы [ 2 ]

1 голос
/ 01 октября 2011

Полагаю, проблема в том, что вы не удаляете все с уровня должным образом, прежде чем переходите на следующий уровень.

Вот как должна работать «загрузка игры»:

  1. Настройка всех внутриигровых статических ресурсов. (HUD, плитка и т. Д.)
  2. Настройка всех элементов вышки (панель для покупки башен)
  3. Установите все вражеские элементы. (Создайте массив, который представляет враги, которые будут появляться)
  4. Продолжите настраивать все остальные элементы, которые есть в игре.

После того, как они закончили играть на этом уровне, будь то выигрыш / проигрыш, вы должны удалить ВСЕ вещи, которые были добавлены во время фазы «загрузки».

Идея в том, что вы хотите, чтобы все загружалось, каждый новый уровень, точно так же, как каждый раз, когда вы делаете это с небольшими изменениями уровня, например, дизайна. Такие вещи, как враги и башенные активы, всегда будут загружаться одинаково, поэтому вам необходимо убедиться, что вы удаляете их должным образом до начала следующих раундов, чтобы при добавлении их в этот раунд вы не добавляли что-то еще существует в игре.

Вы, похоже, не понимаете игрового дизайна в целом. Проблема, о которой я упоминал выше, является лишь одной из многих проблем, возникающих при разработке игр. Я бы порекомендовал вам пройтись по книге игрового дизайна. Я бы порекомендовал этот . Причина, по которой я рекомендую такую ​​книгу, заключается в том, что она проведет вас через концептуальную часть игрового дизайна и заставит вас правильно мыслить. Я изучил программирование игр из этой книги и недавно кодировал Symphonic Tower Defense .

1 голос
/ 30 сентября 2011

Вам нужно создать возможность легко сбрасывать игровое состояние. Удаление слушателей (может не потребоваться, если вы используете слабые ссылки; http://gskinner.com/blog/archives/2006/07/as3_weakly_refe.html), очистить массивы, удалить графику (removeChild) и т. Д. Хранение всего в объекте "level" и наличие функции dispose () (или аналогичной) для этого это хороший способ сделать это (как упомянуто в комментариях). Затем просто создайте новый объект уровня для следующего уровня, и вы готовы пойти:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...