[ vladaboy93 @ 17.03.2007. 21:20 ] @
Počeo sam da pravim igre u delphiu7 i možete mi reći nešto osnovno o pravljenju igara u delphiu i štami sve treba osim delphia.Takoće bi mogli da mi nabrojite neke tutorijale.

I uostalom da li uopšte vredi praviti igre u delphiu ili preći na nešto drugo?

[ Nemanja_666 @ 17.03.2007. 22:39 ] @
Pogledaj temu vise:

TOP: Kako koristiti GLScene
[ Srki_82 @ 18.03.2007. 14:01 ] @
Igru je najbolje pisati u jeziku koji dobro poznajes. Ne vredi ti da imas ultra giga mega engine koji jede malu decu za dorucak ako ne umes da pozoves glavnu petlju, definises promenljive, kreiras objekte i sl. Ako odlicno znas Delphi onda u njemu pisi igre, a ako imas vremena da ucis nov jezik, nauci C++ i mnogo manje ce te boleti glava... bar u pocetku

U svakom slucaju, u pocetku UVEK koristi gotov engine... za delphi uzmi GLScene, a za C++ je Ogre 3D sasvim pristojan i besplatan engine.

Ako pocnes da pises igru, nemoj da te mrzi da otvoris temu i da postujes kod, informacie o napretku, kao i da trazis pomoc, jer je mnogo ljudi na forumu zainteresovano za pravljenje igara.

Kakvu igru si poceo da pravis? Koristis li neki graficki API (DirectX, OpenGL, Mesa,...)?
[ vladaboy93 @ 18.03.2007. 16:17 ] @
Počeo sam da pravim klasičnu tenk igru(cilj igre je da se pobede svi neprijateljski tenkovi i sačuva svoja baza).
Napravio sam Multyplayer verziu igre u Game Makeru i video sam koliko je ograničen pa sam počeo da pravim tu igru na delphiu7 jer već imam nešto malo iskustva u delphiu.

Probao sam da instaliram GLscene (nisam siguran ni da li mi treba jer je igra 2D) i uspeo sam da instaliram samo dve komponente ostale nešto neće da se instaliraju.
A kad pokrenem neki GLscene demo onda mi uvek kaže da mi treba neki VectorGeometry,..

Video sam tvoj tutorijal o GLscenu SVAKA ČAST!!!

U ostalom naišao sam na par problema u vezi igre probao sam da namestim da mi se tenk kreće na arowkeys (gore dole levo desno) mada nigde nisam našao ASCII code za to u prošloj igrici koju sam pravio u delphiu(pogledaj temu pomoć oko igre u delphiu) objekat se kretao na W,A,S,D i to me je strašno nerviralo, pa ako neko zna kako da napravim da mi se objekat kreće na arowkeys UNAPRED HVALA!

[Ovu poruku je menjao vladaboy93 dana 18.03.2007. u 17:29 GMT+1]
[ Srki_82 @ 19.03.2007. 09:16 ] @
Nemoj koristiti ASCII kodove neko Virtual kodove. Ako se dobro secam, OnKeyXXX eventi ti daju virtualni kod tastera i jednostavno ga uporedis sa VK_UP, VK_DOWN, VK_LEFT ili VK_RIGHT. Pogledaj kompletnu listu virtualnih kodova (imas je u Delphi helpu) za kodove za ostale tastere.

Mozemo li da vidimo neki demo?

P.S. GLScene ti nije potreban. Za tu igru i obican GDI moze da posluzi.
[ vladaboy93 @ 19.03.2007. 14:06 ] @
Hvala na dosadašnjoj pomoći!

Izvini što te gnjavim ali ne znam šta znači GDI i demo ću poslati za par dana samo da nešto prvo završim.

Da li postoji način da se animacije ubace u delphi iz recimo 3D Max-a Ne mislim na neke fensy 3D animacije nego neke skromne npr. kretanje gusenica,...

Kod crtanja pozadine nije bitno koje da li je moguđe u delphiu da pozadina objekta koji se kreće bude ista sa pozadinom forme u delphiu koja nije jednobojna nego je na pozadini neka slika,..

Kada god se moj objekat (tenk) kreće (za 4 piksela) on uvek secka (refrešuje se) ova pojava nema veze sa brzinom računara,grafičke kartice itd. jer sam ga probao i na najačim računarima i svuda je isto.

[Ovu poruku je menjao vladaboy93 dana 19.03.2007. u 15:21 GMT+1]
[ Nemanja Avramović @ 19.03.2007. 14:18 ] @
Pogledaj: http://delphi.about.com/library/bluc/text/uc052102a.htm
[ Srki_82 @ 19.03.2007. 15:01 ] @
Dovoljno je da izrenderujes par frejmova u niz slika i da ih u programu prikazujes u odredjenom redu (prva, druga, treca, prva, druga,... itd). U praksi se obicno svi frejmovi vezani za jedan objekat nalaze u jednoj slici, a program samo prikazuje deo koji odgovara odredjenom frejmu iz animacije.

Posalji kod koji imas pa da vidimo zasto secka.
[ vladaboy93 @ 22.03.2007. 20:38 ] @
Kod je malo dugačak pa evo ti ceo projekat.
[ Srki_82 @ 23.03.2007. 10:37 ] @
Fajl koji si poslao je prazan

Bilo bi lepo kad bi zajedno sa fajlom postavio par slicica i napisao par reci o tome kako si pravio igru (na koje si probleme naisao, sta si naucio, koje si komponente koristio,...).
[ vladaboy93 @ 25.03.2007. 10:19 ] @
izvini za prazan fajl, evo ti exe.
[ Srki_82 @ 25.03.2007. 21:56 ] @
Nije lose za pocetak, ali...

Prvo sto bi mogao da uradis je da poziciju objekta ne menjas na OnKeyPress jer se zbog toga javlja seckanje, a i brzina kojom ce se taj event javljati zavisi od podesavanja na racunaru (zavisi od repeat delay i repeat rate podesavanja za tastaturu) i zbog toga se tenkic prvo pomeri samo malo, pa malo cekas (repeat delay) pa onda pocne da se krece, ali u skokovima (repeat rate).
Resenje bi bilo da pre iscrtavanja proveris da li je taster za, recimo, dole pritisnut i ako jeste onda pomeris objekat, a ako nije iscrtas ga na istoj lokaciji. Obrati paznju da ce se na ovaj nacin objekat kretati brze na brzim, a sporije na sporijim racunarima, ali se to vrlo lako resi tako sto brzinu objekta ne meris pixelima, centimetrima ili nekom drugom jedinicom za duzinu po frejmu, nego pixel po sekundi.

[Ovu poruku je menjao Srki_82 dana 26.03.2007. u 10:18 GMT+1]
[ Srki_82 @ 06.04.2007. 20:04 ] @
Desavali se nesto sa igrom?
[ vladaboy93 @ 24.04.2007. 11:23 ] @
Crko mi je internet na neko vreme pa nisam mogao da ti saljem podatke o igri i umedjuvremenu sam naisao na problem.

kada hocu da stavi neku moju pozadinu na tablu nemogu da podesim da pozadina tenka bude ista sa pozadinom table.

unapred hvalla.
[ Srki_82 @ 24.04.2007. 11:52 ] @
Odavno nisam radio sa TImage i TBitmap, ali, ako se dobro secam, moguce je da postavis transparentnu boju za sliku. Pozadinu tenka postavis na neku boju koju ne koristis (pink ce da posluzi) i postavis da je ta boja transparentna. Prilikom crtanja tenka, iscrtace se svi pikseli cija boja je razlicita od transparentne i pozadina ce se lepo videti.
[ Nemanja_666 @ 24.04.2007. 13:13 ] @
Jos treba reci da Delphi za transparent boju uzima donji lijevi pixel. Znaci kad se transparent stavi na true svi pixeli boje kao donji lijevi pixel bice providni.

Nemoj raditi tako igru jer ces dobiti treptanje slike dok se tenk pomjera.
[ Nemanja_666 @ 24.04.2007. 13:38 ] @
Evo da stavim i ja jednu svoju igru. Nije raditi u Enginu, ili OpenGL/DirectX.

Radio sam je na osnovu BeJeweled 2. Mnoge slike i zvukovi su pokradeni, ali sta se moze. Nije mi se dalo crtati i praviti zvucni efekti.
Da bi radila ispravo otpakujte datoteku prekopirajte font koji je u njoj u \Windows\Fonts\ i pokrenite igru i uzivajte.

Ako zelite source javite.

Link: http://rapidshare.com/files/27658575/Jewel.rar
[ bojan21 @ 24.04.2007. 17:43 ] @
Citat:

Resenje bi bilo da pre iscrtavanja proveris da li je taster za, recimo, dole pritisnut i ako jeste onda pomeris objekat, a ako nije iscrtas ga na istoj lokaciji. Obrati paznju da ce se na ovaj nacin objekat kretati brze na brzim, a sporije na sporijim racunarima, ali se to vrlo lako resi tako sto brzinu objekta ne meris pixelima, centimetrima ili nekom drugom jedinicom za duzinu po frejmu, nego pixel po sekundi.


Tri stvari mi nisu jasne! Na koji event da pomeram objekat (tj. tenkic u ovom slucaju)? Kad kazesh da ga "iscrtam na istoj lokaciji", sto da ga iscrtavam, jel mogu da ga ostavim takav kakav je - tj na se nista ne izvrsava u slucaju kad nije pritisnut taster (gresim li?)? I josh, kad kazes da koristim pixel po sekundi, da li da koristim tajmer sa odvojenom niti (zbog moguceg seckanja)?
[ Srki_82 @ 24.04.2007. 20:04 ] @
1. Ako hoces da ti igra sto manje secka, iscrtavaj sve kad god aplikacija nema sta da radi. Ako se dobro secam, postoji OnIdle event.

2. Zamisli da, recimo, nesto prelece preko tenka... to sto je nacrtano preko tenka ce obrisati deo njegove slike... tenk se ne pomera, ti ga ne crtas ponovo... i... dobijes sliku koja ne izgleda bas lepo.

3. Ne treba ti tajmer... dovoljno je da u svakom OnIdle eventu vidis koliko je vremena proslo od poslednjeg crtanja (GetTickCount moze da posluzi).

BTW zasto koristite VCL za pravljanje igara?
[ bojan21 @ 24.04.2007. 21:22 ] @
Hvala na odgovoru! Ja koristim VCL jer igru moram da napravim u delphiju (za shkolu), pa moram da donesem source! Nastavnik ni da cuje za GL Scene ;)))!
[ Srki_82 @ 24.04.2007. 22:48 ] @
Koristi samo ono sto dobijes uz Delphi... Win API da kreiras prozor (Windows.pas + Messages.pas) + OpenGL (OpenGL.pas) i cepaj :)
Nema nikakvih 3rd party komponenti, a opet koristis OpenGL.

Ako ti nesto znaci, mogu da napravim rotirajucu kocku da vidis kako to ide.
[ vladaboy93 @ 25.04.2007. 12:29 ] @
Da li bi mogao da mi malo detaljnije objasnis ono sa transparentnom bojom pozadine objekta gde to da namestim,
u paintu? i kako. ili mozda u delphi image editoru?

Izvini sto te gnjavim nije mi bas najjasnije.
unapred hvala!!!!!!!
[ Nemanja_666 @ 25.04.2007. 13:10 ] @
Sve sto zelis da na slici bude providno ofarbas u jednu boju ukljucujuci donji levi pixel. Da protestitas ubaci na formu jednu TImage komponentu i zadajoj vrijednost transparent. Ubaci sliku i vidjeces da ne iscrtava dijelove koji su transparent(Te boje)
[ vladaboy93 @ 02.05.2007. 14:50 ] @
Pozdrav ljudi nisam neko vremo radio na igrici jer sam se pripremao za republicko takmicenje iz informatike i tamo sam branio jednu igrgicu koju sam pravio pre ove. Isto tako sa tenkicem samo sto je cilj igre da se dodje do cilja to jest da se pokupe svi poeni i da se poubijaju svi neprijateljski crveni tenkici usput treba naci neke kljuceve i proci kroz vrata koja su zakljucana.


[att_img]



[Ovu poruku je menjao vladaboy93 dana 02.05.2007. u 16:43 GMT+1]

[Ovu poruku je menjao vladaboy93 dana 02.05.2007. u 16:46 GMT+1]
[ savkic @ 02.05.2007. 18:37 ] @
> Pozdrav ljudi nisam neko vremo radio na igrici jer sam se pripremao za republicko takmicenje iz informatike i tamo sam branio
> jednu igrgicu koju sam pravio pre ove.

Kada si već spomenuo ovo, možeš li poslati tekst zadataka sa takmičenja (može i sa gradskog), verujem da bi svima to bilo interesantno. U čemu se sada rade zadaci, TurboPascal, TurboC, Delphi, Lazaruz, free pascal, .NET?
[ vladaboy93 @ 03.05.2007. 12:26 ] @
Ako bi neko hteo exe ili source moje igre neka mi javi.
Ja sam ove godine isao na takmicenje iz branjenja aplikacija ali znam kakvi su zadaci bili iz programiranja.
Sto se tice toga u kom se jeziku rade zadaci moze se u kom god jeziku oces.Mada su vecina radili u pascalu,C++,basic.

Evo vam zadaci sa republickog takmicenja.

XV Republičko takmičenje iz informatike učenika osnovnih škola
17. maj 2003.

1. (15) Prave x=a i x=b predstavljaju obale reke, iz koje izviruju dva kamena čije su koordinate (x1,y1) i (x2,y2), tako da je a<x1<x2<b. Napisati program kojim se za dato a, b, x1, y1, x2, y2 i m proverava da li se može preći reka bez kvašenja u skokovima dužine najviše m, pri tome dozvoljeno je stati na kamenje u reci.
Primer: Ulaz: a=2 b=10 x1=5 y1=2 x2=8 y2=4 m=4 Izlaz: moze
Ulaz: a=2 b=10 x1=5 y1=2 x2=8 y2=5 m=4 Izlaz: ne moze
Ulaz: a=3 b=10 x1=5 y1=4 x2=7 y2=8 m=4 Izlaz: moze

2. (20) Dat je prirodan broj N. Napisati program kojim se određuje koliko ima prirodnih brojevi manjih od N koji su potpuni kvadrati i jednaki su zbiru 1+2+..+I za neki prirodan broj I (primer takvog broja je 36 jer 36=62 i 36=1+2+3+4+5+6+7+8 ).
Primer: Ulaz: N=100 Izlaz : Postoje 2 takva broja.

3. (30) Dat je prirodan broj N (N<=10) i niz prirodnih brojeva A dužine N. Zamišljeni brojač sastoji se od N kolutova. Na I-tom kolutu ispisani su prirodni brojevi od 1 do A[I]. Napisati program kojim se ispisuju sva moguća stanja brojača.
Primer : Ulaz: N=2 A: 2, 3
Izlaz: 1,1 2,1 1,2 2,2 1,3 2,3

4. (35) Zadata je ogrlica od plavih ('P') i crvenih kuglica ('C'). Kuglice su numerisane brojevima od 1 do N. Nizom A dužine N (N<=100) date su boje kuglica (A[I] je boja I-te
kuglice). Ako ogrlicu prekinemo između dve susedne kuglice sakupljamo kuglice na sledeći način: Uzimamo jednu kuglicu sa desne strane i idemo udesno dok ne naiđemo na kuglicu suprotne boje. Isti postupak ponavljamo sa leve strane.
Napisati program kojim se određuje između koje dve kuglice treba prekinuti ogrlicu da bi broj sakupljenih kuglica bio maksimalan. (Ako ima više mogućnosti za sakupljanje maksimalnog broja kuglica nije bitno koje rešenje ispišete.)
Primer: Ulaz: N=7 A: 'PPPCPCC' Izlaz: Prekid izmedju 7. i 1. kuglice.
Ulaz: N=8 A: 'PPPCPCCP' Izlaz: Prekid izmedju 7. i 8. kuglice.
Ulaz: N=3 A: 'PPP' Izlaz: Prekid izmedju 1. i 2. kuglice.
Izrada zadataka traje najviše 120 minuta.
[ Srki_82 @ 03.05.2007. 13:01 ] @
offtopic: odlicni zadaci za takmicenje, uzevsi u obzir da je upitaju takmicenje osnovnih skola.

Cudi me da se patis sa ovom igrom koju sad pravis, a vec si napravio jednu na isti fazon. U cemu si radio ovu prvu igru koju si branio na takmicenju? Zasto ti je ona bila laksa za pisanje od ove koju sad radis?
[ savkic @ 03.05.2007. 16:14 ] @
> Ja sam ove godine isao na takmicenje iz branjenja aplikacija ali znam kakvi su zadaci bili iz programiranja.

Šta je to branjenje aplikacija, kako to izgleda? Napraviš program kod kuće na zadatu temu pa pred komisijom dokazuješ da si ga ti napravio?

> Sto se tice toga u kom se jeziku rade zadaci moze se u kom god jeziku oces.Mada su vecina radili u pascalu,C++,basic.

Znaš li koja su okruženja? Kad sam ja išao moglo se birati između TurboPascala i TurboCa.

[ vladaboy93 @ 03.05.2007. 16:38 ] @
>Zasto ti je ona bila laksa za pisanje od ove koju sad radis?

Tako je bila mi je laksa za pisanje, nisam nista drugo osim delphia koristio ali se objekat krece na W,A,S,D i malo zastaje pri kretanju mada je neprimetno objekti nisu slozenog dizajna, jeste da koce i seckaju ali je to neprimetno jer je pozadina siva i objekti su jednostavni.Tu igru sam bukvalno radio u 5 do 12 jer su pomerili predavanje radova nedelju dana ranije i ja sam jos mnogo stvari imao da uradim na igrici pa sam neke uspeo da namestim difficulti (easy,hard,medium) i da uradim AI to jest AS
(artoficial stupednes) sorry for the spelling! U prevodu napravio sam da se neprijateljski tenkici bezveze krecu po tabli odbijajuci se od zidova. Sve u svemu igrica nije losa iako je jednostavna.

Ako te zanima exe ili kod daj mi e-mail pa cu ti poslati.

>Šta je to branjenje aplikacija, kako to izgleda? Napraviš program kod kuće na zadatu temu pa pred komisijom dokazuješ da si ga ti napravio?

Grubo receno da, stim sto nepostoji zadata to jest tema (kakve sam gluposti video nebi mi verovali) i da, radi se kod kuce
stim sto se radovi predaju komisiji i onda ona to izboduje itd.

A na takmicenju iz programskih aplikacija se radi jedan test pre odbrane rada (opste znanje iz programiranja i kompjutera uopste) i onda ti komisija pregleda rad pa onda i kod po ti kaze da im objasnis neki deo koda itd.

>Znaš li koja su okruženja?

Mislim da je Borland C++ builder, Visual basic 6 i Pascal je ja mislim na DOS-u.


U vezi igre:


Naisao sam na problem.


Ne znam kako da proverim da li je pritisnuto gore preko virtual koda.

Probao sam sledece:

if key=VK_UP then
bla..truc...

nece ne znam zasto?
kako se to uopste proverava?



Inace resio sam se seckanja u mojoj drugoj igri (stavio sam ispod svih objekata panel) ali se pojavio drugi problem, muljanje ili razmazivanje boja.

POGLEDAJ FAJL ISPOD.


[Ovu poruku je menjao vladaboy93 dana 03.05.2007. u 18:28 GMT+1]
[ savkic @ 03.05.2007. 17:41 ] @
> Ne znam kako da proverim da li je pritisnuto gore preko virtual koda.
> Probao sam sledece:
> if key=VK_UP then
> nece ne znam zasto?
> kako se to uopste proverava?

Tako. U kom event handleru si to napisao? Da li ti je podešeno KeyPreview forme na True?
[ vladaboy93 @ 03.05.2007. 18:15 ] @
Sad malopre mi je uspelo problem je bio u to me sto sam stalno definisao na on KeyPress o ne na on KeyDown pa zato nije radilo!

Imam problem sa seckanjem slike (i jako ruzno izgleda kad se krece) pogledajte fajl u mojoj prosloj poruci -Projekt1-

Hvala na saradnji!


[ Srki_82 @ 03.05.2007. 18:25 ] @
Citat:
Inace resio sam se seckanja u mojoj drugoj igri (stavio sam ispod svih objekata panel) ali se pojavio drugi problem, muljanje ili razmazivanje boja.

POGLEDAJ FAJL ISPOD.


Ne znam sta ti mulja... kad pokrenem program koji si stavio tenkic malo stoji i zatim ode gore pa desno... ne mulja mi se slika.

Secka verovatno zato sto koristis timer za kretanje tenkica.
[ Programmer @ 03.05.2007. 19:49 ] @
Graphics32 komponente je mnogo bolje koristiti od standardnih, TImage32 i TImage, posto rade mnogo brze.

Na Canvas TImage32 komponente moguce je staviti vise odvojenih objekata (slika) u obliku layer-a i svaki podesavati za sebe, davati koji je top, alpha blend i slicno. Tako da je za ovakve stvar generalno mnogo bolje i brze koristiti Graphics32.

Medjutim 2D igre se ne prave tako, mogu se praviti medjutim to nije predvidjeno za to, vec postoji dosta game engine-a koji su usavrsili kompletno manipulisanje grafickim i zvucnim elementima i fontovima i slicno.

Jedan od poznatih je PopCap, oni su pravili Zumu, Bejeweled...

U principu je mnogo bitnija dobra ideja nego konkretna implementacija. :)
[ vladaboy93 @ 03.05.2007. 20:25 ] @
>Secka verovatno zato sto koristis timer za kretanje tenkica.

Da koristim tajmer, postoji li neki drugi nacin za pokretanje tenkica koji nece kociti?

>Jedan od poznatih je PopCap.

Kako on radi da li moze da se pise code u pascalu?
I da li bi mogao da das neki link za taj program tj. engine?

[ Milan Milosevic @ 03.05.2007. 23:01 ] @
Probaj Delphix komponente ima deo za rad sa sprajtovima i dva elegantna primera.
[ Srki_82 @ 03.05.2007. 23:54 ] @
@vladaboy93

Da li hoces da pravis igru uz pomoc VCL ili hoces da koristis neki gotov engine... ili mozda hoces sam da napises neki svoj jednostavan engine pa da njega koristis?

Da ne objasnjavam sad kako da radis sve uz pomoc standardnih komponenti iz VCL sto, odmah da kazem, nece dati neke Bog zna kakve rezultate ako hoces da koristis nesto sto je predvidjeno za brzo crtanje.
[ vladaboy93 @ 04.05.2007. 12:22 ] @
>Da li hoces da pravis igru uz pomoc VCL

Neznam sta je to da li bi mogao da mi objasnis?

>Probaj Delphix komponente ima deo za rad sa sprajtovima i dva elegantna primera.

Gde to mogu da nadjem?

Hvala na saradnji!
[ Srki_82 @ 04.05.2007. 13:09 ] @
Ovde mozes procitati nesto o VCL: http://en.wikipedia.org/wiki/Visual_Component_Library
[ vladaboy93 @ 04.05.2007. 13:14 ] @
Hvala na linku sad mi je jasno!

Gde mogu da skinem VCL i da li ce mi to pomoci pri pravljenju igrice i seckanju?

>Secka verovatno zato sto koristis timer za kretanje tenkica.

da li postoji drugi nacin?
[ Srki_82 @ 04.05.2007. 14:11 ] @
1. Verovatno si koristio VCL za sve sto si ikad radio u Delphi-u. TForm, TEdit, TButton, TMenu, TMemo, TShape, TLabel, itd... sve su to klase iz VCL. VCL bas i nije predvidjen brzo crtanje, mada imas komponente kao sto su GLScene i DelphiX koje ti dozvoljavaju da koristis VCL i OpenGL/DirectX.

Ako ne koristis VCL, moras sam da kreiras prozore, da citas poruke koje salje sistem, itd... ali je kod koji dobijes dosta manji i nesto brzi.

2. Probaj da koristis OnIdle event. On se pokrece kad god aplikacija nema sta da radi (sve poruke su obradjene). Izracunas koliko je vremena proslo od poslednjeg update-a i pomeris objekat koliko treba. Naravno, ako je aplikacija zauzeta ili je neki program u pozadini pokrenut, opet ce da ti secka.
[ vladaboy93 @ 04.05.2007. 15:20 ] @
Na events od forme nisam nasao OnIdle event? Nema ga!

[ Srki_82 @ 04.05.2007. 16:25 ] @
OnIdle je event aplikacije, a ne forme.

Evo... nemam instaliran Delphi, ali mozes da upotrebis ovaj kod koji sam napisao u Lazarus-u:
Code:
unit MainUnit;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls;

type

  { TVector2D }
  
  TVector2D = record
    X, Y: Double;
  end;

  { TfrmMain }

  TfrmMain = class(TForm)
    shpCircle: TShape;
    procedure FormCreate(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: char);
  private
    { private declarations }
    Position2D: TVector2D;
    Speed2D: TVector2D;
    LastTime: Int64;
    procedure AppIdle(Sender: TObject; var Done: Boolean);
    procedure RenderScene(DeltaTime: Double);
  public
    { public declarations }
  end; 

var
  frmMain: TfrmMain;

implementation

uses
  dos;

{ TfrmMain }

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  DoubleBuffered := True;
  
  Position2D.X := ClientWidth / 2;
  Position2D.Y := ClientHeight / 2;
  
  Speed2D.X := Random(100) + 100;
  Speed2D.Y := Random(100) + 100;
  
  LastTime := GetMsCount;

  Application.OnIdle := @AppIdle;
end;

procedure TfrmMain.FormKeyPress(Sender: TObject; var Key: char);
begin
  if Key = #27 then
    Application.Terminate;
end;

procedure TfrmMain.AppIdle(Sender: TObject; var Done: Boolean);
var
  NewTime: Int64;
begin
  NewTime := GetMsCount;
  RenderScene((NewTime - LastTime) / 1000);
  LastTime := NewTime;
  
  Done := False;
end;

procedure TfrmMain.RenderScene(DeltaTime: Double);
begin
  Position2D.X := Position2D.X + Speed2D.X * DeltaTime;
  Position2D.Y := Position2D.Y + Speed2D.Y * DeltaTime;
  
  if Position2D.X > (ClientWidth - shpCircle.Width / 2) then
  begin
    Position2D.X := ClientWidth - shpCircle.Width / 2;
    Speed2D.X := -Random(100) - 100;
  end;

  if Position2D.X < (shpCircle.Width / 2) then
  begin
    Position2D.X := shpCircle.Width / 2;
    Speed2D.X := Random(100) + 100;
  end;

  if Position2D.Y > (ClientHeight - shpCircle.Height / 2) then
  begin
    Position2D.Y := ClientHeight - shpCircle.Height / 2;
    Speed2D.Y := -Random(100) - 100;
  end;

  if Position2D.Y < (shpCircle.Height / 2) then
  begin
    Position2D.Y := shpCircle.Height / 2;
    Speed2D.Y := Random(100) + 100;
  end;
  
  shpCircle.Left := Trunc(Position2D.X - shpCircle.Width / 2);
  shpCircle.Top := Trunc(Position2D.Y - shpCircle.Height / 2);
end;

initialization
  {$I mainunit.lrs}

end.
[ vladaboy93 @ 04.05.2007. 17:55 ] @
Bravo Srki Care!!!!

Hvala ti na kodu!

Samo jedno pitanje kako meni treba da izgleda interfejs i imena komponenti da bi se slagao sa kodom?

Kod mi nije bas najjasniji to ti moram priznati-ja na Delphiu radim tek 3 meseca.
Koliko sam ja shvatio radi se o pomeranju nekog kruga (ispravi me ako gresim).

Tvoj Kod je za mene babaroga!!

Pogledaj moj kod (cisto radi uporedjivanja) za kretanje i sudaranje crvenog objekta sa republickog takmicenja!


Code:

procedure TForm1.TredTimer(Sender: TObject);
begin
if game_=true then
begin
   if Sdole1=true then
   begin
      if Fred1.Top <512 then Fred1.Top:=Fred1.Top+1
      else Sdole1:=false;
   end
   else
   begin
    if Fred1.Top >416 then Fred1.top:=Fred1.Top-1
    else  Sdole1:=true;
   end;
               if fred1.visible=true then
               begin
   if (bl1.left+25>Fred1.left) and (bl1.left<Fred1.left+Fred1.Width) and
      (bl1.Top+25>Fred1.Top) and (bl1.top<Fred1.Top+Fred1.Height) then
begin
     bl1.Left:=832;
     bl1.Top:=16;
     live:=live-1;
     bl2.Left:=832;
     bl3.Left:=832;
     bl2.Top:=16;
     bl3.Top:=16;
     bl4.Left:=832;
     bl4.Top:=16;
end;
end;


Hvala na trudu i pisanju koda!
[ vladaboy93 @ 04.05.2007. 21:40 ] @
Srki jos jednom hvala za kod!

Hvala vam svima na pomoci evo napravio sam jedan mali demo igre i uspeo sam da namestim da se tenkic krece na arowkeys preko virtual coda i uspeo sam da namestim i da puca.
Resio sam seckanje tako sto sam ispod stavio panel.

Samo ima jedan problem.
Kada se tenk krece i kada pritisne space i ispali metak onda zastane pa onda mora ponovo da se klikne taster da bi se ponovo kretao.

Kako vam se cini?
[ Srki_82 @ 04.05.2007. 22:28 ] @
Treba da imas formu i na njoj jedan TShape objekat koji se zove shpCircle. Velicine i pozicoje forme i shpCircle uopste nisu bitne, program ce sam da se pobrine za sve. U Delphi-u jedino ne treba da koristis dos unit, a umesto GetMsCount koristi GetTickCount. Delphi ce sam ukljuciti sve unit-e koji su mu potrebni za kompajliranje programa.

Reci sta ti nije jasno pa cu probati da ti objasnim... kod bi trebalo da je bas jako jednostavan.
[ vladaboy93 @ 05.05.2007. 08:54 ] @
Izvini sto te gnjavim Srki i hvala ti sto hoces da mi objasnis tvoj code.
Mislim da si primetio da ti ovde imas posla sa pocetnikom!

Evo ovaj deo mi uopste nije jasan?

Hvala na saradnji!

Code:


procedure TfrmMain.AppIdle(Sender: TObject; var Done: Boolean);
var
  NewTime: Int64;
begin
  NewTime := GetMsCount;
  RenderScene((NewTime - LastTime) / 1000);
  LastTime := NewTime;
  
  Done := False;
end



Jesi li pogledao onaj fajl "Pucanje" u mojoj prosloj poruci Jer bi znao kako da resis onaj problem sto tenk uvek zastane kad puca?

Thank's for your Help!
[ Srki_82 @ 05.05.2007. 11:02 ] @
Nakuckah ovo nabrzaka na poslu pa vidi kako ide. Kad se vratim kuci, objasnicu ti deo koda koji ti nije jasan.

BTW: program je radjen u Lazarusu, ali ga je lako prevesti na Delphi.
[ Srki_82 @ 05.05.2007. 12:39 ] @
Citat:
Jesi li pogledao onaj fajl "Pucanje" u mojoj prosloj poruci Jer bi znao kako da resis onaj problem sto tenk uvek zastane kad puca?

Ako zelis da ti neko pomogne oko problema na koji si naisao, izvrsni fajl nista ili vrlo malo znaci onome ko trazi gde si pogresio. Postuj kod programa kao sto ja radim i onda mozemo da vidimo sta radis pogresno.
Code:
procedure TfrmMain.AppIdle(Sender: TObject; var Done: Boolean);
var
  NewTime: Int64;
begin
  NewTime := GetMsCount;
  RenderScene((NewTime - LastTime) / 1000);
  LastTime := NewTime;
  
  Done := False;
end;

Ovako... na pocetku programa u LastTime uzimamo vreme u milisekundama koje cemo koristiti za racunanje proteklog vremena prilikom iscrtavanja. Svaki put kada se pozove AppIdle funkcija uzimamo novo vreme u milisekundama, zatim racunamo razliku izmedju vremena koje smo ranije uzeli i ovog novog. Posto su vremena u milisekundama, kada ih podelimo sa 1000 dobijemo vreme u sekundama. Pozivamo funkciju RenderScene i kao parametar joj dajemo vreme u sekundama koje je proslo od kad smo je poslednji put zvali tako da zna koliko treba da pomeri objekte. Na kraju u LastTime ubacujemo novo vreme jer je sada ono vec staro :)

Nadam se da je bilo jasno.
[ vladaboy93 @ 05.05.2007. 12:57 ] @
Jasno hvala ti.
Code cu ti poslati kada dodjem kuci!
Ovde ga trenutno nemam!

Sta radi RenderScene?
[ Srki_82 @ 05.05.2007. 13:12 ] @
Pise u kodu sta radi
Code:
procedure TfrmMain.RenderScene(DeltaTime: Double);
begin
  Position2D.X := Position2D.X + Speed2D.X * DeltaTime;
  Position2D.Y := Position2D.Y + Speed2D.Y * DeltaTime;
  
  if Position2D.X > (ClientWidth - shpCircle.Width / 2) then
  begin
    Position2D.X := ClientWidth - shpCircle.Width / 2;
    Speed2D.X := -Random(100) - 100;
  end;

  if Position2D.X < (shpCircle.Width / 2) then
  begin
    Position2D.X := shpCircle.Width / 2;
    Speed2D.X := Random(100) + 100;
  end;

  if Position2D.Y > (ClientHeight - shpCircle.Height / 2) then
  begin
    Position2D.Y := ClientHeight - shpCircle.Height / 2;
    Speed2D.Y := -Random(100) - 100;
  end;

  if Position2D.Y < (shpCircle.Height / 2) then
  begin
    Position2D.Y := shpCircle.Height / 2;
    Speed2D.Y := Random(100) + 100;
  end;
  
  shpCircle.Left := Trunc(Position2D.X - shpCircle.Width / 2);
  shpCircle.Top := Trunc(Position2D.Y - shpCircle.Height / 2);
end;

Pomera shpCircle... samo to i nista vise
[ Milan Milosevic @ 05.05.2007. 13:12 ] @
Iscrtava ti narednu scenu.Novi polozaj tenka metka i.t.d.
[ vladaboy93 @ 05.05.2007. 14:54 ] @
Ovo ti Srki kod (malo je dugacak) ali ti ces se sigurno snaci
Nisam znao koji deo da stavim pa sam ti poslao ceo!

Code:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    gt1: TImage;
    gt2: TImage;
    gt3: TImage;
    gt4: TImage;
    Tgtright: TTimer;
    Tgtup: TTimer;
    Tgtdown: TTimer;
    Tgtleft: TTimer;
    Tbgt1: TTimer;
    Tbgt2: TTimer;
    Tbgt3: TTimer;
    Tbgt4: TTimer;
    gbull: TImage;
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);

    procedure Tbgt1Timer(Sender: TObject);
    procedure Tbgt3Timer(Sender: TObject);
    procedure Tbgt2Timer(Sender: TObject);
    procedure Tbgt4Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);


  private
    { Private declarations }
  public
  gtup:boolean;
  gtdown:boolean;
  gtleft:boolean;
  gtright:boolean;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
gt2.Left:=gt1.Left;
gt2.top:=gt1.top;

gt3.Left:=gt1.Left;
gt3.top:=gt1.top;

gt4.Left:=gt1.Left;
gt4.top:=gt1.top;

if key=VK_SPACE then
begin
if gt1.visible=true then
begin
gbull.left:=gt1.left+12;
gbull.top:=gt1.top;
Tbgt1.enabled:=true;
Tbgt2.enabled:=false;
Tbgt3.enabled:=false;
Tbgt4.enabled:=false;
end;

if gt2.visible=true then
begin
gbull.left:=gt1.left+25;
gbull.top:=gt1.top+12;
Tbgt2.enabled:=true;
Tbgt1.enabled:=false;
Tbgt3.enabled:=false;
Tbgt4.enabled:=false;
end;

if gt3.visible=true then
begin
gbull.left:=gt1.left+12;
gbull.top:=gt1.top+25;
Tbgt3.enabled:=true;
Tbgt2.enabled:=false;
Tbgt1.enabled:=false;
Tbgt4.enabled:=false;
end;

if gt4.visible=true then
begin
gbull.left:=gt1.left;
gbull.top:=gt1.top+12;
Tbgt4.enabled:=true;
Tbgt3.enabled:=false;
Tbgt2.enabled:=false;
Tbgt1.enabled:=false;
end;
end;


if key=VK_UP then
begin
gt1.top:=gt1.Top-4;
gtup:=true;
gtdown:=false;
gtleft:=false;
gtright:=false;
end;
if key=VK_DOWN then
begin
gt1.Top:=gt1.top+4;
gtup:=false;
gtdown:=true;
gtleft:=false;
gtright:=false;
end;
if key=VK_LEFT then
begin
gt1.left:=gt1.left-4;
gtup:=false;
gtdown:=false;
gtleft:=true;
gtright:=false;
  end;
if key=VK_RIGHT then
  begin
  gt1.left:=gt1.left+4;
gtup:=false;
gtdown:=false;
gtleft:=false;
gtright:=true;
  end;
////////////////////////////////////////////////////////////////////////////////
if gtup=true then
begin
gt1.Visible:=true;
gt2.Visible:=false;
gt3.Visible:=false;
gt4.Visible:=false;

end;

if gtleft=true then
begin
gt1.Visible:=false;
gt2.Visible:=false;
gt3.Visible:=false;
gt4.Visible:=true;


end;

if gtdown=true then
begin
gt1.Visible:=false;
gt2.Visible:=false;
gt3.Visible:=true;
gt4.Visible:=false;

end;

if gtright=true then
begin
gt1.Visible:=false;
gt2.Visible:=true;
gt3.Visible:=false;
gt4.Visible:=false;

end;
end;



procedure TForm1.Tbgt1Timer(Sender: TObject);
begin
gbull.top:=gbull.top-6;
gbull.Visible:=true;
end;

procedure TForm1.Tbgt3Timer(Sender: TObject);
begin
gbull.top:=gbull.top+6;
gbull.Visible:=true;
end;

procedure TForm1.Tbgt2Timer(Sender: TObject);
begin
gbull.left:=gbull.left+6;
gbull.Visible:=true;
end;

procedure TForm1.Tbgt4Timer(Sender: TObject);
begin
gbull.left:=gbull.left-6;
gbull.Visible:=true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
gt1.visible:=true;
gt2.visible:=false;
gt3.visible:=false;
gt4.visible:=false;
gbull.Visible:=false;
end;

end.


U cemu je problem?
[ Srki_82 @ 05.05.2007. 17:06 ] @
OnKeyDown event se poziva dok drzis taster pritisnut. Dakle... drzis desno... i imas OnKeyDown(desno), OnKeyDown(desno), OnKeyDown(desno), OnKeyDown(desno),... ne pustas desno, ali pritisnes i space OnKeyDown pocinje da se poziva za space OnKeyDown(space), OnKeyDown(space), OnKeyDown(space),... pustis space u dobijes OnKeyUp(space)... ti i dalje drzis desno, ali nema vise OnKeyDown(desno) jer OnKeyDown tj. WM_KEYDOWN poruka tako radi. Cim pustis bilokoji taster nema vise OnKeyDown. Posto se tebi tenk pomera bas u OnKeyDown eventu posle pritiska na space kretanje prestaje jer vise nema OnKeyDown poruke.

Pogledaj kako sam ja to uradio (ni to nije najsrecnije resenje, ali je bolje od tvog) pa ces videti razliku.

BTW da sam na tvom mestu, krenuo bih da pisem program iz pocetka jer si ga iskomplikovao bez potrebe.
[ vladaboy93 @ 06.05.2007. 11:14 ] @
Nisam bas razumeo u cemu sam pogresio problem nije u kretanju nego u pucanju kako da napravim da puca i da se krece u isto vreme.On kad pukne odma prestane sa kretanjem-kako to da popravim?

[ bojan21 @ 06.05.2007. 11:53 ] @
Pa Srki ti je upravo to i objasnio! Cim ispalis raketu (znaci, pritisnes SPACE) OnKeyDown za gore (dole, levo, desno) se vise ne poziwa, jer je program primio poruku za OnKeyUp za SPACE! Posto ti pomeras tenkic na taj event, a event se vise ne poziva, nema ni kretanja tenkica! Kako sto je Srki rekao, ne koristi OnKeyDown za kretanje i pucanje! Pozdrav!
[ Srki_82 @ 06.05.2007. 13:43 ] @
Pogledaj kod koji sam poslao. U OnKeyXXXX eventima samo postavljaj flag koji ce prilikom iscrtavanja novog frejma da kaze programu da li treba da pomeri objekat ili ne. Ovako je dovoljno da dobijes samo jedan OnKeyDown event za npr. gore... onda postavis flag za kretanje na gore, kad crtas frejm vidis da je flag postavljen i pomeris objekat, itd... kad dobijes OnKeyUp za gore skines flag za kretanje i u sledecem iscrtavanju ne pomeras objekat.
[ vladaboy93 @ 07.05.2007. 19:10 ] @
Izvini sto te ovo pitam znam da ce zvucati pocetnicko ali stacu kad sam pocetnik:
Sta je flag (znam da je zastava) ali verovatno ti mislis na nesto drugo?
[ Srki_82 @ 07.05.2007. 20:58 ] @
Flag... to je promenljiva :)
Uglavnom je to boolean ili integer promenljiva. U ovom slucaju flag treba da ti kaze da li da i gde da pomeras objekat ako treba. Posto moze da ima vise vrednost, tip bi mogao da bude integer. Kada je promenljiva koja ti predstavlja flag postavljena na 0 ti nemoj da pomeras objekat. Kada je postavljen na 1 onda ga pomeraj gore, kada je 2 onda dole i sl... Flag postavljas u OnKeyXXXX eventu. Kada se neki taster pritisne, ti proveris koji je i na osnovu toga postavis flag. Kada se taster otpusti, prvo proveris da li se otpustio taster koji je postavio flag (moguce je da si pritisnuo levo, pa gore, pa pustio levo... objekat i dalje treba da ide gore) i onda resetujes flag na 0. U tajmeru ili gde god vec updatujes objekte proveris u kom stanju se nalazi flag i na osnovu njega oderdjujes sta ces da radis.
[ Srki_82 @ 17.06.2007. 14:17 ] @
Vlado The Boy, sta se desava sa igrom. Ne javljas se vec duze vreme?
[ bojan21 @ 17.06.2007. 14:46 ] @
Sigurno sprema neshto extra mega giga specijano pa nas drzi u neizvesnosti ;)!
[ vladaboy93 @ 21.06.2007. 10:31 ] @
Ljudi nisam stizao sve ovo vreme nista da uradim moro sam da se nakacim za udzbenike i strebanje , strebanje i tako da popravim sve ocene i jos sam kasnije primljen u petnicu i 2 nedelje nisam seo za svoj komp i tako........

Vratio sam se i pocecu da radim........ ocekojte novi post sutra preksutra sa nekom greskom u igri

pozdrav svima!
[ vladaboy93 @ 24.06.2007. 14:40 ] @
Evo ljudi kao sto sam i obeco doso sam do problema juce dok sam radio na igri....

Znate onu moju igricu koju sam radio sa tenkicima e... sada sam dodao multyplayer i igra se sa 2 igraca jedan se krece na arowkeys preko virtual koda a drugi na W.A.S.D preko ASCII koda... problem je u tome sto kada se jedan krece drugi ne moze da se krece to jest da nemogu da se krecu istovremeno.

unapred hvala!!!
[ bojan21 @ 24.06.2007. 14:51 ] @
Hm, nisam bas siguran da sam te razumeo! Ja kad sam pravio nesto slicno samo preko ASCII koda noramlno je radilo (mislim na to da su oba mogla da se krecu u isto vreme)! Jel mozes da postujes SOURCE?

edit: NE MOZE - pise se odvojeno !
[ vladaboy93 @ 24.06.2007. 14:58 ] @
Postovacu source samo kada dodjem kuci.