![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DoCollision B DelphiX [Delphi, DelphiX, Windows]
Аццкий_рыцарь:) © (2005-12-29 14:07:00)
Страницы: < 1 2 3 4 5 6 7 8 9 10 >
когда спрйт анимируется, то 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;