Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kde se koná výstava fotografií Luďka Vojtěchovského?

V dnešní soutěži hrajeme o:



Pohyblivé pozadí pomocí sprite

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Pohyblivé pozadí pomocí sprite

Autor: JaroB

9:05:53 06.10.2010

komplet projekt máš n mailu

Citovat příspěvek

 

Re: Pohyblivé pozadí pomocí sprite

Autor: JaroB

22:40:13 05.10.2010

opravuji 32x32

Citovat příspěvek

 

Re: Pohyblivé pozadí pomocí sprite

Autor: JaroB

22:24:56 05.10.2010

Tak jsem to prohlédl a zjistil že zřejmě chybí příkaz
[code]
SpriteEngine.Draw;
[/code]
ve výkonné proceduře.
Ale ten hlavní problém vidím v tom, že obrázek s hvězdičkama v DxImageListu není jeden,ale je to 8 obrázků - musí se přenastavit pattern na 16x16.

Citovat příspěvek

 

Re: Pohyblivé pozadí pomocí sprite

Autor: JaroB

17:33:43 05.10.2010

Podívám se na to :)

Citovat příspěvek

 

Re: Pohyblivé pozadí pomocí sprite

Autor: Tomáš

16:09:05 05.10.2010

Na mail jsem ti poslal zdroják, už vážně nevím co s tím...

Citovat příspěvek

 

Re: Pohyblivé pozadí pomocí sprite

Autor: JaroB

13:28:21 05.10.2010

Existuje ještě jeden způsob, jak vytvářet sprity a vázat je s obrázky, který jsem vytvořil jako přímou součást DelphiX.

Citovat příspěvek

 

Re: Pohyblivé pozadí pomocí sprite

Autor: JaroB

11:30:13 05.10.2010

Existuje samozřejmě i netradiční metoda

Citovat příspěvek

 

Re: Pohyblivé pozadí pomocí sprite

Autor: JaroB

11:27:58 05.10.2010

Existuje i jiný netradiční způsob

Citovat příspěvek

 

Re: Pohyblivé pozadí pomocí sprite

Autor: JaroB

11:00:42 05.10.2010

To není dobře. Na TBackroundSprite je dobrý příklad v adresáři DelphiX v Samples\Sprite\Shoot, kde
je demo jak se pozadí vytvoří a jak se s ním hýbe.

Vyseknul jsem z něj to hlavní
[code]
type
TScrollBackground = class(TBackgroundSprite)
private
FSpeed: Double;
protected
procedure DoMove(MoveCount: Integer); override;
end;

{ TScrollBackground }

procedure TScrollBackground.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
X := X - MoveCount*(60/1000)*FSpeed;
end;

// např. ve form create
// vytvoření 3 planů (vrstev)
//---------------------------------------------------------------------

{ Background }
with TScrollBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(200, 10);
Image := ImageList.Items.Find('Star');
Y := 10;
Z := -13; //vzdalenost planu !!!
FSpeed := 0.5; //rychlost
Tile := True;

for i:=0 to MapHeight-1 do
for j:=0 to MapWidth-1 do
begin
Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 8);
if Random(100)<95 then Chips[j, i] := -1;
end;
end;

with TScrollBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(200, 10);
Image := ImageList.Items.Find('Star');
Y := 30;
Z := -12; //vzdalenost planu !!!
FSpeed := 1;
Tile := True;

for i:=0 to MapHeight-1 do
for j:=0 to MapWidth-1 do
begin
Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 4);
if Random(100)<95 then Chips[j, i] := -1;
end;
end;

with TScrollBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(200, 10);
Image := ImageList.Items.Find('Star');
Y := 40;
Z := -11; //vzdalenost planu !!!
FSpeed := 2;
Tile := True;

for i:=0 to MapHeight-1 do
for j:=0 to MapWidth-1 do
begin
Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 2);
if Random(100)<95 then Chips[j, i] := -1;
end;
end;

//--------------------------------------------------------------------------------
//a v on timer periodicky se volá např. hned po Begin
SpriteEngine.Move(1000 div 60);
SpriteEngine.Dead;

