Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Разное > Флейм
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.05.2013, 17:33
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
Восклицание Записки начинающего Игродела

Доброго времени суток все кто читает мой текст. Я зарегистрировался совсем недавно, хотя давно уже пользуюсь ресурсами вашего форума для самообучения, однако, как оказалось, учусь я слишком медленно. Дело в том, что мне надо в течение двух недель закончить курсовую по программированию и это без учета, что другие предметы сдавать надо. Но ладно, это моя проблема и не буду грузить ею )
Итак, суть.
Я создаю игру.
2D слэшер. Как я понимаю это достаточно простая игрушка, ибо все что я хочу, это небольшая локация 800 пикс шириной и 300 высотой. Есть анимированный герой, который сражается с толпами мобов прибывающих с двух сторон экрана.
Детали игры таковы:
- у Героя есть шкала жизни и ярости. Жизнь имеет пассивную регенерацию. Ярость заполняется при нанесении урона мобам и в три раза быстрее заполняется при получении урона от мобов.
- Герой может бегать, прыгать, а кнопкой down еще и защищаться мечом.
- Герой получает опыт за убийство мобов и за определенное количество опыта он получает уровни. За уровни получает бонусы, что дают ему преимущество (например, если кто-то играл - Crimsonlands. Там тоже есть за уровни бонусы, которые дают увеличенные жизни, регенерацию и т.д.)
- у Героя по мимо обычной атаки есть одна единственная спец. атака, которой можно воспользоваться при полном заполнении шкалы злости.
- с повышением уровня героя, я хочу попытаться сделать увеличение силы приходящих монстров, а так же их количество.

В принципе, это всё.
Единственное, я еще хотел повставлять звук, - фоновая музыка, реплика героя, когда у него мало жизни, реплика героя когда он делает спец.атаку реплика когда умирает, реплика когда получает уровень.

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

Вот...
У меня есть основа, но я все еще разбираюсь с движением героя и происходит это... Весьма туго. Я бы не обращался и сделал бы всё сам, но у меня поджимают сроки и потому, я прошу вашего времени и помощи в моем проекте.
Единственное что я из всего этого сделал, это фон и способность героя бегать по форме, что, конечно, вас может не впечатлить. Исходный код или проще, - сам исходник я могу скинуть если согласитесь мне помочь, - не хочу тему загружать.
Заранее благодарю за любую подсказку.
Ответить с цитированием
  #2  
Старый 13.05.2013, 18:04
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Работа, код на шару.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 13.05.2013, 18:15
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Если Вы имеете в виду это, то мне не нужны ни шара, ни заказ программера. Мне нужны лишь ответы на конкретные вопросы и подсказка, если это возможно.
Благодарю.
Ответить с цитированием
  #4  
Старый 13.05.2013, 18:22
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Мне нужны лишь ответы на конкретные вопросы
В таком случае следует задавать конкретные вопросы. Например:
- Как вывести изображение на форму?
- Как сделать перемещение изображения на форме в зависимости от нажатых клавиш?
- Как сделать анимацию (изменяющуюся картинку)?
...
Все конкретные вопросы предварительно задаются гуглу, и только если ответа там нет - пишутся здесь.
Вопросы, ответ на которые вряд ли удастся получить (не конкретные):
- Как сделать, чтобы герой мог бить монстров?
- Как сделать, чтобы герой прокачивался?
...

Пока что я не вижу ни одного вопроса в теме. Как следствие, и ответить ничего не могу.
Задавай вопросы, будем обсуждать.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 13.05.2013 в 18:24.
Ответить с цитированием
  #5  
Старый 13.05.2013, 19:12
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Да, Баргест, прошу прощения, Вы правы.

Я буду задавать вопросы по мере продвижения, так, я думаю, будет удобней.

На данном этапе у меня проблема с прыжками. Я гуглил ответ на вопрос, как разработать гравитацию (обычное равноускоренное движение) и сделать её глобальной процедурой, дабы, если герой находится в воздухе, он всегда возвращался на исходную координату Y. Я сделал подобие гравитации, однако у меня оно нагло зависло. А при попытке сделать самостоятельное, плавное падение с ускорением, - действие происходит моментально.

Так же я все еще не могу разобраться как сделать "карточку" персонажа и монстра. То есть количество жизни, сила атаки.

