Game Programming Patterns / Паттерны программирования в играх: 1.6. State
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Время исповедаться: я немного перестарался и затолкал в эту главу слишком многое. bubenok 03.05.14 в 06:30 Время исповеди: я слегка перестарался и вложил в эту главу слишком многое. Deo 31.08.14 в 09:07 |
|
|
Это все якобы о паттерне проектирования "Состояние" bubenok 03.05.14 в 06:32 Якобы, это все о паттерне State design (Состояние). Deo 31.08.14 в 09:08 |
||
|
Но я не могу говорить о нем и об играх не затрагивая фундаментального понятия конечных автоматов (или FSM). Но как только я начал погружаться в эту тему, я понял, что мог бы так же сделать неплохое введение в тему иерархических конечных автоматов и автоматов с магазинной памятью. bubenok 03.05.14 в 07:00 |
||
|
Это большая тема, и для краткости в примерах кода были опущены некоторые детали, которые вы должны будете заполнить по своему усмотрению. bubenok 03.05.14 в 07:11 |
||
|
Надеюсь они все же останутся достаточно понятными, чтобы видеть общую картину. bubenok 03.05.14 в 07:13 |
||
|
Если вы никогда не слышали о конечных автоматах - не грустите. bubenok 03.05.14 в 07:13 |
||
|
Разработчики искуственного интеллекта и хакеры компиляторов хорошо с ними знакомы, в других же программистских кругах о них знают не так много. bubenok 03.05.14 в 07:22 Они хорошо известы хакерам искуственного интеллекта и компиляторов, в кругах программистов других областей о них знают меньше. Deo 31.08.14 в 12:38 |
||
|
Я думаю, они должны быть более широко известны, и я собираюсь применить их для решения различного типа задач. bubenok 03.05.14 в 07:25 Поскольку я считаю, что они должны быть более известны, я собираюсь применять их для решения разных задач. Deo 31.08.14 в 12:40 |
||
|
Это перекликается с ранним периодом развития искуственного интеллекта. bubenok 03.05.14 в 07:29 |
||
|
В 50-е и 60-е большая часть исследований искуственного интеллекта была сосредоточена на обработке языка. bubenok 03.05.14 в 07:33 |
||
|
Многие из методов компиляторов, которые сегодня используются для парсинга языков программирования были изобретены для парсинга человеческого языка. bubenok 03.05.14 в 07:37 Многие используемые компиляторами техники распознавания языков программирования изобретены на основе распознавания человеческих. Deo 31.08.14 в 12:45 |
||
|
Мы все были там. bubenok 03.05.14 в 07:37 Нам всем это знакомо Deo 31.08.14 в 12:45 |
||
|
Мы работали над маленьким двухмерным платформером. bubenok 03.05.14 в 07:40 |
||
|
Наша задача состояла в реализации героини, которая была аватаром игрока в игровом мире. bubenok 03.05.14 в 07:42 |
||
|
Это означает, что она должна была реагировать на команды пользователя. bubenok 03.05.14 в 07:45 |
||
|
Нажимаем на кнопку В и она должна прыгнуть. bubenok 03.05.14 в 07:46 |
||
|
Достаточно просто: bubenok 03.05.14 в 07:46 Довольно просто: Deo 31.08.14 в 12:50 |
||
|
void Heroine::handleInput(Input input) bubenok 03.05.14 в 07:46 |
||
|
{ bubenok 03.05.14 в 07:46 |
||
|
if (input == PRESS_B) bubenok 03.05.14 в 07:46 |
||
|
} bubenok 03.05.14 в 07:46 |
||
|
yVelocity_ = JUMP_VELOCITY; bubenok 03.05.14 в 07:47 |
||
|
setGraphics(IMAGE_JUMP) bubenok 03.05.14 в 07:47 |
||
|
; bubenok 03.05.14 в 07:47 |
||
|
} bubenok 03.05.14 в 07:47 |
||
|
} bubenok 03.05.14 в 07:47 |
||
|
Нашли ошибку? bubenok 03.05.14 в 07:47 |
||
|
Никак не предотвращена возможность "воздушных прыжков": долбите по кнопке B пока она в воздухе и она будет в подвешенном состоянии вечно. bubenok 03.05.14 в 07:51 Ничто не мешает совершать "воздушные прыжки": долбите "B", пока она в воздухе и она будет парить вечно. Deo 31.08.14 в 12:52 |
||
|
Простой способ исправить это - добавляем булево поле isJumping_ к Heroine, которое отслеживает прыгнула ли наша героиня и делаем следующее: bubenok 03.05.14 в 07:54 |
||
|
void Heroine::handleInput(Input input) bubenok 03.05.14 в 07:54 |
||
|
{ bubenok 03.05.14 в 07:54 |
||
|
if (input == PRESS_B) bubenok 03.05.14 в 07:54 |
||
|
{ bubenok 03.05.14 в 07:54 |
||
|
if (!isJumping_) bubenok 03.05.14 в 07:55 |
||
|
{ bubenok 03.05.14 в 07:55 |
||
|
isJumping_ = true; bubenok 03.05.14 в 07:55 |
||
|
// Jump... bubenok 03.05.14 в 07:55 |
||
|
} bubenok 03.05.14 в 07:55 |
||
|
} bubenok 03.05.14 в 07:55 |
||
|
} bubenok 03.05.14 в 07:55 |
||
|
Здесь также должен быть код, который устанавливает isJumping_ назад в false, когда героиня касается земли. bubenok 03.05.14 в 07:57 |
||
|
Я опустил его для краткости. bubenok 03.05.14 в 07:59 |
||
|
Затем, мы хотим чтобы героиня пригибалась если игрок нажимает вниз, а она при этом стоит на земле, и вставала когда игрок отпускает кнопку. bubenok 03.05.14 в 08:03 |
||
|
void Heroine::handleInput(Input input) bubenok 03.05.14 в 08:03 |
||
|
{ bubenok 03.05.14 в 08:03 |
||
|
if (input == PRESS_B) bubenok 03.05.14 в 08:03 |
||
|
{ bubenok 03.05.14 в 08:03 |
||
|
// Jump if not jumping... bubenok 03.05.14 в 08:03 |
||
|
} bubenok 03.05.14 в 08:03 |
||
|
else if (input == PRESS_DOWN) bubenok 03.05.14 в 08:04 |