// vše se vykonává skrz TSpriteEngine, je to fakt jednoduché
[/code]


Nebo tady je tutoriál, jak vůbec sprity použít [url]http://www.zive.cz/clanky/programovani-her-v-delphi---dil-6--spriteengine/sc-3-a-101615/default.aspx[/url].

Na mém webu jsou i další demo příklady a dokumentace, stačí stáhnout a prostudovat :) případně se přidržet doporučených konstrukcí.

Citovat příspěvek

 

Re: Pohyblivé pozadí pomocí sprite

Autor: Tomáš

20:26:35 04.10.2010

Šel jsem tedy tvojí cestou, a nyní vše řeším pomocí procedur volaných v jednom Timeru. Mám ale definovanou proceduru, která by měla vykreslit pozadí:


[quote]procedure TForm1.pohybPozadi();
var i,j: integer;
begin
with TScrollBackground.Create(DXSpriteEngine.Engine) do
begin
SetMapSize(200, 10);
Image := DXImageList1.Items.Find('hvezdy');
Y := 10;
Z := -13;
FSpeed := 0.5;
Tile := True;

for i:=0 to MapHeight-1 do
for j:=0 to MapWidth-1 do
begin
Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 8);
if Random(100)<95 then Chips[j, i] := -1;
end;
end;
end;[/quote]


A v Timeru to obsluhuju následovně:

[quote]case faze of
0 : Form1.vykreslitCary;
1 : Form1.pohybPozadi;
end;[/quote]

Ke změně fáze dojde, zkoušel jsem tam dát ShowMessage, a zobrazí se (resp. se dokola generuje). Nicméně to pozadí mi to prostě ani nevykreslí, natož aby se hýbalo...

Citovat příspěvek

 

Re: Pohyblivé pozadí pomocí sprite

Autor: JaroB

11:02:46 03.10.2010

Základní otázka zní: A proč je potřeba dvou timerů?
Mnohdy stačí konstrukce v ontimer typu
[code]
case StatusPrg of
spZacnout: ZacnoutProc;
spTitulky: TitulkyProc;
...

end {case};
[/code]
kdy přepnutí no dalšího módu může obstarat přímo výkonná procedura (na stisk klávesy, doběhnutí animace atp.

Citovat příspěvek

 

Re: Pohyblivé pozadí pomocí sprite

Autor: Tomáš

1:03:49 03.10.2010

A jak tedy doporučuješ udělat přepnutí Timerů?

Citovat příspěvek

 

Re: Pohyblivé pozadí pomocí sprite

Autor: JaroB

20:56:03 30.09.2010

kód proběhne cca 18-20x podle šířky (tj. tak za 1/20 sec) viz
[code]
with DXDraw.Surface.Canvas do
try
if ramce_x1 <= DXDraw.Width then
begin
Pen.Width := 2;
Pen.Color := DXDraw.Surface.ColorMatch(clWhite); //tohle je pomalé, je dobré udělat to jen jednou
MoveTo(0,30);
LineTo(ramce_x1,30);
ramce_x1 := ramce_x1 + 40;
if ramce_x1 = 40 then ramce_x2 := 800;
MoveTo(DXdraw.Width,610);
LineTo(ramce_x2,610);
ramce_x2 := ramce_x2 - 40;
end;
finally
Release;
end;
[/code]

asi je chyba, že hodnoty nejsou relativní vůči šířce DXDraw plochy. Můžu se jen dohadovat co znamená 800, 30, 40, 610 atp. ale hlavní chyba je, že nekreslíš na povrch dxdraw, ale na povrch formuláře pod tím (viz opravený kód výše).

a v případě tohohle kódu
[code]
if ramce_x1 > 800 then
begin
DXTimer1.Enabled := false;
DXTimer2.Enabled := true;
end;
end;
[/code]
se to prostě zastaví

Citovat příspěvek

 

Re: Pohyblivé pozadí pomocí sprite

Autor: Tomáš

17:06:37 30.09.2010

Na Timeru1 mám (použité proměnné jsou samozřejmě definovány):

[quote]procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
if not DXDraw1.CanDraw then exit;

with DXDraw1.Surface.Canvas do
begin
if ramce_x1 <= Form1.ClientWidth then
begin
Canvas.Pen.Width := 2;
Canvas.Pen.Color := clSilver;
Canvas.MoveTo(0,30);
Canvas.LineTo(ramce_x1,30);
ramce_x1 := ramce_x1 + 40;
if ramce_x1 = 40 then ramce_x2 := 800;
Canvas.MoveTo(Form1.ClientWidth,610);
Canvas.LineTo(ramce_x2,610);
ramce_x2 := ramce_x2 - 40;
end;

Release;
end;

DXDraw1.Flip;
if ramce_x1 > 800 then
begin
DXTimer1.Enabled := false;
DXTimer2.Enabled := true;
end;
end;[/quote]

Timer2 je momentálně prázdný, ale vykreslení a animaci pozadí bych rád dělal až v něm, tj. po nakreslení oněch čar.

Citovat příspěvek

 

Re: Pohyblivé pozadí pomocí sprite

Autor: JaroB

16:59:07 30.09.2010

zde je pár tipů viz

[url]http://www.builder.cz/art/delphi/dx_cast_obrazku.html[/url]

[url]http://www.builder.cz/art/delphi/delphi_iso.html[/url]

[url]http://www.builder.cz/art/delphi/clanek1248078484.html[/url]

Citovat příspěvek

 

Re: Pohyblivé pozadí pomocí sprite

Autor: JaroB

13:38:19 30.09.2010

Tak to asi potřebuji ten kód vidět. Pošli mi ten kus, kde vykresluješ (timer1 a 2) a hlavně jak a kde je přepínáš a jak máš udělaný ten cyklus, [ital]"který vykreslí různé čáry, body apod."[/ital].

Kdybych to dělal já, tak si asi udělám jen jednu událost ontimer a pomocí přepínače uvnitř přepínám vykreslování - obrazovka 1, obrazovka 2 atd.

funguje to tak, že periodicky překresluješ obrazovku na pozadí (surface) a pak ji přehazujes na popředí (primary) aby to neblikalo/nesněžilo při kreslení.

Citovat příspěvek

 

Re: Pohyblivé pozadí pomocí sprite

Autor: Tomáš

8:44:24 30.09.2010

Nejsem si jistý přesnou verzí DelphiX, ale byla to ta s instalátorem... Delphi mám ve verzi 7. Příklady jsem studoval, a vždy, když z nich okopíruju pouze tu část pro TBackgroundSprite, se mi program spustí, ale pozadí nevykreslí... Abych to trochu rozvedl:
Při startu programu se spustí první timer, který vykreslí různé čáry, body apod... Po dokončení cyklu se vypne a spustí se druhý timer, který by již měl začít zobrazovat pozadí, ale nezačne... Ty kódy používám přesně jako v příkladech

Citovat příspěvek

 

Re: Pohyblivé pozadí pomocí sprite

Autor: JaroB

5:51:59 30.09.2010

Rolování pozadí se dělá v DelphiX jednoduše například za pomoci TBackgoundSprite. Nastuduj si pár příkladů a zkus si to. Velikost obrázku je omezena maximální velikostí textury podle driveru (obvykle 1024x1024 nebo 2048x2048 bodů podle videoadaptéru). Jakou verzi DelphiX a Delphi máš? Případně sem dej aspoň kousek kódu, který ti nechodí...

Citovat příspěvek

 

Pohyblivé pozadí pomocí sprite

Autor: Tomáš

21:38:19 29.09.2010

Potřeboval bych do svého projektu vložit pohyblivé pozadí (např. tečky) tak, aby se pozadí samo pohybovalo (předpoládám že pomocí timeru). Na internetu jsem našel spousty návodů, jak sprite na pozadí vložit, ale ani za nic nemůžu tuto věc ve svém projektu aktivovat, buďto mi to neustále hází chyby, nebo se pozadí nezobrazí... Mohl bych poprosit někoho zkušeného, jestli by mi přesně nenapsal, co kam vložit, aby se mi na pozadí roloval obrázek načtený z imagelistu? Díky

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: