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

 



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #31  
Старый 15.05.2013, 22:13
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

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

Да, направление есть. Но, не совсем понял идею. Это, при нажатии атаки каждый раз делать проверку в н-количестве координат в направлении атаки от спрайта?
Ответить с цитированием
  #33  
Старый 15.05.2013, 22:38
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Проще посчитать расстояние от координат врагов до координат плеера и сравнить с требуемым. При этом накладывается дополнительное условие, что если игрок повернут влево, то X < Player_X, если вправо - X > Player_X.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Царь (16.05.2013)
  #34  
Старый 20.05.2013, 00:17
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Благодарю всех кто отозвался на мою просьбу и помог советами ) Особенно Bargest, Ваши советы бесценны для меня )

- Теперь у меня новый уровень проблем. Если с гравитацией и движением я уже проблем не ощущаю и с легкостью прописал начальный АИ монстра и смог его заставить бегать за героем, то теперь я не могу понять как заставить их взаимодействовать. Прописал как написано в примерах
Цитата:
procedure TEnemy.DoCollision(Sprite:Tsprite; var Done:Boolean);
begin
if Sprite is THero then Dead;
Collision;
end;
Где THero, это Спрайт героя.

И не хочет! не исчезает. Даже пытался для примера сделать так:
Цитата:
procedure TEnemy.DoCollision(Sprite:Tsprite; var Done:Boolean);
begin
if x=HX then x:=x+100;
Collision;
end;
Где HX это позиция героя, а x это позиция моба.

В таймере так же добавил: " DXSpriteEng.Dead;" - не понял зачем, но добавил.

Что делать? (



- Конечно, это наверно еще более примитивный вопрос, но все же, как работать с несколькими Unit? Как прочитал, достаточно связывать их в uses и писать далее, в общем, типа хорошая сортировка. Но, пытался отдельно прописать юнит для своего героя и для монстра, но у меня не получается очеловеченная взаимосвязь. Одно другое не видит. Можете, пожалуйста, подсказать какую-то литературу на эту тему, а то гугл не дает адекватных результатов на мой запрос.


- Еще у меня начала выскакивать ошибка stack overflow, что, как я прочитал, тонко намекает, что у меня перегрузка и где-то происходит утечка и лишняя работа. Как это можно проверить? И можно ли?
Ответить с цитированием
  #35  
Старый 20.05.2013, 00:22
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Stack overflow - точно нет рекурсии? Может быть неявной. Или какие-нибудь гигантские массивы локальные?

Взаимодействие - не надо никого никак связывать. Когда плеер один, известны его координаты. Следовательно, любой монстр стремится дойти до этих координат, и когда расстояние меньше расстояния удара - наносит удар. Обработчик ударов - одинаковый, просто вычетает жизни. Как только жизни любого монстра стали <= 0, то монстр исчезает, а если это был плеер - GameOver.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #36  
Старый 20.05.2013, 00:44
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

- Хм... Вообще, начало появляться, когда я весело начал добавлять Collision при работе со спрайтами. Возможно, стоит убрать. Как бы, мне пока не всё до конца понятно и поэтому точно пояснить не могу, простите.


- То есть сделать как Вы ранее говорили, - учет расстояния от края спрайта. Это значит в АИ моба прописать, что если он на определенном расстоянии от Героя, то включается атака. Но если герой отбежит? Или атакует в ответ, дабы прервать атаку монстра? Посоветуете как это учесть?
Я полагаю можно включить некоторый счетчик, который включается при атаке монстра. И настоящая атака активируется когда счетчик подходит к нулю (там например дать секунду, две, три), а до, монстр как бы замахивается и у героя есть шанс отбежать. Я правильно мыслю? Оо
Примерно то же можно прописать на героя. Если у него анимация атаки и координата монстра неподалеку, то он попадает.

- Кстати, а как осуществить создания множества монстров? К примеру с помощью for минимум мобов to максимум мобов do


- Ну и собственно я так и не пришел к тому, что бы монстр исчезал при взаимодействии с героем

Последний раз редактировалось Царь, 20.05.2013 в 00:46.
Ответить с цитированием
  #37  
Старый 20.05.2013, 15:17
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Что ж, со взаимодействием я относительно разобрался, благодаря координатам. Но, теперь у меня есть две проблемы:

- Первая как и была, - как и где можно прописать создание нескольких монстров?

- Вторая сложнее. Я решил поиграться с процедурами для удобства и наткнулся на такую вот ошибку:
Цитата:
procedure TEnemy.EHurt(Hurt:Boolean);
begin
if Hurt=True then
health:=(health-Hero.Power);
end;

Где Enemy это класс TEnemy в котором вписан мой монстр, а Hero это THero класс, где все данные о герое. Собственно, при возникании взаимодействия и, соответственно запуске процедуры, у меня выскакивает ошибка, которую моему неразвитому программному мозгу не понять. Можете ли что либо подсказать по этому поводу?
Ответить с цитированием
  #38  
Старый 20.05.2013, 15:27
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Даже удумал сделать общий вычет повреждений, как Вы и предлагали ранее.
Цитата:
function TGameForm.Hurt(a,d:real; Hurt:Boolean):real;
begin
if Hurt=True then
Result:=d-a;
Hurt:=False;
end;
Но у меня программа ругается на объявление переменных Hero или Enemy где бы то ни было, при попытке их активации в программе. Похоже ошибка мелкая, возможно я в начале что-то не туда вписал... Но все же, подскажите ==
Ответить с цитированием
  #39  
Старый 20.05.2013, 22:27
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Во-первых, не надо превращать форум в чат. Есть кнопка "Редактировать сообщение".
Цитата:
То есть сделать как Вы ранее говорили, - учет расстояния от края спрайта. Это значит в АИ моба прописать, что если он на определенном расстоянии от Героя, то включается атака. Но если герой отбежит?
Никто не сказал, что атака должна начинаться именно на дальней границе расстояния атаки, чтобы достаточно было на 1 пиксель сдвинуться. Она может начинаться и ближе.
Цитата:
Первая как и была, - как и где можно прописать создание нескольких монстров?
Так же, как и одного. Создаем массив классов, каждый элемент создаем также, как отдельного юнита.
Цитата:
Но у меня программа ругается на объявление переменных Hero или Enemy где бы то ни было, при попытке их активации в программе.
Ни слова не понял. Где ругается, чем ругается, при каких условиях ругается, и что вообще применяется?
И кстати для нанесения удара было бы логичнее сделать Hurt методом класса TUnit, который является общим предком для THero и TEnemy, тогда можно будет вызывать метод этого класса как Enemy.Hurt(Damage).
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Царь (21.05.2013)
  #40  
Старый 21.05.2013, 01:55
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Прошу прощения, больше не будет "чата". Что ж, за это время я успел полностью перебрать код, используя новые знания. А то есть я таки разобрался как взаимодействуют Юниты, смог задействовать Collision, избавился от всех перечисленных мною ошибок и, кажется, мой код выглядит красивее )
Благодарю, Bargest, за терпение. Я использую Ваши советы с максимальной пользой )

Правда, теперь у меня новый уровень проблемы. Когда я создаю массу мобов, то при сталкивании с героем они, во-первых: когда достигает один моб героя, активирует столкновение, анимацию атаки и... Атакуют все мобы вне зависимости от расстояния. А во-вторых при смерти исчезают так же все мобы. Как я понял они все связаны, но как тогда заставить их жить самостоятельной жизнью?
Ответить с цитированием
  #41  
Старый 21.05.2013, 10:29
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Счетчики у каждого должны быть свои, а не один на всех. Можно делать счетчик полем класса "TUnit", можно делать динамический массив структур "счетчик-юнит" и добавлять туда создаваемые счетчики. И смерть должна применяться к конкретному юниту. Можно даже в виде удаления из массива.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Царь (22.05.2013)
  #42  
Старый 21.05.2013, 12:25
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Прошу, можете пояснить подробней? А то я, кажется, не до конца понял.
Ответить с цитированием
  #43  
Старый 21.05.2013, 12:39
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

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

Хм, хорошо, я примерно понимаю как создать динамический массив для юнитов. Но как их добавлять и учитывать при столкновении и выбирать из массива нужный, при столкновении, объект? Извините, если вопрос глупый, пытаюсь уложить идею в голове.
Ответить с цитированием
  #45  
Старый 21.05.2013, 18:20
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Проверять столкновения каждого юнита с героем отдельно.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Ответ



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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2019

ВКонтакте   Facebook   Twitter