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

Delphi Sources



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

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

Цитата:
Сообщение от Bargest
Можно нарисовать табло самому, и руками же ввести в него текст. Чуток посложнее.
Ну если как нарисовать табло я представляю, то произвести выборочный вывод текста в полях из текстового файла у меня представляется смутно. Можете пояснить подробнее пожалуйста?

Цитата:
Сообщение от Bargest
Говорю N+1 раз - сделать счетчик полем класса "монстр", и в функции, которая счетчик обрабатывает, пройтись по всем монстрам и обработать все счетчики.
Кажется, я понял. Сейчас попробую )
__________________
Сталкиваться с препятствиями полезно. Только отвечая на вызовы судьбы, мы узнаем пределы наших возможностей.
Ответить с цитированием
  #77  
Старый 01.06.2013, 13:36
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Можете пояснить подробнее пожалуйста?
Для GDI - TextOut в нужных координатах, для dx наверно есть свои аналоги. В файле записать через разделитель, при чтении разбить строку на части и выводить в соответствующих координатах.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Царь (02.06.2013)
  #78  
Старый 03.06.2013, 19:49
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
сделать счетчик полем класса "монстр", и в функции, которая счетчик обрабатывает, пройтись по всем монстрам и обработать все счетчики.

Хорошо, я вписал счетчик в тип, сделал так, (в DoMove) что как только монстр доходит до героя у него появляется состояние атаки (State:=msAttack). затем, (в том же DoMove) я описываю, что если state:=msAttack, то активируется счетчик и моб получает анимацию и направление атаки в зависимости от его расположения относительно героя. Проверил - так и есть, у каждого моба появляется свой счетчик и каждый атакует. Но вот теперь затык. Я пытаюсь вписать массив или переменную Enemy, обращенные к типу TEnemy в тайер, где счетчик обрабатывается, но он выдает ошибку что-то про AccessViolation и отказывается работать. Что я не так сделал? (

- И еще я почти никогда не общался с заливкой фигур и выводом текста в среде Delphi (ну типа в пэинте у меня как два пальца об асфальт). Собственно, выводить текст я умею, даже "родил" шкалу жизни героя, которая красиво так меняет цвет при уменьшении. Только вот проблема в том, что цвет, который я использую для изменения цвета шкалы жизни, передается и в текст, отчего он у меня моргает как светоформ в зависимости от кол-ва жизни героя. А как привязать разные цвета на разные действия Canvas?

- А, и еще. Я вот читал про то, что можно осуществить динамическое приближение и отдаление, словно камерой управляешь. Наверняка про это написано, но, как это называется, что бы мне найти? Хочется научится для создания большей динамичности )
__________________
Сталкиваться с препятствиями полезно. Только отвечая на вызовы судьбы, мы узнаем пределы наших возможностей.

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

Цитата:
что-то про AccessViolation
Значит что-то не создал и удалил раньше времени.
Цитата:
А как привязать разные цвета на разные действия Canvas?
После рисования восстановить стандартный цвет.
Цитата:
динамическое приближение и отдаление, словно камерой управляешь
для вменяемого вида всего этого придется пол игры переписывать. А если надо именно масштаб и абы как - то просто менять переменную Масштаб и все изображения рисовать в соответствии с ней.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Царь (05.06.2013)
  #80  
Старый 05.06.2013, 19:32
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Значит что-то не создал и удалил раньше времени.
Я понимаю, что вы говорите, но не понимаю как это исправить ( Вот, счетчик как бы прописан в типе "Монстр" и начисляется в процедуре "Монстр.DoMove" во время атаки. Отнимается он на главной форме в Таймере. Однако главная форма ругается именно этим AccesViolation. Я не в первый раз с таким сталкиваюсь, но так и не понял как исправить и оптимизировать работу.
__________________
Сталкиваться с препятствиями полезно. Только отвечая на вызовы судьбы, мы узнаем пределы наших возможностей.
Ответить с цитированием
  #81  
Старый 05.06.2013, 20:23
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Похоже уже давно надо эту тему переименовать в "Записки начинающего Игродела".
Без полного исходного кода трудновато подсказывать. Как вам уже сказали, такая ошибка возникает при попытке обратится к несуществующему объекту. Попробуйте в отладчике пошагово посмотреть значения ваших переменных перед возникновением ошибки.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #82  
Старый 05.06.2013, 21:30
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Похоже уже давно надо эту тему переименовать в "Записки начинающего Игродела".
Хех ) Возможно ) Сдачу курсовой на счастье продлили еще где-то на 2 недели, так что я в какой-то мере расслабился. Однако все еще надо решить главную проблему - таблица рекордов, но вроде как еще живет идея, надо только реализовать попробовать )
К тому же я уже люблю свою игру! Так что даже если курсовая закончится я хочу улучшить её еще как можно больше, ибо планов хватает )
Цитата:
Без полного исходного кода трудновато подсказывать.
Я могу кинуть исходник (похвастаться своими достижениями), но уверен, что разбираться в моих каракулях Вам будет не особо желанно ) Так что я постараюсь пояснить что же я вписал.
Итак.
Юнит Монстра
.....
тип
Монстр положение = (Жив, ранен, атака);
Монстр = класс (ТИмэйджСпрайт)
откататаки: реал;
.....
private
.....
public
.....

