Отправляет email-рассылки с помощью сервиса Sendsay

[prg] враги в bgt

здравствуйте.
вопрос к знающим bgt, вот делаю класс:
class enemy
{
int hp;
enemy()
{
hp = 100;
}
}
а можно еще подробней о создании врага? как сделать его перемещение,
атаку, мою атаку и т.д?

Ответить   Thu, 11 Dec 2014 08:35:46 +0300 (#3179683)

 

Ответы:

Приветствую!

Никогда больше не давайте переменным такие имена (особенно членам класса).

Подробности бывают разные. Например, вот так: сначала нужно описать игровой
объект обычным языком в письменном виде. Затем проанализировав этот текст,
составить список действий, которые этот объект должен выполнять, и список
свойств, которыми должен обладать.
На основании этого списка вы проектируете класс: действия станут методами
класса, а свойства объекта -- переменными (свойствами) класса.
Например, для перемещения объекта нужны свойства "позиция" и "скорость", а
также метод "движение", который и должен будет вычислять новую позицию
объекта, исходя из его скорости и прошедшего времени с момента предыдущего
вычисления.
Если это недостаточно подробно, то теорию конечных автоматов, основы
объектно-ориентированного программирования (и проектирования), а также
синтаксис языка сценариев BGT рекомендую изучить самостоятельно (материалов
в сети достаточно). Эти темы непосредственно касаются ответа на ваш вопрос,
если бы этот ответ был максимально подробным.

Ответить   "i_chay" Fri, 12 Dec 2014 07:32:49 +0300 (#3180421)

 

К этому ещё нужно добавить список состояний, которыми характеризуется
поведение объекта, например, покой, атака, бегство, поиск_цели,
поиск_предмета и т.п. (в соответствии с тем текстовым описанием, которое вы
придумали ранее).
Эти состояния и составят таблицу переходов (состояний) в вашем классе.

Ответить   "i_chay" Fri, 12 Dec 2014 07:43:53 +0300 (#3180427)

 

здравствуйте
я вас не совсем понимаю, мне нужен пример.
ну сделаю я класс, я понимаю что нужен speed и т.д только как это
используется, я уже голову сломал.
что я смог сделать только вот класс который я писал, и игру с
передвижением, вот ее код:
#include "dynamic_menu.bgt"

const int board = 20;
int player_position = 1;
int hp = 20;
sound start;
sound music1;
sound music;
sound shag;

void main()
{
music.load("sounds/music.wav");
music.volume = -30;
music1.load("sounds/music1.wav");
music1.volume = -10;
shag.load("sounds/shag.wav");
shag.volume = 50;
start.load("sounds/start.wav");
start.volume = 30;
tts_voice voice;
dynamic_menu menu;
menu.allow_escape = true;
menu.wrap = true;
menu.add_item_tts("Start game");
menu.add_item_tts("Exit game");
show_game_window("Enemy");
voice.speak_wait("Welcome to Enemy");
music.play_looped();
int choice;
do
{
choice = menu.run("Please choose a menu item with the arrow keys, then
hit enter to activate it.", true);
if(choice==1)
{
music.stop();
game_play();
}
}
while(choice!=0 and choice!=3);
music.stop();
voice.speak_wait("Thanks for playing.");
}

void game_play()
{
start.play_wait();
while(true)
{
music1.play_looped();
if(key_pressed(KEY_LEFT) and player_position>0) {
player_position--;
shag.play();
}
if(key_pressed(KEY_RIGHT) and player_position<20) {
player_position++;
shag.play();
}
if(player_position<0)
{
player_position++;
}
if(player_position>20)
{
player_position--;
}
}
}
и все.

Ответить   Fri, 12 Dec 2014 20:47:00 +0300 (#3181011)

 

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

Большинство игр строятся по принципу бесконечного цикла, который называется
"игровым циклом". В этом цикле обновляются состояния всех игровых объектов.
Игровые объекты описываются базовым классом, например, something от которого
наследуются все остальные классы игровых объектов (player, enemy и т.д.).

У базового класса something должен, как минимум, быть метод update(),
который вы и будете вызывать на каждой итерации игрового цикла.
У всех наследников этого класса вы можете переопределять метод update() так,
чтобы в нём реализовать соответствующее поведение. Например, enemy будет
менять свою позицию и атаковать игрока; player будет обрабатывать нажатия
клавиш и менять свою позицию или стрелять в зависимости от нажатой клавиши и
т.д.
Для игры с множеством игровых объектов они собираются в список или массив,
который нужно перебирать на каждой итерации игрового цикла и вызывать метод
update() для каждого объекта.
В обобщенном виде это выглядит так (это псевдо-код, а не рабочий вариант):
...
something@[] objects;
...
while(state!=GAME_OVER)
{
for (int i=0; i<objects.length();++i)
{
state = objects[i].update(time_step);
}
wait(time_step);
}
...
Строка
while(time_step);
позволяет вам регулировать продолжительность одной игровой итерации так,
чтобы события игры не происходили слишком быстро.
Более корректным будет расчёт времени задержки как разности между требуемой
продолжительностью одной итерации и времени, затраченного на обновление всех
объектов.

Ответить   "i_chay" Sat, 13 Dec 2014 15:57:01 +0300 (#3181464)

 

подразумевалась строка:
wait(time_step);

Ответить   "i_chay" Sat, 13 Dec 2014 18:21:32 +0300 (#3181506)

 

все равно не пойму.
может вы знаете какую игру с открытым кодом где это есть?

Ответить   Sun, 14 Dec 2014 06:57:42 +0300 (#3181666)