Форум: "Игры";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
ВнизDoCollision B DelphiX Найти похожие ветки
← →
Cash © (2006-01-19 08:51) [160]А если еще подумать, то можно и еще почикать эту процедурку.
procedure TForm1.DrawKozelDeath(Subj: TKozel);
var
t: TColor;
b: TRect;
begin
t := Subj.Image.TransparentColor;
b := bounds(Trunc(Subj.X),Trunc(Subj.Y),77,77);
p.Canvas.Brush.Style := bsClear;
p.Canvas.BrushCopy(b,a,a.Canvas.ClipRect,t);
DXImageList1.Items.Items[9]..Assign(p);
DXImageList1.Items.Items[9].Restore;
end;
← →
antonn © (2006-01-19 09:36) [161]Cash © (19.01.06 8:21) [158]
Он хоть и присуцтвует, а никакой функции не несет!
нужно иметь битмап и работать с пикселами напрямую через scanline, тогда будет скорость (да еще и эффектов, типа прозрачности и черно-белости можно добавить).
кстати, я вот на основе работы со scanline игру на один конкурс писал:
http://an-files.narod.ru/Star_Scroller.rar (1366182 Б)
почти не тормозит на хороших компах;)
>procedure TForm1.DrawKozelDeath(Subj: TKozel);
>var
>r: TGraphic;
>t: TColor;
>b: TRect;
>begin
>r := DXImageList1.Items.Items[9].Picture.Graphic;
>t := Subj.Image.TransparentColor;
>b := bounds(Trunc(Subj.X),Trunc(Subj.Y),77,77);
>p.Canvas.Brush.Style := bsClear;
>p.Canvas.BrushCopy(b,a,a.Canvas.ClipRect,t);
>r.Assign(p);
>Form1.DXImageList1.Items.Items[9].Restore;
> end;
а "напрямую" никак? :) да и вообще, tbitmap юзай
> p.Canvas.Brush.Style := bsClear;
делается всего один раз - и хватит:)
← →
Аццкий_рыцарь:) (2006-01-19 09:47) [162]
> MonoLife (19.01.06 06:02) [157]
понимаешь, я игру пишу не для того чтоб повыпендриваться, мол :"я крутой программер". Я пишу чтоб научиться разбираться с проблемами, возникающими при построении игр! Если б я отдельно садился без игры и начал рыть статьи по ДелфиХ, это бы заняло очень много времени. А так я сразу вижу чего плохого есть там, и как это решить :)
> Cash © (19.01.06 08:47) [159]
моя машина:
Athlon XP 2200+
Radeon 9600 pro
523 Mb оперативы...
мышка и клава Sven :)
ЭХ!
ща буду пытаться это все воплотить в игруху...
← →
Аццкий_рыцарь:) (2006-01-19 10:43) [163]Cash
Теперь че-та мертвого монстряка вообще не рисует, а глючит как и раньше :(
вот что я делал :
там где Private формы вставил p,a: TBitMap;
вот насчет носителя Hit... Я че-то непойму, зачем его переименовывать? допустим пускай Hit будет DeathDraw ...
насчет картинки... Я просто сделал пока что без анимации смерти, все image, которые были с анимацией я просто туда картинку валяющегося монстра вставил.
- вот, что я вставил в FormCreate:
p := TBitMap.Create;
a := TBitMap.Create;
- a:=form1.dxImageList3.Items.Find("mdeadend").Picture.Bitmap;
p.Width := 768;
p.Height := 1024;
- B FormDestroy вставил
a.Free;
p.Free; (кстати пишет ошибку при закрытии форми Acces violation error, тут закрадываются сомнения, насчет правильности создания мной буферов :) )
-В бывший Hit, теперь DeathDraw вставил:
procedure tform1.DeathDraw;
var
r: TGraphic;
t: TColor;
b: TRect;
begin
r := form1.DXImageList1.Items.Items[9].Picture.Graphic;
t := form1.DXImageList1.Items.Items[9].TransparentColor;
b := bounds(deadkozelX,deadkozelY,77,77);
form1.p.Canvas.Brush.Style := bsClear;
form1.p.Canvas.BrushCopy(b,form1.a,form1.a.Canvas.ClipRect,t);
r.Assign(form1.p);
Form1.DXImageList1.Items.Items[9].Restore;
end;
← →
Аццкий_рыцарь:) (2006-01-19 10:49) [164]MoonLife
насчет примеров...
я полно статей нарыл по DelphiX, но вот про эти проблемы, которые я поднимал в этом топике НИГДЕ НИЧЕГО НЕТ:( если можешь, то вышли вот мыло : iradchenko@bigmir.net
← →
Cash © (2006-01-19 11:26) [165]Аццкий_рыцарь:) (19.01.06 10:43) [163]:
... вот насчет носителя ...
Под носителем я понимаю класс, который содержит этот метод или поле.
А вопрос переименоки чисто эстетический! :)
... a:=form1.dxImageList3.Items.Find("mdeadend").Picture.Bitmap; ...
Хм-м, ты же уже создал этот буфер. Зачем тебе его переназначать?
Ты заменишь буфер на бесполезную картинку, которая еще и пустая!
При таком переназначении ты потеряешь ранее созданый объект!
Надо было сделать так:
a.Width := 77;
a.Height := 77;
a.Canvas.Draw(0,0,dxImageList3.Items.Find("mdeadend").Picture.Graphic);
Вроде как этот "mdeadend" и есть последний кадрик анимации этого монстра?
p.Width := 1024; // ух, сделал бы лучше 800х600, тормоза еще и от этого
p.Height := 768;
p.Canvas.Draw(0,0,dxImageList3.Items.Item[9].Picture.Graphic);
← →
Cash © (2006-01-19 11:35) [166]Аццкий_рыцарь:) (19.01.06 09:47) [162]:
... моя машина: ...
Ух-х-х-х-х!
Давненько наверное не грейженая.
Зацени конфиг:
Intel Celeron D360 3.0 GHz (HT+)
ATI x750Pro 128 Md PCI-Ex
1 Gb DDR2 RAM
Тота у меня эти манипуляции с перерисовкой не тормозят! :)))
← →
antonn © (2006-01-19 11:36) [167]Аццкий_рыцарь:) (19.01.06 10:43) [163]
- a:=form1.dxImageList3.Items.Find("mdeadend").Picture.Bitmap;
p.Width := 768;
p.Height := 1024;
матерь божья, у тебя такой здоровый битмап??? а ты на нем еще и draw()...
> -
> a:=form1.dxImageList3.Items.Find("mdeadend").Picture.Bitmap;
>p.Width := 768;
>p.Height := 1024;
>
>- B FormDestroy вставил
> a.Free;
я бы тоже чего нибудь выдал:)
ты вообще, объясни структуру битмапов, какой для вывода, где хранатся тайлы(я так понял в DXImageList1.Items.Items[]?)
>procedure tform1.DeathDraw;
>var
>r: TGraphic;
>t: TColor;
>b: TRect;
>
>begin
> r :=
>form1.DXImageList1.Items.Items[9].Picture.Graphic;
> t :=
>form1.DXImageList1.Items.Items[9].TransparentColor;
>b := bounds(deadkozelX,deadkozelY,77,77);
>form1.p.Canvas.Brush.Style := bsClear;
>form1.p.Canvas.BrushCopy(b,form1.a,form1.a.Canvas.ClipRect,t);
>r.Assign(form1.p);
>Form1.DXImageList1.Items.Items[9].Restore;
> end;
че то тут не то...
я так понял, тебе нужно выхватить из form1.DXImageList1.Items.Items[9] картинку и скопировать ее с прозрачным цветом на большой битмап. Так? у form1.DXImageList1.Items.Items[9] есть Tbitmap, или только TGraphic?
попробуй переписать DeathDraw:
procedure tform1.DeathDraw;
begin
//на p надо вывести?
CopyTransparentBrush(form1.DXImageList1.Items.Items[9].Picture.bitmap, p,deadkozelX,deadkozelY, form1.DXImageList1.Items.Items[9].TransparentColor);
Form1.DXImageList1.Items.Items[9].Restore;
end;
//только у CopyTransparentBrush в параметрах первый var убери
← →
Cash © (2006-01-19 11:47) [168]antonn © (19.01.06 11:36) [167]:
Не учили тебя в детстве читать все посты до конца! :D :D :D
DXImageList - это типа хранилище картинок.
А выводить какраз надо на девятый индекс!
Девятку в p еще на старте запихивают, а сама процедура
рисует еще обин бтмап на p и передают его обратно в девятку.
После чего обновляют текстуру девятки.
← →
antonn © (2006-01-19 11:57) [169]Cash © (19.01.06 11:47) [168]
Девятку в p еще на старте запихивают, а сама процедура
рисует еще обин бтмап на p и передают его обратно в девятку.
После чего обновляют текстуру девятки.
мда...
короче в девятку просто смешивают ее саму и еще один битмап?
а нельзя сразу записать в девятку, без копирований еще одного битмапа на Р а потом в девятку?
← →
Аццкий_рыцарь:) (2006-01-19 12:37) [170]antonn
пытались, но нифига неполучилось :(
кстати я тут все снова учел что написали и всеравно глючит :(
я даже r пытался поставить в OnCreate формы, но от глюков это не избавило :(
← →
Shirson © (2006-01-19 13:05) [171]Аццкий_рыцарь, ты это всё через DelphiX делаешь? Тогда зачем канву мучать? Или я чего-то не понимаю :)
Выложи свой код, посомтреть хочется, может чего подскажу.
← →
Аццкий_рыцарь:) (2006-01-19 13:08) [172]Shirson на DelphiX (шоб его!), ты прав :) я ща на диалапе, еще и скорость передачи 400 байт\с :) че-то эти холода наверное натворили с проводами :) перемерзли наверное :)
← →
Shirson © (2006-01-19 13:36) [173]400б/с это по-взрослому :)
Ладно, тогда так.
У items, из которых стостоит DXImageLis, есть метод Draw(Alpha), который рисует картинку из этого item на поверхность.
Создаёшь дополнительную поверхность, на которой будешь "хранить" трупы.
При смерти "козла" или кого уж там, рисуешь на эту поверхность очередной труп.
В цикле таймера, копируешь кладбищенскую поверхность на главную.
Вот и всё, собственно...
← →
Cash © (2006-01-19 13:41) [174]antonn © (19.01.06 11:57) [169]:
Не, так не получится. По девятому индексу (в девятке типа) лежит
DelphiX текстура, в которой из рабочих и для канвы -
только Graphic: TGraphic! Поэтому пришла идея перебить ее буфер,
а потом работать с буфером. Вот! Елки палки, а ведь на омеге все проще,
там изначально с битмапом работа идет.
Аццкий_рыцарь:) (19.01.06 12:37) [170]:
А вчем глюки то? Если только в медленности - можно забить, более
производительность этого кода можно повысить только с Антоновой
процедурой. А если что не то, то надо действительно посмотреть код.
А r можно вообще убрать, [160] пост.
← →
Shirson © (2006-01-19 13:41) [175]В конце концов, можно делать DXImageList.items.find("kozel").draw(DXImageList.items.find("Background").PatternSurfaces[0],.... и так далее
← →
Cash © (2006-01-19 13:46) [176]Shirson © (19.01.06 13:41) [175]:
Вот я тупой то а!
Полез в какието дела с канвой, когда там прямо на поверхность текстуры
штопать можно!!! И с альфой!!! И быстро!!! И главное - просто, вызвав
одну процедуру! Sorry одним словом, память дырявая! :(
← →
Аццкий_рыцарь:) (2006-01-19 13:48) [177]Э я наверное тоже тупой... еще тупее Cash :) я че-то непойму про что был базар в 175 :)
← →
Shirson © (2006-01-19 13:50) [178]Cash, да ничего, бывает :)
← →
Shirson © (2006-01-19 13:53) [179]Аццкий_рыцарь, DXImageList это, грубо говоря, организованный набор Surface. Каждая из которых позволяет копировать себя на другую Surface, с применением всяческих эффектов, вроде прозрачности, альфа-канала, затенения и пр.
Т.к это всё Surface, можно на прямую копировать изображение из одного Item в другой.
← →
Cash © (2006-01-19 13:54) [180]Аццкий_рыцарь:) (19.01.06 13:48) [177]:
Дело шло про следующую команду
procedure TForm1.DrawKozelDeath(Subj: TKozel);
begin
Subj.Image.Draw(DXImageList1.Items.Items[9].PatternSurfaces[0],
Subj.X,Subj.Y,Subj.AnimC ount-1);
end;
← →
Shirson © (2006-01-19 14:00) [181]Угу, оно самое.
PatternSurfaces[0], чтобы не вводил в заблуждение, это первая поверхность последовательности, которая организуется при раскадровке.
Т.е. если в Item грузить картинку и задавать высоту и ширину кадра, то картинка разбивается на эти кадры, для удобства анимации.
Если разбики на кадры нет, то считается что он всего один и доступ к поверхности идёт через PatternSurfaces[0].
Это так, на всякий случай. Если не понятно - не нужно забивать в голову, оставим на потом
← →
Shirson © (2006-01-19 14:02) [182]P.S. Cash, а тут Subj.[b]Image[/b].Draw не лишниее?
← →
Cash © (2006-01-19 15:37) [183]Shirson © (19.01.06 14:02) [182]:
Неее. Там же обработка из под формы происходит,
а сам дохлый козел (смешно получилось:) в качестве параметра.
А козел, Subj тобишь - это TAnimedSprite (по моему этот класс так
называется).
← →
Shirson © (2006-01-19 16:33) [184]Ааа... Я просто спрайтами не пользуюсь, поэтому меня Image и смутило.
← →
Аццкий_рыцарь:) (2006-01-19 16:38) [185]УРЯ! пашет, как по маслу! ваще нет глюков! теперь жирок такой! на полу полно трупов буквально за 20 сеунд игры, а ты топчешся по ним :)
← →
Shirson © (2006-01-19 17:36) [186]Как всё просто оказывается :)
← →
Cash © (2006-01-19 17:46) [187]Ну вот! разобрались.
Пока эта века еще не забыа и брошена надо бы ее экземпляр на винт кинуть!
:)))
← →
Аццкий_рыцарь:) (2006-01-19 23:42) [188]Shirson
100% !
Cash
тоже 100% :)
← →
JUS © (2006-02-13 22:11) [189]Jus 99% ! :)
Страницы: 1 2 3 4 5 вся ветка
Форум: "Игры";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
Память: 0.79 MB
Время: 0.054 c