You are on page 1of 17

Prošli put:

primjer PMF GameSDK


obradio
Saša Mladenović
Prirodoslovno matematički fakultet
Primjeri
Hanojski toranj
Opet igra 
 Za one koji vole algoritme
“Igramo se Hanojskog tornja”
 S obzirom na stalna prediđanja smaka svijeta i pokušaje predviđanja
završetka Majanskog kalendara prigodno je igrati upravo ovu igru.
Legenda o Hanojskom tornju
 Legenda kaže da je stari indijski bog Brahma prilikom stvaranja svijeta
postavio tri dijamantna štapa i na prvog stavio 64 zlatna kruga različitih
promjera najvećeg dolje, a svaki idući je manji od prethodnog. Svećenici
hrama dužni su bez prestanka prebacivati krugove sa prvog štapa na treći
upotrebljavajući srednji kao pomoćni. Odjednom se može premjestiti samo
jedan krug, i ne smije se stavljati veći krug na manji. Kada budu prebačeni
svi krugovi sa prvog na treći štap, nastupiti će smak svijeta !

 Ako uspijete danas ćete ispuniti proročanstvo 

svećenici moraju napraviti 1,84 * 109 poteza kako bi prebacili sve krugove na zadani štap
(imamo još vremena ….)
Cilj: razviti igru
Hanojski tornjevi
Osnovne značajke igre:
1. Tri štapa
2. Četiri diska različitih veličina
3. Upravlja se pomoću miša
4. Jednostavna grafika
5. Diskovi se pokreću prema koordinatama miša
6. Ako se disk ne može spustiti na štap vraća se na prethodnu poziciju
7. Ako su diskovi ispravno posloženi na drugom ili trećem štapu igra je
gotova
8. Igrač može ponovno igrati igru
9. Broje se ukupni potezi igrača, a obavijest se prikaže na kraju igre
Što sada?
 Kreirati vlastiti jednostavni engine (jer je za početak to dovoljno)
 GameSDK
 2DGL (2D Game Language)
 Ako ste probali napraviti igru Ping-pong ili ako ste barem pogledali kod i
proučili kako radi, tada će vam ova igra biti novi izazov.
 Ako ništa od navedenog niste učinili, vjerojatno vam ništa neće biti jasno.

 Kako ima više vas koji ste odabrali igru za projekt, primjereno je proći još
jedan, nešto složeniji primjer.

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;
}

36-64 – oznaka retka u kodu projekta Hanoi


Definicija diskova
67-72 int uzmiDisk = 0; // imamo 4 diska (1,2,3,4) predstavljenih spriteovima.
// Za početak niti jedan nije odabran (vrijednost 0).
int prethodniStap = 1;
// imate tri štapa, a na početku se svi diskovi nalaze na prvom štapu.
// Ako uzmete disk i onda ga ne stavite na štap, ili ga jednostavno stavite na štap na koji
// ne smijete, tada će program vratiti disk na prethodni štap.

ZAHTJEV 6
Početna pozicija
int[] stap1 = {1, 2, 3, 4}; // u početku se svi diskovi nalaze
//na prvom štapu
int[] stap2 = {0, 0, 0, 0}; // ostali štapovi su prazni
int[] stap3 = {0, 0, 0, 0};

Koji je koji disk?


Disk 1
Disk 2
Disk 3
Disk 4

Postavimo i pozadinu!

76-78
Postavljanje pozadine
 Pripremili smo sliku u png formatu, ali….

Što nije dobro?!

Kako riješiti ovaj problem?!


setBackgroundImage("Bg.png");
// postavi sliku u pozadinu
setBackgroundImageLayout("stretch");
// proširi sliku pozadine, jer nije dobre veličine

95-96
Učitavanje diskova
// sada je potrebno učitati spriteove koji predstavljaju diskove

loadSprite("Disk1.png", 1);
setImageColorKey(1, Color.Black);
loadSprite("Disk2.png", 2);
setImageColorKey(2, Color.Black);
loadSprite("Disk3.png", 3);
setImageColorKey(3, Color.Black);
loadSprite("Disk4.png", 4);
setImageColorKey(4, Color.Black);

svaki disk postavlja se inicijalno na koordinate 0,0

Uvodimo korekciju položaja pomicanjem spriteova


moveSprite(1, 103 - ( spriteWidth(1) / 2), 274);
moveSprite(2, 103 - ( spriteWidth(2) / 2), 274+spriteHeight(1));
moveSprite(3, 103 - ( spriteWidth(3) / 2), 274+spriteHeight(1)+spriteHeight(2));
moveSprite(4, 103 - ( spriteWidth(4) / 2), 274+spriteHeight(1)+spriteHeight(2)+spriteHeight(3));

98-107
Problemi počinju
// sada moramo vidjeti je li korisnik kliknuo na miša i na koji je disk kliknuo
// iako zadatak izgleda jednostavan, to nije tako jer nekako treba spriječiti
provjeru za slučaj kada smo kliknuli na disk već samo treba nastaviti pratiti
poziciju miša

Ideja:
1. Ako je tipka miša pritisnuta i ne držiš već disk, tada provjeravaj gdje se nalaziš
2. Ako si blizu nekog štapa, tada podigni disk koji možeš
if(isMousePressed() && uzmiDisk == 0) // ako je miš pritisnut i odabrani disk 0 (nema diska)
{
if(odabraniStap() != 0)
{
podigni(odabraniStap());
} Kako biramo štap?
}
Kako podižemo disk?
130-136
Koji je štap odabran
 Ovo je igra, a mi pokušavamo pogoditi namjeru igrača.
 Pretpostavljamo kako igrač želi podići disk sa nekog štapa, ako se
nalazi u nekoj “zoni aktivnosti”
public int odabraniStap() // potrebna nam je metoda za dodjelu šipke
{
int stap = 0;
if(mouseX() > 25 && mouseX() < 200 & mouseY() > 150)
{
stap =1;
}
if(mouseX() > 201 && mouseX() < 400 & mouseY() > 150)
{
stap =2;
}
if(mouseX() > 401 && mouseX() < 640 & mouseY() > 150)
{
stap =3;
}
return stap; // vraćamo vrijednost koja pokazuje koji je štap odabran
}
332-354
Još samo podizanje diska
public void podigni(int stap)
{
if (stap == 1) // ovo je stanje za prvi štap na kojem mogu postojati najviše 4 diska - od 0 do 3
{
if(stap1[0] != 0) // ako najviši nije prazan onda ćemo ga podignuti
{
uzmiDisk = stap1[0]; // podižemo disk
prethodniStap = 1; // podigli ste disk i pamtite gdje se nalazio
stap1[0] = 0; // nema više diska, pa je to mjesto prazno
}
else if(stap1[1] != 0)
{
uzmiDisk = stap1[1]; // podižemo disk
prethodniStap = 1; // podigli ste disk i pamtite gdje se nalazio
stap1[1] = 0; // nema više diska, pa je to mjesto prazno

}
else if(stap1[2] != 0)…….. I TAKO ZA SVA TRI ŠTAPA!!!
{

226-329
Sada malo u kod
 …

You might also like