Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.08.2013, 11:43   #1
Alexandr17-10
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 99
По умолчанию игра с игровым движком DelphiX

Код:
Type
  TPlayerSprite = class(TImageSprite)       //Êëàññ èãðîêà
  protected
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override; //ñòîëêíîâåíèå
    procedure DoMove(MoveCount: Integer); override; // Äâèæåíèå
  public
    Lives:Integer; //Æèçíü
    IDIndexPula:Integer;
    MaxPurpose:Integer;
    IDPurpose:Array of Integer;
    ActivCollisionDwerID:Boolean;
    NamesSprite:String;
    constructor Create(AParent: TSprite); override; //ïðè ñîçäàíèè
    destructor Destroy; override; // ïðè ñìåðòè
  end;

  TEnemiesSprite = class(TImageSprite) // Êëàññ âðàãà
  Protected
    // Ñòîëêíîâåíèå
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
    procedure DoMove(MoveCount: Integer); override;  //Äâèæåíèå
  public
    Lives:Integer; //Æèçíü
    ActivDoMove:Boolean; //Ðàçðåøàåì ëè ìû åìó äâèãàòüñÿ
    constructor Create(AParent: TSprite); override; //ïðè ñîçäàíèè
    destructor Destroy; override; // ïðè ñìåðòè
  end;

  TSpiderSprite = class(TImageSprite) // Êëàññ áîññà
  Protected
    // Ñòîëêíîâåíèå
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
    procedure DoMove(MoveCount: Integer); override;
  public
    Lives:Integer; //Æèçíü
    constructor Create(AParent: TSprite); override; //ïðè ñîçäàíèè
    destructor Destroy; override; // ïðè ñìåðòè
  end;

  TDwerSprite = class(TImageSprite)
  Protected
    procedure DoMove(MoveCount: Integer); override;
  public
    ActivDvigX:Boolean;
    AnimDvigX:Integer;
    AnimDvigY:Integer;
    constructor Create(AParent: TSprite); override; //ïðè ñîçäàíèè
  end;
...
PlayerSprite:TPlayerSprite;
  EnemiesSprite:Array of TEnemiesSprite;
  SpiderSprite: TSpiderSprite;
  DwerSprite:Array of TDwerSprite;
...
procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
var i:integer;
begin
  For i:= 0 to Length(EnemiesSprite)-1 do
    if Sprite is EnemiesSprite[I] then
      Lives:=Lives-MinusLive;
  For i:= 0 to Length(PulaSprite)-1 do begin
    If (Sprite is PulaSprite[i])and(PulaSprite[i].TypePule = 1) then
      Lives:=Lives-MinusLive;
    If (Sprite is PulaSprite[i])and(PulaSprite[i].TypePule = 2) then
      Lives:=Lives-(MinusLive * 3);
  end;

  For I := 0 to MaxPurpose do
    If Purpose[IDPurpose[i]].TypePurpose = 2 then
      If Sprite is DwerSprite[Purpose[IDPurpose[i]].IDDwerSprite] then
        Purpose[IDPurpose[i]].EnabledPurpose:=True
      else Purpose[IDPurpose[i]].EnabledPurpose:=False;
  Collision;
end;
Пишу маленькую игру с файлом карты на DelphiX но вот здесь выдает ошибку
if Sprite is EnemiesSprite[I] then
If Sprite is DwerSprite[Purpose[IDPurpose[i]].IDDwerSprite] then

Он не хочет почемута просчитывать столкновение для каждого спрайта только для всех но вот здесь нужно просчитывать столкновение для каждого спрайта по отдельности
If Sprite is DwerSprite[Purpose[IDPurpose[i]].IDDwerSprite] then

Делал по этому примеру
http://easyprog.ru/index.php?option=...=374&Itemid=53

но вообще использовал еще и этот
http://www.delphisources.ru/pages/fa...hix_part1.html

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

Можете помочь что делать может кто знает где достать нормальные уроки а лучше книгу по DelphiX или посоветуйте другой более легкий и быстрый движок 2D который работает с формой

Последний раз редактировалось Alexandr17-10; 19.08.2013 в 11:45.
Alexandr17-10 вне форума Ответить с цитированием
Старый 19.08.2013, 19:17   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Цитата:
Пишу маленькую игру с файлом карты на DelphiX но вот здесь выдает ошибку
Код:
if Sprite is EnemiesSprite[I] then
If Sprite is DwerSprite[Purpose[IDPurpose[i]].IDDwerSprite] then
Выдаёт ошибку потому что так нельзя писать в дельфи, неправильно Вы работаете с оператором is, он проверяет только соответствует ли некоторый объект (сам является или наследуется от ) указанному классу. У Вас же вместо класса справа от is стоит какой-то другой объект (ну в смысле экземпляр класса, а не сам класс).
Вот же по ссылкам, что Вы дали код:
Код:
if Sprite is TBullet
тут объект Sprite проверяется является ли он объектом типа (класса) TBullet или же наследуется от него (говоря строго - можно ли объект приводить/кастовать к этому классу)
Также теория по работе с объектами и классами, так как на мой взгляд, сперва надо освоить ооп, а потом уже работать с движками вроде дельфиикс, так как они подразумевают обязательное(емнип) использование ооп.

Также скажу, что дельфиикс безнадёжно устарел, лучше взять другие движки для дельфи, например, андорра2д - преемник дельфиикс, но без его тормозов и багов.
Также много других движков - компонентных и нет, для 2д , для 3д или для 2 и 3д, с опенгл или директикс или с обеими гапи, с тем или иным набором прочих подсистем - звук, физика, сеть и т.д. В общем, выбор широк, и прежде чем окончательно садиться программировать, надо определиться с задумкой игры и прикинуть какие вообще возможности нужны от движка, какие нужны фичи в игре, чтобы адекватно спроектировать работу программы и т.д. Посему, предлагаю Вам озвучить некий концепт игры и Ваши цели.
phomm вне форума Ответить с цитированием
Старый 19.08.2013, 20:26   #3
Alexandr17-10
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 99
По умолчанию

игра на столько легкая что подойдет любой который емеет способ содержать очень много спрайтов, имеет полноэкранный режим хотя не так обязательно, имеет возможность встроенных функций столкновение или чтобы легко быо написать свою функцию

Вообще Andora2d подойдет но он более новый или просто к нему нре стали делать уроки кроме одного

http://andorra.sourceforge.net/index...l?bb=tutot1rus

Английского не знаю. Для изучение в Delphi он желателен но не очень важен да и при том команды делфи это не слова с ними может и переводчик помочь. Так что я не могу разобраться в Andora2d. Мне бы по нему самоучитель на руском и я бы сделал игру. Вот что нужно

Загрузка спрайтов очень много количество желательно для каждого спрайта создать тип

Столкновение спрайта

DelphiX - Он мне бы подошел но там только предусмотренное количество спрайтов тоесть классов каждый класс там имеет каждый персонаж в прочем я уверен что там можно использовать один класс и не использовать ассив чтобы вывести несколько персонажей принадлежащих одному классу.

Гдето я находил движок который мне раньше не понравился. Раньше я был глуп и не понимал что если движок хоть и пишут там игры без формы то это не значит что ее нельзя использовать.
Движок назывался както где последние слово Engine и 4 толи 5 уроков создание игры
уроки показывали что код там пишется без формы так как движок имеет свое окно

Как бы мне хотелось найти этот движок но я все сайты перерыл первые 3 странницы в гугле и не нашел его.

Посоветуйте мне 2d движок с уроками на русском чтобы я смог научиться управлять спрайтами столкновением и т.п

Пробывал игру написать без движка испльзуя такой метод спрайтов http://delphiworld.narod.ru/base/sprites_work.html но спрайтов на столько много что не потянула. Единственный выход это использовать DirectX или OpenGl но знаний в этих графических движках у меня нет. Пробывал разобраться в OpenGl но так и не смог. Сильно сложно. Так что выход найти подходящий движок. Или самоучитель по Andora2D
Alexandr17-10 вне форума Ответить с цитированием
Старый 20.08.2013, 08:08   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Движок не напишет за тебя игру. Надо уметь программировать в определённой степени. Уроки и самоучители - также не сделают ничего, кроме того, что ты их повторишь и разберёшь. Своё без программирования на базе уроков сделать нельзя, будет просто тот же урок.
Движков на паскале(дельфи) на русском не сильно много, хотя со словом engine на конце многие.
Довольно хороший список движков с описанием есть тут: www.uraldev.ru/engines/‎ - не все под паскаль естественно. Ещё неплохой список (но жутко неудобный) есть тут: gcup.ru - опять же полный, без деления по языку.

Лично я не смогу назвать движок, который подошёл бы по запросам (хотя их сложно понять, скажем прямо, просто наборы слов).
Особенно удивляет, что беспокоишься о каких-то несущественных на данном этапе вещах, о производительности (ну тут скажем прямо - использовать мегастарье начала двухтысячных годов - это сразу ставит под сомнение ваши усердия).
Русский - советую не привязываться, лучше сразу работайте с англ ресурсами, пробуйте переводить переводчиками типа гугл транслейта, уроки лучше не по конкретным движкам смотреть, а по самой технике программирования игр, для чего желательно почитать всё отсюда
Т.е. сперва наработать теоретическую базу на простых уроках, можно даже разных движков или вовсе без них, и только потом уже пробовать реализовывать именно саму игру. Также вот теория по самому дельфи, чтобы быть уверенным в основах.

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

Опять же лично я не буду советовать движки и уроки, я просто скажу - начните с самого малого сперва - круг летает по форме или картинка персонажа статичная передвигается по форме от кнопок клавиатуры, и потом уже можно идти дальше, иначе Вы будете на каждой мелочи застревать очень надолго, а экспериментируя на рабочем проекте будет уходить туча времени на разборку, постройку, ломание, переделку.

И ещё, чем последовательнее будет подход в этой работе - тем быстрее будут результаты, тем более, что легко можно спросить какую-то деталь тут на форуме (если первичный поиск не дал ответа), обычно либо уже обсуждалось и кинут ссылку либо напишут ответ. Применяйте систематизированный подход, логику и всё будет.

Последний раз редактировалось phomm; 20.08.2013 в 08:30.
phomm вне форума Ответить с цитированием
Старый 20.08.2013, 11:30   #5
Alexandr17-10
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 99
По умолчанию

Я уже делал игру 1,5 года назад на VB6 но много ограниченицй да и удалил ее. Прочитал я об сообщение и думаю а а не сделать ее снова. Игра будет сделана путем уже сосставленных компонентах на Frame. Так как я хорошо знаком с ини то уровней можно замутить хоть тысячи. правдо врагов будет предусмотренное количество. так как програмно компонент на форме не создаш а вообще я гдето об этом слышл что можно но незнаю почему не заинтересовался. Толи один программист сказал что нельзя толи сказал что не правильно. Вообще несколько просьб

1 Где писать обработку движения и столкновения в таймере или в процедурах а сами процедуры использовать в таймере.

2 Как создать на форме компонент программно если можно то спрайты и не особо нужны тогда.

3 нужна задержка без зависании проекта.
Alexandr17-10 вне форума Ответить с цитированием
Старый 20.08.2013, 13:00   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

У вас набор слов, понять сложно. Ваш опыт с вб и ини в данном случае ничего не говорит, вы рассуждаете с позиции полного новичка.

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

1. Обработку столкновений оптимальнее писать в процедурах, а из таймера их вызывать, тогда код будет менее связным и более гибким к изменениям.
2.Создать программно "компонент" - у Вас же есть EnemiesSprite:Array of TEnemiesSprite; как Вы его наполняете данными ? вот если наполняете - то именно так и создавать.
Если же хотите классы, то они в компилируемых языках программно не создаются, но используется мощная модель ооп для возможностей комбинирования объектов в рантайме из готовых блоков-объектов (как на форму в дизайнтайме можно кнопок накидать - по сути это формирование новой сущности из готовых кусочков)
3. Непонятно что за задержка и что за зависание. Если речь о паузе игры, то делается разными способами - начиная от обычного флага и заканчивая сложным менеджером сцен. В случае с флагом надо лишь проверять его для тех объектов которые должны быть приостановлены - т.е. что-то такое:
Код:
if not GamePaused then Ememies.Interact();
Правильно написанный менеджер имеет некоторую аналогию такого флага, но в коде не надо везде проверять сам флаг, менджер это автоматом делает.

Повторяю, сделайте хотя бы простейший пинг-понг или змейку и сюда выложите, тут уже укажут на ошибки и в какую сторону развиваться.
phomm вне форума Ответить с цитированием
Старый 20.08.2013, 13:07   #7
Alexandr17-10
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 99
По умолчанию

Ну спроцедурами столкновения понятно что в процедуре. Я говорю про задержку движения хотя пока сделаю одинаковую скорость для всех элементов

Проблемы возникли со столкновением 2х имаге точнее сама функция есть

function TFrame2.Collision(XS1, YS1, WS1, HS1, XS2, YS2, WS2,
HS2: Integer): Boolean;
begin

