Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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.05 c
15-1164019452
Cyrax
2006-11-20 13:44
2006.12.10
Компиляторы, интерпретаторы и трансляторы


8-1145944179
TRyaSS
2006-04-25 09:49
2006.12.10
Как найти угол между отрезком и осью(любой )


2-1164300895
dreamse
2006-11-23 19:54
2006.12.10
Передача и получение строк из DLL


2-1164292901
Defort
2006-11-23 17:41
2006.12.10
Работа с датой


15-1163872173
POP
2006-11-18 20:49
2006.12.10
Типы данных, cardinal





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский