Professional Documents
Culture Documents
OOP Pong
OOP Pong
Osnovni elementi:
• apstrakcija
• enkapsulacija
• modularnost
• nasljeđivanje
• polimorfizam
Bez jednog od ovih elemenata model se ne može
proglasiti objektno-orijentiranim
3
Elementi objektnog modela
Dodatni elementi:
• identifikacija tipa (typing)
• konkurentnost
• perzistencija
Ovi elementi su korisni, ali ne i neophodni elementi
objektnog modela
4
Primjeri
Igra
Prvi projekt sa liste koju ste popunili je:
“Neka jednostavna igra u GUI (WinForm)”
Pong je naziv za računalnu igru koju je razvila tvrtka Atari 1972. Ova igra je
pokrenula razvoj industrije računalskih igara.
Cilj: razviti Pong igru
Osnovne značajke igre:
1. 2D igra (pojednostavljeni stolni tenis)
2. Igra za jednog igrača (lijeva strana predstavlja igrača)
3. Upravlja se pomoću tipkovnice
4. Jednostavna grafika
5. Jedna loptica koja se kreće po x i y osi
6. Dvije palice koje se kreću po y osi
7. Loptica mijenja smjer kada udari u palicu (reket)
8. Kad igrač promaši lopticu igra je završena
9. Obavijesti igrača o tome je li igru dobio ili izgubio
10. Vrati sve parametre na početak, ako želiš ponovo igrati
Što sada?
Kreirati vlastiti engine ili koristiti postojeći?
Koje biblioteke i alate koristiti?
http://www.youtube.com/user/ashh640?feature=watch
Korak 1
Krećemo od postavljanja razvojnog okruženja
• Forma je veličine 640x480
• Osnovni element u igrama je “Sprite” (2D slika ili animacija integrirana u
širu scenu)
Kako to definirati?
Preuzmite GameSDK sa stranica kolegija.
Proučite što bi Vam moglo trebati od dostupnih metoda.
Kod za igru pohranjujete u BGL.cs (Basic Game Language C#)
Sprite
public struct Sprite public Sprite(string images, int p1, int p2, int w, int h)
{ {
public string image; bmp = new Bitmap(images);
public Bitmap bmp; image = images;
public int x, y, width, height; x = p1;
public bool show; y = p2;
width = w;
public Sprite(string images, int p1, int p2 height = h;
) show = true;
{ }
bmp = new Bitmap(images); }
image = images;
x = p1;
y = p2;
width = bmp.Width;
height = bmp.Height;
show = true;
}
39-55
Pomaci loptice
setTitle("Ping-Pong!"); // postavi naziv prozora
Polje spriteova
Za razmišljanje:
Što je ovo? Kako to da imamo isti naziv metode?
Kako se naziva ova pojava u OOP-u?
266-283
Inicijalizacija
Sve do sada navedeno spada u inicijalizaciju igre.
public void Init() Što je ovo?
{
…
// definiramo moguće pomake loptice
left = true; // pomičemo lopticu lijevo
up = true; // pomičemo lopticu gore
80-90
Problem prozirnosti
Loptica koju koristimo je drukčija od originala. Naša je loptica okrugla. Sada
postoji problem prozirnosti dijela bitmape oko loptice (crna boja).
91 setImageColorKey(1, Color.Black); // učini nevidljivom za zadani sprite
//navedenu boju
Bitmap Class
System.Drawing Namespace
Nedostaje još pozadina
Na isti način kao i do sada učitava se još jedna bitmapa.
93 setBackgroundImage("Pozadina.bmp"); // postavi zadanu bitmapu u pozadinu
101-111
A što je s lopticom?
Loptica se kreće u četiri osnovna smjera:lijevo, gore, desno i dolje
Koliko nam varijabli treba za određivanje smjera ako pretpostavimo da se
radi o logičkim varijablama?
Kako ćemo naznačiti da se loptica kreće ukoso?
// ponašanje loptice
if(left) moveSprite(1, spriteX(1) - 5, spriteY(1));
if(up) moveSprite(1, spriteX(1), spriteY(1) - 5);
if(left == false) moveSprite(1, spriteX(1) + 5, spriteY(1));
if(!up) moveSprite(1, spriteX(1), spriteY(1) + 5);
121-124
Iza 09.12.
Loptica i reket
Ovo je složenija zadaća, ali logički bi mogli reći:
1. Ako se loptica kreće ulijevo (prema nama) i
2. ako smo detektirali sudar između reketa i loptice
onda se loptica više ne treba kretati u lijevo nego u suprotnu
stranu
Bilo bi lijepo pronaći odgovarajući zvuk udarca i odsvirati ga
128-133
Kako detektirati koliziju?
Najjednostavnije je zamisliti kako su svi spriteovi pravokutnici i onda tražiti
sijeku li se ili ne.
if (!Collision.IsEmpty)
{
return true; Rectangle Structure
} Namespace: System.Drawing
else Method: Intersect(Rectangle, Rectangle)
{
return false;
}
} 478-493
Što sa drugim reketom?
Ako je loptica udarila u igračev reket, promijenili smo joj smjer gibanja.
Sada treba ispitati: Je li loptica udarila u drugi reket?
// detekcija sudara s drugim reketom
if ( !left && spriteCollision(1, 3)) // metoda iz 2D game language
{
playSound(2);
left = true; // ako loptica ne ide u lijevo i udari u reket
// tada se treba opet kretati u lijevo
}
135-141
Kako se kreće drugi reket?
1. Trebamo detektirati poziciju loptice u odnosu na reket računala
2. Ako se loptica kreće prema reketu ( ne u lijevo) tada trebamo prilagoditi y
koordinatu reketa y koordinati loptice (tako radi i čovjek)
3. Broj piksela za koji ćemo pomaknuti reket emulira reflekse čovjeka dok igra
Kako se kreće drugi reket?
Loptica je učitana prva u polju spriteova, pa je njezina oznaka 1 (zadržali
smo neku logiku označavanja)
Drugi po redu učitali smo reket igrača, a treći po redu reket računala
Ovo nam je važno za razumijevanje koda koji definira kretanje drugog reketa
// Kretanje drugog reketa (UI)
if(spriteY(1) > spriteY(3) - 15 && spriteY(3) < (480-163) && left == false)
// želimo postaviti centar reketa
{
moveSprite(3, spriteX(3), spriteY(3) + 7);
}
144-154
Detekcija kraja igre
Za ovako jednostavnu igru nećemo uvoditi brojač već ćemo smatrati da se
igra samo dok loptica ne “ispadne” sa stola.
Sada imamo relativno jednostavan zadatak.
Detekcija kraja igre