Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Помогите по простому AI платформера (http://www.flasher.ru/forum/showthread.php?t=137937)

dedalx 26.03.2010 00:18

Помогите по простому AI платформера
 
Привет всем!
Начал приучаться к AS3 и возникли проблемы из-за классовости.

Суть проблемы: есть уровень двумерного платформера (по типу марио, вид сбоку) нужно сделать AI для монстров - чтобы они ходили влево-вправо до краев платформы на которой находятся. Если слева/справа платформы пусто то они идут обратно. Для этого добавил ниже моба маркеры которые проверяют hittest моба с платформой.
У моба класс - mob, у платформы класс box. И мобы и платформы на уровне расставляются вручную в Adobe Flash CS4, не программно.

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

Подскажите как это реализовать? Чтобы у меня на уровне было много мобов (с одинаковым поведением указанным в их классе) и много платформ по каким им можно ходить влево-вправо (у каких тоже свой класс). Просто хочется чтобы можно было "пол" для моба делать из нескольких платформ просто расстановкой их рядом (как тайлов) как в марио.

Rzer 26.03.2010 00:33

Перед стартом игры рисуй все box в BitmapData (1 box = 1 пикселю) - перед перемещением монстра проверяй закрашен ли пиксель (x+направление, y+1) цветом бокса. Если да то идём туда, если нет - меняем направление.

dedalx 26.03.2010 00:36

Интересное решение, только думаю не слишком универсально, к примеру если у меня боксы не по сетке пиксельной, а просто расставлены (как впрочем и есть), и расстояния везде разные. Я их по битмаповской копии уровня не расставлю..

Добавлено через 6 минут
У меня вопрос несколько другой - как делать проверку для мобов именно в отношении того блока который под ним?

Rzer 26.03.2010 00:44

Перед стартом игры разбивай общий массив на массив платформ:

1) Берём монстра - получаем индекс box под ним (смотрим наличие индекса платформы)
2) Если его нет ищем все проходимые боксы засовываем им всем ссылку на платформу. Высчитывает длину платформы и координаты.
3) Если индекс есть, то просто берём длину и координаты платформы ранее посчитанной.

Гоняем монстра туда сюда по длине.

dedalx 26.03.2010 00:49

" общий массив на массив платформ:" - у меня все платформы суют себя в индекс в классе, то есть все платформы в массиве Boxes

"1) Берём монстра - получаем индекс box под ним (смотрим наличие индекса платформы)"
можно поподробнее, как это сделать? У меня есть массив платформ, а откуда я знаю какая к какому мобу? соотношений то никаких.. какой индекс то проверять. платформ может быть 10 а мобов 3 какие тока на трех из этих платформ стоят.

Rzer 26.03.2010 00:53

Я имел ввиду платформа - это группа box, по которым может бегать монстр.
Цитата:

можно поподробнее, как это сделать?
Например, проверить на расстояние по осям от центра моба, до центра бокса, учитывая знак. Ну или
getObjectsUnderPoint(point:Point) на точку немного ниже монстра.

dedalx 26.03.2010 01:02

вот спасибо! getObjectsUnderPoint(point:Point) про что-то такое я и спрашивал! Пойду пробывать

Rzer 26.03.2010 01:04

Вот так игры и начинают тормозить на 4 пентиумах ;) Не то что старый добрый Марио)

dedalx 26.03.2010 01:24

Но как быть если у меня рядом две платформы впритык и надо чтобы моб по обоим мог ходить так как они рядом?

VVall 26.03.2010 02:11

Если персонаж поворачивает от краёв платформы, то он не может упасть с платформы. Если он не может упасть, зачем проверять наличие платформы под ним? Пусть ходит от маркера до маркера, хоть в воздухе, хоть где.

dedalx 26.03.2010 02:22

Цитата:

Сообщение от VVall (Сообщение 895733)
Если персонаж поворачивает от краёв платформы, то он не может упасть с платформы. Если он не может упасть, зачем проверять наличие платформы под ним? Пусть ходит от маркера до маркера, хоть в воздухе, хоть где.

Я проверяю наличие платформы под ним чтобы по ней узнать в каких пределах ему можно ходить (до её концов).

Возникла другая проблема.

Код AS3:

// Проверяем где бокс моба
p.x=this.x;
p.y=this.y+this.height/2+1;
 
mobbox=stage.getObjectsUnderPoint(p);

Получили ссылку на бокс,типа [shape] отлично.

Проверяю пересечение с маркером моба (маркер нарисован программно, trace показывает что маркер тоже типа [shape]:

Код AS3:

 
if(markerLM.hitTestObject(mobbox))
{
        goleft=false;
        goright=true;
}

И получаю ошибку преобразования типов:

TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать []@2a27a779 в flash.display.DisplayObject. at game::Mob/UpdateWorld()

Вместо билеберды "[]@2a27a779" каждый кадр разный набор символов.
Хотя обе вещи [shape] судя по ошибке это не так..
Пробывал явно указать что:
public var mobbox:Shape;

не помогло, только меняется ошибка:
TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать []@16cdcf59 в flash.display.Shape. at game::Mob/UpdateWorld()

Подскажите как поправить?

Добавлено через 29 минут
Разобрался) getObjectsUnderPoint возвращает массив, надо брать [0]

Добавлено через 39 минут
НОВАЯ ПРОБЛЕМА:

Когда один моб все нормально, он определяет свою стенку (даже если их несколько) и по ней правильно ездит. А когда добавляю второго моба начинаются ошибки:

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".at game::Mob/UpdateWorld()

И работает только первый. Помоги пожалуйста что нетак.

dedalx 26.03.2010 03:03

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

dedalx 26.03.2010 03:46

Ошибка
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at game::Mob/UpdateWorld()\game\Mob.as:48]

На строке:
if(!mobbox.hitTestPoint(this.x-this.width/2,this.y+this.height/2+1,true))

Вылазиет когда больше одного моба

etc 26.03.2010 09:54

Очевидно, mobbox в этой строке — null.

dedalx 26.03.2010 15:19

А почему? Ведь я тупо скопировал на сцене моба с платформой и поместил их рядом. То есть под ним есть эта платформа также как и там.

RandomUser 26.03.2010 15:39

Ты проверяешь нижнюю точку моба. Видимо, этот моб на 0.5-2 пикселя выше стоит чем надо. Опусти моба или эту точку чуть ниже.

Код AS3:

public function Mob():void {
 
        // Проверяем где бокс моба
        p.x=this.x;
        p.y=this.y+this.height/2+5; // как-то так...
        mobboxdata=stage.getObjectsUnderPoint(p);
        mobbox=mobboxdata[0];
 
        // Листенеры
        addEventListener(Event.ENTER_FRAME, UpdateWorld);
}


dedalx 26.03.2010 15:49

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


Часовой пояс GMT +4, время: 17:15.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.