Урок 16 SFML, расставляем случайно объекты в SFML

Рандом может вам понадобиться. К примеру в случае заполнения карты какими то бонусами. Да вспомните простую игру “Змейка”! Там тоже актуально расставление яблочек в рандомном месте.

Видеоверсия http://www.youtube.com/watch?v=J4mN0j3EWNc&feature=youtu.be

 

Не буду вас томить и перейдем к делу. Расставим псевдослучайным (далее буду называть просто “случайным”) образом камни на карте. Сначала расставим их перед самой игрой, а потом и в процессе игры по таймеру.

Внизу файла map.h напишите:

 

Итак , функция расставляет камешки. У нас две случайные величины – для горизонтали и для вертикали. Так же имеется количество камней, заметьте, что оно не должно превышать ширина*высота карты – бордюр карты. То есть почти что площадь карты, или площадь карты (если хотите ставить и вместо бордюров, что не имеет смысла). Потом идет цикл, пока количество камней больше нуля , мы заполняем карту этими камнями. Генерируется случайное число в интервале от одного и до ширина/высота карты -1, (-1 для того, чтобы не генерировать для бордюра карты).
Далее идет условие – если случайный элемент карты равен ‘ ‘,
то рисуем на его месте камень. Получается этим мы исключаем возможность нарисовать камень вместо камня или на другом месте, на котором нельзя рисовать. Потом ниже я вывожу координаты камня в консольке , чтобы вы посмотрели на них. И декрементирую счетчик камня (уменьшаю на единицу). Всё:)

 

Чтобы нарисовать случайным образом камни при запуске игры – функцию “randomMapGenerate();” стоит вызывать в int main() до цикла sfml “пока открыто окно”, тем самым вы сразу нарисуете карту с рандомными камнями.  Например пользователь вводит в настройках перед игрой – сколько он хочет камней увидеть, или это будет зависеть от сложности игры. Допустим , если сложность лёгкая, то мы рисуем рандомно сердечки и большом количестве, если хардкор – то в малом. И тд

Как вы знаете рисовать мы можем и в процессе игры. Если вы хотите, чтобы камень появлялся каждые, допустим 3 секунды, то следует вызывать функцию randomMapGenerate(); в теле цикла sfml “пока открыто окно” , создав перед этим таймер. Таким образом игрок увидит эту генерацию в процессе игры.

 

Перед этим объявив таймер до “пока открыто окно”:

Можете сделать так, что камень будет появляться каждые 5 секунд(или сразу) в случайном месте нашей карты как только вы его съедите. Тогда ваш персонаж превратится в змейку :)

Код урока:

main.cpp

 

map.h

 

 

Буду благодарен, если поделитесь:
SFML вопросы, прошу, задавайте на форуме.
  1. //рисуем поле из пробелов и границы из нулей
    for (int i = 0; i < (x + 2); i++)
    {
    for (int j = 0; j < (y + 2); j++)

    if (i == (x+1) || i == 0 || j == (y + 1) || j == 0){ field[i][j] = '0'; }
    else { field[i][j] = ' '; }
    };
    можно добавить еще.

  2. Хоршо, такой вопрос, по функции RandomMapGenerate() Если же выпадут координаты точки где уже есть камень то я так понимаю что прото будет выход из функции и камень не выпадет. Правильно понимаю? Если да, то было бы логично(правильно) написать: else и в нем снова вызвать функцию эту же. Или же есть более логичные варианты?

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