BGT — Множество объектов

При создании игр у вас может возникнуть вопрос, как сделать много объектов.
Например, вы делаете игру, где много каких-нибудь роботов, которые должны убивать персонажа.
Не будете же вы прописывать переменные для каждого робота. Это сильно грузит процессор, да и вообще плохо сказывается на производительности игры.
Лучше автоматизировать сей процесс.
Это можно делать несколькими способами.
Способ массивов, как я сам его называю и объектный способ.
Сегодня мы рассмотрим только 1 способ: массивный.
Наша задача: создать игру, где игрок тупо собирает яйца, получая за это очки.
Если вы играли в коллекцию игр, то там тоже была игра «В поисках яиц».
Вот мы и создадим её подобие.
#include»sound_pool.bgt»;
sound_pool s;
//Задаём случайные координаты игрока
int x=random(1, 100);
int y=random(1, 100);
//Переменная очков
int points=0;
//Создаём массив с координатами яиц
int[] egg_x;
int[] egg_y;
//Создаём массив слотов для яиц, чтобы управлять их звуками через sound_pool
int[] egg_slot;
void main() {
show_game_window(«Тест»);
//У нас будет 20 яиц на поле, поэтому задаём значение для двадцати.
for(int i=0; i<20; i++) {
egg_x.insert_at(i, random(1, 100));
egg_y.insert_at(i, random(1, 100));
//Запускаем проигрывание звука яйца.
egg_slot.insert_at(i, s.play_2d(«egg.wav», x, y, egg_x[i], egg_y[i], true));
}
while(true) {
//Делаем движение игрока по полю.
if(key_pressed(KEY_LEFT)) {
x-=1;
s.play_stationary(«step»+random(1, 3)+».wav», false);
}
if(key_pressed(KEY_UP)) {
y+=1;
s.play_stationary(«step»+random(1, 3)+».wav», false);
}
if(key_pressed(KEY_RIGHT)) {
x+=1;
s.play_stationary(«step»+random(1, 3)+».wav», false);
}
if(key_pressed(KEY_DOWN)) {
y-=1;
s.play_stationary(«step»+random(1, 3)+».wav», false);
}
//Запускаем цикл, в котором будем работать с яйцами.
for(int i=0; i<20; i++) {
//Создаём условие, чтобы игрок взял яйцо, наступив на его координаты.
if(x==egg_x[i] and y==egg_y[i]) {
//Проигрываем звук того, что игрок взял яйцо.
s.play_stationary(«egg take.wav», false);
//Перемещаем яйцо на новые координаты и даём его слоту новый звук.
s.destroy_sound(egg_slot[i]);
egg_x[i]=random(1, 100);
egg_y[i]=random(1, 100);
egg_slot[i]=s.play_stationary(«egg.wav», false);
//Начисляем игроку одно очко.
points+=1;
}
}
//Делаем просмотр очков.
if(key_pressed(KEY_SPACE))
alert(«Сообщение», points);
if(key_pressed(KEY_ESCAPE))
exit();
s.update_listener_2d(x, y);
}
}
Как вы поняли, мы создавали массив для каждой переменной объекта.
У каждого из яиц есть переменные:
координата x, координата y, слот для звука.
Нам нужно создать таких 20 яиц, поэтому создаём три массива для каждой переменной.
А потом в while просто запускаем цикл, который ежесекундно проверяет условие в своём теле.
Также вы можете создавать и много врагов, только переменных у них будет больше и условий тоже больше.
Бывает так, что нужно создать массив не int или string, а массивы таймеров, звуков, логических значений и т. д.
Делается это вот так:
sound[] my_sound;
timer[] my_timer;
bool[] life;
vector[] v;
По идее всё также, как и с int и string.
Пробуйте создавать много объектов, пробуйте делать так, чтобы они двигались и жили своей жизнью.
Всем удачи, вопросы пишем в комментах к статье.

BGT — Множество объектов: 0 комментариев

  1. Добрый день! У меня вопрос на стыке тем массивы и объекты. Пытаюсь создать массив объектов введённого мною класса. Это невозможно? Например, создать множество видов оружия через класс weapon, с помощью метода new_weapon(int id, int damage, int level, string description); Соответственно оружию задаётся идентификационный нормер, наносимый врагу урон, уровень, с которого оружие доступно герою и описание, которое игрок видит при осмотре оружия, как предмета в инвентаре. Класс уже создан предварительно. Теперь я создаю массив weapon[] my_weapons; и начинаю каждой ячейке массива присваивать по объекту через метод new_weapon с указанием своих параметров для каждого оружия. Например так:
    my_weapons[0]=new_weapon(1, 15, 1, "Старый потрёпанный в боях меч со сколами на лезвии");
    и ещё пробовала через метод работы с массивами .insert_at вот так:
    my_weapons.insert_at(0,new_weapon(1, 15, 1, "Старый потрёпанный в боях меч со сколами на лезвии"));

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

  2. нет, нужно не так.
    weapon[] my_weapons;
    weapon test;
    my_weapons.insert_at(0, test);
    my_weapon[0].new_weapon(1, 15, 1, "Старый потрёпанный в боях меч со сколами на лезвии");
    вот так получится.

  3. а вы просто попытались массиву, у которого тип weapon, присвоить метод.
    это всёравно, что в числовой массив типа int пытаться запихнуть строку или логическую переменную.

Добавить комментарий