Форум: "Игры";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
ВнизDoCollision B DelphiX Найти похожие ветки
← →
Аццкий_рыцарь:) (2006-01-09 02:13) [80]1. Означает что я обращаюсь ко всем тем, кто принимал участие в обсуждении данного топа :)
2. Почему? Кто сказал?
← →
Cash © (2006-01-09 08:55) [81]Аццкий_рыцарь:) (09.01.06 02:13) [80]:
2: Это ни кто не говорил. Но это так есть!
При всем этом, такое ни кто не запрещал!
← →
JUS © (2006-01-09 10:25) [82]
> Аццкий_рыцарь:) (09.01.06 02:13) [80]
> 2. Почему? Кто сказал?
Это всё равно что есть суп вилкой:)
← →
JUS © (2006-01-09 12:43) [83]
> > Аццкий_рыцарь:) (09.01.06 00:59) [78]
> > 2 ВСЕ :)
А чё значит "2" перед "ВСЕ"?
> Аццкий_рыцарь:) (07.01.06 23:44) [68]
> 2Jus кстати, можешь, если не сложно еще раз игру выложить?
> а то там архив поврежден :(
И "2Jus"?
← →
JUS © (2006-01-09 12:45) [84]Аццкий_рыцарь:) ты ссылку то посмотрел или нет!? http://www.webfile.ru/732575
← →
JUS © (2006-01-09 12:48) [85]Если долго качается можеш на моём "сайте":) скачать, там быстрее.
http://www.sidorov-vadim.narod.ru
Ещё можеш редактор карт скачать и посмотреть скриншоты:)
← →
Cash © (2006-01-09 14:18) [86]Аццкий_рыцарь:) (09.01.06 00:59) [78]:
... когда прорисовываешь постоянно через ДХтаймер то приложение ...
А DxTimer вообще вещь мерзопакостная и очень нехорошая!
Найди набор Power Draw 3, бери таймер от туда.
Или, если не хоца, могу дать свой аналог для Омеги.
Установишь его (он встанет на закладку Omega), и работай
дальше!
← →
Аццкий_рыцарь:) (2006-01-09 18:44) [87]1) Игру посмотрел :) прикольно. Внатуре много спрайтов и неглючит. Но, например если играть в мою игру 30 мин, и постоянно валить монстров, то на бекграунде надо будет постоянно по 2000 монстров , у каждого из которых свои координаты и все остальное :(
2) 2 это типа на английсrом "to" , тоесть если дословно перевести 2Jus - To Jus - Обращаюсь к Jus :)
3) А таймер от омеги имеет все те же функции что и ДелфиХ таймер? и он будет работать так же с DXDraw?
4) Ну смотрите. Зачем мне грузить память постоянно всякими лишними монстрами, создавать трупов, если на рисунке бекграунда можно сразу нарисовать монстра 1 раз и никогда больше к нему не возвращаться?
← →
Cash © (2006-01-10 09:44) [88]Аццкий_рыцарь:) (09.01.06 18:44) [87]:
3) Поправочка, мой таймер к Омеге, родной от Омеги он абсолютно другой.
Мой тоже с DxTimer-ом не родим.
Таймер, этож абсолютно левая штука. Бери хоть из закладки System,
тока он для игр негоден.
Моя переделка таймера очень похожа на PowerTimer из Power Draw 3.
У него нет interval, рисует всегда с макс. скоростью,
есть ProcessFPS, частота в секунду сробатывания события OnProcess,
то есть перемещений. три флага: CanRealTime, CanRender, CanProcess,
и три события к ним OnRealTime (раз в сек.), OmRender (макс. возм. скорость), OnProcess (ProcessFPS раз в сек.)
4) Вот и я про что говорю. Оставь монстров 200 - 250, а трупы бери и рисуй
на бэкграунде.
← →
Аццкий_рыцарь:) (2006-01-10 13:48) [89]4) А КАК?????? МОЖЕШЬ ПОЛНЫЙ КОД НАПИСАТЬ?
← →
Cash © (2006-01-10 16:31) [90]Аццкий_рыцарь:) (10.01.06 13:48) [89]:
АГА... :))) Щасссс.... :D
Нетужки, это тебе самому придется делать! А то, блин, кайфа никакого
не получишь! ;) Не помоч то, я, помогу. Но по минимуму.
- При создании игры говори:
(при этом я предпологаю, что у монстра есть поля Image и DeathImage)
i:=0;
while i < 250 do begin
With TMonster.Create(DxSpriteEngine.Engine) do begin
X := <bla bla bla>;
Y := <bla bla bla>;
<bla bla bla>
Image := DxImageList.Items.Find("LiveMonster");
DeathImage := DxImageList.Items.Find("DeathMonster");
end;
inc(i);
end;
- Добавь монстру флаг жизни (смотри предыдущие помты) и
сделай методы DoMove, DoDraw и DoCollision Монстра согласно
этому флагу.
- Добавь монстру "тик таймер" целочисленную переменную,
которая будет отвечать сколько монстр уже мертв. И в методе
DoMove, когда монстр мертв (IsLive = false) увеличивай этот
таймер.
- Если есть прикольная анимация смерти монстра, то пускай при
смерти он ее прогонет, а на картинке заднего фона нарисуй
последний кадр этой анимации. Думаю, ты знаешь как это сделать.
Просто, когда монстр покажет свой последний кадр смерти, делай
ему Visible:=false и рисуй последний кадр с последующим Restore.
(Надеюсь, ты уже догадался, что это я бы запихал в DoMove монстра)
- Не делай внешний таймер для добавления монстра. Сделай так, чтобы
монстр сам воскрешался по прошествии некоторого интервала времени
(здесь как раз и поможет "тик таймер"). Когда пройдет достаточно
времени и "тик таймер" отсчитает достаточно тиков, говори монстру
IsLive := true;, и "тик таймер" сбрасывай в ноль.
Да, кстати! JUS прав. Запиши монстров в масив, и отрисовывай и
перемещай не через DxSpriteEngine.Move и ...Draw, а используя цыкл:
i:=0;
while i < 250 do begin
if Monsters[i].Visible then begin
Monsters[i].Move(MoveCount);
Monsters[i].Draw;
end;
inc(i);
end;
Для записи в масив первый листинг можно переделать так:
i:=0;
while i < 250 do begin
Monsters[i] := TMonster.Create(DxSpriteEngine.Engine); // <---=
With Monsters[i] do begin // <---=
X := <bla bla bla>;
Y := <bla bla bla>;
<bla bla bla>
Image := DxImageList.Items.Find("LiveMonster");
DeathImage := DxImageList.Items.Find("DeathMonster");
end;
inc(i);
end;
← →
Аццкий_рыцарь:) (2006-01-10 21:28) [91]2 Cash я все примерно так и делал, просто не понимаю что такое Restore:(
это как бы дает понять приложению, что спрайт у которого стоит .restore должен постоянно прорисовываться и неудаляться? тоесть например спрайт монстра уже заново живой, а картинка с мертвым монстром рисуется постоянно на том месте где ты ей один раз задал координаты?
← →
Cash © (2006-01-11 08:32) [92]Аццкий_рыцарь:) (10.01.06 21:28) [91]:
Нет, нет, нет!
Не приложению, а самой картинке, тобиш ее классу.
И не про спрайт, а про нее саму (картинку), про то, что она
как то обновлена.
Сделай так:
DxImageList.Items.Add;
With DxImageList.Items.Items[0] do begin
// А здесь нарисуй что нибудь прямо на битмап этой картинки
end;
После этих манипуляцый попробуй вывести эту картинку:
DxImageList.Items.Items[0].Draw(0,0,0);
Она не нарисуется, потаму, что ты направил данные только на битмап!
В самой картинке предусмотрено два варианта ее хранения:
- в виде простой и понятной битматрицы,
- в виде текстуры, понятной DirectDraw устройству!!!
На поверхности DxDraw рисуются только текстуры, а не битмапы!
А чтобы перегнать картинку из битматрицы в текстуру надо сказать:
DxImageList.Items.Items[0].Restore;
Тем самым, когда Монстр проигрывает свой последний кадр анимации
и, вроде, должен застыть в этом кадре, ты ему говориш:
if AnimPos = AnimCount then begin
Visible := false;
// А здесь бери, и рисуй прямо на картинку заднего фона
// потом вызови у Restore у заднего фона, и новоотрисованное
// изображение обновится и на текстуре.
// А Visible ставим в false, чтоб монстр больше не отрисовывался.
end;
← →
Аццкий_рыцарь:) (2006-01-11 22:27) [93]Счас попробую...
← →
Аццкий_рыцарь:) (2006-01-11 23:06) [94]вот смотри, допустим у меня спрайт-бэкграун это DxImageList1.Items.Items[2], в DXDib1.dib есть картинка мертвого монстра
мне надо нарисовать картинку DXDib1.dib поверх бэкграунда DxImageList1.Items.Items[2] по нажатие кнопки Button1:что я не так сделал?
procedure TForm1.Button1Click(Sender: TObject);
begin
DxImageList1.Items.Add;
With DxImageList1.Items.Items[2] do begin
picture.Bitmap.Canvas.Draw(2,2,dxdib1.DIB);
end;
DxImageList1.Items.Items[2].Restore;
end;
← →
Cash © (2006-01-12 07:57) [95]Аццкий_рыцарь:) (11.01.06 23:06) [94]:
Ты что все с DxDIB извращаешься.
Для уменьшения дальности переходов по адресам я бы порекомендовал
захватить битматрицу картинки заднего фона.
var
P: TBitMap;
begin
P := BgImage.Picture.BitMap;
// а потом можно рисовать на P
Если тебе охота попробовать сначала на пустом примере, то перед тем
как что то рисовать надо задать новые размеры битматрицы (Width, Height).
Потом надо задать PatternWidth и PatternHeight. А потом нарисовать и
вызвать Restore.
А если это прямо в игре не срабатывает, на той картинке, которую
ты выводишь на заднем фоне, то я просто не знаю.
Q:
Слушай Аццкий_рыцарь:), а ты просто, на только что созданый битмап
картинку вывести могешь, примерно так:
var
P: TBitMap;
begin
P := TBitMap.Create;
// Подготовь битмап и нарисуй на нем хыть прямоугольник
// А потом сделай это.
Form1.Canvas.CopyRect(P.Canvas.ClipRect,P.Canvas,P.Canvas.ClipRect);
P.Free;
end;
И чтоб после этих манипуляцый на форме появилось нарисованное тобой
изображение???
← →
Аццкий_рыцарь:) (2006-01-12 15:08) [96]Например та же ситуация с кнопкй, чтоб она рисовала DxDib на ImageList1.items.Item[2]...
Вот так что ли?
procedure TForm1.Button1Click(Sender: TObject);
var P: TBITMAP;
begin
P := TBitMap.Create;
P:= DxImageList1.Items.Items[2].Picture.bitmap;
DxImageList1.Items.Add;
With DxImageList1.Items.Items[2] do begin
Form1.Canvas.CopyRect(P.Canvas.ClipRect,P.Canvas,P.Canvas.ClipRect);
p.Canvas.Draw(2,2,dxdib1.DIB);
end;
DxImageList1.Items.Items[2].Restore;
end;
че-то когда нажимаешь кнопку, то спрайт бэкграунда просто пропадает :(
блин я че-то недопонимаю. мне так обидно за это, что хочу биться головой об стенку :((
← →
Cash © (2006-01-12 16:51) [97]Аццкий_рыцарь:) (12.01.06 15:08) [96]:
Не, биться об стенку незачем...., н-ну-у-у-у...., если угодно ремонт устроить... :D :D :D
Так, давай начнем с простого.
Бери Пустую форму, ставь на нее кнопку. В событии клика пиши:
var
P: TBitMap;
begin
P := TBitMap.Create;
with P do begin
Canvas.Brush.Color := clBlack;
Canvas.Pen.Color := clRed;
Canvas.RectAngle(5,5,95,115);
end;
Canvas.CopyRect(Bounds(50,50,P.Width,P.Height),P.Canvas,P.Canvas.ClipRect);
P.Free;
end;
Как видишь по клику кнопки производится рисование на канву формы,
но не просто так, а через буфер, т. е. через битматрицу.
На форме должен появиться белый прямоугольник, внутри которого
черный квадрат с красной границей.
После компиляции, по нажатию на кнопку ничего не происходит.
Тебе вопрос: Почему?
(я пойду от простого к сложному, тогда тебе должно стать все понятно)
← →
Аццкий_рыцарь:) (2006-01-12 23:44) [98]ээээ я непонимаю что такое CopyRect, из названия видно, что это надо копировать какой-то прямоугольник... А с чего копировать?
← →
antonn © (2006-01-13 06:47) [99]Cash © (12.01.06 16:51) [97]
т. е. через битматрицу.
ухх... :)
Аццкий_рыцарь:) (12.01.06 23:44) [98]Canvas
.CopyRect(Bounds(50,50,P.Width,P.Height)
,P.Canvas,P.Canvas.ClipRect);
синим на что копировать, и в какой прямоугольник, черным откуда и из какого прямоугольника.
← →
Cash © (2006-01-13 11:31) [100]Аццкий_рыцарь:) (12.01.06 23:44) [98]:
Вот из этого становится ясно, что с оборотом графики в Delphi
ты не сильно хорошо знаком. :(
TCanvas.CopyRect(DestRect: TRect; Src: TCanvas; SrcRect: TRect);
Эта процедура копирует часть канвы исходника Src, описанную
рамкой SrcRect, и вписывает эту часть в прямоугольник DestRect
собственной канвы.
Применительно к примеру [97] процедура несет смысл:
"Берем весь буфер, копируем и вставляем его по координатам [50,50]
канвы формы".
На форму это изображение не выводится потаму, что при создании буфер
не были указаны его ширина и высота. Сделай пример [97] в живую,
напиши его на Delphi. Посмотри, что это действительно так. Потом найди
некоторые сходства с проблемой в игре, они есть (даю 250% гарантии).
Потом откоректируй пример, примерно так:
... // здесь тпа var..., begin..., все рядом
with P do begin
Width := 100;
Height := 150;
Canvas.Brush.Color := clBlack;
Canvas.Pen.Color := clRed;
Canvas.RectAngle(5,5,95,115);
end;
... // а там все остальное
Потом запусти отредактированный пример, и посматри на выведенную
картинку (она выведется на 255%, если ты все правильно сделаешь).
Проанализировав этот пример и полученный опыт, тебе должно стать ясно,
где именно ты сделал ошибку.
← →
Cash © (2006-01-13 11:38) [101]А вот еще вопрос:
Ты задний фон создаешь через TBackgroundSprite?
Если нет, то попробуй.
Если да, то:
С какими параметрами ты вызываешь SetMapSize?
← →
Аццкий_рыцарь:) (2006-01-14 00:49) [102]О! ВОТ НАД ЧЕМ Я БЪЮСЬ! я не могу разобраться что за setmapsize и как работать с TBackgroundSprite :( Расскажи плиз про него немного, если можешь :)
← →
Cash © (2006-01-14 11:13) [103][102]:
А чёб и не рассказать!!! ;)
TBackgroundSprite - класс еще раз подтверждающий крутизну этого
японского психа.
(на его сайте была фотка: козлиная бородка, бегающие глазки, очечки
дурацкие, псих одним словом :D )
Это класс заднего фона игры, в основном в нем используются следующие поля:
- X,Y: конечно положение по осям левого верхего края карты.
- Chips: масив из целых чисел, индексов картинки.
- Image: сама картинка
- MapWidth: длина векторов по X в масиве Chips.
(мутно написал, правда :), проще - это ширина масива Chips)
- MapHeight: высота масива Chips.
Сам масив Chips - это и есть вся карта.
Задать высоту и ширину этого масива можно вызвав SetMapSize(AMapWidth, AMapHeight: Integer).
Тогда карта становится такой:
SetMapSize(4,10);
+---+---+---+---+---+
|0,0|0,1|0,2|0,3|0,4|
+---+---+---+---+---+
|1,0|1,1|1,2|1,3|1,4|
+---+---+---+---+---+
|...|...|...|...|
+---+---+---+---+---+
|0,9|1,9|2,9|3,9|4,9|
+---+---+---+---+---+
И обращаться к этим элементам можно как:
<...>.Chips[x,y] := <...>;// where (0 <= x <= MapWidth) & (0 <= y <= MapHeight)
Так вот, в твоем случае (тебе же хочется рисовать на поверхности заднего
фона), SetMapSize надо вызывать с параметрами 1,1!!!
То есть твоя карта состоит из 1 элемента. При всем этом тебе понадобится
заготовить картинку заднего фона размером с экран (640х480; 800х600; ...)!
Только тогда можно будет рисовать на картинке заднего фона по нужным
координатам (ну не то чтобы можно, оно можно всегда, но тыж видел что
бывает :))) ).
← →
Cash © (2006-01-14 11:16) [104]Вечно я с этими примерами путаю! :)
SetMapSize(5,10);
+---+---+---+---+---+
|0,0|0,1|0,2|0,3|0,4|
+---+---+---+---+---+
|1,0|1,1|1,2|1,3|1,4|
+---+---+---+---+---+
|...|...|...|...|...|
+---+---+---+---+---+
|9,0|9,1|9,2|9,3|9,4|
+---+---+---+---+---+
Вот, так правильнее.
← →
Аццкий_рыцарь:) (2006-01-14 16:29) [105]а класс бэкграунда так объявлять?:
type
Tgrass = class(TBackgroundSprite)
protected
end;
а потом
procedure TForm1.FormCreate(Sender: TObject);
begin
with Tgrass.Create(Dxspriteengine1.Engine) do
begin
setmapsize(1,1)
x:=0;
y:=0;
image:=form1.dxImageList1.Items.Find("trava");
end;
end;
← →
Cash © (2006-01-14 16:44) [106]Да ну..., на кой тебе класс наследовать????
Бери прямо объект от класса TBackGroundSprite.
← →
Аццкий_рыцарь:) (2006-01-14 17:19) [107]Это как? О_о
← →
Cash © (2006-01-14 17:32) [108]Аццкий_рыцарь:) (14.01.06 17:19) [107]:
:D :D :D :D :D :D :D :D :D :D :D :D :D :D :D
Ну даешь!!!! :)
var
BgImage: TBackgroundSprite;
И Все!!! :D :D :D :D
← →
Аццкий_рыцарь:) (2006-01-14 23:23) [109]О! рисует на бэкграунде ! :)
procedure TForm1.Button1Click(Sender: TObject);
var P: TBITMAP;
begin
p:= form1.DXImageList1.Items.Items[3].Picture.bitmap;
with P do begin
Width := 77;
Height := 77;
Canvas.Brush.Color := clBlack;
Canvas.Pen.Color := clRed;
canvas.Draw(0,0,dxdib1.DIB);
end;
form1.DXImageList1.Items.Items[3].Restore;
end;
только оно стирает полностью всю картинку бэкграунда, и рисует туда мертвого монстра :( а надо чтоб рисовало просто поверх. Как это сделать?
← →
Аццкий_рыцарь:) (2006-01-15 00:41) [110]и еще...
мне надо чтоб фон у картинки был прозрачным, но у dxdib есть только transparent, a transparent color нету :( я пытался вместо canvas.Draw(0,0,dxdib1.DIB) ставить canvas.Draw(0,0,form1.DXImageList1.Items.Items[4].Picture.bitmap) (в DXImageList1.Items.Items[4] я посавил такую же картинку как и в dib1 ) но рисуется вместо монстра белый квадра :( блин !что тут не так?
← →
antonn © (2006-01-15 06:10) [111]если нужно скопировать битмап на битмап(не на канвас) с "прозрачным цветом", могу дать процедурку, она побыстрее, чем canvas.Draw()
← →
Cash © (2006-01-15 09:15) [112]Аццкий_рыцарь:) (14.01.06 23:23) [109]:
ыыыыы.... :)))
Конечно рисует, но вот зря ты бэкграунду размеры меняешь!
Их же менять надо, когда утебя картинка новая.
А на бэкграунде у тебя уже есть картинка, и должна она,
по моему, быть большой. И размеры бэкграунда вроде должны
быть под размер экрана.
antonn © (15.01.06 06:10) [111]:
Выкладывай!
Хотя... есть BrushCopy. Аццкий_рыцарь:), посмотри в хелпе по этой
процедуре.
TCanvas.BrushCopy(<...>)
Аццкий_рыцарь:) (15.01.06 00:41) [110]:
Не майся ты с DxDIB, это лаг. делай все манипуляции из буфера-битмапа.
Этож проще, и я показал уже как.
Еще одно замечание: зачем тебе form1 в обработчике класса TForm1???
Если ты создашь два объекта класса TForm1, то они не будут работать!
Потаму, что ты обращаешся не к свойствам класса, а к свойствам внешнего
объекта этого класса. Проше говоря, все законы действуют только для
Form1: TForm1.
Обращайся напрямую из обработчика к свойствам класса, или, если не
помниш что да как то, используй Self для переходов по адресам.
procedure TForm1.Button1Click(Sender: TObject);
var P: TBITMAP;
begin
p:= DXImageList1.Items.Items[3].Picture.bitmap; /// Look here
with P do begin
Width := 77;
Height := 77;
Canvas.Brush.Color := clBlack;
Canvas.Pen.Color := clRed;
canvas.Draw(0,0,dxdib1.DIB);
end;
Self.DXImageList1.Items.Items[3].Restore; /// Look here
end;
← →
antonn © (2006-01-15 09:39) [113]Cash © (15.01.06 9:15) [112]
Хотя... есть BrushCopy.
забудь о BrushCopy:) А о Canvas.Draw() так тем более:))) Это же тормоза страшенные будут.
может я неправильно ее использовал, но у меня, при clblack "прозрачном цвете", битмап копировался с белым фоном. Единственное преимущество у этой функции - она может менять размер "выводного" битмапа, растягивая его, нпмр.
Вот, в 3,5 раза быстрее, чем BrushCopy(замерял через QueryPerformanceCounter после 1000 копирований битмапа 128х128):
_B_in - копируемый битмап,
_B_out - на который копируем,
_x,_y - координаты копирования копируемого (гы-гы-гы) битмапа,
trColor - прозрачный цвет.procedure CopyTransparentBrush(var _B_in,_B_out:Tbitmap; _x,_y:integer; trColor:Tcolor);
const
Pixels = MaxInt div SizeOf(TRGBTriple);
type
PRGBArray = ^TRGBArray;
TRGBArray = array[0..Pixels-1] of TRGBTriple;
var x, y, x_cor,y_cor,x_corS,y_corS: Integer; RowOut,RowIn: PRGBArray;
rc1, bc1, gc1:byte;
begin
if (_x)>_B_out.Width-1 then exit; if (_x+_B_out.Width)<0 then exit;
if (_y)>_B_out.Height-1 then exit; if (_y+_B_out.Height)<0 then exit;
_B_in.PixelFormat:=pf24bit; //убрать, если изначально этот формат
_B_out.PixelFormat:=pf24bit; //убрать, если изначально этот формат
if _x<0 then x_corS:=abs(_x) else x_corS:=0;
if _y<0 then y_corS:=abs(_y) else y_corS:=0;
if (_x+_B_in.Width)>_B_out.Width then x_cor:=_x+_B_in.Width-_B_out.Width else x_cor:=0;
if (_y+_B_in.Height)>_B_out.Height then y_cor:=_y+_B_in.Height-_B_out.Height else y_cor:=0;
rc1:=GetRValue(trColor); gc1:=GetGValue(trColor); bc1:=GetBValue(trColor);
for y:=y_corS to _B_in.Height-1-y_cor do begin
RowOut:= _B_out.ScanLine[y+_y];
RowIn:= _B_in.ScanLine[y];
for x:=x_corS to _B_in.Width-1-x_cor do
if not((RowIn[x].rgbtRed=rc1)and(RowIn[x].rgbtGreen=gc1)and(RowIn[x].rgbtBlue=bc1)) then begin
RowOut[x+_x]:=RowIn[x];
end;
end
end;
← →
antonn © (2006-01-15 09:40) [114]да, забыл сказать:
канвас - рулез!
:)
← →
Cash © (2006-01-15 10:44) [115]antonn © (15.01.06 09:40) [114]:
Whaaatsuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuup!!!!! :)))
antonn © (15.01.06 09:39) [113]:
Эту процедуру сам писал? Форматирование текста ужасное. :)
Переформатировав под сбя понял, что, наверное, ты всетаки
неправильно использовал BrushCopy.
Двойной, вложеный for это самоубийство в плане быстродействия.
А в другом, пока я прознал про BrushCopy, делел именно так! ;)
(только с заменой for на while)
← →
Аццкий_рыцарь:) (2006-01-15 11:10) [116]antonn
УЖОС! :) я пока разберусь с твоей процедурой, то мои волсы станут седые :)
Cash
так как работает BrashCopy? и как сделать чтоб фон картинки мертвого монстра был прозрачным? и где ты показывал как записать битмап в буфер? :)
← →
Cash © (2006-01-15 11:31) [117]Аццкий_рыцарь:) (15.01.06 11:10) [116]:
Самое главное в нашем деле - не торопиться.
Торопишся, внимательнее изучай изложенную здесь информацию!
Пример из [97] и далее. Переделай его под себя.
Слушай, а мож я тебе дам русскую справку по Делфе,
недоделанная и для D4, но тебе поможет.
У меня еще есть англиская - по DelphiX, если шариш в
буржуйском, там все понятнее понятного написано.
← →
antonn © (2006-01-15 11:54) [118]Cash © (15.01.06 10:44) [115]
Эту процедуру сам писал?
угу:)
могу еще ужаснее показать:
http://kladovka.net.ru/index.cgi?pid=list&rid=252
> Форматирование текста ужасное.
я старался:)))
у меня поле с кодом не такое большое, чтобы размашисто писать, поэтому я привык писать сжато, мне то понятно:)
> Двойной, вложеный for это самоубийство в плане
>быстродействия.
> А в другом, пока я прознал про BrushCopy, делел именно
>так! ;)
> (только с заменой for на while)
это самоубийсво работает быстрее, у меня по крайней мере:)
Аццкий_рыцарь:) (15.01.06 11:10) [116]
УЖОС! :) я пока разберусь с твоей процедурой, то мои волсы станут седые :)
:]
В общем так я сравнивал:
на форме 2 Timage, в одном картинка 128х128 с черным "прозрачным цветом", на другом другая картинка (около 300х200). Делал 3 вызова нижеприведенного кода, из них брал усредненное. Сначала с BrushCopy, потом CopyTransparentBrush (только без var в передаче параметров).var
Divisor:Int64; T1:Int64; i,X,ii:integer; TotalTime :Extended; iii:integer;
begin
if QueryPerformanceFrequency(Divisor) then
begin
QueryPerformanceCounter(T1);
TotalTime := T1;
for iii:=0 to 199 do
// Image2.Picture.Bitmap.Canvas.BrushCopy( rect(0,0,Image1.Width,Image1.Height),Image1.Picture.Bitmap,rect(0,0,Image1.Width,Image1.Height),clblack ); //0.142
CopyTransparentBrush( Image1.Picture.Bitmap,Image2.Picture.Bitmap,10,20,clblack ); //0,041
QueryPerformanceCounter(T1);
TotalTime:=(T1-TotalTime)/Divisor;
caption:=floattostr(TotalTime);
end;
где я неправильно испрользовал BrushCopy?
← →
Cash © (2006-01-15 13:47) [119]antonn © (15.01.06 11:54) [118]:
... я старался:))) ...
Видел бы ты мой первый метод выравнивания текста.
Я щас этого прочитать не могу. Даже переформатировать на новый лад! :)
... где я неправильно испрользовал BrushCopy? ...
Ну, а как можно ошибиться в одной процедуре? Все вроде нормально,
но тыж говорил о нарушении цвета (про белый фон). Я это имел в виду.
← →
antonn © (2006-01-15 13:55) [120]Cash © (15.01.06 13:47) [119]
Ну, а как можно ошибиться в одной процедуре? Все вроде нормально,
но тыж говорил о нарушении цвета (про белый фон). Я это имел в виду.
вот после приведенного кода (даже без цикла), вместо "прозрачного цвета" - белый фон.
Страницы: 1 2 3 4 5 вся ветка
Форум: "Игры";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
Память: 0.72 MB
Время: 0.058 c