end;

но как в ней обработать столкновение. Раньше знал теперь понять не могу. У вас этоже уже обсуждалось дай ссылку.
Alexandr17-10 вне форума Ответить с цитированием
Старый 20.08.2013, 13:33   #8
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Задержка делается через тики. Общеигровой таймер отсчитывает оч маленькие равные периоды времени (тики) и все проверяют их у себя (обычно через собственный счетчик), если на очередном тике у них настало время действовать - то вызывают нужным им код. Например один объект срабатывает раз в 10 тиков а другой раз в 9 тиков - он будет на 10 % чаще срабатывать - получится как бы быстрее, если надо ускорять/замедлять, то соответственно менять значение тика на котором действовать.

Столкновение 2 прямоугольных областей находится обычной математикой - у Вас, как я полагаю, функция принимает ху координаты и ширину и высоту прямоугольника первого и второго. Найти их пересечение проще простого, если представить себе их на обычной координатной плоскости.
Если (x1 >= x2) и (x1 <= x2+w2) то координата х первого прямоугольника лежит внутри отрезка х-координат второй области - надо свести в единое условие также и у-коориданты и остальные точки - таким образом проверя всё.
А также существует уже в дельфи и в винапи готовая функция для этого - IntersectRect, если бы Вы удосужились проявить усердие - давно бы уже её нагуглили.

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

Последний раз редактировалось phomm; 20.08.2013 в 13:35.
phomm вне форума Ответить с цитированием
Старый 20.08.2013, 14:00   #9
Alexandr17-10
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 99
По умолчанию

Да есть такая функция IntersectRect но нужно не только узнать не столкнулся ли персонаж но и сделать так чтобы он не пересекал врага

Код:
procedure TFrame2.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
  if (getasynckeystate(65)<>0)Or(getasynckeystate(37)<>0) then
    Player1.Left:=Player1.Left-5;
  if (getasynckeystate(68)<>0)or(getasynckeystate(39)<>0) then
    Player1.Left:=Player1.Left+5;
  if (getasynckeystate(83)<>0)or(getasynckeystate(40)<>0) then
    Player1.Top:=Player1.Top+5;
  if (getasynckeystate(87)<>0)or(getasynckeystate(38)<>0) then
    Player1.Top:=Player1.Top+5;
end;
решил использовать таймер у DirectX так как он лучше чем обычный
Alexandr17-10 вне форума Ответить с цитированием
Старый 20.08.2013, 14:30   #10
Alexandr17-10
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 99
По умолчанию

Код:
procedure TFrame2.DXTimer1Timer(Sender: TObject; LagCount: Integer);
Var Overlay: TRect;
begin
  DoubleBuffered:=true;
  if (getasynckeystate(65)<>0)Or(getasynckeystate(37)<>0) then begin
    Player1.Left:=Player1.Left-5;
    If intersectrect(overlay, Player1.BoundsRect, Enemies0.BoundsRect) then
      Player1.Left:=Player1.Left+5;
  end;
  if (getasynckeystate(68)<>0)or(getasynckeystate(39)<>0) then begin
    Player1.Left:=Player1.Left+5;
    If intersectrect(overlay, Player1.BoundsRect, Enemies0.BoundsRect) then
      Player1.Left:=Player1.Left-5;
  end;
  if (getasynckeystate(83)<>0)or(getasynckeystate(40)<>0) then begin
    Player1.Top:=Player1.Top+5;
    If intersectrect(overlay, Player1.BoundsRect, Enemies0.BoundsRect) then
      Player1.Top:=Player1.Top-5;
  end;
  if (getasynckeystate(87)<>0)or(getasynckeystate(38)<>0) then begin
    Player1.Top:=Player1.Top-5;
    If intersectrect(overlay, Player1.BoundsRect, Enemies0.BoundsRect) then
      Player1.Top:=Player1.Top+5;
  end;
end;
Идеально работает. Вообще я бы хотел узнать как сделать AI для врагов
Alexandr17-10 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с движком (MediaWiki) iandreyfursenko Помощь студентам 7 31.07.2012 23:40
Проблема с спрайтовым движком delphix ros.pro Мультимедиа в Delphi 0 06.06.2011 14:41
Помогите с торрент движком! asterisk PHP 0 05.08.2009 22:39
проблема с движком cstrike_svlist Nexus2116 Свободное общение 1 27.06.2009 00:53
Помогите с движком!!! Руслантус Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 28.07.2007 13:14