Позвольте я покажу исходник, может Вы сможете что-то подсказать?

тык - у форума почему-то загрузчик ошибает.
Примечание:Ссылку обновил.

Последний раз редактировалось Царь, 13.05.2013 в 19:23.
Ответить с цитированием
  #6  
Старый 13.05.2013, 19:25
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
На данном этапе у меня проблема с прыжками.
Если надо прыгнуть, значит надо задать стартовую скорость (вверх). Вектор силы тяжести действует постоянно. Самый простой вариант - на каждой итерации игры (глобальный счетчик) нужно ко всем векторам скоростей прибавить вектор dt * g, где dt - интервал времени между двумя итерациями. После этого все тела сдвигаются в соответствии со своими векторами скоростей на V*dt. Если прыгает только герой - вычисляем только для него. Так же на время нахождения в воздухе (координата Y > 0) можно отключить управление.
Разумеется, нужно сделать проверку столкновений, но в данном случае все объекты можно считать круглыми, тогда столкновения считаются просто. Столкновение с землей - расстояние от центра окружности до прямой меньше радиуса, с другими предметами - расстояние между двумя центрами окружностей меньше суммы их радиусов.
Цитата:
Так же я все еще не могу разобраться как сделать "карточку"
"Карточка" - задать объект структурой или классом, у которого будут все характеристики. Жизни, координаты, скорости по осям. Для игрока - дополнительные параметры, как уровень, опыт и т.д. Все действия (перемещение, удары, "прокачка") производятся над этой структурой.
Такие вопросы надо по-хорошему решать на этапе проектирования. И ответ на них можно найти, если правильно сам вопрос поставить. А для этого нужно описать, что должно происходить, в виде структур данных и методов их обработки. Делать такие вещи после начала написания кода - получить кучу проблем при дальнейшей доработке. Но уже, собственно, поздно.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 13.05.2013 в 19:29.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Царь (14.05.2013)
  #7  
Старый 13.05.2013, 19:26
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Понял. Сейчас попробую инициализировать

Последний раз редактировалось Царь, 13.05.2013 в 19:29.
Ответить с цитированием
  #8  
Старый 24.03.2014, 09:34
ThierryH ThierryH вне форума
Прохожий
 
Регистрация: 22.03.2014
Сообщения: 2
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Добрый день.
Честно говоря впечатлен вашей статьей,
не могли бы вы мне помочь

Сразу говорю, я относительно недавно начал изучать язык, поэтому попрошу сильно не ругаться, за некоторые возможно глупые вопросы).

Сейчас сам пытаюсь реализовать небольшую игру.
И у меня возникла проблемка в самом начале, не могли бы подсказать как вы реализовали создание объектов Player (игрок) и Enemy(враги).

Вот, например, (начну с самого начала):
у меня есть модуль main и модуль objects:
Код:
TBase=class
       private
         x: Integer;
         y: Integer;
       public
         constructor Create(x0, y0: Integer);
         procedure setX (x0: Integer);       //назначают координаты
         procedure setY (y0: Integer);
         function  getX: Integer;            //возвращают координаты
         function  getY: Integer;
    end;

    { TStatic }

    TStatic=class(TBase)
      private
        bitmap: TBitmap;
      public
        constructor Create(x0, y0: Integer; bitmap0: TBitmap);
        procedure setBitmap (bitmap0: TBitmap);   // меняет изображ. внутри объекта
        function getBitmap: TBitmap;              // возвращает изображение
    end;

    { TAnimate }

    TAnimate=class(TBase)
      private
         bitmap: array[0..100] of TBitmap;
         curFrame: Integer;       //текущий кадр
         maxFrame: Integer;       //максим.кадр
      public
        constructor Create(x0, y0: Integer; bitmap0: array of TBitmap;
          maxFrame0: Integer);
        procedure nextFrame;       //меняет кадры
        procedure setBitmap(bitmap0: array of TBitmap);
        function getBitmap:TBitmap;
    end;
{ TEnemy }

    TEnemy=class(TAnimate)
      public
        procedure move;
    end;

    { TPlayer }

    TPlayer=class(TAnimate)
      private
        health: Integer;
      public
        constructor Create(x0, y0: Integer; bitmap0: array of TBitmap;
          maxFrame0: Integer);
        procedure moveLeft;
        procedure moveRight;
        function getHealth: Integer;
    end;


