Cuprins: 1. Introducere ...........................................................................................................3 1.1. Alegerea temei ................................................................................................4 1.2. Propunerea aplicaiei .....................................................................................4 2. Resurse ...................................................................................................................5 2.1. Construcia resurselor ...................................................................................5 2.2. Monster Sprite ............................................................................................9 3. Noiuni i algoritmi de programare folosii n aplicaie...................................... 12 3.1. Clasa static localSettings: ........................................................................... 14 3.2. Clasa static runTime .................................................................................. 15 3.3. Clasa Monster............................................................................................... 15 3.4. Metoda loadLevel ......................................................................................... 20 3.5. Metoda Load a formei principale ................................................................ 22 3.6. Functia principala refresh() a aplicaiei apelat la fiecare time_Tick ....... 24 3.7. Clasa Extra ................................................................................................... 31 3.8. Clasa option .................................................................................................. 32 4. Aplicaia PrincessRescue (UO-FS-DMI-2011) .................................................... 34 4.1. Ecranul principal al aplicaiei are urmtoarea configuraie : .................... 34 4.2. Setri ............................................................................................................. 35 4.3. Extras ............................................................................................................ 37 4.4. Nivelul demonstrativ 0 ................................................................................. 39 4.5. Fiierele resurs pentru crearea unui nivel: ............................................... 40 4.6. Nivelul demonstrativ 1 ................................................................................. 44 4.7. Nivelul demonstrativ 2 ................................................................................. 45 5. Bibliografie :......................................................................................................... 46
3
1. Introducere In introducere se gaseste o scurta descriere pentru tehnologiile si aplicatiile folosite in realizarea acestei lucrari. CorelDRAW este un program de grafica vectoriala ,2D, ce a fost creat pentru a rula pe platforme Microsoft Windows. Pana in anul 2000 au existat si variante pentru Linux (versiunea 9) si pana in 2001 pentru Macintosh (versiunea 11). In prezent, CorelDRAW ruleaza doar sub Microsoft Windows. C# este un limbaj de programare orientat-obiect conceput de Microsoft la sfritul anilor 90. A fost conceput ca un concurent pentru limbajul J ava. Ca i acesta, C# este un derivat al limbajului de programare C++. Graphics Device Interface (GDI) este o interfa de programare Microsoft Windows a aplicaiilor de baz i sistemului de operare fiind component responsabila de reprezentarea obiectelor grafice i transmiterea acestora la dispozitive de ieire , cum ar fi monitoare i imprimante . GDI este responsabil pentru sarcini, cum ar fi : desen linii i curbe, randare fonturi i de manipulare palete . Lucrarea este realizata in Windows Form Application , C#si este structurat pe 4 capitole. n primul capitol se descrie propunerea aplicaiei si motivatia alegerii temei. n capitolul doi se arat cum sunt construite resursele folosite de aplicaie i modul de gestionare a acestora. n capitolul trei este prezentat construcia aplicaiei din punct de vedere al programatorului. Capitolul patru contine prezentarea la nivel de utilizator a aplicaiei practice Princess Rescue.
4
1.1. Alegerea temei Am ales aceasta tema pentru realizarea lucrarii de licenta deoarece prin intermediul acestei aplicatii , numita Princess Rescue , pot sa ajut copii, si nu numai, sa isi formeze dexteritatile in ceea ce priveste folosirea mouse-ului. Comenzile jocului sunt create doar pentru a fi folosite de la mouse , astfel copii sau persoana care se joaca acest joc sa poata sa isi formeze dexteritatea cu mouse-ul jucand un joc distractiv. 1.2. Propunerea aplicaiei n aplicaia practic asociat acestei lucrri se dorete construirea unui joc bazat pe tehnologiile GDI+ , adaugand faciliti i opiuni . Gestionarea unui obiect de ctre utilizator pe baza mouse-ului. Deciziile utilizatorului vor fi cuantificate pe baza interaciunii dintre acest obiect i celelalte obiecte existente pe zona de joc. Existena unui punctaj global ce reflect toate aciunile utilizatorului. Acest punctaj va fi ca valoare pozitiv i cresctor. Valoarea 0 a acestui punctaj arat c utilizatorul curent nu a acionat deocamdat corect relativ la cerinele jocului. n continuare vom numi acest punctaj variabila Points. Existena unui punctaj secundar cu scopul de a cuantifica aciunile greite ale utilizatorilor dintre care amintim coliziunea cu un obiect de tip monstru sau trecerea prin zonele cu foc. Valoarea 0 a acestei variabile este una din condiiile de pierdere a jocului. Vom numi aceast variabil Life. Existena unor nivele de joc cu grade de dificultate diferite i posibilitatea de accesare a acestora de ctre utilizatori pentru mbuntire sau creare de nivele noi . Existena unor obiecte Montrii cu animaie 2D, personalizabili, cu diferite nivele de agresivitate i raz de aciune. Existena unor obiecte colectabile (heart i diamond) cu influen n creterea valorii variabilelor Points i Life.
5
2. Resurse 2.1. Construcia resurselor Toate resursele folosite de aplicaia Princess Rescue dinamice (montrii) sau statice (imagini de backGround) sunt de constucie proprie realizate prin tehnici i deprinderi nvate la laboratorul de grafic pe calculator (2010) Fie imaginea i2.cdr Construit n CorelDraw x5
Fig 2.1. Resursa i2.png
Are 5 elemente constructive: Cele 2 lnci, 2 sbii i scutul central. Cele dou lnci i cele dou sbii sunt identice ntre ele doar difer matricea de RTS (Rotaie, Translaie i Scalare). Astfel numrul de elemente constructive se reduce la 3 : O sabie, o lance i un scut. Se observ din imagine c scutul are 12 inte. Vom ncepe construcia cu : 1.) un poligon regulat cu 12 vrfuri (obiect predefinit n corelDraw); 2.) construirea elementului int prin suprapunerea a dou cercuri;
6
3.) prin operaii repetate Copy, Paste se centreaz fiecare obiect int n unul din vrfurile poligonului ;
4.) Cele 4 cercuri constructive ale conturului i ale cercului interior;
5.) Se construiete un dreptunghi (elementul scndur constitutiv al scutului); 6.) Prin repetri succesive Copy, Paste se construiete matricea de scnduri care se grupeaz (meniul arrange group );
7
7.) Aplicarea rotaiei cu un unghi oarecare (aici 18.9);
8.) Plasarea cercului central peste matricea de scnduri; 9.) Prin meniul Arrange Shaping Intersect obinerea figurii centrale; 10.)
11.) Texturarea i aplicarea efectului de umbrire;
12.) Lsnd la o parte obiectul scut vom construi obiectul sabie din un dreptunghi alungit; 13.) Prin reuniunea unor obiecte (cerc, dreptunghi i cerc) prin meniul (Arrange shaping weld) construim aprtoarea minii respectiv; 14.) Mnerul sabiei din reuniunea obiectelor (trapez, dreptunghi i cerc);
8
15.) Elementele de combinare, texturare i copiere pentru a obine cea de a doua sabie;
16.) Dup obinerea lncii din elementele constructive ;
17.) Construcia ansamblului final;
9
2.2. Monster Sprite
Urmtoarele fiiere resurse construite n corelDrawx5 i exportate sub form de fiiere *.png stau la baza animaiei n aceast aplicaie. Pentru fiecare obiect ce se dorete a fi animat se construiesc imaginile corespunztoare diferitelor ipostaze ale miscrii obiectului respectiv dup care acestea se afieaz succesiv (n funcie de o variabil intern (care primete sens (n cazul nostru) de vitez de rotaie)). Aceast succesiune de imagini ale aceluiai obiect poart numele de sprite i devine clasa de baz a unei aplicaii GDI+.
Figurile urmtoare arat modul de creare a unui Sprite din vectori de imagini *.png
10
Poziiile a) Monster01_t00, b) monster01_t01, c) monster01_t02, d) monster01_t03
Fig. 2.2.a,b,c,d,e,f,g,h,i . Fiierul sprite cu 9 poziii ale obiectului Monster_01.
Fig. 2.3. Poziiile a) monster02_t00, b) monster02_t01 i c) monster02_t02
Poziiile a) Monster03_t00, b) monster03_t01, c) monster03_t02, i d) monster03_t03
11
Poziiile e) monster03_t04 i f) monster03_t05 ale
Fig. 2.4. Fiierul Sprite Monster03.
Poziiile a) Monster04_t00, b) monster04_t01, c) monster04_t02, i d) monster04_t03
Poziia e) monster04_t04 a
Fig. 2.4 Fiierul Sprite Monster04
Fig. 2.5.a i b Fiierul sprite Monster05
12
3. Noiuni i algoritmi de programare folosii n aplicaie Aplicaia este construit n .Net C#ca i o aplicaie WindowsFormApplication cu urmtoarele componente : Forma principal conine urmtoarele zone:
Fig. 3.1. Forma principal
1.) Component de tip panel care conine informaiile despre punctajul de bonus, variabila life i punctajul total; 2.) Component de tip pictureBox, suportul zonei de joc; 3.) Opiunile principale de ncepere a jocului (Start Game), accesarea zonei de setri relative la dificultatea jocului (Options), accesare formei de afiare a datelor despre aplicaie i autori (Extra) respectiv ieirea din aplicaie; 4.) Panelul de comand a utilizatorului format din 5 controale de tip button pentru direciile cardinale + stop; 5.) Zona de afiare a datelor (un control de tip listBox); 6.) Controale de tip timer cu urmtoarele caracteristici:
13
Timer 1. Controleaz viteza jocului ; Timer 2 Controlez interfaa grafic ; Timer 3 Controleaz viteza de deplasare a nscrisului Logo ;
Clasa Application Engine este format din 3 clase cu caracter static :
public static class gameSettings { public static Graphics g; public static Image backImage; public static int crtLevel =0; public static int lastLevel =3; public static Randomrnd =new Random(); public static List<monster>monsters =new List<monster>(); public static void loadMonster(string strData) { TextReader data_load =new StreamReader(strData); string data; List<string>tmpData =new List<string>(); while ((data =data_load.ReadLine()) !=null) { tmpData.Add(data); if (data =="endm") { monsters.Add( new monster (tmpData)); tmpData.Clear(); } } data_load.Close(); } }
public static Graphics g; obiectul principal de tip graphics destinat zonei de joc public static Image backImage; variabila suport a obiectului grafic g public static int crtLevel =0; nivelul curent public static int lastLevel =3; ultimul nivel (n versiunea demonstrativ) public static Random rnd =new Random(); variabila global folosit pentru a genera numere aleatoare (se folosete n aplicaie la explozia minelor (timpul la care explodeaz i zonele din matrice afectate de foc se genereaz aleator))
14
public static List<monster>monsters =new List<monster>(); variabila de tip list care va reine toate obiectele de tip monstru public static void loadMonster(string strData) procedura de ncrcare a fiierului @..\ ..\ LarisaGame\ LarisaGame\ Resource\ Monsters\ data01.txt n lista monsters. 3.1. Clasa static localSettings: publ i c st at i c cl ass l ocal Set t i ngs { publ i c st at i c bool showMonst er Radi us = t r ue; publ i c st at i c f l oat monst er DamageMul t i pl y = 1; publ i c st at i c i nt f i r eResi st ance = 10; publ i c st at i c i nt hear t Li f eSi ze = 30; publ i c st at i c i nt di amondPoi nt sMul t i pl y = 3; publ i c st at i c i nt di amondBasePoi nt s = 150; publ i c st at i c i nt bonusTi meMul t i pl yer = 3; publ i c st at i c st r i ng l ogoSt r i ng = ""; }
public static bool showMonsterRadius =true; Opiune de design care va afia sau nu raza de aciune a unui obiect de tip monstru pentru a da posibilitatea utilizatorilor de a aprecierea mai bine (vizibil) apropierea de un astfel de obiect public static float monsterDamageMultiply = 1; Variabila folosit n calculul unei coliziuni cu un obiect de tip monstru n vederea obinerii punctajului cu care va fi diminuat variabila life public static int fireResistance =10; Variabil de calcul folosit n coliziunea obiectului gestionat de utilizator cu o zon cu foc. public static int heartLifeSize =30; Numrul de puncte cu care crete variabila life n cazul n care utilizatorul colecteaz un obiect de tip heart public static int diamondPointsMultiply =3 i public static int diamondBasePoints =150; variabile de calcul a punctajului acordat atunci cnd utilizatorul colecteaz un obiect de tip diamond public static int bonusTimeMultiplyer =3; variabila de multiplicare a bonusului de timp. public static string logoString =""; variabila string ce reine textul citit din fiierul G:\ Projects\ LarisaGame\ LarisaGame\ Resource\ Text\ logo.txt i care este afiat n micare n partea de sus a zonei de joc. La data publicrii acestei lucrri fiierul conine datele : Fiierul logo.txt Licenta UO-FS-DMI, GDI+Tehnology 2011, Merce Larisa
15
3.2. Clasa static runTime (n completarea clasei localSettings) Conine datele care se modific pe parcursul jocului.
publ i c st at i c cl ass r unTi me { publ i c st at i c i nt l i f e = 300; publ i c st at i c i nt poi nt s = 0; publ i c st at i c i nt pozx = 1; publ i c st at i c i nt pozy = 40; publ i c st at i c i nt bonus = 100; publ i c st at i c i nt gl obal Ti me = 0; }
public static int life; valoarea curent a variabilei life public static int points; variabila destinat stocrii punctajului public static int pozx, public static int pozy; poziia de start n matricea jocului a obiectului gestionat de utilizator public static int bonus, valoarea curent a bonusului de timp public static int globalTime, timpul efectiv de joc. 3.3. Clasa Monster
S-a construit un obiect de tip monster (conform cerinelor date n propunerea aplicaiei) care s poat fi personalizat dup nume i imaginile asociate, direcia de deplasare, nivelul de apariie, agresivitatea i raza de aciune. Aceste date au fost introduse n fiierul @..\ ..\ LarisaGame\ LarisaGame\ Resource\ Monsters\ data01.txt
Pentru versiunea demonstrativ fiierul data01.txt are urmtoarea componen: Fiierul data01.txt.
Direcia de deplasare : spre nord de 30 de ori cte 5 pixeli (N:30:5), spre sud de 60 de ori cte 5 pixeli (S:60:5), din nou nord 30 cu cte 5 pixeli (N:30:5), apoi spre vest de 10 ori cu viteza 10 pixeli (W:10:10) cnd ajunge la capt ncepe de la nceput. Nivelul de apariie (n acest caz level:0). Locaia de unde pornete pe hart (location : 250 cu 190) Setul de imagini Sprite care vor determina animaia .
Figurile urmtoare arat modul de creare a unui Sprite din vectori de imagini *.png . Fig.3.2 . Monster01 Sprite
Variabila damage : reprezint puterea monstrului (n cazul n care acesta intr n coliziune cu obiectul gestionat de utilizator) pentru exemplul anterior damage are valoarea 4 Variabila relativeRange gestioneaz raza de aciune a obiectului monstru (valaorea se msoar n pixeli)
publ i c cl ass monst er { publ i c st r i ng name; publ i c Li st <Poi nt > mPoi nt s; publ i c i nt l vl Apar i t i on; publ i c Poi nt st ar t Locat i on; publ i c Poi nt cr t Locat i on; publ i c i nt cr t Posi t i on; publ i c Li st <I mage> mI mages; publ i c i nt cr t I mage; publ i c i nt damage; publ i c i nt r el at i veRange; }
Metoda draw asociat obiectelor monster folosete urmtorul mecanism : Caluleaz poziia curent a obiectului folosind circular valorile listei mPoints n funcie de timpul global, tot prin acest mecanism calculeaz poziia imagii curente din setul de imagini mImages care trebuie afiat dup care apeleaz metodele DrawImageUnscaled i DrawString ale obiectelor grafice.
publ i c voi d dr aw( i nt t i meOf Di spl ay) { cr t Posi t i on = t i meOf Di spl ay %mPoi nt s. Count ;
19
cr t I mage = t i meOf Di spl ay %mI mages. Count ; cr t Locat i on. X = cr t Locat i on. X + mPoi nt s[ cr t Posi t i on] . X; cr t Locat i on. Y = cr t Locat i on. Y + mPoi nt s[ cr t Posi t i on] . Y; gameSet t i ngs. g. Dr awI mageUnscal ed( t hi s. mI mages[ cr t I mage] , t hi s. cr t Locat i on) ; gameSet t i ngs. g. Dr awSt r i ng ( t hi s. name, new Font ( "Ar i al ", 10, Font St yl e. Regul ar ) , new Sol i dBr ush ( Col or . Bl ack) , new Poi nt ( cr t Locat i on. X - 20, cr t Locat i on. Y + 40) ) ; }
Constructorul clasei Monster instaniaz un obiect al acestei calse dintr-o list de stringuri (acestea sunt citite din fiier i pe baza metodei Split a clasei String sunt mprite i convertite (dac este cazul) n datele necesare astfel:
data[0] =name : FirstDefender d_ =data[0].Split (:) d_[0] =name respectiv d_[1] =First Defender this.name =d_[1]; data[1] =N:30:5:S:60:5:N:30:5:W:10:10:E:20:10:W:10:10 d_ =data[1].Split (:) d_[0] =N, d_[1] =30; d_[2] =5, , d_[15] =W, d[16] =10 i d[17] =10; pentru toate elementele lui d_, din 3 n 3 (cu i contor) dac d_[i] = N tx =+1, (se calculeaz n funcie de punctele cardinale) Se adaug punct cu punct n lista mPoints valoarea (d_[i + 2])*tx,(d_[i + 2])*ty i aa n continuare pentru fiecare membru al clasei monster
public monster(List<string>data) { mPoints =new List<Point>(); string[] d_ =data[0].Split(':'); this.name =d_[1]; d_ =data[1].Split (':'); for (int i =0; i <d_.Length-1; i +=3) { int tx =0; int ty =0; switch (d_[i]) { case "N": ty =-1; break;
20
case "S": ty =+1; break; case "W": tx =-1; break; case "E": tx =+1; break; } for (int j =0; j <int.Parse(d_[i +1]); j++) { mPoints.Add(new Point(int.Parse(d_[i +2])*tx, (int.Parse(d_[i +2]))*ty)); } } d_ =data[2].Split(':'); this.lvlAparition =int.Parse(d_[1]); char [] separators =new char [] {',',':'}; d_ =data[3].Split(separators); this.startLocation =new Point(int.Parse(d_[1]), int.Parse(d_[2])); this.crtLocation=newPoint(this.startLocation.X,this.startLocation.Y); this.crtPosition =0; d_ =data[5].Split(','); this.mImages =new List<Image>(); foreach (string dataS in d_) mImages.Add(Image.FromFile(@"..\..\Resource\Monsters\" +dataS +".png")); this.crtImage =0; d_ =data[6].Split(':'); this.damage =int.Parse(d_[1]); d_ =data[7].Split(':'); this.relativeRange =int.Parse(d_[1]); } 3.4. Metoda loadLevel Aplicaia apleleaz aceast metod de fiecare dat cnd utilizatorul ajunge la obiectul de tip poart i variabila gameSettings crtLevel prin incrementare nu depete variabila gameSettings.lastLevel. Aceast metod este structurat n urmtoarele module: ncarc fiierul corespunztor (@"..\..\Resource\Text\Lvl"+level +".txt") care conine informaiile referitoare la obiectivele jocului
21
ncarc fiierul corespunztor (@"..\..\resource\Text\minit"+level+".txt") care conine datele referitoare la matricea de joc. Procesarea matricii de joc ncrcarea fiierului (@"..\..\resource\Image\backImage"+ level+".png") care conine imaginea de fundal a nivelului ncrcarea fiierului (@"..\..\resource\Text\Extra"+level+".txt") ce conine datele despre bonusul de timp (n versiunea demonstrativ) i afiarea acestui bonus n controlul progressBar
publ i c voi d l oadLevel ( i nt l evel ) { l i st Box1. I t ems. Cl ear ( ) ; Text Reader dat a_Load = new St r eamReader ( @". . \ . . \ Resour ce\ Text \ Lvl "+ l evel + ". t xt ") ; st r i ng cr t Dat a; whi l e ( ( cr t Dat a = dat a_Load. ReadLi ne( ) ) ! = nul l ) l i st Box1. I t ems. Add( cr t Dat a) ; dat a_Load. Cl ose( ) ;
Text Reader l oad = new St r eamReader ( @". . \ . . \ r esour ce\ Text \ mi ni t "+l evel +". t xt ") ; st r i ng myTxt = l oad. ReadToEnd( ) ; l oad. Cl ose( ) ;
i nt k = 0; f or ( i nt i = 0; i < 80; i ++) { f or ( i nt j = 0; j < 102; j ++) { i f ( j <100) mA[ j , i ] = i nt . Par se( myTxt [ k] . ToSt r i ng( ) ) ; k++; } }
gameSet t i ngs. backI mage = new Bi t map( @". . \ . . \ r esour ce\ I mage\ backI mage"+ l evel +". png") ; r ct = new Rect angl e( - 1, - 1, 600, 480) ; gameSet t i ngs. g. Dr awI mage( gameSet t i ngs. backI mage, r ct ) ;
Text Reader get Bonus = new
22
St r eamReader ( @". . \ . . \ r esour ce\ Text \ Ext r a"+l evel +". t xt ") ; st r i ng[ ] bonusDat a = get Bonus. ReadLi ne( ) . Spl i t ( ' : ' ) ; r unTi me. bonus = i nt . Par se( bonusDat a[ 1] ) ; r unTi me. bonus *= l ocal Set t i ngs. bonusTi meMul t i pl yer ; pr ogr essBar 1. Maxi mum= r unTi me. bonus; pr ogr essBar 1. Mi ni mum= 0; pr ogr essBar 1. Val ue = r unTi me. bonus; }
3.5. Metoda Load a formei principale Conine urmtoarele module: Iniializarea grafic dup un obiect de tip bitmap; ncrcarea fiierelor *.png pentru controalele de tip buton asociate panoului de comand destinat utilizatorului;
Fig. 3.3. resursele sg_u/ sg_l/ sg_r/ sg_d ncrcarea imaginii de backGround i pornirea controlului de tip timer ascociat cu suprapunerea imaginilor de backGround;
Fig. 3.4. backGround image A Fig. 3.5. backGround Image D ncrcarea fiierului ( @". . \ . . \ r esour ce\ Monst er s\ dat a01. t xt ") care conine toate datele despre montrii; ncrcarea fiierului de nceput (@"..\..\resource\Text\begining.txt") cu informaii privitoare la posibilele prime aciuni ale utilizatorului. La data publicrii acestei lucrri acest fiier are urmtoarele date:
Welcome to Princess Rescue 2011
23
This is the demo version and has only three levels.
Press START to begin your journey Press OPTIONS to customize features Press Help to learn how to play Press Exit to leve this application
Program version beta 0.2.4
ncrcarea fiieruli ( @". . \ . . \ r esour ce\ Text \ l ogo. t xt ")
private void Form1_Load(object sender, EventArgs e) { MessageBox.Show("Beta 0.2.4"); b =new Bitmap(pictureBox1.Width, pictureBox1.Height); gameSettings.g =Graphics.FromImage(b); button1.BackgroundImage =Image.FromFile (@"..\..\resource\sg_u.bmp"); button2.BackgroundImage =Image.FromFile (@"..\..\resource\sg_l.bmp"); button3.BackgroundImage =Image.FromFile (@"..\..\resource\sg_r.bmp"); button4.BackgroundImage =Image.FromFile (@"..\..\resource\sg_d.bmp"); gameSettings.backImage =new Bitmap(@"..\..\resource\Image\backImageA.png"); rct =new Rectangle(-1, -1, 600, 480); gameSettings.g.DrawImage(gameSettings.backImage, rct); timer2.Enabled =true; pictureBox1.Image =b; gameSettings.loadMonster(@"..\..\resource\Monsters\data01.txt"); panel1.Visible =false; TextReader data_load =new StreamReader(@"..\..\resource\Text\begining.txt"); string crtData; while ((crtData =data_load.ReadLine()) !=null) listBox1.Items.Add(crtData); data_load.Close(); TextReader logo_load =new StreamReader(@"..\..\resource\Text\logo.txt"); l ocal Set t i ngs. l ogoSt r i ng = l ogo_l oad. ReadLi ne( ) ; l ogo_l oad. Cl ose( ) ; }
24
3.6. Functia principala refresh() a aplicaiei apelat la fiecare time_Tick
Fig. 3.6. partea I a procedurii refresh n prima parte a acestei funcii se fac doar verificri relativ la coliziunile obiectului gestionat de utilizator i poziia curent din matrice. publ i c voi d r ef r esh( ) { i f ( mA[ r unTi me. pozx , r unTi me. pozy ] == 2) { mA[ r unTi me. pozx, r unTi me. pozy] = 0; r unTi me. l i f e += l ocal Set t i ngs. hear t Li f eSi ze; r unTi me. poi nt s += 10; } i f ( mA[ r unTi me. pozx, r unTi me. pozy] == 8) / / her at suppor t {} { r unTi me. l i f e += l ocal Set t i ngs. hear t Li f eSi ze;
25
r unTi me. poi nt s += 10; i nt t mpDat ax = 0; i nt t mpDat ay = 0;
f or ( i nt i = 4; i >= 0; i - - ) { f or ( i nt j = 4; j >= 0; j - - ) { i f ( mA[ r unTi me. pozx - i , r unTi me. pozy - j ] == 2) { t mpDat ax = r unTi me. pozx - i ; t mpDat ay = r unTi me. pozy - j ; br eak; } } } f or ( i nt i = 0; i < 5; i ++) { f or ( i nt j = 0; j < 5; j ++) { mA[ t mpDat ax + i , t mpDat ay + j ] = 0; } } } i f ( mA[ r unTi me. pozx, r unTi me. pozy] == 9) / / di amond suppor t {} { r unTi me. poi nt s += l ocal Set t i ngs. di amondBasePoi nt s * l ocal Set t i ngs. di amondPoi nt sMul t i pl y; i nt t mpDat ax = 0; i nt t mpDat ay = 0; f or ( i nt i = 4; i >= 0; i - - ) { f or ( i nt j = 4; j >= 0; j - - ) { i f ( mA[ r unTi me. pozx - i , r unTi me. pozy - j ] == 7) { t mpDat ax = r unTi me. pozx - i ;
26
t mpDat ay = r unTi me. pozy - j ; br eak; } } } f or ( i nt i = 0; i < 5; i ++) { f or ( i nt j = 0; j < 5; j ++) { mA[ t mpDat ax + i , t mpDat ay + j ] = 0; } } } i f ( mA[ r unTi me. pozx, r unTi me. pozy] == 7) { mA[ r unTi me. pozx, r unTi me. pozy] = 0; r unTi me. poi nt s += l ocal Set t i ngs. di amondBasePoi nt s * l ocal Set t i ngs. di amondPoi nt sMul t i pl y; } / / cont i nuar e
Fig. 3.6. Partea a II-a a procedurii refresh() i f ( ( mA[ r unTi me. pozx, r unTi me. pozy] == 3) | | ( mA[ r unTi me. pozx, r unTi me. pozy] == 4) ) { gameSet t i ngs. cr t Level ++; r unTi me. pozx = 1; r unTi me. pozy = 40; r unTi me. poi nt s += r unTi me. bonus; l abel 1. Text = r unTi me. poi nt s. ToSt r i ng( ) ;
27
i f ( gameSet t i ngs. cr t Level == gameSet t i ngs. l ast Level ) gameWon( ) ; el se l oadLevel ( gameSet t i ngs. cr t Level ) ; } i f ( ( mA[ r unTi me. pozx, r unTi me. pozy] == 6) ) { r unTi me. l i f e - = ( 25 - l ocal Set t i ngs. f i r eResi st ance) ; i f ( r unTi me. l i f e < 0) { r unTi me. l i f e = 0; gameLoose( ) ; } } i f ( r unTi me. bonus ! = 0) { r unTi me. bonus- - ; pr ogr essBar 1. Val ue = r unTi me. bonus; } l abel 1. Text = r unTi me. poi nt s. ToSt r i ng( ) ; l abel 2. Text = r unTi me. l i f e. ToSt r i ng( ) ; gameSet t i ngs. g. Dr awI mage( gameSet t i ngs. backI mage, r ct ) ; / / cont i nuar e
Modulul de actualizare grafic cu care se ncheie modulul anterior are ca scop redesenarea zonei de joc astfel: Pentru fiecare element din matricea de joc dac valoarea acestuia este: 1 - Se consider zid i aciunea grafc corespunztoare este de a desena o crmid de culoare gri; 2 - Se consider nceputul zonei de desenare a obiectului de tip heart drept urmare aciunea grafic corespunztoare este de a ncrca fiierul resur: ..resource\heart1.png ; 3 - Element suport al zonei de calcul pentru obiectul de tip door, nu are aciune grafic asociat; 4 - Inceputul zonei de desenare a obiectului de tip door aciunea grafic corespunztoare este de a ncrca fiierul resur: ..resource\door_2.png" prin metoda asociat obiectelor grafice DrawImageUnscaled 5 - Obiectul de tip min. Probabilitatea de explozie a acesteia este 1/250. n cazul n care explodeaz pe o raz de 10 uniti din matricea de joc. Explozia are 100 de elemnte constitutive (se geereaz aleator de 100 de ori o poziie n interiorul zonei de explozie i valorile corespunztoare iau valoarea 6 (foc)).
28
Se ine cont ca o explozie aproape de obiectul door s nu distrug n totalitate acest obiect; 6 - Zon de teren cu foc. Se deseneaz cu portocaliu zona respectiv; 7 - Inceputul zonei de desenare a obiectului de tip diamond aciunea grafic corespunztoare este de a ncrca fiierul resur: . . \ . . \ r esour ce\ di amond. png " prin metoda asociat obiectelor grafice DrawImageUnscaled; 8 - Element suport al zonei de calcul pentru obiectul de tip heart, nu are aciune grafic asociat; 9 - Element suport al zonei de calcul pentru obiectul de tip diamond, nu are aciune grafic asociat;
for (int i =0; i <80; i++) { for (int j =0; j <100; j++) { switch (mA[j,i]) { case 1: Rectangle toDraw =new Rectangle(j * 6, i * 6, 6, 6); gameSettings.g.FillRectangle(new SolidBrush(Color.LightGray), toDraw); break; case 2: gameSettings.g.DrawImageUnscaled( Image.FromFile(@"..\..\resource\heart1.png"), new Point(j * 6, i * 6)); break; case 4: toDraw =new Rectangle(j * 6, i * 6, 6, 6); gameSettings.g.DrawImageUnscaled( Image.FromFile(@"..\..\resource\door_2.png"), new Point(j * 6-12, i * 6-9)); break; case 5: int explode =gameSettings.rnd.Next() % 250; if (explode ==0) {
29
mA[j, i] =6; for (int AEC =0; AEC <100; AEC++) { int explosionRX = gameSettings.rnd.Next() % 21 - 10; int explosionRY = gameSettings.rnd.Next() % 21 - 10; try { if (!(((mA[j +explosionRX, i + explosionRY]) ==4) || ((mA[j + explosionRX, i +explosionRY]) ==3))) mA[j +explosionRX, i +explosionRY] =6; } catch {} } } toDraw =new Rectangle(j * 6, i * 6, 6, 6); gameSettings.g.FillRectangle(new SolidBrush(Color.Black), toDraw); break; case 6: //fire toDraw =new Rectangle(j * 6, i * 6, 6, 6); gameSettings.g.FillRectangle(new SolidBrush(Color.Orange), toDraw); break; case 7: // diamonds gameSettings.g.DrawImageUnscaled( Image.FromFile(@"..\..\resource\diamond.png"), new Point(j * 6, i * 6)); break; } } } / / cont i nuar e
30
Modulul de actualzare grafic continu cu desenarea obiectului gestionat de utilizator:
gameSet t i ngs. g. Fi l l El l i pse( new Sol i dBr ush( Col or . Red) , r unTi me. pozx * 6, r unTi me. pozy * 6, 6, 6) ; gameSet t i ngs. g. Dr awEl l i pse( Pens. Red , r unTi me. pozx * 6 - 2, r unTi me. pozy * 6 - 2, 10, 10) ; / / cont i nuar e
Respectiv (n ncheierea procedurii refresh()) se verific dac exist obiecte ale clasei monster n acest nivel i pentru fiecare obiect gsit se verifc coliziunea acestuia cu obiectul utilizator:
f or each ( monst er dat aM i n gameSet t i ngs. monst er s) { i f ( dat aM. l vl Apar i t i on == gameSet t i ngs. cr t Level ) { dat aM. dr aw( r unTi me. gl obal Ti me) ; f l oat xa = r unTi me. pozx * 6; f l oat ya = r unTi me. pozy * 6; f l oat xc = dat aM. cr t Locat i on. X + dat aM. r el at i veRange/ 2; f l oat yc = dat aM. cr t Locat i on. Y + dat aM. r el at i veRange/ 2; f l oat d = ( xa - xc) * ( xa - xc) + ( ya - yc) * ( ya - yc) ; i f ( d < ( ( dat aM. r el at i veRange/ 2) * ( dat aM. r el at i veRange/ 2) ) ) { r unTi me. l i f e - = ( i nt ) ( ( f l oat ) dat aM. damage * l ocal Set t i ngs. monst er DamageMul t i pl y) ; i f ( r unTi me. l i f e < 0) { r unTi me. l i f e = 0; gameLoose( ) ; } } } } pi ct ur eBox1. I mage = b; }
31
3.7. Clasa Extra Aceast clas este asociat formularului windows Extra asociat cu gestionarea fiierului cu acelai nume @"..\..\Resource\Text\Extra.txt". Metoda de ncrcare a acestui fiierului este construit pe baza unui obiect TextReader conform codului urmtor :
Publ i c par t i al cl ass Ext r a : For m { publ i c Ext r a( ) { I ni t i al i zeComponent ( ) ; }
pr i vat e voi d Ext r a_Load( obj ect sender , Event Ar gs e) { l i st Box1. I t ems. Cl ear ( ) ; Text Reader dat a_Load = new St r eamReader ( @". . \ . . \ Resour ce\ Text \ Ext r a. t xt " ) ; st r i ng cr t Dat a; whi l e ( ( cr t Dat a = dat a_Load. ReadLi ne( ) ) ! = nul l ) { l i st Box1. I t ems. Add( cr t Dat a) ; } dat a_Load. Cl ose( ) ; } pr i vat e voi d but t on1_Cl i ck( obj ect sender , Event Ar gs e) { t hi s. Cl ose( ) ; } }
32
Fig. 3.7. Form Extra 3.8. Clasa option
Datorit modului de dezvoltarea a aplicaiei la nivel de programare orientat pe obiecte aceast clas (cu designul n figura urmtoare) nu trebuie dect s gestioneze valorile clasei statice localSettings respectiv runTime prin anumite controale
Fig. 3.8 Form Option
33
publ i c voi d r ef r esh_dat a( ) { r unTi me. l i f e = t r ackBar 1. Val ue; l ocal Set t i ngs. monst er DamageMul t i pl y = ( f l oat ) ( numer i cUpDown1. Val ue) ; l ocal Set t i ngs. f i r eResi st ance = ( i nt ) ( numer i cUpDown2. Val ue) ; l ocal Set t i ngs. hear t Li f eSi ze = ( i nt ) ( numer i cUpDown3. Val ue) ; l ocal Set t i ngs. di amondBasePoi nt s = ( i nt ) ( numer i cUpDown4. Val ue) ; l ocal Set t i ngs. di amondPoi nt sMul t i pl y = ( i nt ) ( numer i cUpDown5. Val ue) ; l ocal Set t i ngs. bonusTi meMul t i pl yer = ( i nt ) ( numer i cUpDown6. Val ue) ; }
34
4. Aplicaia PrincessRescue (UO-FS-DMI-2011) 4.1. Ecranul principal al aplicaiei are urmtoarea configuraie :
Fig. 4.1. Ecranul principal
35
1. Meniul principal al jocului ce dispune de submeniurile StarGame (pornirea jocului), Option (setrile accesibile utilizatorilor), Extra (conine date sumare despre aplicaie i autori) i Exit (pentru ieirea din aplicaie) 2. Bara de design cu nscrisul mobil Licena UO-FS-DMI, GDI+ Tehnology 2011, Merce Larisa 3. Zona efectiv de joc 4. Informaii despre joc, nivelul curent, obiective i date despre obiectele ntlnite (pentru fiecare nivel n parte se schimb mesajul n funcie de cerinele nivelului) i scenariul dat. 4.2. Setri
Fig. 4.2. Setri
1.) La acest nivel se pot face urmtoarele setri: Conceptul de via (variabila Life) cu valori ntre 100 i 500 (curnt este 300) Cu ct utilizatorul are mai multe puncte n aceast variabil cu att poate rezista la mai multe atacuri ale obiectelor sau foc, elemente care diminueaz acest punctaj. Cnd acest valoare ajunge la 0 este una din condiiile pentru care se termin jocul.
36
Variabila Monster Agressinon indic cu ct va diminua atacul unui obiect monstru valoarea life a utilizatorului. Aa cum am artat n paragrafele anterioare un obiect monstru are un punctaj de baz. Valoarea total a atacului este acest punctaj nmulit cu valoarea variabilei Monster Agression. Aceast variabil are o plaj de valori cuprins ntre valoarea 0.50 pentru nivelul cel mai uor i 2.50 pentru nivelul cel mai dificil. Variabila Fire Resistance are ca scop gestionarea coliziunii dintre obiectul condus de utilizator i zonele acoperite de foc (sau explozia minelor). Cu ct aceast valoare este mai mare cu att mai puine puncte se vor diminua din variabila Life a juctorului atunci cnd trece peste o zon acoperitde foc. Variabila Fire Resistance are o valoare 0 pentru nivelul cel mai dificil i 20 pentru nivelul cel mai uor. Hp (heal Points) .valoarea n puncte cu care crete variabila life atunci cnd obiectul gestionat utilizator trece peste un obiect de tipul heart. Variabila Hp are valori ntre 50 (maximul acordat pentru nivelul cel mai facil) i doar 10 puncte pentru cel mai dificil nivel
Diamond Base Points, Valoarea n puncte acordat utilizatorului cnd acesta trece peste un obiect de tip diamond. Valorile sunt cuprinse ntre 50 i 250
Multiply Valoarea cu care se multiplic punctajul acordat trecerii peste obiectele diamant. Intervalul de valori pe care le poate lua aceast variabil este cuprins ntre 1 pentru nivelul cel mai dificil i 5 puncte pentru nivelul cel mai uor. Bonus Time. Fiecare nivel beneficiaz de un bonus de timp de baz ce se adaug punctajului total la terminarea nivelului. Valoarea variabilei Bonus Time multiplic acest punctaj. 2.) Selectarea rapid a nivelului dorit cu urmtoarele valori:
Ver y hard Har d Med ium Eas y Ver y Easy Life 100 200 300 400 500 Monster agression 2.5 2.0 1.5 1.0 0.5 Fire Resistance 0 5 10 15 20 Hp 10 20 30 40 50 Diamon 50 100 150 200 250
37
Base Paoints Multiply 1 2 3 4 5 Bonus Time 1 2 3 4 5
3.) Butonul de revenire n forma principal fr a salva ultimile modificri la nivel de setri 4.) Butonul de acceptare a modificrilor i revenirea n forma principal. 4.3. Extras
Fig. 4.3. Extras
La data publicrii acestei lucrri fiierul @..\..\Resource\Text\Extras.txtncrcat n aceast fereastr are urmtorul coninut:
38
Universitatea din Oradea, Facultatea de Stiinte, Departamentul de Matematica si Informatica.
Promotia 2011
Acest joc este aplicatia practica asociata cu lucrarea de licenta a studentei Merce Larisa.
Aplicatia se bazeaza in special pe conceptele GDI+ prezentate in laboratorul de grafica pe calculator.
Toate resursele folosite de aceasta aplicatie au fost construite de catre autori in CorelDraw x5 si au caracter demonstrativ, fara implicatii financiare, liber de folosit in scop educativ.
Toti algoritmii din aceasta aplicatie sunt construiti de catre aurtori, modul de interpretare a datelor este original, codificarea deplasarii si codificarea obiectelor sunt concepte proprii.
Multumim d-lui Conf. univ Caus V. Aurel pentru sprijinul acordat in dezvoltarea acestui proiect.
39
4.4. Nivelul demonstrativ 0
Fig. 4.4. Nivelul 0 Acesta este primul nivel al jocului i are ca scop familiarizarea utilizatorilor cu obiectivele jocului: Se pot identifica urmtoarele informaii disponibile utilizatorilor: 1. Punctajul acordat ca bonus pentru o trecere rapid peste nivelul curent. Cu ct trece mai mult timpul de joc, punctajul de bonus se diminueaz. n momentul cnd utilizatorul ajunge la poart (zona 7) n punctajul total (zona 3) se adaug valoarea n puncte a acestui bonus. 2. Valoarea Life a utilizatorului. Cnd aceast valoare ajunge la 0 jocul se consider pierdut. 3. Zona de afiare a punctajului yotal curent al utilizatorului. Orice aciune din joc ntr-o form sau alta are repercursiuni n schimbarea valorii acestei variabile. Nu exist valori negative. 4. Primul obiect monstru cu urmtoarele informaii:
6. Obiectele de tip diamond colectabile pentru creterea punctajului 7. Obiectul poart de trecere la nivelul urmtor 8. Marginea zonei de joc (se poate urmrii n fiierul urmtor construcia la nivel de matrice a acestui nivel). Semnificaia valorilor se poate gsi n paragraful 2.2 9. Controalele mouse disponibile utilizatorului pentru controlul jocului. 4.5. Fiierele resurs pentru crearea unui nivel:
Fig. 4.5. Fiierele text resurse
1. Minit+nivel_dorit + .txt : fiierul resurs cu elementele matricii. Pentru nivelul 0 arat ca i n desfurarea urmtoare:
2. Extra+nivel_dorit + .txt : fiierul resurs ce conine punctajul bonus. 3. Lvl+nivel_dorit + .txt: de informaii cu privire la nivelul curent: Pentru nivelul 0:
Level 0: Begginning your Journey
Press the arrow buttons to move around Avoid walls (dark gray blocks)
44
Get hearts to score life and points Exit to the eastern gate
4.6. Nivelul demonstrativ 1
Fig. 4.6. Nivelul demonstrativ 1
Elementele noi introduse de acest nivel sunt: 1.) Obiectul monstru personalizat (conceptul de BOSS aprut frecvent n astfel de jocuri). Poate trece peste zonele nchise, se deplaseaz aleator, foarte puternic. 2.) Obiectul defender03 cu urmtoarele caliti:
4.) Zonele din matric afectate de foc 5.) Mine cu explozie aleatoare Matricea corespunzatoare nivelului demonstrativ 1 se gaseste in fisierul resurse, la fel ca si pentru celelalte doua nivele. 4.7. Nivelul demonstrativ 2
Fig. 4.7. Nivelul demonstrativ 1
Elementele noi introduse de acest nivel sunt: 1.) Obiectul monstru personalizat,4xPacMan;
46
5. Bibliografie : [1] Laslo Eugen, Ionescu V.S, anul 2010 , Algoritmica C++, editura Matrix-Romania, Bucuresti ; [2] MSDN - http://en.wikipedia.org/wiki/MSDN [3] Jeffrey Richter, anul 2009, Microsoft .NET Framework, editura Teora, Bucuresti [4] Ellen Hatton , Alexandre Santos Lobao , David Weller , anul 2004, Beginning .NET Game Programming with C#(Beginners Beginning Guides) , editura Apress [5] Gary David Bouton, anul 2010, CorelDRAW X5 The Official Guide, editura CorelPress