Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DoCollision B DelphiX [Delphi, DelphiX, Windows]


Страницы:   1 2 3 4 5 6 7 8 9 10

Аццкий_рыцарь:) ©   (2005-12-29 14:07:00) 

когда спрйт анимируется, то DoCollision происходит только на первом его кадре. А мне нужно что б на всех кадрах происходило колижн ХЕЛП!


Аццкий_рыцарь:)   (2006-01-14 23:23:00) [81]

О! рисует на бэкграунде ! :)



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;



только оно стирает полностью всю картинку бэкграунда, и рисует туда мертвого монстра :( а надо чтоб рисовало просто поверх. Как это сделать?


Cash   (2006-01-14 17:32:00) [82]

Аццкий_рыцарь:)   (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 17:19:00) [83]

Это как? О_о


Cash   (2006-01-14 16:44:00) [84]

Да ну..., на кой тебе класс наследовать????
Бери прямо объект от класса TBackGroundSprite.


Аццкий_рыцарь:)   (2006-01-14 16:29:00) [85]

а класс бэкграунда так объявлять?:

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 11:16:00) [86]

Вечно я с этими примерами путаю! :)

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|
+---+---+---+---+---+

Вот, так правильнее.


Cash   (2006-01-14 11:13:00) [87]

[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


Аццкий_рыцарь:)   (2006-01-14 00:49:00) [88]

О! ВОТ НАД ЧЕМ Я БЪЮСЬ! я не могу разобраться что за setmapsize и как работать с TBackgroundSprite :( Расскажи плиз про него немного, если можешь :)


Cash   (2006-01-13 11:38:00) [89]

А вот еще вопрос:
Ты задний фон создаешь через TBackgroundSprite?
Если нет, то попробуй.
Если да, то:
 С какими параметрами ты вызываешь SetMapSize?


Cash   (2006-01-13 11:31:00) [90]

Аццкий_рыцарь:)   (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%, если ты все правильно сделаешь).
Проанализировав этот пример и полученный опыт, тебе должно стать ясно,
где именно ты сделал ошибку.


antonn   (2006-01-13 06:47:00) [91]

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);
синим на что копировать, и в какой прямоугольник, черным откуда и из какого прямоугольника.


Аццкий_рыцарь:)   (2006-01-12 23:44:00) [92]

ээээ я непонимаю что такое CopyRect, из названия видно, что это надо копировать какой-то прямоугольник... А с чего копировать?


Cash   (2006-01-12 16:51:00) [93]

Аццкий_рыцарь:)   (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 15:08:00) [94]

Например та же ситуация с кнопкй, чтоб она рисовала 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 07:57:00) [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-11 23:06:00) [96]

вот смотри, допустим у меня спрайт-бэкграун это 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;
что я не так сделал?


Аццкий_рыцарь:)   (2006-01-11 22:27:00) [97]

Счас попробую...


Cash   (2006-01-11 08:32:00) [98]

Аццкий_рыцарь:)   (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-10 21:28:00) [99]

2 Cash я все примерно так и делал,  просто не понимаю что такое Restore:(

это как бы дает понять приложению, что спрайт у которого стоит .restore должен постоянно прорисовываться и неудаляться? тоесть например спрайт монстра уже заново живой, а картинка с мертвым монстром рисуется постоянно на том месте где ты ей один раз задал координаты?


Cash   (2006-01-10 16:31:00) [100]

Аццкий_рыцарь:)   (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;


Страницы:   1 2 3 4 5 6 7 8 9 10

Наверх

Титульная страница Поиск, карта сайта Написать письмо