Где точки, это то, что по-моему не относится к откату атаки и положению атаки.
Далее, я в процедуре DoMove монстра пишу:
если монстр_слева_от_героя или монстр_справа_от_героя то
Положение:=Атака;

если
Положение=Атака то
начнем
откататаки:=35;
вместе с TКоготь.Создать делать
если герой_слева то появление когтя с поправкой влево;
если герой_слева то появление когтя с поправкой вправо;
конец;

ТКоготь это невидимый спрайт атаки. До другого я просто пока не додумался. Если есть альтернативный вариант, то я с удовольствием приму знания )
Далее мне нужно сделать три записи.
Первая, это в процедуре Таймер, в основном юните. Там я записываю постоянное снижение откататаки на единицу. Попробовал вписывать уменьшение откататаки в процедуре DoMove монстра, но вышло так, что откат начинается только тогда, когда монстр двигается =\
Вторая, - записать в юните Коготь, в процедуре DoMove, что если откататаки монстра меньше либо равно числу 15, то коготь умирает/исчезает.
Третья, - в процедуре коллизии Героя, что если он сталкивается со спрайтом Коготь и откат когтя равно 15, то она получает урон.
В итоге должно получится, что при атаке монстр создает откататаки, воспроизводит анимацию атаки, воспроизводит спрайт коготь и через несколько мгновений коготь должен исчезнуть в не зависимости от того, попал он в героя или нет, - завершение атаки. Далее остается 20 единиц отката не позволяющих монстру атаковать повторно.
Ранее я делал откататака в варе основного юнита, но работало оно как бы глобально и поэтому если один монстр атаковал, то стопились все.
Вот, собственно и вся проблема, да
__________________
Сталкиваться с препятствиями полезно. Только отвечая на вызовы судьбы, мы узнаем пределы наших возможностей.
Ответить с цитированием
  #83  
Старый 08.06.2013, 22:10
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

А вот по поводу таблицы рекордов... Я так вот рассчитал, что если я хочу создать таблицу прямо в игре, то мне нужно:
- создать тип записи рекордов. Получается так:
Код:
type
TResult = record
Name:string[10];
Score:cardinal;
end;

var
Table: array [1..10] of TResult; //топ 10
- далее сформировать процедуры записи, вывода и сортировки текста таблицы, - это не сложно в принципе (море пафоса).

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

А и еще, Bargest сказал выводить результаты в нужных координатах нарисованной таблицы. Собственно, а можно ли узнать подробней "как"? )
__________________
Сталкиваться с препятствиями полезно. Только отвечая на вызовы судьбы, мы узнаем пределы наших возможностей.

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

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

Цитата:
но вы можете помочь хотя бы с монстрами?.
TLDR.
В конце-концов прочитал, но все равно ЯННП.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #86  
Старый 13.06.2013, 21:42
ildvild ildvild вне форума
Прохожий
 
Регистрация: 12.10.2010
Адрес: Уфа
Сообщения: 31
Версия Delphi: 7, 2007, 2010
Репутация: 10
По умолчанию

Ну исходник ты так и не выложил, даже участок кода не привел.
Для DelphiX есть модуль с описанием компонентов intf.pas(ищи в инете). Там есть поле ввода, кнопка, чекбокс и т.д.

Вывод можешь сделать через Textout как и писали в нужные координаты

напр
Код:
for i:=1 to RecordList.Count-1 do
 textout(Xc, Yc+10*i,RecordList[i])

где Xc -положение по x (обычно середина)
Yc -положение по y (отступ сверху)

RecordList-список рекордсменов
Ответить с цитированием
Этот пользователь сказал Спасибо ildvild за это полезное сообщение:
Царь (13.06.2013)
  #87  
Старый 15.06.2013, 20:37
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Да, по сути таблица это просто, спасибо за совет, мне немного осталось до решения этой задачи )

