Разработка игры Fly (Заключение)

Опубликовал – 03.07.2010

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

Давайте для начала поработаем с фоном. Создадим несколько фоновых картинок с размерами 400х360. Назовем их back0.bmp..backN.bmp. Я добавил еще две. Теперь добавим процедуру загрузки фона в хаотичном порядке, в модуле uGraphics, в классе TRender:

procedure TRender.GenerateBack(back: ShortString);
var r: Integer;
begin
  r := random(3);
  Screen[SCR_BACK] := imagelib.Get(back + inttostr(r));
end;

А в конструкторе соответственно будем вызывать эту функцию заместо старой инициализации:

  GenerateBack(back);

Теперь, что же делать со статистикой. Ведь как то надо рассчитать, убийства сделанные только нашим корабликом. Это очень простое решение, добавляем в класс TGameObject две переменные:

  targetid: DWORD; //цель
  iskill: Boolean; //убита ли

в конструкторе их обнуляем:

  targetid:= 0;
  iskill  := false;

Точно так же обнулять надо в процедуре MakeStep(). Теперь нам надо при столкновении выстрела, записывать в эти переменные соответствующие значения, открываем модуль uModule, ищем класс TFire и обработчик столкновений в MakeStep(), вот так:

  for i := 0 to pred(gameobjectlist.Count) do begin
    pgo := gameobjectlist.Items[i];
    if (pgo^.id = parrentid) then continue;
    if (pgo^ = self) then continue;
    if (pgo^.remove) then continue;
    if (pgo^.id = ID_EXP) then continue;
    if (pgo^.id = ID_SHOT) then continue;
    if (pgo^.id = ID_BOMB) then continue;
    if (hasIntersect(rc, pgo^.rc)) then begin
      gameobjectlist.Add(TExp.Create(point(pos.x + size.x shr 1, pos.y + size.y shr 1)));
      targetid := pgo^.id; //в кого попали
      if (pgo^.life = 1) then iskill := true; //если последняя жизнь
      setbit(pgo^.state, ST_HIT);
      remove := true;
    end;
  end;

Вот так все просто. Теперь в модуле uGameObjectList, в классе TGameObjectList создадим процедуру обнуления статистики:

procedure TGameObjectList.ClearStatistics();
begin
  diePlane := 0;
  dieHeli := 0;
end;

А в процедуру удаления объектов внесем изменения для получения статистики:

      if (pgo^.id = ID_SHOT) and (pgo^.iskill) then begin
        if (pgo^.targetid = ID_PLANE) then inc(diePlane);
        if (pgo^.targetid = ID_HELI) then inc(dieHeli);
      end;

Вот так все просто! Давайте теперь подумаем как оживить наш кораблик после смерти. Мне кажется нужно просто создать объект класса TSubmarine снова и поместить его в список объектов. Так мы и сделаем при нажатии кнопки F5, в случае смерти кораблика. Я покажу всю функцию работы с клавиатурой, чтобы все стало понятно:

procedure TGame.ProcessKey();
begin
  if (gameobjectlist.GetCount(ID_SHIP) <> 0) then begin
    if (boolean(GetKeyState(VK_LEFT) and $80)) then
      TSubmarine(player).MoveTo(VEC_LEFT);
    if (boolean(GetKeyState(VK_RIGHT) and $80)) then
      TSubmarine(player).MoveTo(VEC_RIGHT);
    if (boolean(GetKeyState(VK_SPACE) and $80)) then
      TSubmarine(player).Shot();
  end else begin
    if (boolean(GetKeyState(VK_F5) and $80)) then begin
      player := gameobjectlist.Add(TSubmarine.Create());//создаем игрока
      render.GenerateBack('back');//хаотично выбираем фон
      gameobjectlist.ClearStatistics();//обнуляем статистику
    end;
  end;
end;

Теперь надо оповестить пользователя после смерти, что можно продолжить игру нажав клавишу F5:

  if (gameobjectlist.GetCount(ID_SHIP) <> 0) then begin
    render.TextOut(point(10, FieldHeight - 70), 'life: ' + inttostr(player.life));
    render.TextOut(point(10, FieldHeight - 50), 'obj count:' + inttostr(gameobjectlist.count));
    render.TextOut(point(10, FieldHeight - 30), 'die: ' + gameobjectlist.GetStatistics());
  end else begin
    render.TextOut(point((FieldWidth - 90) shr 1, 200), 'Game Over');
    render.TextOut(point((FieldWidth - 180) shr 1, FieldHeight - 20), 'Press F5 to replay');
  end;

Довольно просто, не так ли? Теперь, мне бы хотелось, чтобы Вы сами поработали над игрой и придумали какой-нибудь вид самолета с интересным АИ, например. Можно сделать чтобы самолет пролетал мимо, очень быстро и кидал последовательно несколько снарядов, ровно над вашим кораблем. Ну там уж, как у вас фантазии хватит. Буду рад увидеть Ваши работы. Надеюсь статьи принесли Вам хоть немного удовольствия.

Исходные коды к данной статье fly (part 7). Успехов!

Рассказать друзьям:
  • Добавить ВКонтакте заметку об этой странице
  • Мой Мир
  • Facebook
  • Twitter
  • Яндекс.Закладки
  • В Живую Ленту Google
  • Сто закладок
Комментарии (2) - Разработка игры Fly (Заключение)

Ответ

  1. Анонимно:

    Молодец! Большое спасибо, очень интересно и доходчиво. Жду от вас новых статей.

    Thumb up Thumb down 0

Ответить

Comments

Перед отправкой формы: