|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#76
|
||||
|
||||
Цитата:
Цитата:
Сталкиваться с препятствиями полезно. Только отвечая на вызовы судьбы, мы узнаем пределы наших возможностей. |
#77
|
||||
|
||||
Цитата:
jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Царь (02.06.2013)
|
#78
|
||||
|
||||
Цитата:
Хорошо, я вписал счетчик в тип, сделал так, (в DoMove) что как только монстр доходит до героя у него появляется состояние атаки (State:=msAttack). затем, (в том же DoMove) я описываю, что если state:=msAttack, то активируется счетчик и моб получает анимацию и направление атаки в зависимости от его расположения относительно героя. Проверил - так и есть, у каждого моба появляется свой счетчик и каждый атакует. Но вот теперь затык. Я пытаюсь вписать массив или переменную Enemy, обращенные к типу TEnemy в тайер, где счетчик обрабатывается, но он выдает ошибку что-то про AccessViolation и отказывается работать. Что я не так сделал? ( - И еще я почти никогда не общался с заливкой фигур и выводом текста в среде Delphi (ну типа в пэинте у меня как два пальца об асфальт). Собственно, выводить текст я умею, даже "родил" шкалу жизни героя, которая красиво так меняет цвет при уменьшении. Только вот проблема в том, что цвет, который я использую для изменения цвета шкалы жизни, передается и в текст, отчего он у меня моргает как светоформ в зависимости от кол-ва жизни героя. А как привязать разные цвета на разные действия Canvas? - А, и еще. Я вот читал про то, что можно осуществить динамическое приближение и отдаление, словно камерой управляешь. Наверняка про это написано, но, как это называется, что бы мне найти? Хочется научится для создания большей динамичности ) Сталкиваться с препятствиями полезно. Только отвечая на вызовы судьбы, мы узнаем пределы наших возможностей. Последний раз редактировалось Царь, 03.06.2013 в 21:23. |
#79
|
||||
|
||||
Цитата:
Цитата:
Цитата:
jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Царь (05.06.2013)
|
#80
|
||||
|
||||
Цитата:
Сталкиваться с препятствиями полезно. Только отвечая на вызовы судьбы, мы узнаем пределы наших возможностей. |
#81
|
||||
|
||||
Похоже уже давно надо эту тему переименовать в "Записки начинающего Игродела".
Без полного исходного кода трудновато подсказывать. Как вам уже сказали, такая ошибка возникает при попытке обратится к несуществующему объекту. Попробуйте в отладчике пошагово посмотреть значения ваших переменных перед возникновением ошибки. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#82
|
||||
|
||||
Цитата:
К тому же я уже люблю свою игру! Так что даже если курсовая закончится я хочу улучшить её еще как можно больше, ибо планов хватает ) Цитата:
Итак. Юнит Монстра ..... тип Монстр положение = (Жив, ранен, атака); Монстр = класс (ТИмэйджСпрайт) откататаки: реал; ..... private ..... public ..... Где точки, это то, что по-моему не относится к откату атаки и положению атаки. Далее, я в процедуре DoMove монстра пишу: если монстр_слева_от_героя или монстр_справа_от_героя то Положение:=Атака; если Положение=Атака то начнем откататаки:=35; вместе с TКоготь.Создать делать если герой_слева то появление когтя с поправкой влево; если герой_слева то появление когтя с поправкой вправо; конец; ТКоготь это невидимый спрайт атаки. До другого я просто пока не додумался. Если есть альтернативный вариант, то я с удовольствием приму знания ) Далее мне нужно сделать три записи. Первая, это в процедуре Таймер, в основном юните. Там я записываю постоянное снижение откататаки на единицу. Попробовал вписывать уменьшение откататаки в процедуре DoMove монстра, но вышло так, что откат начинается только тогда, когда монстр двигается =\ Вторая, - записать в юните Коготь, в процедуре DoMove, что если откататаки монстра меньше либо равно числу 15, то коготь умирает/исчезает. Третья, - в процедуре коллизии Героя, что если он сталкивается со спрайтом Коготь и откат когтя равно 15, то она получает урон. В итоге должно получится, что при атаке монстр создает откататаки, воспроизводит анимацию атаки, воспроизводит спрайт коготь и через несколько мгновений коготь должен исчезнуть в не зависимости от того, попал он в героя или нет, - завершение атаки. Далее остается 20 единиц отката не позволяющих монстру атаковать повторно. Ранее я делал откататака в варе основного юнита, но работало оно как бы глобально и поэтому если один монстр атаковал, то стопились все. Вот, собственно и вся проблема, да Сталкиваться с препятствиями полезно. Только отвечая на вызовы судьбы, мы узнаем пределы наших возможностей. |
#83
|
||||
|
||||
А вот по поводу таблицы рекордов... Я так вот рассчитал, что если я хочу создать таблицу прямо в игре, то мне нужно:
- создать тип записи рекордов. Получается так: Код:
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
|
||||
|
||||
Не хочу показаться наглым, но вы можете помочь хотя бы с монстрами?.. Я с таблицой разберусь, честно (
Сталкиваться с препятствиями полезно. Только отвечая на вызовы судьбы, мы узнаем пределы наших возможностей. |
#85
|
||||
|
||||
Цитата:
В конце-концов прочитал, но все равно ЯННП. jmp $ ; Happy End! The Cake Is A Lie. |
#86
|
|||
|
|||
Ну исходник ты так и не выложил, даже участок кода не привел.
Для 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
|
||||
|
||||
Да, по сути таблица это просто, спасибо за совет, мне немного осталось до решения этой задачи )
А вот с монстрами затык. Итак, я плохо пояснил, сейчас сделаю вторую попытку. Я последовал совету и сделал счетчик полем классна монстр, вот: Код:
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; Далее, следует процедура 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; И вот теперь подхожу к кульминации, - отсчет отката атаки. То есть я так и непонял как заставить счетчик "тикать". Я пытался прописать в таймер: Код:
if Enemy.ClawDelay<>0 then Enemy.ClawDelay:=Enemy.ClawDelay-1; if Enemy.ClawDelay<=0 then Enemy.State:=msLive; Попробовал ввести в процедуру TEnemy.DoMove однако у меня тогда счетчик вообще не тикал. И вот. У меня наверное снова какая-то глупая погрешность которую я не заметил в силу своей неопытности и тугодумия. Можете ли вы мне помочь и пояснить? Сталкиваться с препятствиями полезно. Только отвечая на вызовы судьбы, мы узнаем пределы наших возможностей. |
#88
|
||||
|
||||
А такой еще вопрос, - а можно ли загрузить собственный шрифт в программу? Или загрузить набор символов и использовать их вместо стандартного шрифта? Например загрузить картинку с алфавитом и при нажатии клавиш выводить его, а не стандартные символы - для красоты.
И с монстрами то, наверное, глобальная проблема? ( Сталкиваться с препятствиями полезно. Только отвечая на вызовы судьбы, мы узнаем пределы наших возможностей. Последний раз редактировалось Царь, 16.06.2013 в 16:26. |
#89
|
||||
|
||||
Не знаю, что за движок ты используешь (лень читать всю тему), в SDL есть возможность подгрузки картинки с назначенными символами и он будет рисовать ими.
Самый простой крестьянско-пролетарский вариант - загружаешь тайлы букв в TImageList, а чтоб вывести его, просто imglist.draw(canvas, x, y, byte('A')-{разница между кодом буквы и ее позицией в листе}); — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
Царь (16.06.2013)
|
#90
|
||||
|
||||
Цитата:
Использую я DelphiX. Хм, это получается на каждую букву надо писать подобный код? Сталкиваться с препятствиями полезно. Только отвечая на вызовы судьбы, мы узнаем пределы наших возможностей. |