Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.10;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.74 MB
Время: 0.046 c
15-1164266454
wezzz
2006-11-23 10:20
2006.12.10
Вопрос по IIS


2-1164165854
lobach
2006-11-22 06:24
2006.12.10
Как узнать какой пункт ListBox а сейчас выбран?


2-1164205377
Kolan
2006-11-22 17:22
2006.12.10
Как получить номер выделенной строки DBGrid?


2-1164307993
Michael69
2006-11-23 21:53
2006.12.10
Подмена перетаскиваемого объекта в OnStratDrag


11-1140317106
vvp
2006-02-19 05:45
2006.12.10
Как "прикрутить" иконку к проэкту?