А вот с монстрами затык. Итак, я плохо пояснил, сейчас сделаю вторую попытку.

Я последовал совету и сделал счетчик полем классна монстр, вот:
Код:
type
  TEnemyState = (msLive, msHurt, msAttack);
  TEnemy = Class(TImageSprite)
    ClawDelay:real;
    Location: Tpoint;
    State:    TEnemyState;
    EnemyPower:integer;
    EnemyHealth:integer;
  protected
    procedure DoMove(MoveCount:Integer); override;
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
    procedure SpriteCreate(Name:String; Anis:integer; Anic:integer);
  public
    Constructor Create(AParent:TSprite); override;
    Destructor Destroy; override;
end;
Где счетчик - переменная ClawDelay типа real.
Далее, следует процедура DoMove, где и активируется атака:
Код:
procedure TEnemy.DoMove(Movecount:integer);
begin
...
if (((x>=HX-85) and (x<=HX-10)) or ((x<=HX+45) and (x>=HX+10))) and (ClawDelay<=0) then   
State:=msAttack; //HX - координата героя. Если монстр в определенном диапазоне слева или справа относительно местоположения героя и откат атаки меньше или равно нулю, то происходит активация положения атаки

if State=msAttack then //если положение атаки
begin
ClawDelay:=35;       //устанавливается откат атаки
if x<HX then begin       //если монстр слева от героя
SpriteCreate('SpiderAttackRight',0,7);  //анимация атаки вправо
if ClawDelay=15 then        //если откат атаки равен 15, то
with TClaw.Create(Engine) do  //создается спрайт атаки Claw
x:=Self.x+95;  end;    //который появляется чуть правее от монстра

if x>HX then begin     //то же самое, только с поправкой в противоположную сторону
SpriteCreate('SpiderAttackLeft',0,7);
if ClawDelay=15 then
with TClaw.Create(Engine) do
x:=Self.X-10;   end;
AnimLooped:=False;

  end;
Получается, что задав откат атаки, проходит около секунды, прежде чем атака действительно будет иметь губительный эффект для здоровья героя. Далее, после появления спрайта Claw, он тут же исчезает и следующий остаток отката атаки монстр бездействует (секунда где-то), а затем действие повторяется, если для атаки соблюдены все условия. Я надеюсь смог ясно изложить? )

И вот теперь подхожу к кульминации, - отсчет отката атаки. То есть я так и непонял как заставить счетчик "тикать". Я пытался прописать в таймер:
Код:
if Enemy.ClawDelay<>0 then Enemy.ClawDelay:=Enemy.ClawDelay-1;
if Enemy.ClawDelay<=0 then Enemy.State:=msLive;
что привело к ошибке AcessViolation.

Попробовал ввести в процедуру TEnemy.DoMove однако у меня тогда счетчик вообще не тикал.
И вот.
У меня наверное снова какая-то глупая погрешность которую я не заметил в силу своей неопытности и тугодумия. Можете ли вы мне помочь и пояснить?
__________________
Сталкиваться с препятствиями полезно. Только отвечая на вызовы судьбы, мы узнаем пределы наших возможностей.
Ответить с цитированием
  #88  
Старый 16.06.2013, 16:11
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

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

И с монстрами то, наверное, глобальная проблема? (
__________________
Сталкиваться с препятствиями полезно. Только отвечая на вызовы судьбы, мы узнаем пределы наших возможностей.

Последний раз редактировалось Царь, 16.06.2013 в 16:26.
Ответить с цитированием
  #89  
Старый 16.06.2013, 16:32
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Не знаю, что за движок ты используешь (лень читать всю тему), в SDL есть возможность подгрузки картинки с назначенными символами и он будет рисовать ими.

Самый простой крестьянско-пролетарский вариант - загружаешь тайлы букв в TImageList, а чтоб вывести его, просто imglist.draw(canvas, x, y, byte('A')-{разница между кодом буквы и ее позицией в листе});
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
Царь (16.06.2013)
  #90  
Старый 16.06.2013, 16:41
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Не знаю, что за движок ты используешь (лень читать всю тему), в SDL есть возможность подгрузки картинки с назначенными символами и он будет рисовать ими.

Самый простой крестьянско-пролетарский вариант - загружаешь тайлы букв в TImageList, а чтоб вывести его, просто imglist.draw(canvas, x, y, byte('A')-{разница между кодом буквы и ее позицией в листе});

Использую я DelphiX.

Хм, это получается на каждую букву надо писать подобный код?
__________________
Сталкиваться с препятствиями полезно. Только отвечая на вызовы судьбы, мы узнаем пределы наших возможностей.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter