2017-02-21 90 views
0

Вот моя дилеммаЧто такое более эффективный способ совершения столкновений?

У меня есть 4 стены вокруг стадии моей игры, когда игрок попадает эти стены я не хочу, чтобы сделать, если заявление для всех и каждого из стен проверки, если игрок бьет его , поэтому я создал массив для удержания стен, а затем проверить, ударил ли игрок. Теперь, потому что я делаю это, я не буду знать, что игрок на самом деле наносит удар, если он что-то наткнулся, и я не могу сделать чек в моем массиве, если он бьет как [0], [1], [2] и т. Д., Потому что тогда я вернусь к проверке, если он бьет конкретные стены. Причина, по которой я не хочу этого делать, - это будущее, когда я добавляю больше барьеров, зданий и т. Д.

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

if (main.playerPosKeeper_mc.hitTestObject(this[main.StageCollisions])) 
{ 
    trace("hit"); 
} 

StageCollisions массив, который содержит все мои барьеры в нем.

Когда игрок ударяет что-либо в StageCollisions, я не могу просто просто вычесть его значение y или значение x, потому что я не знаю, какой объект он ударил, , но я также не хочу его жестко кодировать, чтобы я проверьте, не ударился ли я, скажем, верхний барьер, потому что тогда зачем нужен массив, если я только вернусь к созданию статических if else-заявлений.

^^ Refrencing эту тему

AS3 - How to Cycle States of Character Animations (moving & stopped)

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

+0

Итак, вы хотите сохранить героя в определенном прямоугольнике при обработке четырех граничных стенок в петле? – Organis

+0

Не обязательно, я делаю проверку на столкновение, и мне интересно, как я могу узнать, на какую стену игрок бьет, не проверяя каждую стену, которую у меня есть, а затем дайте соответствующие команды. Моя настоящая цель - отойти от жестких коллизионных проверок с конкретными объектами, так как если я сделаю игру более крупной, мне придется делать больше проверок на определенные объекты. Тема, в которую я включал ответ от пользователя Vesper, - это то, над чем я пытался работать, но заслуживаю своей темы. Возможно, я могу переоценить это, но да. – UnAlpha

+0

Кроме того, забыл упомянуть, что я делаю проверку столкновений после того, как нажата кнопка dpad, мне сказали использовать циклы, прежде чем, вероятно, используя прослушиватель событий, который активирует каждый кадр, но я думаю, что более простой и эффективный способ было бы проверить только, когда вы нажмете на клавиатуру, где она переместит вас в направлении, проверьте, ударило ли вы что-то, если вы что-то ударили, верните назад, но затем я поднимаю вопрос выше, где я не знаю, m, и я не хочу жестко проверять код на конкретных объектах ради будущего, если я хочу добавить больше стен и вещей. – UnAlpha

ответ

1

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

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

Что-то вроде этого:

function movePlayer(movementX:Number, movementY:Number):void { 
    var originalX:Number = player.x; 
    var originalY:Number = player.y; 
    player.x += movementX; 
    if (checkCollision()) { 
     player.x = originalX; 
    } 
    player.y += movementY; 
    if (checkCollision()) { 
     player.y = originalY; 
    } 
} 

function checkCollision():Boolean { 
    for each (var wall:MovieClip in walls) { 
     if (player.hitTestObject(wall)) { 
      return true; 
     } 
    } 
    return false; 
} 

Таким образом, вы могли бы иметь checkCollision() проверки 4 стены или 50 стены, это не имеет значения. Это не позволит игроку перейти в них.

Это всего лишь отправная точка, и есть много способов ее разрушения или уточнения.

0

Некоторые тривиальным псевдокод для вас учиться:

private function collisionCheck(h:Sprite):Sprite{ // pass the hero Sprite into this function and it will return the wall that it hit 
    for each (b:Sprite in blockArray){ // if your array of hit-able objects is called "blockArray" 
     if (h.hitTtestObject(b)){ // check the hero Sprite against all objects in the array 
      return b; 
     } 
    } 
    return null; 
} 

Затем, в другом месте в коде (возможно, в вашей функции gameTick или функции gameLoop или там, где у вас есть логика игры повторять на каждом кадре:

private function gameTick():void{ 
    var objectHit:Sprite = collisionCheck(_myHero); // this will run the collision check function, and return the sprite that the hero collides with; 
    if (objectHit != null){ 
     objectHit.alpha = 0.5; 
     // this will give you a visible representation that your code is indeed working, or not. 
    } 
} 

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

+0

«Конечно, вы сделаете что-то другое, кроме изменения его альфа-значения в своем проекте» - об этом спрашивает ОП. ;) – Aaron

+0

Нет, если вы прочтете комментарии OPs ниже сообщения, вы увидите, что он просто хочет узнать, как определить, на какую стену он попал. Он ясно понимает концепцию перемещения, проверки, отмены. Он просто кажется, что есть лучший способ, чем проверять каждый объект в очереди через массив, которого нет на самом деле, и это то, что я пытался показать. Затем, если он действительно должен знать, что * он ударил, мой код вернет это. –

+0

Да, это буквально возвращает тот объект, который он ударил, но его реальный вопрос заключается в том, как сделать что-то значимое с тем, что он ударил, не прибегая к кодированию разных условий для того, что попало. В этом примере не показано, как это сделать вообще. – Aaron