Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Delphi Game - TImage Self Create

[es] :: Pascal / Delphi / Kylix :: Delphi Game - TImage Self Create

Strane: 1 2

[ Pregleda: 7799 | Odgovora: 26 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Delphi Game - TImage Self Create28.08.2003. u 12:31 - pre 251 meseci
Pisem Arkanoid u Delphiju 6. Dosao sam do kreiranja nivoa, i imam jedan problem. Kad se igrica startuje, treba da iscita .dat fajl u kome se nalaze podaci za odredjeni nivo. Prvo idu koordinate plocice (recimo 2 23), pa zatim ostali podaci za tu plocicu. E sad, kad program iscita koordinate, kako da on napravi TImage objekat sam od sebe, koji ce se nalaziti na koordinatama 2 23 ?
 
Odgovor na temu

overflow
Goran Milosavljević
Integration & Internet Senior
Engineer @ Telenor
Beograd

Član broj: 396
Poruke: 345
*.vdial.verat.net

ICQ: 106825659
Sajt: localhost


Profil

icon Re: Delphi Game - TImage Self Create28.08.2003. u 15:17 - pre 251 meseci
Code:

Var Img : TImage;
Begin
   Img := TImage.Create(Form1);  // owner je dakle Form1
   Img.Left := 2;
   Img.Top := 32;
   Img.Parent := Form1;    
   .
   .
   .
End;

Sve sto je besmislenije, utoliko je bolje.
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Delphi Game - TImage Self Create28.08.2003. u 15:28 - pre 251 meseci
Samo da probam pa cu da javim kako sam proso... :D
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Delphi Game - TImage Self Create28.08.2003. u 15:44 - pre 251 meseci
Bravo majstore, ajde sad mi kazi jos kako da ucitam odredjeni deo slike, a ne celu sliku i vise necu da gnjavim. Napravio sam jedan bmp, koji sadrzi sve vrste zidova. Kako da ucitam recimo zid u 3. koloni i 2. redu ?
 
Odgovor na temu

overflow
Goran Milosavljević
Integration & Internet Senior
Engineer @ Telenor
Beograd

Član broj: 396
Poruke: 345
*.verat.net

ICQ: 106825659
Sajt: localhost


Profil

icon Re: Delphi Game - TImage Self Create28.08.2003. u 19:46 - pre 251 meseci
Mislim da bi ti funkcija BitBlt bila od pomoci za tako nesto, mada nisam siguran da je to i najelegantnije resenje. Njome sa source handle kopiras sa odredjene XY koordinate odredjen width i height na destination handle. Pogledaj help za detalje oko koriscenja.
Sve sto je besmislenije, utoliko je bolje.
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Delphi Game - TImage Self Create29.08.2003. u 19:24 - pre 251 meseci
ufff..., ima li neki drugi nacin?
 
Odgovor na temu

goblin
Milan Aleksic
Gtech Belgrade, Sofware Engineer II
Beograd

Član broj: 4055
Poruke: 85
*.beotel.net

Jabber: milanaleksic@gmail.com
Sajt: www.milanaleksic.net


Profil

icon Re: Delphi Game - TImage Self Create31.08.2003. u 13:30 - pre 251 meseci
BitBlt je zaista sjajna API funkcija za kopiranje delova slika (i mnogih drugih stvari i to veoma brzo). Mada deluje kao izuzetno komplikovana, jedina stvar koja je kod nje zastrasujuca jeste sto ima vise parametara i sto ne radi sa nekim TCanvas objektom kao takvim, vec sa handlerom (hDC) nekog canvasa. Dakle, u parametrima ove funkcije ide Timage.Picture.Bitmap.Cavas.Handle (ako radis sa bitmapom u TImage, mada ne bi trebalo da bude problema ni sa Graphic umesto Bitmap, ako imas jpeg sliku... onda ti je ugnjezden objekat TJpeg, a ne TBitmap - mada ovo ruku na srce nisam probao).
Sve u svemu, evo ti aktivan primer iz jedne moje male desktop igre:

Code:

BitBlt(frmMAIN.Canvas.Handle, lastX, lastY, image1.Width, 
image1.Height,BackroundBuffer.Canvas.Handle, lastX, lastY, SRCCOPY);


frmMAIN je naziv forme na kojoj iscrtavam, mada to moze da bude bilo koja komponenta koja ima canvas sa mogucnoscu pisanja, cak i neka bitmapa
backgroundBuffer je TBitmap koji cuva sliku desktopa. lastX i lastY su koordinate gornjeg levog ugla pravougaonika, a image1.Width i image1.height su, nagadjas...

Medjutim, vaznija stvar ovde je malo nepraktican sistem rada... nikako ti ne preporucujem da pravis previse objekata TImage na formi... nikako. Mislim, ne znam kako ce uopste da izgleda igra, ali ako nameravas da kreiras 20x20 plocica to ti je 400 objekata... kako ces da drzis celu zver pod kontrolom? Prijateljski savet sa cuvanje zivaca: nabaci neki paintbox (unutar kojeg ces po mogucstvu da presretnes i ponistis poruku WM_ERASEBKGND da bi izbegao suvisan & ruzan refreshing, a pritom ti osnovno iscrtavanje ostaje netaknuto) i na njemu iscrtavaj celu stvar. Brze, efikasnije i lakse za odrzavanje. Believe me :)

Pozdrav, Milan

P.S. Ako zaista zelis da radis na neki laksi nacin (?) probaj da radis sa Pixels metodom nekog TCanvas-a kojom pristupas individalnim pikselima, tj. njegovoj boji... ali u stvari dobijes komplikovaniji kod... izbor je tvoj.
Don't try to impress me... I'm good !
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Delphi Game - TImage Self Create31.08.2003. u 16:00 - pre 251 meseci
@goblin:
Hvala na iscrpnom odgovoru, pokusacu da radim sa tom naredbom (pocetnik sam). Zanima me da li to moze da se uradi sa ScanLine precedurom?
 
Odgovor na temu

goblin
Milan Aleksic
Gtech Belgrade, Sofware Engineer II
Beograd

Član broj: 4055
Poruke: 85
*.beotel.net

Jabber: milanaleksic@gmail.com
Sajt: www.milanaleksic.net


Profil

icon Re: Delphi Game - TImage Self Create31.08.2003. u 20:28 - pre 251 meseci
Ma, može i tako, ali onda moraš da znaš programiranje dinamičkih promenljivih... Tu imaš nesto što se zove pokazivač na niz bajtova - bez uvrede, ali mislim da na tvom uzrastu ovo može da bude samo noćna mora, bez ikakve potrebe. Nauči prvo rad na jednostavnijim pokazivačkim strukturama pre nego sto uplivaš u ovakve tipove podataka (PByteArray). Moraš da paziš na dužinu niza, kako pristupaš podacima na koje pokazuje pointer, posle memorijski bafer da oslobadjaš... pošto kažeš da si početnik mislim da sve ovo može samo da ti napravi još veću glavobolju od one koje leči.

Sve u svemu, ScanLine bi ti bilo još veće komplikovanje. Pojam "komplikovanje" shvati uslovno... uvek komplikovanost nekog pristupa u programiranju zavisi od uvežbanosti u toj oblasti... posle par programa sa thread-ovima ili dll-ovima pitaćeš se zašto ti nije ranije palo na pamet da kreneš da radiš sa njima pa će kasnije upotreba istih da bude samo stvar potrebe a ne neophodnosti - ScanLine je još jedan sjajan metod ali... da li se isplati cimanje?

Odgovor na tvoje pitanje - možeš da uradiš sa ScanLine, ovaj metod je bolji i brži od Pixels property-ja, ali je BitBlt najbolji. Ne zaboravi da ti je BitBlt WinAPI funkcija... nema gomilanja VCL koda oko tvoje komande... BitBlt radi direktno na handler-u tvojeg platna... tj. najveća brzina! Opet, za BitBlt ti treba najmanje filozofije i rada.
Trust me.
Srećno zaranjanje u Delphi :)
Don't try to impress me... I'm good !
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Delphi Game - TImage Self Create01.09.2003. u 11:40 - pre 251 meseci
Hvala, napravio sam sa BitBln, ali ide mnooooogo sporo. Kako da uradim to sa PaintBox, celo vece se mucim i ne mogu nikako...
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
*.pexim.co.yu



+62 Profil

icon Re: Delphi Game - TImage Self Create01.09.2003. u 15:41 - pre 251 meseci
Pogledaj primere za TCanvas.CopyRect(). To ti je 'zapakovano' koriscenje BitBlt funkcije, ali tebi kao pocetniku ce biti lakse za koriscenje.
Batali ScanLine, jer rad sa pixelima u for (ili bilo kojoj drugoj) petlji je spor.

Rajko
 
Odgovor na temu

goblin
Milan Aleksic
Gtech Belgrade, Sofware Engineer II
Beograd

Član broj: 4055
Poruke: 85
*.beotel.net

Jabber: milanaleksic@gmail.com
Sajt: www.milanaleksic.net


Profil

icon Re: Delphi Game - TImage Self Create01.09.2003. u 17:01 - pre 251 meseci
Sporo sa BitBlt? Čekaj, pa kako vršiš iscrtavanja? Tj. ako koristiš tajmer koliki ti je interval-nije valjda ispod 100ms? nije valjda da iscrtavaš SVE tj celu formu (treba da iscrtavaš samo deo platna koji se menja)... optimizuj kod, nije stvar u BitBlt-u! Ako bi dao neku skicu kako ti otprilike radi program možda bi neko mogao da ti pomogne...

P.S. Nije bitno na čemu iscrtavaš (da li je to forma ili paintbox) sve dok imaš OnPaint događaj ili dok možeš da utičeš na iscrtavanje te komponente...
Don't try to impress me... I'm good !
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Delphi Game - TImage Self Create01.09.2003. u 20:07 - pre 251 meseci
Nisi me razumeo. BitBln radi perfektno, ali imam mnogo TImage objekata na ekranu, pa je racunar preopterecen, i loptica ide mnogo sporo. Evo procedure koja iscrtava nivo :
Code:

// Crta plocice (!Brick)
procedure TMainWindow.LevelDraw;
var
 C1  : Integer;
 C2  : Integer;
 Bmp : TBitmap;
begin
 Bmp := TBitmap.Create;
 Bmp.LoadFromFile('bricks.bmp');
 For C1 := 1 to 18 Do
  For C2 := 1 to 31 Do
   If Brick[C1, C2, 1] <> '' Then Begin
    Img[C1, C2] := TImage.Create(MainWindow);
    With Img[C1, C2] Do Begin
     Parent := MainWindow;
     Left := (C1 - 1) * 49 + 1;
     Top := (C2 - 1) * 25 + 1;
     Width := 49;
     Height := 25;
     BitBlt(Canvas.Handle, 0, 0, 49, 25, Bmp.Canvas.Handle,
            (StrToInt(Brick[C1, C2, 2]) - 1) * 49, (StrToInt(Brick[C1, C2, 3]) - 1) * 25, SRCCOPY);
     OnMouseMove := FormMouseMove;
     OnClick := FormClick;
    End;
   End;
 Bmp.Free;
end;

Ajde sad kazi mi kako ovo da uradim sa PaintBox ?
 
Odgovor na temu

goblin
Milan Aleksic
Gtech Belgrade, Sofware Engineer II
Beograd

Član broj: 4055
Poruke: 85
*.beotel.net

Jabber: milanaleksic@gmail.com
Sajt: www.milanaleksic.net


Profil

icon Re: Delphi Game - TImage Self Create01.09.2003. u 21:47 - pre 251 meseci
Nisam iskompajlirao, ali teorijski bi trebalo da radi:
Code:

procedure TMainWindow.LevelDraw;
var
 C1  : Integer;
 C2  : Integer;
 Bmp : TBitmap;
 Left, Top : Integer;
begin
 // neka ti se PaintBox zove ClientPaintBox
 Bmp := TBitmap.Create;
 try
  Bmp.LoadFromFile('bricks.bmp');  
  For C1 := 1 to 18 Do
   For C2 := 1 to 31 Do
    If Brick[C1, C2, 1] <> '' Then Begin
      Left := (C1 - 1) * 49 + 1;
      Top := (C2 - 1) * 25 + 1;
      BitBlt(ClientPaintBox.Canvas.Handle, Left, Top, 49, 25, Bmp.Canvas.Handle, (StrToInt(Brick[C1, C2, 2]) - 1) * 49, (StrToInt(Brick[C1, C2, 3]) - 1) * 25, SRCCOPY); 
{
ovo postavis u object inspektoru za paintbox koji dovoljno prosiris da bi se sve videlo
      OnMouseMove := FormMouseMove;
      OnClick := FormClick;
}
    End;
  finally
   Bmp.Free;
  end;
end;



E, sad, ne mogu da ti garantujem da ce ovo da radi (posto ne znam uopste sta ce ti trodimenzionalni niz kad sam ja uvek koristio dvodimenzionalni niz zapisa) ali mislim da ces dobiti ideju sta se uopste radi gore. Posto mi je za nedelju dana jedan ispit ne mogu da ti garantujem ni to da cu se uopste pojvaljivati na forumu narednih desetak dana (dvodelni ispit), ali ako i dalje imas problema prijavi, mozda se ponudi i neko drugi da ti pomogne...

P.S. uvek kad dinamicki kreiras objekte (kao sto si ti kreirao TBitmap) radi sa njima u nekom try bloku da bi ti sto pre postala navika
Don't try to impress me... I'm good !
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Delphi Game - TImage Self Create02.09.2003. u 10:21 - pre 251 meseci
Sve bi lepo bilo kad bi ovo radilo. Isto ovo sam i ja probao, ali uopste nece da iscrta slicicu na PaintBox - na njemu nema nista. Ako kreiram TImage objekat nalik PaintBox-u, onda radi dobro, ali je pozadina bela, a kad stavim na Transparent := TRUE, ide sporo.
3D nizove koristim zato sto postoji mogucnost da jedna plocica treba, recimo tri puta da se udari lopticom da bi ona nestala, itd itd...
Evo podatka za jednu plocicu :

Brick[x, y, 1] := 3; // Koliko puta loptica treba da udari plocicu da bi ona nestala
Brick[x, y, 2] := 1; // X koordinata 1. plocice u bmp slici
Brick[x, y, 3] := 3; // Y koordinata 1. plocice u bmp slici
Brick[x, y, 4] := 2; // X koordinata 2. plocice u bmp slici
Brick[x, y, 5] := 3; // Y koordinata 2. plocice u bmp slici
Brick[x, y, 6] := 3; // X koordinata 3. plocice u bmp slici
Brick[x, y, 7] := 3; // Y koordinata 3. plocice u bmp slici
Brick[x, y, 8] := U; // Da li je plocica unistiva ili ne (U - unistiva, N - neunistiva)
Brick[x, y, 8] := 150; // Koliko poena vredi plocica

Nadam se da si razumeo ovo sto sam napisao, posto nisam bas dobar u objasnjavanju. :)

Pozdrav, Marko.

P.S. Zelim ti srecu na ispitu !
 
Odgovor na temu

goblin
Milan Aleksic
Gtech Belgrade, Sofware Engineer II
Beograd

Član broj: 4055
Poruke: 85
*.beotel.net

Jabber: milanaleksic@gmail.com
Sajt: www.milanaleksic.net


Profil

icon Re: Delphi Game - TImage Self Create02.09.2003. u 10:44 - pre 251 meseci
Kad radis sa TPaintBox onda ti nije fora da naredis iscrtavanje - kao kod TImage. Kad nesto nacrtas na platnu TImage komponente to i ostaje (jer ti zapravo kreiras bitmapu!).
Kad radis sa TPaintBox moras da razmisljas na drugaciji nacin - moras da koristis OnPaint event (kada sistem posalje poruku da je potrebno iscrtavanje) i da iscrtavas kad ti se on pojavi. Ako hoces da ti bas iscrtas, onda fizicki pozoves paintbox.Repaint metod (ja sam pretpostavljao da si ovo vec znao).
Ako ti je pozadina bela znaci da treba da odradis jedan FillRect sa bojom koju hoces. Batali Transparent za ovakve stvari...
Batali trodimenzionaln niz, napravi nesto ovako:
Code:

type

TBrick = record
 NumOfHits, X1, Y1, X2, Y2, X3, Y3 : Integer;
 Destructible : Boolean;
 Value : Integer;
end;

TBricks = array[1..50] of TBrick;
...
var 
 Bricks : TBiricks;

Lakse ces da skapiras sta radis (jer ces imati imena promenljivih umesto brojeva) a i nece ti trebati typecast iz stringa u sve i svasta (komplikujes kod bezveze).

Evo kako je sve ispalo sa paintbox-om (moj Snake):
http://www.geocities.com/lordgoblin83/prgsnake.htm

Pozdrav (e sad i definitivno :)

Don't try to impress me... I'm good !
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Delphi Game - TImage Self Create02.09.2003. u 11:11 - pre 251 meseci
Ma ja sam vec probao i sa PaintBox.Refresh i PaintBox.Repaint i sa PaintBox.Update, nije telo. Sigurno nesto ne radim dobro. Pozabavicu se time malo duze..
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Delphi Game - TImage Self Create02.09.2003. u 18:25 - pre 251 meseci
Hvala puno na pomoci, napravio sam. Kad igricu privedem kraju postovacu je ovde pa da vidite sta sam napravio. :)
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Delphi Game - TImage Self Create06.09.2003. u 20:16 - pre 250 meseci
Ajde sad jos jedno pitanje.... Kada napravim Timer i stavim mu da na 1 ms poziva formu BallMove, loptica ide previse sporo. Ovaj problem sam resio sa Application.OnIdle, ali kada sam odneo do komsije program, loptica je isla mnooogo sporo. Kako ovo da resim, da uvek brzina loptice bude ista, bez obzira na brzinu compa ?
 
Odgovor na temu

morlic
Milos Orlic
Beograd

Član broj: 6081
Poruke: 735
195.252.80.*



+1 Profil

icon Re: Delphi Game - TImage Self Create06.09.2003. u 20:49 - pre 250 meseci
Koristi multimedia timers. Vec sam ovih dana postovao slican odgovor:

timeKillEvent
TimeProc
timeSetEvent

Rade na svim windows platformama i imas u MSDN-u objasnjenja kako se koriste.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Delphi Game - TImage Self Create

Strane: 1 2

[ Pregleda: 7799 | Odgovora: 26 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.