Game Programming Patterns / Паттерны программирования в играх: 1.6. State

← →
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

Время исповедаться: я немного перестарался и затолкал в эту главу слишком многое.

bubenok 03.05.14 в 06:30

0

Время исповеди: я слегка перестарался и вложил в эту главу слишком многое.

Deo 31.08.14 в 09:07

0

Это все якобы о паттерне проектирования "Состояние"

bubenok 03.05.14 в 06:32

0

Якобы, это все о паттерне State design (Состояние).

Deo 31.08.14 в 09:08

0

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

bubenok 03.05.14 в 07:00

1

Это большая тема, и для краткости в примерах кода были опущены некоторые детали, которые вы должны будете заполнить по своему усмотрению.

bubenok 03.05.14 в 07:11

1

Надеюсь они все же останутся достаточно понятными, чтобы видеть общую картину.

bubenok 03.05.14 в 07:13

1

Если вы никогда не слышали о конечных автоматах - не грустите.

bubenok 03.05.14 в 07:13

1

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

bubenok 03.05.14 в 07:22

0

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

Deo 31.08.14 в 12:38

0

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

bubenok 03.05.14 в 07:25

0

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

Deo 31.08.14 в 12:40

0

Это перекликается с ранним периодом развития искуственного интеллекта.

bubenok 03.05.14 в 07:29

1

В 50-е и 60-е большая часть исследований искуственного интеллекта была сосредоточена на обработке языка.

bubenok 03.05.14 в 07:33

1

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

bubenok 03.05.14 в 07:37

0

Многие используемые компиляторами техники распознавания языков программирования изобретены на основе распознавания человеческих.

Deo 31.08.14 в 12:45

0

Мы все были там.

bubenok 03.05.14 в 07:37

0

Нам всем это знакомо

Deo 31.08.14 в 12:45

0

Мы работали над маленьким двухмерным платформером.

bubenok 03.05.14 в 07:40

0

Наша задача состояла в реализации героини, которая была аватаром игрока в игровом мире.

bubenok 03.05.14 в 07:42

0

Это означает, что она должна была реагировать на команды пользователя.

bubenok 03.05.14 в 07:45

0

Нажимаем на кнопку В и она должна прыгнуть.

bubenok 03.05.14 в 07:46

1

Достаточно просто:

bubenok 03.05.14 в 07:46

0

Довольно просто:

Deo 31.08.14 в 12:50

0

void Heroine::handleInput(Input input)

bubenok 03.05.14 в 07:46

0

{

bubenok 03.05.14 в 07:46

0

if (input == PRESS_B)

bubenok 03.05.14 в 07:46

0

}

bubenok 03.05.14 в 07:46

0

yVelocity_ = JUMP_VELOCITY;

bubenok 03.05.14 в 07:47

0

setGraphics(IMAGE_JUMP)

bubenok 03.05.14 в 07:47

0

;

bubenok 03.05.14 в 07:47

0

}

bubenok 03.05.14 в 07:47

0

}

bubenok 03.05.14 в 07:47

0

Нашли ошибку?

bubenok 03.05.14 в 07:47

1

Никак не предотвращена возможность "воздушных прыжков": долбите по кнопке B пока она в воздухе и она будет в подвешенном состоянии вечно.

bubenok 03.05.14 в 07:51

0

Ничто не мешает совершать "воздушные прыжки": долбите "B", пока она в воздухе и она будет парить вечно.

Deo 31.08.14 в 12:52

0

Простой способ исправить это - добавляем булево поле isJumping_ к Heroine, которое отслеживает прыгнула ли наша героиня и делаем следующее:

bubenok 03.05.14 в 07:54

0

void Heroine::handleInput(Input input)

bubenok 03.05.14 в 07:54

0

{

bubenok 03.05.14 в 07:54

0

if (input == PRESS_B)

bubenok 03.05.14 в 07:54

0

{

bubenok 03.05.14 в 07:54

0

if (!isJumping_)

bubenok 03.05.14 в 07:55

0

{

bubenok 03.05.14 в 07:55

0

isJumping_ = true;

bubenok 03.05.14 в 07:55

0

// Jump...

bubenok 03.05.14 в 07:55

0

}

bubenok 03.05.14 в 07:55

0

}

bubenok 03.05.14 в 07:55

0

}

bubenok 03.05.14 в 07:55

0

Здесь также должен быть код, который устанавливает isJumping_ назад в false, когда героиня касается земли.

bubenok 03.05.14 в 07:57

1

Я опустил его для краткости.

bubenok 03.05.14 в 07:59

0

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

bubenok 03.05.14 в 08:03

1

void Heroine::handleInput(Input input)

bubenok 03.05.14 в 08:03

0

{

bubenok 03.05.14 в 08:03

0

if (input == PRESS_B)

bubenok 03.05.14 в 08:03

0

{

bubenok 03.05.14 в 08:03

0

// Jump if not jumping...

bubenok 03.05.14 в 08:03

0

}

bubenok 03.05.14 в 08:03

0

else if (input == PRESS_DOWN)

bubenok 03.05.14 в 08:04

0
Минутку...

Следующая страница →