Форум: "Игры";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
ВнизDoCollision B DelphiX Найти похожие ветки
← →
Cash © (2006-01-03 19:20) [40]JUS © (03.01.06 18:07) [36]:
Это точно!!! :D
JUS © (03.01.06 18:16) [37]:
Коллега, мы нашли общий язык. Респект!
Аццкий_рыцарь:) (03.01.06 18:58) [38]:
Сорри, я не могу посмотреть твой код, дела.... сессия....
ботанничество короче! :)))
В замен goto можно использовать while цыкл, или, если
пыть по ближе к goto, использовать repeat.
Если что, могу пояснить - как.
Мож, у тебя из за goto все рамсы со спрайтами? Мож, конечно, и нет.
А от глючности со столкновениями можно избавиться написанием
своей процедурки обработки столкновений, на приметивах.
Если что, то и это объясню.
А япошку этого завут (который DelphiX сделал, если я правильно помню) Хируоки Хори (Hiroyuki Hori). Этакий fo kso (fo kusotore) из японии
← →
Аццкий_рыцарь:) (2006-01-03 20:26) [41]Эээээ со столкновениями я с горем пополам разобрался (вырубил пиксельчек и зделал колижн при столкновениях рамок спрайтов, а рамки сделал "вакурат" прикасающимися к изображению спрайтов)
НО ВОТ С ГЛЮКАМИ! билна наверное этот Хируоки Хори специально сделал чтоб после вывода больше 40 спрайтов, ФПС падали
← →
Аццкий_рыцарь:) (2006-01-03 22:14) [42]О! тут удалось сохранить примерно 90 фпс при выводе где-то 70 спрайтов! я в свойствах спрайта монстра поставил systemmemory=true.
← →
Cash © (2006-01-04 12:59) [43]Аццкий_рыцарь:) (03.01.06 22:14) [42]:
Ага, есть такое. Поставь у DxDraw.Options параметр doSystemMemory
в true, при большом количестве спрайтов это облегчает работу,
т. е. поднимает FPS.
А еще, ижели в полноэкранном режиме, и графика вся в 256 цветах,
то поставь 256 цветов в свойствах DxDraw тоже(DxDraw.Display.BitCount).
Так же, если в полноэкранном режиме, в DxDraw.Options поставь:
doWaitVBlank -> false
doCenter -> false
doDirectX7Mode -> false
doRetainedMode -> true
Если производительность будет падать, попробуй вариации этих параметров.
Бывало, у меня при выводе 700 спрайтов FPS составляло 89 - 92.
Это с такими настройками.
Аццкий_рыцарь:) (03.01.06 20:26) [41]:
А от goto избавился?
← →
JUS © (2006-01-04 14:41) [44]Используй For
чтоб добавить ещё капельку производительности напиши код в Form1.onActivate или как уж там
DoubleBuffered:=True;
помоему так.))
> Cash © (04.01.06 12:59) [43]
Respect)))
← →
Аццкий_рыцарь:) (2006-01-04 21:09) [45]немного помогло :)
ну-с с глюками как бы разорался :) пасиба!
меня еще одна проблемка волнует... а можно на DXDrav рисовать? через канвас? мне надо чтоб картинка мертвого монстра рисовалась на спрайте бекграунда. Это можно сделать?
← →
JUS © (2006-01-04 21:16) [46]
> Аццкий_рыцарь:) (03.01.06 20:26) [41]
> Эээээ со столкновениями я с горем пополам разобрался (вырубил
> пиксельчек и зделал колижн при столкновениях рамок спрайтов,
> а рамки сделал "вакурат" прикасающимися к изображению спрайтов)
>
> НО ВОТ С ГЛЮКАМИ! билна наверное этот Хируоки Хори специально
> сделал чтоб после вывода больше 40 спрайтов, ФПС падали
1.Какие еще рамки "вакурат"? Ты делай чтоб размеры спрайта были равны размеру самого спрайта(они вымерятся автоматически) ниче подгонять в аккурат не надо.
Width := Image.Width;
Height :=Image.Height;
2. ниче подобного, я ж тебе писал в другой ветке как надо спрайты выводить, у меня на экране >700 спрайтов и всё ок. И не используй этот goto. Создай массив скажем для 100 монстров, пускай они где хотят там и появляются, это ты сам сделаеш, и выводи как я писал тебе, в другой ветке.
Выводи из массива через For.
Вот ссылка на прошлую ветку
http://delphimaster.net/view/9-1135469233/Monstr:array[0..99] of TMonstr;
fMonstr:integer;
...
В каком нибудь таймере поставь создание монстровFor i:=0 to 99 do begin
begin
fMonstr:=fMonstr+1;
Monstr[fMonstr]:=TMonstr.Create(DXSpriteEngine.Engine);
Monstr[fMonstr].Image:=DXImageList.Items.Find("Primer");
Monstr[fMonstr].Width:=Monstr[fMonstr].Image.Width;
Monstr[fMonstr].Height:=Monstr[fMonstr].Image.Height;
Monstr[fMonstr].X:=XX;
Monstr[fMonstr].Y:=YY;
Monstr[fMonstr].Z:=ZZ;
end;
Если монстра завалил, то fMonstr:=fMonstr-1;
Если fMonstr:=100 или больше то не создает.
Тока не забывай после его гибели отчищать память или будут тормоза.
Не пытайся доделать игру прям щас, порассматривай несколько примеров, поэксперементируй. Во многих примерах спрайты создаются так же как ты их создаеш, попробуй создать как я, и всё будет ок.)))
Пока отложи игру и поэксперементируй с выводом не анимированных спрайтов, потом с коллизиями, потом с анимированными спрайтами. Ничего трудного. И goto не трогай!!!
← →
JUS © (2006-01-04 21:21) [47]
> Аццкий_рыцарь:) (04.01.06 21:09) [45]
> немного помогло :)
>
> ну-с с глюками как бы разорался :) пасиба!
>
> меня еще одна проблемка волнует... а можно на DXDrav рисовать?
> через канвас? мне надо чтоб картинка мертвого монстра рисовалась
> на спрайте бекграунда. Это можно сделать?
Рисуй так же как на канве, тока че там писать надо не помню, вроде...Form1.DXDraw1.Surface.Canvas
... а дальше думаю разберешся
А нафига тебе там рисовать на канве, нарисуй этого скелета в BMP и загрузи спрайт (будет как фон), только Z поставь меньше чем у всех своих монстров и др.
← →
Cash © (2006-01-04 21:37) [48]Аццкий_рыцарь:) (04.01.06 21:09) [45]:
Да. Берешь DxDraw.Surface.Canvas (по моему),
и делаешь с ним что хошчь! Даже текст выводи!
JUS © (04.01.06 21:16) [46]:
... Выводи из массива через For. ...
Поправлю, маленечко!, не через for, он медленный, а через while!
(заменяй все for на while, а goto на repeat, выиграешь
в производительности!)
Аналог цыкла for на манер while:
while i < Need do begin
<Чёнибудь делаем>
inc(i);
end;
Аналог goto на манер repeat:
// тут без титула не обойтись
Label
m;
begin
m:
<Чёнибудь делаем>
if i < Need then goto m;
end;
// а так это на repeat выглядит
begin
repeat
<Чёнибудь делаем>
until i >= Need; // замечу, что именно >=, потаму, как (not (>=)) = <.
end;
← →
cyborg © (2006-01-05 09:57) [49]>>[43] Cash © (04.01.06 12:59)
>>Ага, есть такое. Поставь у DxDraw.Options параметр doSystemMemory
>>в true, при большом количестве спрайтов это облегчает работу,
>>т. е. поднимает FPS.
Наоборот снижает. Прибавление будет лишь в тех случаях, когда используются пиксельное столкновение, отображение с поворотом или с прозрачностью.
← →
Аццкий_рыцарь:) (2006-01-05 22:37) [50]2cyborg разве когда включить пиксельное столкновение, то повысится производительность? О_о
Кстати, у меня goto использовалось не для повторения какой-то процедуры, а для пропускания одельной части кода
← →
JUS © (2006-01-06 00:04) [51]
> Кстати, у меня goto использовалось не для повторения какой-
> то процедуры, а для пропускания одельной части кода
Ну и не правильно все равно. для этого можно использовать условиеif
, если чё то пропускать такой то код.
> 2cyborg разве когда включить пиксельное столкновение, то
> повысится производительность? О_о
нет, ты не правильно понял
← →
Аццкий_рыцарь:) (2006-01-06 02:37) [52]2JUS ААААААААА! Я СОЗДАЛ МАСИВОМ! И, КОГДА Я ВЫВОЖУ ДАЖЕ 200 СПРАЙТОВ, ТО ФПС ~ 65 !!! ААА! КАК Я РАД! АА! ПАСИБА!
← →
Аццкий_рыцарь:) (2006-01-06 04:49) [53]Я пытался через канвас выводить, но когда монстряка рисуешь на бекграунде, то он выводится и сразу же пропадает... наверное это из-за того, что дроу постоянно обновляет поверхность для рисования... И как мне быть? :(
Кстати, я не хочу чтоб этот мертвый монстряк был спрайтом (так я уже сделал), потому что еще один спрайти не пойдет на пользу производительности.
← →
Cash © (2006-01-06 09:02) [54]Аццкий_рыцарь:) (05.01.06 22:37) [50]:
Как уже заметил коллега JUS, используй if, организовывай нужную
часть кода, как блок подпрограммы внутри if оператора.
Аццкий_рыцарь:) (06.01.06 04:49) [53]:
Ну дак, тыж каждый раз перерисовываешь все пространство.
... потому что еще один спрайти не пойдет на пользу ...
Так, прошу прошения, а постоянные вычищения памяти и
следующие за ними выделения пойдут, скажешь, на пользу?
Пускай у твоего спрайта будет два состояния, первое:
хорошенький такой бодринький монстрячок, который
весело так бегает за юзером и наровит типнуть за ******. :)))
Второе состояние монстряка - это когда злой дядя юзер
шмальнул из своей валыны по этому веселому монстрячку,
и тот обидился и решил сдохнуть, тобиш лежил и не шивелится. :)))
(прикольно получилось) :D
А когда приходит время добавить еще одного монстрячка, то
мы берем самого залежавшегося, меняем ему состояние на
живое, и ставим по другим координатам.
Вот это будет выигрыш в производительности!
← →
Аццкий_рыцарь:) (2006-01-06 15:20) [55]2Cash ОДНАКО!
← →
JUS © (2006-01-06 21:27) [56]
> Аццкий_рыцарь:) (06.01.06 15:20) [55]
> 2Cash ОДНАКО!
ААААА сразу что, не догадался? Чем больше анимированных спрайтов выводиш сразу, тем больше тормоза. Обычные спрайты почти не тормозят. И я тебе говорил, что память надо отчищать, тебе по***.
> Аццкий_рыцарь:) (06.01.06 02:37) [52]
> 2JUS ААААААААА! Я СОЗДАЛ МАСИВОМ! И, КОГДА Я ВЫВОЖУ ДАЖЕ
> 200 СПРАЙТОВ, ТО ФПС ~ 65 !!! ААА! КАК Я РАД! АА! ПАСИБА!
>
Что такое ААААААААААА ;-(
Всё правильно делаеш(почти). А 65 ФПС, че мало? убавь таймер и ускорь скорость анимации и фпс будет более-менее постоянной. Ваще и 35-ти хватило бы, как минимум.
← →
JUS © (2006-01-06 21:29) [57]
> Что такое ААААААААААА ;-(
> Всё правильно делаеш(почти). А 65 ФПС, че мало? убавь таймер
> и ускорь скорость анимации и фпс будет более-менее постоянной.
> Ваще и 35-ти хватило бы, как минимум.
Там чёто еще помоему надо сделать или нет, поправьте если я не прав!
← →
Аццкий_рыцарь:) (2006-01-06 21:43) [58]2JUS АААААА - это эмоции :)
а у самого спрайта есть канвас? можно на image спрайта рисовать?
← →
Аццкий_рыцарь:) (2006-01-06 22:45) [59]Вот смотрите, например я хочу чтоб по клику на кнопку поверх имеющегося image спрайта grass рисовалось то, что находится в DXDIB1.DIB:
procedure TForm1.DXDraw1FinalizeSurface(Sender: TObject);
begin
FSurface.Free; FSurface := nil;
end;
procedure TForm1.DXDraw1InitializeSurface(Sender: TObject);
begin
FSurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
end;
procedure TForm1.DXDraw1RestoreSurface(Sender: TObject);
begin
FSurface.LoadFromGraphic(DXDIB1.DIB);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
tgrass(sprite).Image.Draw(form1.DXDraw1.Surface, 100, 100,100 );
end;
и нифига не рисует :(
что тут неравильно?
← →
Cash © (2006-01-07 09:34) [60]Аццкий_рыцарь:) (06.01.06 22:45) [59]:
Ну, есть у тебя кнопка, ну, по клику по кнопке ты на DxDraw рисуешь
(замечу, один раз). Ну наверняк у тебя пр этом таймер работает,
который делает DxDraw.Flip.
Ты просто не успеваешь постмотреть картинку, ее перекрывают.
А если таймера нет, тогда надо по клику кнопки сказать DxDraw
дравнуться и флипнуться. :)
← →
JUS © (2006-01-07 09:55) [61]
> Аццкий_рыцарь:) (06.01.06 21:43) [58]
> 2JUS АААААА - это эмоции :)
>
> а у самого спрайта есть канвас? можно на image спрайта рисовать?
>
Можно. У тебя каждый раз прорисовывается спрайт, а твои рисования на спрайте рисуются один раз, ты не успеваеш рассмотреть, т.к. экран опять отчищается и рисует там опять спрайт, а твои рисульки больше не рисуются. Сделай чтоб они рисовались в DXTimer1:procedure TForm1.DXTimerTimer(Sender: TObject; LagCount: Integer);
begin
if not DXDraw.CanDraw then exit;
DXInput.Update;
DXDraw.Surface.Fill(0);
DXSpriteEngine.Dead;
DXSpriteEngine.Move(1000);
DXSpriteEngine.Draw;
With DXDraw.Surface.Canvas Do
Begin
Brush.Style := bsClear;
Font.Color := clFuchsia;
Font.Size := 16;
Textout(10, 50, " FPS: " + inttostr(DXTimer.FrameRate));
<...тут рисуй...>
end;
Release;
end;
DXDraw.Flip;
end;
← →
JUS © (2006-01-07 10:05) [62]Если ты хочеш рисовать на канве только лиш из за токо чтоб как ты думаеш сэкономить память не рисуя там спрайт(вместо рисований), то это зря. если спрайт не анимированый, то от него и тормозов практически совсем совсем никаких. и фпс не куда не упадет.
Вот, посмотри мою игру недоделку. там у меня тока в панели состояния 39 спрайтов, 3 из них анимированные.
http://www.webfile.ru/619176
← →
Аццкий_рыцарь:) (2006-01-07 15:46) [63]ЛЮДИ! вы не очень внимательно прочитали мой последний топ! там я рисовал не на Dxdraw, а именно изменял рисунок своего спрайта, и динамически во время работы игры рисовал В нем а не НА нем. Тоесть, пусть даже поверхность обновляется, но спрайт-то будет рисоваться. Что можете сказать поэтому поводу?
← →
Cash © (2006-01-07 19:01) [64]Аццкий_рыцарь:) (07.01.06 15:46) [63]:
Ужас!!! Тебя кто этому научил ??? (Я бы этому дяде с большими ушами ...) :)))
Ну зачем такой изврат? Заготовь две картинки. Первую - живого мостра,
вторую - мертвого. Потом, при смерти монстра говори:
"Монстр.Картинка:=Мертвый", а после реанимации:
"Монстр.Картинка:=Живой".
(Не, если охота оставить PixelCheck, то согласен, надо бы рисовать,
но у меня в этой ситуяции родилась другая мысля: "все кадры
распихать по разным картинкам. А вместо анимации по кадрам
делать анимацию по картинкам.")
← →
JUS © (2006-01-07 20:48) [65]
> Аццкий_рыцарь:) (07.01.06 15:46) [63]
дааа уж,....эх
← →
Аццкий_рыцарь:) (2006-01-07 23:00) [66]2Cash и 2Jus ну смотрите, если прорисовывать постояно картинку мертвого монстра в DXтаймере, это нормально с одним монстром... А если монстров 200? то постоянно надо рисовать каждого из них на DxDraw?? это ж склько координат ?!
← →
JUS © (2006-01-07 23:31) [67]Координаты выбирай из массива циклом.
← →
Аццкий_рыцарь:) (2006-01-07 23:44) [68]2Jus кстати, можешь, если не сложно еще раз игру выложить? а то там архив поврежден :(
← →
JUS © (2006-01-08 00:40) [69]
> архив поврежден :(
быть не может, ты каким раром распаковывал? я паковал, версией 3.20.
а у тебя какая?
← →
JUS © (2006-01-08 01:10) [70]Разместил SFX-архив (exe-шный), там точно RAR не нужен:-)
http://www.webfile.ru/732575
← →
JUS © (2006-01-08 01:11) [71]Кстати весит он 1.7мб
← →
Аццкий_рыцарь:) (2006-01-08 02:21) [72]Блин, у меня проблема с инетом :(скорость 800 байт в секунду может завтра станет нормальной...
← →
Cash © (2006-01-08 09:26) [73]Аццкий_рыцарь:) (07.01.06 23:00) [66]:
... монстров 200? то постоянно надо рисовать каждого ...
Надо надо, если тебе это надо, то надо.
Так, товарищь! У тебя есть куча спрайтов. И DxSpriteEngine.
У тебя есть DxImageList. Картинки монстра в DxImageList
находится, так? Причем, и мертвого, и живого, так?
Монстров ты создаешь, и (наверное) картинку им ставишь в конструкторе,
или после создания уже говоришь:?
Monster.Image:=DxImageList.Items.Find("Monster");
А что тебе помешает сделать два указателя на картинки для монстра??
Monster.Image:=DxImageList.Items.Find("Monster");
Monster.DeathImage:=DxImageList.Items.Find("DeathMonster");
Делаешь у монстра булевский флаг IsLive. И поцедуры DoMove,DoDraw и
DoCollision подчиняешь этому флагу.
(В конструкторе, естественно, флаг надо поднять)
Procedure TMonster.DoMove(MoveCount: Integer);
begin
if IsLive then begin
//<Живем и радуемся жизни> :)
end;
end;
Procedure TMonster.DoDraw;
begin
if IsLive then Image.Draw(<.....>)
else DeathImage.Draw(<.......>);
end;
Procedure TMonster.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if IsLive then begin
// <Проверяем столкновения>
end;
end;
Как результат, тебе не надо никуда ничего рисовать.
Если спрайт мертв, то он не будет анимироваться,
процедуры DoMove и DoCollision будуть просто пролетать.
При этом ты и остальные будут видеть мертвый спрайт.
И когда надо, то не создавать нового, а снова поднять
флаг жизни (IsLive) спрайту и переместить его на новые координаты.
-----------------------------------------------------------------------------
ЗЫ: А если охота, чтоб через некоторое время все действо проходило на
горе трупов монстров, то заготовь одну большую картинку заднего фона,
рисуй на ней спрайт мертвого монстра, и делай BgImage.Restore.
тогда появится картинка мертвого на фоне всех остальных.
(Блин, и как я сразу про Restore не вспомнил, без него изменения на
битмапе недействительны)
← →
JUS © (2006-01-08 12:02) [74]Первый раз про Restore слышу. Поподробнее можеш?)
← →
Аццкий_рыцарь:) (2006-01-08 17:48) [75]Что такое BgImage.restore, и с чеми его едят? О_о
← →
Cash © (2006-01-08 19:01) [76]JUS © (08.01.06 12:02) [74]:
Увидев этот пост, усомнился, что Restore есть! (для меня это норма)
Поподробнее про Restore:
С англиского я бы перевел, как "Сбросить" или "Обновить".
Есть такая вещь, называется она DxImageList.Items.LoadFromFile("");.
Кто нибудь смтрел внутрь? Там в конце в самом написано Restore;,
то есть Self{DxImageList.Items}.Reastore;! А там внутри написано:
For <bla bla bla> do Items[i].Restore;
То есть просто при загрузке файлика происходит Restore каждому
итему (Item)! А внутри самой этой Restore; всего лишь обновление
данных для вывода в формате DirectDraw; !!!! Если нарисовать
что нибудь и не вызвать Restore, ничего не произойдет!
Аццкий_рыцарь:) (08.01.06 17:48) [75]:
BgImage - это типа (я же не знаю как это у тебя называется) твой
спрайт, который ты используешь в качестве заднего фона.
Сокращение от BackgroundImage.
Ну а про Restore я уже более или менее "не" :) понятно объяснил.
← →
JUS © (2006-01-08 21:42) [77]
> Аццкий_рыцарь:) (07.01.06 23:44) [68]
> 2Jus кстати, можешь, если не сложно еще раз игру выложить?
> а то там архив поврежден :(
Ну чё скачалась? смотрел?
← →
Аццкий_рыцарь:) (2006-01-09 00:59) [78]2 ВСЕ :)
когда прорисовываешь постоянно через ДХтаймер то приложение начинает УЖАСНО "углючить" :( фпс где-то 25. А вот если в Image спрайта рисовать... тогда делфи будет пофиг что там, а сам спрайт он без глюков рисует
← →
JUS © (2006-01-09 01:41) [79]
> Аццкий_рыцарь:) (09.01.06 00:59) [78]
> 2 ВСЕ :)
>
> когда прорисовываешь постоянно через ДХтаймер то приложение
> начинает УЖАСНО "углючить" :( фпс где-то 25. А вот если
> в Image спрайта рисовать... тогда делфи будет пофиг что
> там, а сам спрайт он без глюков рисует
1.Что такое ВСЕ :) ?
2.Рисовать в спрайте - извращение :)
← →
Аццкий_рыцарь:) (2006-01-09 02:13) [80]1. Означает что я обращаюсь ко всем тем, кто принимал участие в обсуждении данного топа :)
2. Почему? Кто сказал?
Страницы: 1 2 3 4 5 вся ветка
Форум: "Игры";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
Память: 0.64 MB
Время: 0.05 c