Проблемы в моей игре AS2 - PullRequest
0 голосов
/ 30 января 2011

Эй, ребята, я пытаюсь сделать игру в стиле 2D-платформы, похожую на эту игру ниже:

http://www.gameshed.com/Puzzle-Games/Blockdude/play.html

Я закончил большую часть графики и областейи столкновение, но наш персонаж все еще не способен нести вещи.Я не понимаю, какой код использовать, чтобы мой персонаж мог переносить блоки.Мне нужна помощь в том, как заставить нашего персонажа нести блоки, которые находятся перед ним, при условии, что у блоков, на которых ничего нет, нет.Это сбивает меня с толку уже неделю, и любая помощь будет высоко оценена.: D

Ответы [ 2 ]

0 голосов
/ 14 февраля 2015

Способ, которым я бы сделал это, состоит в том, чтобы разработать индивидуальный тест на попадание для каждого блока, который он собирает, а затем код для теста на попадание, чтобы воспроизвести кадр в пределах временной шкалы спрайта, в котором он нес блок, и воспроизвести кадр.в пределах блока, который нужно забрать, временная шкала блока больше не в покое (исчезла?).

Удачи, если вы не понимаете, что я сказал, просто спросите об этом немного больше, и япостараюсь помочь, если смогу.

0 голосов
/ 30 января 2011

Я с любовью помню свою первую игру для AS2.Как я объясню, наилучшим подходом, вероятно, является объектно-ориентированный подход.

В AS2 есть хит-метод, автоматически встроенный в объекты.Вот хороший учебник по Кирупе:

http://www.kirupa.com/developer/actionscript/hittest.htm

также

http://help.adobe.com/en_US/AS2LCR/Flash_10.0/help.html?content=00001314.html

Сначала вы захотите сгенерировать свои ящики, используяКоробка классная.Ваш класс должен выглядеть примерно так:

//Box.as pseudo-code
class Box {
    var x_pos:Number;
    var y_pos:Number;
    var attachedToPlayer:Boolean;

    function Box(_x:Number, _y:Number) {
        this.x_pos = _x;
        this.y_pos = _y;    
    }

    //other code here

}

В этом руководстве рассказывается, как присоединить класс к объекту в библиотеке:

http://www.articlesbase.com/videos/5min/86620312

Чтобы создать новый ящик, вы должны использовать что-то вроде box1 = новый ящик (100,200);// создаем блок в позиции 100x, 200y

Однако вы также захотите сохранить блоки, которые вы хотите собрать, в некоторый массив, чтобы вы могли проходить через них.См. http://www.tech -recipes.com / rx / 1383 / flash-actionscript-create-an-массив-объектов-из-уникального класса /

Пример:

// где-нибудь в верхней части основного метода или везде, откуда запускается основной игровой цикл - обратите внимание на Box.as, который должен находиться в той же папке импорта Box;

//...then, somewhere before your game loop

//create an array to hold the objects
var boxArray:Array = new Array();

    //create loop with i as the counter
    for (var i=0; i<4; i++)
    {
        var _x:Number = 100 + i;
        var _y:Number = 100 + i;
        //create Box object
        var box:Box = new Box();

        //assign text to the first variable.
        //push the object into the array
        boxArray.push(box);
    }

Точно так же вам потребуется класс для вашего игрока и для создания нового объекта Player в начале вашей игры, например,

var player = new Player(0,0);

Затем вы можете запустить хит-метод для вашего игрока против блоков в вашеммассив для основного игрового цикла (то есть цикла, который обновляет позицию вашего игрока и другие игровые свойства).Вероятно, есть более эффективные способы сделать это, например, зацикливание только для блоков, которые в данный момент находятся на экране.

После того, как ваш массив создан, используйте цикл foreach, чтобы запустить хит-тест против вашего игрока в вашей игре.основной цикл, например,

//assuming you have an array called 'boxArray' and player object called 'player'
for(var box in boxArray){
    if (player.hittest(box)) {
        player.attachObjectMethod(box);
    }
}

Это в основном псевдокод для "для каждого поля, которое мы ввели в массив, проверьте, касается ли игрок поля. Если поле касается, используйте полев качестве аргумента для метода в классе проигрывателя (который я произвольно назвал attachObjectMethod) ".

В attachObjectMethod вы можете затем определить какое-то поведение для прикрепления бокса к проигрывателю.Например, вы можете создать метод (ы) get и set для позиции x и y ваших блоков внутри класса box вместе с логическим значением, которое называется что-то полезное, например attachToPlayer.Когда был вызван метод attachObjectMethod, он установил бы логическое значение поля, например, в классе Player

//include Box.as at the top of the file
import Box;

//other methods, e.g. constructor

//somewhere is the Player.as class/file
public function attachObjectMethod (box:Box) {
    box.setattachedToPlayer(true);
    //you could also update fields on the player, but for now this is all we need
}

Теперь логическое значение attachToPlayer для бокса, с которым столкнулся игрок, будет истинным.Вернувшись в наш игровой цикл, мы бы затем изменили наш цикл, чтобы обновить положение блоков:

//assuming you have an array called 'boxArray' and player object called 'player'
for(var box in boxArray){
    if (player.hittest(box)) {
        player.attachObjectMethod(box);
    }
    box.updatePosition(player.get_Xpos, player.get_Ypos);
}

В нашем классе Box нам теперь нужно определить 'updatePosition':

//Box.as pseudo-code
class Box {
    var x_pos:Number;
    var y_pos:Number;
    var attachedToPlayer:Boolean;

    function Box(box_x:Number, box_y:Number) {
        this.x_pos = box_x;
        this.y_pos = box_y;     
    }

    public function updatePosition(_x:Number, _y:Number) {
        if (this.attachedToPlayer) {
            this.x_pos = _x;
            this.y_pos = _y;
        }
    }

    //other code here

}

Как вы можете видеть, мы можем передать позицию игрока и обновить позицию бокса, если был установлен логическое значение attachToPlayer.Наконец, мы добавляем метод перемещения в поле:

public function move() {
    if (this.attachedToPlayer) {
        this._x = x_pos;
        this._y = y_pos;
    }
}

Примеры обновления позиции: http://www.swinburne.edu.au/design/tutorials/P-flash/T-How-to-smoothly-slide-objects-around-in-Flash/ID-17/

Наконец, чтобы все это заработало, нам нужно вызвать метод перемещения вигровой цикл:

//assuming you have an array called 'boxArray' and player object called 'player'
for(var box in boxArray){
    if (player.hittest(box)) {
        player.attachObjectMethod(box);
    }
    box.updatePosition(player.get_Xpos, player.get_Ypos);
    box.move();
}

Вы также указали, что блоки должны перемещаться вместе с игроком, только если на них ничего нет.Когда вы вызываете свой метод attachToPlayer, вам также необходимо запустить цикл foreach внутри метода между блоком и объектами, которые могут располагаться поверх блока.Теперь у вас должна быть четкая идея из приведенного выше кода, как это сделать.

Я ценю, что это довольно длинный ответ, и у меня не было возможности протестировать весь код (на самом деле я 'Я довольно уверен, что где-то допустил ошибку) - не стесняйтесь задавать вопросы.Мой другой совет - тщательно понять концепции, а затем писать свой собственный код по одному.

Удачи!

...