![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#76
|
||||
|
||||
|
Цитата:
Цитата:
|
|
#77
|
||||
|
||||
|
Цитата:
|
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Царь (02.06.2013)
| ||
|
#78
|
||||
|
||||
|
Цитата:
Хорошо, я вписал счетчик в тип, сделал так, (в DoMove) что как только монстр доходит до героя у него появляется состояние атаки (State:=msAttack). затем, (в том же DoMove) я описываю, что если state:=msAttack, то активируется счетчик и моб получает анимацию и направление атаки в зависимости от его расположения относительно героя. Проверил - так и есть, у каждого моба появляется свой счетчик и каждый атакует. Но вот теперь затык. Я пытаюсь вписать массив или переменную Enemy, обращенные к типу TEnemy в тайер, где счетчик обрабатывается, но он выдает ошибку что-то про AccessViolation и отказывается работать. Что я не так сделал? ( - И еще я почти никогда не общался с заливкой фигур и выводом текста в среде Delphi (ну типа в пэинте у меня как два пальца об асфальт). Собственно, выводить текст я умею, даже "родил" шкалу жизни героя, которая красиво так меняет цвет при уменьшении. Только вот проблема в том, что цвет, который я использую для изменения цвета шкалы жизни, передается и в текст, отчего он у меня моргает как светоформ в зависимости от кол-ва жизни героя. А как привязать разные цвета на разные действия Canvas? - А, и еще. Я вот читал про то, что можно осуществить динамическое приближение и отдаление, словно камерой управляешь. Наверняка про это написано, но, как это называется, что бы мне найти? Хочется научится для создания большей динамичности ) Последний раз редактировалось Царь, 03.06.2013 в 21:23. |
|
#79
|
||||
|
||||
|
Цитата:
Цитата:
Цитата:
|
| Этот пользователь сказал Спасибо 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
|
||||
|
||||
|
Цитата:
В конце-концов прочитал, но все равно ЯННП. |
|
#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')-{разница между кодом буквы и ее позицией в листе}); |
| Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
Царь (16.06.2013)
| ||
|
#90
|
||||
|
||||
|
Цитата:
Использую я DelphiX. Хм, это получается на каждую букву надо писать подобный код? |