Я с любовью помню свою первую игру для 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 внутри метода между блоком и объектами, которые могут располагаться поверх блока.Теперь у вас должна быть четкая идея из приведенного выше кода, как это сделать.
Я ценю, что это довольно длинный ответ, и у меня не было возможности протестировать весь код (на самом деле я 'Я довольно уверен, что где-то допустил ошибку) - не стесняйтесь задавать вопросы.Мой другой совет - тщательно понять концепции, а затем писать свой собственный код по одному.
Удачи!