implementation

{ TEnemy }

procedure TEnemy.move;
begin
  y:= y+3;
end;

{ TPlayer }

constructor TPlayer.Create(x0, y0: Integer; bitmap0: array of TBitmap;
  maxFrame0: Integer);
begin
  inherited;
  health:= 100;
end;

procedure TPlayer.moveLeft;
begin
  x:= x-5;
end;

procedure TPlayer.moveRight;
begin
  x:= x+5;
end;

{ TAnimate }

constructor TAnimate.Create(x0, y0: Integer; bitmap0: array of TBitmap;
  maxFrame0: Integer);
begin
  x:=x0;
  y:=y0;
  bitmap:=bitmap0;
  curFrame:= 0;
  maxFRame:= maxFrame0;
end;

procedure TAnimate.nextFrame;
begin
  if curFrame < maxFrame then
     curFrame:=curFrame+1
  else
      curFrame:=0;
end;

procedure TAnimate.setBitmap(bitmap0: array of TBitmap);
begin
  bitmap:=bitmap0;
end;

function TAnimate.getBitmap: TBitmap;
begin
  result:=bitmap[curFrame];
end;

{ TStatic }

constructor TStatic.Create(x0, y0: Integer; bitmap0: TBitmap);
begin
  x:=x0;
  y:=y0;
  bitmap:=bitmap0;
end;

procedure TStatic.setBitmap(bitmap0: TBitmap);
begin
  bitmap:=bitmap0;
end;

function TStatic.getBitmap: TBitmap;
begin
  result:=bitmap;
end;

{ TBase }

constructor TBase.Create(x0, y0: Integer);
begin
  x:=x0;
  y:=y0;
end;

procedure TBase.setX(x0: Integer);
begin
  x:=x0;
end;

procedure TBase.setY(y0: Integer);
begin
  y:=y0;
end;

function TBase.getX: Integer;
begin
  result:=x;
end;

function TBase.getY: Integer;
begin
  result:=y;
end;

end.

В модуле main у меня след.образом объявлены переменные:
Код:
Form1: TForm1;

  //graphics
  plPic: array [0..2] of TBitmap;
  grPic: array [0..2] of TBitmap;
  enPic: array [0..2] of TBitmap;
  seaPic: TBitmap;
  bulPic: TBitmap;

  //objects
  Player: TPlayer;
  Sea: array [0..1] of Tsea ;
  Ground: array [0..2] of TGround;
  Bullet: array [0..100] of TBullet;
  Enemy: array [0..100] of TEnemy;

  //booleans
  MoveL, MoveR: boolean;
  Shoot: boolean;

  //Integers
  delay:Integer;
  score: Integer;

И подгружается графика:
//load graphics
  //player
  for i:=0 to 2 do
      begin
        plPic[i]:= TBitmap.Create;
        plPic[i].LoadFromFile('img/player'+IntToStr(i)+'.bmp');
        plPic[i].Transparent:= True;
      end;

//enemies  (графика для enemy)
  for i:=0 to 2 do
      begin
        enPic[i]:= TBitmap.Create;
        enPic[i].LoadFromFile('img/enemy'+IntToStr(i)+'.bmp');
        enPic[i].Transparent:= True;
      end;
MAD: напоминаю про теги

Далее идет реализация процедур.

Проблема в том, что в модуле objects выдает ошибку incompetible types (bitmap и bitmap0).........прошу вас посмотреть, что можно исправить.
А также подскажите, пож-та, как вы реализовали создание объектов.

Последний раз редактировалось M.A.D.M.A.N., 24.03.2014 в 15:07.
Ответить с цитированием
  #9  
Старый 24.03.2014, 12:03
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от ThierryH
Проблема в том, что в модуле objects выдает ошибку incompetible types (bitmap и bitmap0).........прошу вас посмотреть, что можно исправить.
Поле bitmap сделай динамическим массивом:
Код:
    { TAnimate }
 
    TAnimate=class(TBase)
      private
         bitmap: array of TBitmap;
А загрузку делай так:
Код:
procedure TAnimate.setBitmap(bitmap0: array of TBitmap);
var
  i: Integer;
begin
  SetLength(bitmap, Length(bitmap0));
  for i := 0 to High(bitmap) do bitmap[i] := bitmap0[i];
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:36.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter