Δηιουργία παιχιδιοφ ςτη c++ - teilarΠίλαθαο 1 : Τρληθά...
TRANSCRIPT
ΑΣΕΙ ΘΕΑΛΙΑ ΧΟΛΗ ΣΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ
Σμήμα Μηχανικών Πληροφορικής ΣΕ
Δημιουργία παιχνιδιοφ
ςτη C++
ΠΣΤΧΙΑΚΗ ΕΡΓΑΙΑ
ΜΑΡΚΟΤ ΓΙΩΡΓΟ(ΑΜ: Σ03274)
Επιβλέπων: Κακαρόντζας Γεώργιος, Επίκουρος καιηγητθς
ΛΑΡΙΑ 2017
«Εγώ ν/ε Μάξθνπ Γεώξγηνο , δειώλω ππεύζπλα όηη ε παξνύζα Πηπρηαθή Εξγαζία κε ηίηιν
Δεκηνπξγία παηρληδηνύ ζηελ C++ είλαη δηθή κνπ θαη βεβαηώλω όηη:
Σε όζεο πεξηπηώζεηο έρω ζπκβνπιεπηεί δεκνζηεπκέλε εξγαζία ηξίηωλ, απηό
επηζεκαίλεηαη κε ζρεηηθή αλαθνξά ζηα επίκαρα ζεκεία.
Σε όζεο πεξηπηώζεηο κεηαθέξω ιόγηα ηξίηωλ, απηό επηζεκαίλεηαη κε ζρεηηθή αλαθνξά
ζηα επίκαρα ζεκεία. Με εμαίξεζε ηέηνηεο πεξηπηώζεηο, ην ππόινηπν θείκελν ηεο
πηπρηαθήο απνηειεί δηθή κνπ δνπιεηά.
Αλαθέξω ξεηά όιεο ηηο πεγέο βνήζεηαο πνπ ρξεζηκνπνίεζα.
Σε πεξηπηώζεηο πνπ ηκήκαηα ηεο παξνύζαο πηπρηαθήο έγηλαλ από θνηλνύ κε ηξίηνπο,
αλαθέξω ξεηά πνηα είλαη ε δηθή κνπ ζπλεηζθνξά θαη πνηα ηωλ ηξίηωλ.
Γλωξίδω πωο ε ινγνθινπή απνηειεί ζνβαξόηαην παξάπηωκα θαη είκαη ελήκεξνο(-ε) γηα
ηελ επέιεπζε ηωλ λνκίκωλ ζπλεπεηώλ»
Υπνγξαθή
Μάξθνπ Γηώξγνο
Δγθξίζεθε από ηελ ηξηκειή εμεηαζηηθή επηηξνπή
Σόπος:
Ημερομηνία:
ΕΠΙΣΡΟΠΗ ΑΞΙΟΛΟΓΗΗ
1.
2.
3.
-i-
Πεπίλητη
Η εξγαζία απηή απνηειείηαη από ηελ αλάπηπμε ελόο 2D platformer παηρληδηνύ
Η γιώζζα πξνγξακκαηηζκνύ πνπ έρεη επηιερζεί είλαη ε C++ θαη ζα
γίλεη ε ρξήζε ηεο βηβιηνζήθεο cocos2d-x πνπ παξέρεη αξθεηά εξγαιεία
θαη ιεηηνπξγίεο γηα ηελ αλάπηπμε ελόο παηρληδηνύ.
Η εξγαζία πεξηιακβάλεη επίζεο ην ζρεδηαζκό γξαθηθώλ κε ηα θαηάιιεια
πξνγξάκκαηα.
-iii-
Δςσαπιζηίερ
Θα ήζεια λα επραξηζηήζσ γνλείο θαη ζπγγελείο γηα ηελ ζπλερή ζηεξημή ηνπο
θαζώο θαη ηνπο θαζεγεηέο κνπ γηα ηηο γλώζεηο πνπ κνπ κεηέδσζαλ.
Μάξθνπ Γηώξγνο
5/4/2017
-v-
Πεπιεσόμενα
ΠΔΡΙΛΗΦΗ ..................................................................................................................... I
ΔΤΥΑΡΙΣΙΔ .............................................................................................................. III
ΠΔΡΙΔΥΟΜΔΝΑ ............................................................................................................ V
1 ΔΙΑΓΧΓΗ ................................................................................................................ 1
2 ΙΣΟΡΙΚΗ ΑΝΑΓΡΟΜΗ ΓΛΧΧΝ ΠΡΟΓΡΑΜΜΑΣΙΜΟΤ ΚΑΙ
ΗΛΔΚΣΡΟΝΙΚΧΝ ΠΑΙΥΝΙΓΙΧΝ ................................................................................. 3
2.1 ΓΔΝΙΔ ΓΛΩΩΝ ΠΡΟΓΡΑΜΜΑΣΙΜΟΤ ............................................................... 3
2.2 Η ΙΣΟΡΙΑ ΣΗ C++ ............................................................................................ 6
2.3 ΙΣΟΡΙΑ ΣΩΝ ΒΙΝΣΔΟΠΑΙΥΝΙΓΙΩΝ......................................................................... 7
2.3.1 Τα πρώηα βινηεοπαιτνίδια .................................................................. 7
2.3.2 Η πρώηη οικιακή κονζόλα .................................................................. 9
2.3.3 Η αρτή ηων arcade παιτνιδιών ......................................................... 9
2.3.4 H “τρσζή” εποτή ηων arcade παιτνιδιών ...................................... 10
2.3.5 Κονζόλες 8-bit και 16-bit .................................................................. 11
2.3.6 Η μεηάβαζη ζηα ηριζδιάζηαηα γραθικά .......................................... 12
2.3.7 Κονζόλες έκηης έβδομης και όγδοης γενιάς ............................... 12
2.4 OPENGL GRAPHICS PIPELINE .......................................................................... 13
3 ΔΡΓΑΛΔΙΑ ΚΑΙ ΠΡΟΓΡΑΜΜΑΣΑ ...................................................................... 19
3.1 VISUAL STUDIO EXPRESS EDITION .................................................................. 19
3.1.1 Η διαδικαζία εύρεζης ζθαλμάηων (Debugging) ........................... 20
3.1.2 Η διαδικαζία μεηαγλώηηιζης (compilation) ενός προγράμμαηος 21
3.2 ADOBE ILLUSTRATOR ....................................................................................... 22
3.3 ADOBE PHOTOSHOP ........................................................................................ 24
3.4 COCOS 2D ANIMATION EDITOR ....................................................................... 26
3.5 Η ΒΙΒΛΙΟΘΗΚΗ COCOS-2D-X ............................................................................ 27
-vi-
4 ΔΝΑΛΛΑΚΣΙΚΔ ΠΡΟΣΑΔΙ ΤΛΟΠΟΙΗΗ ................................................ 31
4.1 Η ΒΙΒΛΙΟΘΗΚΗ SDL ........................................................................................ 32
4.2 Η ΒΙΒΛΙΟΘΗΚΗ SFML ...................................................................................... 34
4.3 Η ΒΙΒΛΙΟΘΗΚΗ LIBGDX ................................................................................... 35
4.4 HTML 5 ΚΑΙ JAVASCRIPT ΒΙΒΛΙΟΘΗΚΗ PHASER .............................................. 37
5 ΚΧΓΙΚΑ ΚΑΙ ΔΠΔΞΗΓΗΔΙ ........................................................................... 39
5.1 ΔΓΚΑΣΑΣΑΗ ΣΗ ΒΙΒΛΙΟΘΗΚΗ COCOS2D-X ................................................ 39
5.2 ΚΩΓΙΚΑ ........................................................................................................... 41
6 ΤΜΠΔΡΑΜΑΣΑ ................................................................................................ 57
ΒΙΒΛΙΟΓΡΑΦΙΑ ........................................................................................................... 59
ΠΑΡΑΡΣΗΜΑ Α ........................................................................................................ 59
-1-
1 Διζαγυγή
Η αλάπηπμε ελόο παηρληδηνύ απνηειείηαη από νξηζκέλα ζηάδηα.
Σηα παξαθάησ θεθάιαηα ζα αλαπηπρζεί ε δηαδηθαζία απηή δειαδή ζα γίλεη παξνπζίαζε
θαη επεμήγεζε ηνπ θώδηθα θαη ησλ εξγαιείσλ πνπ ρξεζηκνπνηήζεθαλ, απηά είλαη ην
Visual studio γηα ηελ επεμεξγαζία ηνπ θώδηθα ην Adobe Illustrator, θαη ην Gimp ην γηα
ηελ δεκηνπξγία ησλ γξαθηθώλ.
Η γιώζζα πξνγξακκαηηζκνύ πνπ επηιέρζεθε είλαη ε C++.
Θα αλαθεξζνύλ ηα επηκέξνπο ραξαθηεξηζηηθά ηεο γιώζζαο πνπ ρξεζηκνπνηήζεθαλ,
ζα γίλεη ε ηζηνξηθή αλαδξνκή ηεο γιώζζαο θαζώο θαη νη ηζηνξηθέο εμειίμεηο πνπ
νδήγεζαλ ζηελ δεκηνπξγία ηεο. Δπίζεο ζα γίλεη αλαθνξά ζηελ ηζηνξία ησλ
ειεθηξνληθώλ παηρληδηώλ όπσο θαη νη θνλζόιεο γηα ηηο νπνίεο αλαπηύρζεθαλ έηζη ώζηε
λα ππάξμεη κηα νινθιεξσκέλε εηθόλα γηα ηα ειεθηξνληθά παηρλίδηα.
-3-
2 ΙΣΟΡΙΚΗ ΑΝΑΓΡΟΜΗ ΓΛΧΧΝ ΠΡΟΓΡΑΜΜΑΣΙΜΟΤ ΚΑΙ ΗΛΔΚΣΡΟΝΙΚΧΝ ΠΑΙΥΝΙΓΙΧΝ
Σην παξαθάησ θεθάιαην αλαιύεηαη ε ηζηνξία θπξίσο ηεο C++ θαη νη γεληέο ησλ
γισζζώλ πξνγξακκαηηζκνύ θαη θαζώο θαη ε ηζηνξία ησλ ειεθηξνληθώλ παηρληδηώλ
όπσο ην hardware από ην νπνίν απνηεινύληαλ νη θνλζόιεο.
2.1 Γενιέρ Γλυζζών ππογπαμμαηιζμού
1. Η πξώηε γιώζζα πξνγξακκαηηζκνύ ήηαλ ε γιώζζα κεραλήο
Ο πξνγξακκαηηζηήο έπξεπε λα γξάςεη ηνλ θώδηθα σο κηα
αθνινπζία 0 θαη 1 .
Ο πξώηνο ειεθηξνληθόο ππνινγηζηήο όπσο θαίλεηαη ζηελ Δηθόλα 1 : Colossus
Mark 2 δεκηνπξγήζεθε από Άγγινπο απνθξππηνγξάθνπο θαηά ηελ
δηάξθεηα ηνπ Β΄ παγθνζκίνπ πνιέκνπ θαη πξνγξακκαηηδόηαλ γπξίδνληαο ηνπο
θαηάιιεινπο δηαθόπηεο
Δηθόλα 1 : Colossus Mark 2
-4-
2. Η δεύηεξε γεληά γισζζώλ πξνγξακκαηηζκνύ ήηαλ ε ζπκβνιηθή γιώζζα
Assembly language . Έηζη ρξεζηκνπνηώληαο ζπληνκνγξαθίεο ιέμεσλ
πνπ έκνηαδαλ ζηελ Αγγιηθή γιώζζα όπσο γηα παξάδεηγκα MOV , JMP , ADD
ν πξνγξακκαηηζηήο κπνξνύζε πην εύθνια λα γξάςεη θα λα δηνξζώζεη ηνλ
θώδηθα . Δλώ ν θώδηθαο πνπ παξάγεηαη από ηελ ζπκβνιηθή γιώζζα είλαη
γξήγνξνο έρεη έλα κεγάιν κεηνλέθηεκα , ην όηη ν θώδηθαο εμαξηάηαη από ηνλ
επεμεξγαζηή ηνπ ππνινγηζηή θαη έηζη δελ ππάξρεη θνξεηόηεηα ζε άιιεο
αξρηηεθηνληθέο.
3. Λόγσ ησλ πεξηνξηζκώλ πνπ ππήξραλ ζηηο πξνεγνύκελεο γεληέο
Γεκηνπξγήζεθαλ νη γιώζζεο ηξίηεο γεληάο ε αιιηώο γιώζζεο πςεινύ
επηπέδνπ. Σηα ηέιε ηεο δεθαεηίαο ην 1950 δεκηνπξγήζεθαλ νη πξώηεο
γιώζζεο πςεινύ επηπέδνπ όπσο νη FORTRAN , ALGOL , COBOL
Αξγόηεξα αλαπηύρζεθαλ νη πιένλ πην επξέα δηαδεδνκέλεο γιώζζεο
όπσο νη C, C++ , Java , C# , Python .
Τα πιενλεθηήκαηα κηαο γιώζζαο πςεινύ είλαη :
- Δύθνιν λα δηαβαζηνύλ , λα δηνξζσζνύλ θαη λα ζπληεξεζνύλ
ηα ήδε ππάξρνληα πξνγξάκκαηα.
- Τξέρνπλ αλεμαξηήησο ηνπ επεμεξγαζηή
4. Οη Γιώζζεο ηέηαξηεο γεληάο ζηνρεύνπλ λα απινπνηήζνπλ ηελ δηαδηθαζία
δεκηνπξγίαο ινγηζκηθνύ έηζη ώζηε λα ειαρηζηνπνηεζεί ην θόζηνο αλάπηπμήο ηνπ.
Παξαδείγκαηα γισζζώλ ηέηαξηεο γεληάο είλαη ε SQL θαη ε CSS. Έλα
παξάδεηγκα SQL είλαη ην αθόινπζν:
SELECT name, FROM students WHERE grade = 7;
Σηελ Δηθόλα 2 : Γεληέο γισζζώλ πξνγξακκαηηζκνύ θαίλνληαη νη
γεληέο ησλ γισζζώλ θαη ελδεηθηηθά κεξηθέο γξακκέο θώδηθα
-5-
Δηθόλα 2 : Γεληέο γισζζώλ πξνγξακκαηηζκνύ
-6-
2.2 Η ιζηοπία ηηρ C++
Τν 1979 ν Γαλόο επηζηήκνλαο ππνινγηζηώλ Bjarne Stroustrup μεθίλεζε λα δνπιεύεη
πάλσ ζε κηα γιώζζα πνπ ν ίδηνο νλόκαζε C κε θιάζεηο.
Δπεξεαζκέλνο από ηελ γιώζζα Simula ε νπνία ζεσξείηαη ε πξώηε
αληηθεηκελνζηξαθήο γιώζζα πξνγξακκαηηζκνύ ε νπνία είρε πνιύ ρξήζηκα
ραξαθηεξηζηηθά γηα ηελ αλάπηπμε ινγηζκηθνύ , αιιά ήηαλ πνιύ αξγή ζηελ εθηέιεζή
ηεο.
Έηζη όηαλ μεθίλεζε λα δνπιεύεη ζηα εξγαζηήξηα ηεο AT&T Bell άξρηζε λα θηηάμεη
Μηα βειηησκέλε έθδνζε ηεο C. Η γιώζζα C επηιέρζεθε γηα ηα εμήο ραξαθηεξηζηηθά:
είλαη γεληθήο ρξήζεο , γξήγνξε κπνξνύζε λα ηξέμεη ζε πνιιά ιεηηνπξγηθά ζπζηήκαηα
θαη ήηαλ επξέσο δηαδεδνκέλε.
Τειηθά ην 1983 ε C κε θιάζεηο νλνκάζηεθε C++ πξνζζέηνληαο λέεο ιεηηνπξγίεο
ζηελ γιώζζα επίζεο δεκηνπξγήζεθε ν κεηαγισηηηζηήο ηεο γιώζζαο ν Cfront.
Τν 1985 εθδόζεθε ε πξώηε έθδνζε ηνπ βηβιίνπ ηνπ Bjarne Stroustrup
The C++ Programming Language πνπ έγηλε ν νδεγόο γηα όζνπο επέιεγαλ λα
ρξεζηκνπνηήζνπλ ηελ C++
Δηθόλα 3 : ν δεκηνπξγόο ηεο C++ Bjarne Stroustrup
-7-
2.3 Ιζηοπία ηυν βινηεοπαισνιδιών
Η ηζηνξία ησλ πξώησλ βηληενπαηρληδηώλ μεθηλάεη από ην 1950 όπνπ αθαδεκατθνί
εξεπλεηέο θαη επηζηήκνλεο ησλ ππνινγηζηώλ ζρεδίαδαλ απιά παηρλίδηα θαη
πξνζνκνηώζεηο. Τα βηληενπαηρλίδηα έγηλαλ επξέσο γλσζηά θαηά ηελ πεξίνδν
ηνπ 1970 θαη 1980 κε ηα arcade games θαη ηηο θνλζόιεο παηρληδηώλ.
Ο όξνο βηληενπαηρλίδη πεξηιακβάλεη έλα κεγάιν εύξνο ηερλνινγηώλ ζηηο
κέξεο καο αιιά ζπλδέεηαη κε έλα παηρλίδη πνπ παίδεηαη ζε πιηθό θαηαζθεπαζκέλν
από ειεθηξνληθά θπθιώκαηα έρνπλ κηα κνξθή δηαδξαζηεθόηεηαο κε ηνλ παίρηε
όπσο γηα παξάδεηγκα έλα ρεηξηζηήξην θαη πξνβάιινληαη ζε κηα νζόλε.
2.3.1 Σα ππώηα βινηεοπαισνίδια
Οη πξώηνη ειεθηξνληθνί ππνινγηζηέο ζπγθεθξηκέλα ν Αγγιηθήο θαηαζθεπήο
Collosus θαη ν Ακεξηθαληθήο θαηαζθεπήο ENIAC πνπ θαηαζθεπάζηεθαλ θαηά ηνλ Β΄
παγθόζκην πόιεκν. Αξγόηεξα μεθίλεζε ε αξρηηεθηνληθή απνζεθεπκέλσλ
πξνγξακκάησλ όπσο ε αξρηηεθηνληθή von Neumann θαηά ηελ νπνία ν ειεθηξνληθόο
ππνινγηζηήο απνζεθεύεη ζηελ κλήκε ηνπ δεδνκέλα θαη εληνιέο.
Φξεζηκνπνηώληαο απηή ηελ αξρηηεθηνληθή νη ειεθηξνληθνί ππνινγηζηέο κπνξνύζαλ
λα επαλαπξνγξακκαηηζηνύλ έηζη ώζηε λα κπνξνύλ λα ιύζνπλ δηάθνξα πξνβιήκαηα.
Έηζη πνιιά παλεπηζηήκηα , θξαηηθνί νξγαληζκνί θαη κεγάιεο εηαηξίεο άξρηζαλ λα
ρξεζηκνπνηνύλ ππνινγηζηέο.
Τν πξώην βηληενπαηρλίδη πνπ αλαπηύρζεθε κε ζθνπό ηελ ςπραγσγία θαη όρη
γηα λα δείμεη θάπνηα ηερλνινγία ήηαλ ην Tennis for Two ην νπνίν ζρεδηάζηεθε από ηνλ
William Higinbotham ζε αλαινγηθό ππνινγηζηή θαη ηα γξαθηθά ηνπ εκθαλίδνληαλ
ζε έλαλ παικνγξάθν όπσο θαίλεηαη ζηελ Δηθόλα 4 : Tennis for two.
-8-
Δηθόλα 4 : Tennis for two
Τν 1961 ζην παλεπηζηήκην ησλ ΗΠΑ MIT (Massachusetts Institute of
Technology) απόθηεζε έλαλ ππνινγηζηή PDP-1 έηζι από ηοσς Steve Russell, Martin
Graetz, and Wayne Wiitanen δημιοσργήθηκε ηο Spacewar!
Σο παιτνίδι αποηελούνηαν από δσο διαζηημόπλοια ηα οποία τειριζόνηοσζαν από παίκηες
και προζπαθούζαν να καηαζηρέυοσν ηο ένα ηο άλλο.
Δηθόλα 5 : Spacewar!
Με ηελ πάξνδν ησλ ρξόλσλ νη ππνινγηζηηθνί πόξνη απμάλνληαλ θαη ε αλάπηπμε
Γισζζώλ πςεινύ επηπέδνπ είρε σο απνηέιεζκα ηελ δεκηνπξγία παηρληδηώλ από
θνηηεηέο αιιά ηα παηρλίδηα απηά έκελαλ ζηα εξγαζηήξηα ησλ παλεπηζηεκίσλ
-9-
ρσξίο λα γίλνπλ επξέσο γλσζηά
2.3.2 Η ππώηη οικιακή κονζόλα
Η πξώηε θνλζόια πνπ πξννξηδόηαλ γηα νηθηαθή ρξήζε θπθινθόξεζε
ζηηο αγνξέο ηεο Ακεξηθήο ην 1972 με ονομαζία Magnavox Odyssey θαη
ν θαηαζθεπαζηήο ηνπ ήηαλ ν Ralph Baer.
Η θνλζόια κπνξνύζε λα ζπλδεζεί κε ηελ ηειεόξαζε αιιά δελ ππνζηήξηδε
ήρν. Τα παηρλίδηα πνπ θπθινθόξεζαλ ήηαλ πιαθέηεο πνπ θαζόξηδαλ ην πσο ζα
ηξέμεη ην ζύζηεκα θαη όρη απνζεθεπκέλα πξνγξάκκαηα ,ε αξρηθή ηηκή ηνπ ήηαλ 99 $ .
Δηθόλα 6 : Η θνλζόια Magnavox Odyssey
2.3.3 Η απσή ηυν arcade παισνιδιών
Τν πξώην arcade παηρλίδη πνπ ήηαλε επξέσο γλσζηό δεκηνπξγήζεθε από ηελ εηαηξία
Atari ην 1972, ην Pong έηξερε ζε έλα κεράλεκα ην νπνίν ιεηηνπξγνύζε κε θέξκαηα θαη
ζεκείσζε κεγάιε επηηπρία.
-10-
Δηθόλα 7: Pong
2.3.4 H “σπςζή” εποσή ηυν arcade παισνιδιών
Από ην 1978 έσο θαη ην 1982 ηα ειεθηξνληθά παηρλίδηα πνπ δέρνληαλ θέξκαηα
έγηλαλ επξέσο γλσζηά κεξηθά από απηά είλαη : Space Invaders , Pac-Man ,
Donkey Kong.
Παξαθάησ δίλνληαη ηα ραξαθηεξηζηηθά κηαο πιαθέηαο (system board) Pac-Man :
Πίλαθαο 1 : Τερληθά ραξαθηεξηζηηθά πιαθέηαο Pacman
CPU Zilog Z80 at 3,072 Mhz
ROM 16 KB (Γηα απνζήθεπζε ηνπ παηρληδηνύ)
RAM 4 KB ( Main RAM 2KB , Video Ram 2KB )
Αλάιπζε : 224 × 288
-11-
Δηθόλα 8 : Pac-Man
2.3.5 Κονζόλερ 8-bit και 16-bit
Η πην δεκνθηιήο θνλζόια 8-bit είλαη ην Nintendo Entertainment System (NES),
ην νπνίν θπθινθόξεζε ην 1983 ζηε Ιαπσλία θαη αξγόηεξα ζηνλ ππόινηπν θόζκν.
Μεξηθά από ηα πην δηάζεκα παηρλίδηα πνπ θπθινθόξεζαλ είλαη ηα :
Super Mario Bros θαη The Legend of Zelda.
Δηθόλα 9 : Nintendo Entertainment System
Αξγόηεξα βγήθαλ νη θνλζόιεο 16-bit όπσο ην Sega Mega Drive/Genesis
ην νπνίν θπθινθόξεζε ην 1988. Μεξηθά από ηα πην δηάζεκα παηρλίδηα
ήηαλ ην Sonic the Hedgehog θαη ην Street fighter.
-12-
Παξαθάησ δίλνληαη ηα ηερληθά ραξαθηεξηζηηθά ηνπ Sega Mega Drive/Genesis :
Πίλαθαο 2 :Τερληθά ραξαθηεξηζηηθά Sega Mega Drive/Genesis
Motorola 68000 CPU clocked at 7.6 MHz
72 kB of RAM, 64 kB of video RAM
Aλάιπζε 320x224
2.3.6 Η μεηάβαζη ζηα ηπιζδιάζηαηα γπαθικά
Με ηελ θπθινθνξία ηνπ Sega Saturn , ηνπ Play Station θαη ηνπ Nintendo 64
ζηα κέζα ηεο δεθαεηίαο ηνπ 1990 ππήξμε άλζηζε ησλ ηξηζδηάζηαησλ παηρληδηώλ.
Παξάιιεια ηα βηληενπαηρλίδηα μεθίλεζαλ λα θπθινθνξνύλ ζε CD.
Παξαθάησ δίλνληαη ηα ηερληθά ραξαθηεξηζηηθά ηνπ Sony Playstation :
Πίλαθαο 3 : Τερληθά ραξαθηεξηζηηθά Sony Playstation
CPU: MIPS R3000A-compatible 32-Bit RISC CPU MIPS R3051 at 33.8688 MHz.
RAM : 2 MiB main , 1 MB Video RAM
Resolution up to 640×480
2.3.7 Κονζόλερ έκηηρ έβδομηρ και όγδοηρ γενιάρ
Πιένλ νη θνλζόιεο παύνπλ λα είλαη κόλν παηρληδνκεραλέο αιιά κπνξνύλ
λα αλαπαξάγνπλ θαη ηαηλίεο από DVD αιιά θαη κνπζηθή , επίζεο ζε κεξηθέο
θνλζόιεο ππήξρε ζύλδεζε Ethernet. Απηή ηελ επνρή θπθινθνξνύλ ην
Playstation 2 ηεο Sony ην 2000 θαη ην Xbox ηεο Microsoft ην 2001.
Πίλαθαο 4: Τερληθά ραξαθηεξηζηηθά ηνπ Sony Playstation 2
CPU: MIPS R5900-based "Emotion Engine", clocked at 294.912 MHz
Main memory: 32 MB at 400 MHz
4 MB dedicated video RAM
-13-
Η έβδνκε γεληά ραξαθηεξίδεηαη από πςειήο αλάιπζεο νζόλε θαη ζύλδεζε
κε HDMI θαιώδην θαη εζσηεξηθό ζθιεξό δίζθν θαη ζύξεο USB 2.0, επίζεο ππάξρεη
δπλαηόηεηα ζύλδεζεο ζην δηαδίθηπν θαζώο θαη ιήςεο πεξηερνκέλνπ από απηό όπσο θαη
αλαβαζκίζεηο παηρληδηώλ. Τν Xbox 360 ην νπνίν θπθινθόξεζε ην 2005 θαη ην
Playstation 3 ην νπνίν θπθινθόξεζε ην 2006 θαη έρεη θαη ππνζηήξημε γηα blue ray είλαη
νη πην ραξαθηεξηζηηθέο θνλζόιεο απηήο ηεο γεληάο.
Πίλαθαο 5 : Τερληθά ραξαθηεξηζηηθά ηνπ Xbox 360
CPU : 3-core / 6-thread IBM manufactured , clocked at 3.2 Ghz
Memory : 512 MB GDDR3 shared by the CPU and the GPU
Power Supply 203 W
Η όγδνε γεληά θόλζνιώλ απνηειείηαη από πνιύ δπλαηό πιηθό πξόζβαζε ζην
Γηαδίθηπν θαζώο θαη πςειέο αλαιύζεηο. Οη πην δεκνθηιείο θνλζόιεο απηήο ηεο
γεληάο είλαη ην Playstation 4 ηεο Sony ην νπνίν θπθινθόξεζε ην 2013 θαη ην
Xbox One ηεο Microsoft ην νπνίν θπθινθόξεζε επίζεο ην 2013
Παξαθάησ δίλνληαη ηα ραξαθηεξηζηηθά ηνπ Playstation 4 αιιά
παξόκνηα ραξαθηεξηζηηθά έρεη θαη ην Xbox one
8 core Accelerated Processing Unit (APU) AMD clocked at 1.6 Ghz
8 GB DDR5 unified memory
Power Supply 250 W
Γεπηεξεύνλ επεμεξγαζηήο ARM γηα ρξήζε ηνπ ιεηηνπξγηθνύ ζπζηήκαηνο
2.4 Opengl Graphics Pipeline
Μηα βηβιηνζήθε γξακκέλε ζε κηα γιώζζα πξνγξακκαηηζκνύ όπσο ε cocos2d-x ε
αθόκα θαη έλα νινθιεξσκέλν game engine ρξεηάδεηαη κηα γιώζζα γξαθηθώλ όπσο ην
Opengl ε ην Directx έηζη ώζηε λα επηθνηλσλεί ην πξόγξακκα κε ηελ θάξηα γξαθηθώλ ε
νπνία αλαιακβάλεη ην rendering ησλ πνιπγώλσλ θαη ησλ εθέ.
Τν Opengl είλαη κηα βηβιηνζήθε γξακκέλε ζηελ γιώζζα C θαη γηα απηό ηνλ ιόγν
είλαη γξήγνξε θαη κπνξεί λα ηξέμεη ζε πνιιά ιεηηνπξγηθά.
-14-
Δηθόλα 10: Opengl Application
Παξαθάησ γίλεηαη αλάιπζε ηεο ιεηηνπξγίαο ηνπ Opengl θαζώο θαη ηα ζηάδηα από ηα
νπνία πξέπεη λα πξαγκαηνπνηεζνύλ ώζηε λα έρνπκε έλα απνηέιεζκα ζηελ νζόλε καο :
-15-
Δηθόλα 11: Opengl Rendering Pipeline
- Vertex Specification :
Σε απηό ην ζηάδην ηα vertices πεξλάλε ζηελ θάξηα γξαθηθώλ απηά ηα
vertices κπνξεί λα πεξηγξάθνπλ ηξίγσλα , ζεκεία ε γξακκέο θάζε vertex
πεξηγξάθεηαη κέζσ ησλ αληηθεηκέλσλ Vertex Array Objects ην νπνίν πεξηγξάθεη
ηελ κνξθή πνπ ζα έρεη ην vertex θαη ην Vertex Buffer Objects ην νπνίν
απνζεθεύεη ηα δεδνκέλα
- Vertex Rendering :
-16-
Αθνύ πξνζδηνξηζηνύλε ηα vertices ζρεδηάδνληαη ζηε νζόλε κε κηα
θαηάιιειε εληνιή ζρεδηάζκαηνο.
- Vertex Shader :
Σε απηό ην ζηάδην γίλεηαη ε επεμεξγαζία ησλ vertices θαη έρεη είζνδν θαη σο
έμνδν ηα επεμεξγαζκέλα vertices. Ο πξνγξακκαηηζκόο ηνπ γίλεηαη από ηνλ
ρξήζηε θαη ε ύπαξμή ηνπ είλαη ππνρξεσηηθή.
Παξαθάησ δίλεηαη έλα παξάδεηγκα ελόο vertex shader.
#version 410
layout (std140) uniform Matrices {
mat4 projModelViewMatrix;
mat3 normalMatrix;
};
in vec3 position;
in vec3 normal;
in vec2 texCoord;
out VertexData {
vec2 texCoord;
vec3 normal;
} VertexOut;
void main()
{
VertexOut.texCoord = texCoord;
VertexOut.normal = normalize(normalMatrix * normal);
gl_Position = projModelViewMatrix * vec4(position, 1.0);
}
Δηθόλα 12: Vertex Shader
- Tessellation :
Πξνζζέηεη πεξηζζόηεξα ηξίγσλα ζηελ ήδε ππάξρνπζα γεσκεηξία έηζη ώζηε λα
θαίλεηαη κε πεξηζζόηεξε ιεπηνκέξεηα όπσο θαίλεηαη θα ζηελ παξαθάησ εηθόλα
-17-
Δηθόλα 13 : Τν απνηέιεζκα ηνπ tessellation
- Geometry Shader :
Απνηειείηαη από έλα πξόγξακκα γξακκέλν από ηνλ ρξήζηε ώζηε λα επεμεξγαζηεί
γεσκεηξηθά ζρήκαηα πνπ δέρεηαη σο είζνδν. Η ύπαξμή ηνπ δελ είλαη ππνρξεσηηθή
- Vertex post-processing :
Τα vertices πεξλάλε από νξηζκέλα ζηάδηα.
- Clipping : Τα vertices ηα νπνία είλαη έμσ από ηνλ ρώξν πνπ βιέπεη ν ρξήζηεο
δειαδή ηεο θάκεξαο δελ ρξεηάδεηαη λα ζρεδηαζηνύλε.
- Primitive assembly : Face Culling θαηά ηελ θάζε απηή ε πίζσ κεξηά ησλ
ηξηγώλσλ δελ ζρεδηάδεηαη δηόηη δέλ είλαη νξαηά ζηνλ ρξήζηε.
- Rasterization : Δδώ παξάγνληαη ηα ιεγόκελα fragment ηα νπνία είλαη
απαξαίηεηα γηα ηελ δεκηνπξγία ησλ pixel πνπ εκθαλίδνληαη ζηελ νζόλε.
- Fragment Shader : Απηό ην ζηάδην πξνγξακκαηίδεηαη από ηνλ ρξήζηε θαη
πεξλάλε δεδνκέλα όπσο ηα textures.
Παξαθάησ δίλεηαη έλα παξάδεηγκα fragment shader :
#version 330
#version 330
layout (std140) uniform Material {
-18-
vec4 diffuse;
vec4 ambient;
vec4 specular;
float shininess;
};
layout (std140) uniform Lights {
vec3 l_dir; // camera space
};
in Data {
vec3 normal;
vec4 eye;
vec2 texCoord;
} DataIn;
uniform sampler2D texUnit;
out vec4 colorOut;
void main() {
// set the specular term to black
vec4 spec = vec4(0.0);
// normalize both input vectors
vec3 n = normalize(DataIn.normal);
vec3 e = normalize(vec3(DataIn.eye));
float intensity = max(dot(n,l_dir), 0.0);
// if the vertex is lit compute the specular color
if (intensity > 0.0) {
// compute the half vector
vec3 h = normalize(l_dir + e);
// compute the specular term into spec
float intSpec = max(dot(h,n), 0.0);
spec = specular * pow(intSpec,shininess);
}
vec4 texColor = texture(texUnit, DataIn.texCoord);
vec4 diffColor = intensity * diffuse * texColor;
vec4 ambColor = ambient * texColor;
colorOut = max(diffColor + spec, ambColor);
}
Δηθόλα 14 : fragment shader
- Per-Sample Operations :
Δδώ γίλνληαη δηάθνξεο πξνεηνηκαζίεο ώζηε λα παξαρζεί ην ηειηθό απνηέιεζκα
πνπ ζα εκθαληζηεί ζηελ νζόλε.
-19-
3 Δπγαλεία και ππογπάμμαηα
Παξαθάησ παξνπζηάδνληαη ηα εξγαιεία θαη ηα πξνγξάκκαηα πνπ
ρξεζηκνπνηήζεθαλ θαηά ηελ αλάπηπμε ηνπ 2D παηρληδηνύ δειαδή νη δπλαηόηεηέο ηνπο
θαζώο θαη νη ιεηηνπξγίεο ηνπο.
3.1 Visual Studio Express edition
Τν Visual studio είλαη έλα IDE (integrated development environment)
θαηαζθεπαζκέλν από ηελ Microsoft. Φξεζηκνπνηείηαη γηα ηελ δεκηνπξγία
πξνγξακκάησλ ζε πεξηβάιινλ Windows.Η πξώηε έθδνζε ηνπ Visual studio
θπθινθόξεζε ην 1997 κε ηελ νλνκαζία Visual Studio 97 θαη αξγόηεξα
αθνινύζεζαλ άιιεο εθδόζεηο. Τν Visual studio ππνζηεξίδεη επεμεξγαζία θώδηθα
ζηηο παξαθάησ γιώζζεο C , C++ , Visual Basic , C# , F# , Python , Ruby, Node.js
XML/XSLT, HTML/XHTML, JavaScript θαη CSS.
Μεξηθέο από ηηο ιεηηνπξγίεο ηνπ πεξηιακβάλνπλ :
- Δπεμεξγαζία θώδηθα , syntax highlighting, θαη απηόκαηε ζπκπιήξσζε ηνπ
θώδηθα κέζσ ηνπ IntelliSense ηόζν γηα κεηαβιεηέο όζν θαη γηα ζπλαξηήζεηο θαη
βξόρσλ επαλάιεςεο. Δπίζεο ππάξρεη ε δπλαηόηεηα δεκηνπξγίαο ελόο
- ζειηδνδείθηε ώζηε λα γίλεηαη γξήγνξε πεξηήγεζε κέζα ζηνλ θώδηθα.
- Debugger , γηα ηνλ εληνπηζκό ησλ ηπρόλ ιαζώλ πνπ κπνξεί λα ππάξρνπλ ζηνλ
θώδηθα όπσο θαη εθηέιεζε ηνπ θώδηθα γξακκή πξνο γξακκή θαη
παξαθνινύζεζε ησλ ηηκώλ ησλ κεηαβιεηώλ.
- Δθαξκνγή Σρεδηαζκνύ (Designer) , γηα ηελ δεκηνπξγία θνξκώλ κε ηελ βνήζεηα
ελόο δηαδξαζηηθνύ πεξηβάιινληνο. Δπίζεο παξέρεη ηελ δπλαηόηεηα δεκηνπξγίαο
θαη ζρεδίαζεο κηαο ηζηνζειίδαο.
-20-
Δηθόλα 15 : Visual Studio IDE
3.1.1 Η διαδικαζία εύπεζηρ ζθαλμάηυν (Debugging)
Απηή ε δηαδηθαζία είλαη πνιύ ζεκαληηθή δηόηη καο επηηξέπεη λα εθηειέζνπκε
θνκκάηηα ηνπ θώδηθα γξακκή πξνο γξακκή έηζη ώζηε λα κπνξνύκε λα ειέγμνπκε ην
πξόγξακκα θαη λα εληνπίζνπκε ηπρόλ ιάζε , επίζεο κπνξνύκε λα
παξαθνινπζήζνπκε ηηο ηηκέο ησλ κεηαβιεηώλ.
Τν Visual studio καο παξέρεη ηα θαηάιιεια εξγαιεία ώζηε λα κπνξέζνπκε λα
θάλνπκε έιεγρν ησλ ζθαικάησλ θαη ζπγθεθξηκέλα καο επηηξέπεη λα βάινπκε ηα
ιεγόκελα Break Points κε ηα νπνία ζηακαηάκε ηελ εθηέιεζε ηνπ πξνγξάκκαηνο ζην
ζεκείν ζην νπνίν εηζάγακε ην Break Point ζηε ζπλέρεηα κπνξνύκε λα εθηειέζνπκε
ηνλ θώδηθα γξακκή πξνο γξακκή κε ηα πιήθηξα F10 θαη F11 ή από ηηο αληίζηνηρεο
επηινγέο ζην κελνύ.
Σην debug mode ηνπ Visual Studio εκθαλίδνληαη ηα παξάζπξα Locals θαη
Autos, ζε απηά ηα παξάζπξα εκθαλίδνληαη νη κεηαβιεηέο έηζη ώζηε λα κπνξνύκε λα
παξαθνινπζήζνπκε ηηο ηηκέο πνπ παίξλνπλ.
-21-
Δηθόλα 16 : Visual Studio Debugger
3.1.2 Η διαδικαζία μεηαγλώηηιζηρ (compilation) ενόρ ππογπάμμαηορ
Η δηαδηθαζία ηεο κεηαγιώηηηζεο πεξηιακβάλεη νξηζκέλα ζηάδηα
απηά είλαη ηα εμήο :
-Preprocessing : Καηά ηελ δηαδηθαζία απηή ηα αθαηξνύληαη ηα ζρόιηα από ηνλ πεγαίν
θώδηθα θαη επεμεξγάδνληαη εθθξάζεηο όπσο #include #define επίζεο κπνξεί λα
αγλνήζεη θώδηθα πνπ βξίζθεηαη αλακεζά ζε #if #ifdef #ifndef.
-Compilation : Ο κεηαγισηηηζηήο είλαη ππεύζπλνο γηα ηελ παξαγσγή ηνπ θώδηθα
ζε ζπκβνιηθή γιώζζα assembly , Έηζη από ηνλ θώδηθα ζε assembly παξάγεηαη ην
object file ην νπνίν πεξηέρεη ηνλ θώδηθα ζε δπαδηθή κνξθή.
-Linking : Παξάγεηαη ην ηειηθό εθηειέζηκν πξόγξακκα ην νπνίν κπνξεί λα εθηειέζεη ν
-22-
ππνινγηζηήο , επίζεο κπνξεί λα δεκηνπξγεζεί κηα δπλακηθή ε ζηαηηθή βηβιηνζήθε,ε
νπνία κπνξεί κε ηελ ζεηξά ηεο λα ρξεζηκνπνηεζεί ζε θάπνην άιιν πξόγξακκα.
Ο Linker αληηθαζηζηά ηηο αλαθνξέο ζε ζύκβνια κε ηηο πξαγκαηηθέο δηεπζύλζεηο
νη νπνίεο κπνξεί λα βξίζθνληαη ζηα αληίζηνηρα object files ε ζε θάπνηα βηβιηνζήθε.
Δηθόλα 17 : Η δηαδηθαζία κεηαγιώηηηζεο ελόο πξνγξάκκαηνο
3.2 Adobe Illustrator
Τν Adobe Illustrator είλαη έλα πξόγξακκα δεκηνπξγίαο vector γξαθηθώλ.
Τν Adobe illustrator είλαη ηδαληθό γηα ζρεδίαζε ραξαθηήξσλ 2d παηρληδηώλ επίζεο
κηα πνιύ ζπρλή ρξήζε ηνπ είλαη γηα ηελ δεκηνπξγία ινγόηππσλ γηα εηαηξίεο ε
δηαθεκίζεηο.
Έλα από ηα πιενλεθηήκαηα πνπ έρεη είλαη όηη κπνξεί λα δεκηνπξγήζεη εηθόλεο θαη
ζρήκαηα αλεμαξηήησο αλάιπζεο.
-23-
Δηθόλα 18: Adobe illustrator
Μεξηθά από ηα εξγαιεία πνπ παξέρεη είλαη ηα εμήο :
Selection tool (Δξγαιείν επηινγήο) Φξεζηκνπνηώληαο ην selection tool
κπνξνύκε λα κεηαθηλήζνπκε ζρήκαηα θαη γξακκέο.
Direct Selection tool : Απηό ην εξγαιείν είλαη ηδηαίηεξα ρξήζηκν γηαηί καο
επηηξέπεη λα επηιέμνπκε ηα ζεκεία ελόο ζρεδίνπ θαη λα ηα κεηαθηλήζνπκε
όπσο επηζπκνύκε ώζηε λα θηηάμνπκε ην ζρέδην πνπ ζέινπκε.
Magic Wand Tool : Μαο δίλεη ηελ δπλαηόηεηα λα επηιέμνπκε απηόκαηα κηα
πεξηνρή κε θξηηήξην ηα δηάθνξα ρξώκαηα/ζρέδηα πνπ ππάξρνπλ.
Lasso Tool : Μαο επηηξέπεη λα ζρεδηάζνπκε κηα πεξηνρή θαη επηιέγεη βάζε ηνπ
ζρεδίνπ πνπ θάλακε.
Pen Tool : Απηό ην εξγαιείν ρξεζηκνπνηείηαη γηα ηελ δεκηνπξγία ζρεδίσλ
κε ηελ βνήζεηα επζείσλ ε θακππιώλ. Δπίζεο παξέρεη ηελ δπλαηόηεηα
πξνζζήθεο ε αθαίξεζεο ζεκείσλ πάλσ ζην ζρέδην ην νπνίν θάλακε.
Type Tool : Μπνξνύκε λα επηιέμνπκε κηα γξακκαηνζεηξά, κέγεζνο θαη ρξώκα
θαη λα γξάςνπκε θάπνην θείκελν.
-24-
Line/Arc Tool : Μπνξνύκε λα ηξαβήμνπκε κηα γξακκή ε κηα θακπύιε ηελ
νπνία ζηελ ζπλέρεηα κπνξνύκε λα ηελ επεμεξγαζηνύκε
Rectangle/Rounded Rectangle Tool : Με απηό ην εξγαιείν κπνξνύκε λα
δεκηνπξγήζνπκε γεσκεηξηθά ζρήκαηα ηα νπνία κπνξεί λα έρνπλ θάπνην ρξώκα
γξακκήο θαη πεξηερνκέλνπ.
Paintbrush/PaintTool : Σρεδηάδνπκε κηα γξακκή ειεύζεξα θαη κεηά κπνξνύκε λα
Πξνζαξκόζνπκε ηα ζεκεία ηεο ε λα αιιάμνπκε ην ρξώκα ε ην κέγεζόο ηεο.
Eraser Tool : Μαο επηηξέπεη λα δηνξζώζνπκε ιάζε πνπ έρνπκε θάλεη
Rotate Tool / Scale Tool : Μπνξνύκε λα ζηξηθνγπξίζνπκε έλα ζρήκα
θαη λα ην κεγεζύλνπκε
Hand Tool : Μαο δίλεη ηελ δπλαηόηεηα λα ζύξνπκε ην πνληίθη θαη έηζη
κπνξνύκε λα κεηαβνύκε ζην ζεκείν πνπ ζέινπκε
Zoom Tool : Φξεζηκνπνηώληαο απηό ην εξγαιείν κπνξνύκε λα δνπκάξνπκε
ε λα μεδνπκάξνπκε ζε όπνηα πεξηνρή ηεο νζόλεο ζέινπκε
Gradient Tool : Έλα πνιύ ρξήζηκν εξγαιείν δηόηη καο επηηξέπεη λα
δεκηνπξγήζνπκε κεηαβάζεηο αλάκεζα ζε δύν ε πεξηζζόηεξα ρξώκαηα.
3.3 Adobe Photoshop
Τν Photoshop είλαη έλα από ηα πην γλσζηά πξνγξάκκαηα θαη δεκηνπξγήζεθε ην
1988 θαη ρξεζηκνπνηείηαη γηα επεμεξγαζία θαη δεκηνπξγία γξαθηθώλ θαη εηθόλσλ
Έρεη πνιιά εξγαιεία γηα απηό ην ζθνπό όπσο θαη θίιηξα θαη άιιεο ξπζκίζεηο πνπ
κπνξνύλ λα γίλνπλ πάλσ ζε κηα εηθόλα.
Τν photoshop κπνξεί λα νξγαλσζεί ζηα ιεγόκελα Layers, έηζη κπνξεί κηα εηθόλα
λα δηαζπαζηεί ζε Layers ώζηε λα κπνξεί θάζε Layer λα επεμεξγαζηεί ρσξηζηά.
Μεξηθά από ηα εξγαιεία πνπ παξέρεη αλαθέξνληαη παξαθάησ :
Move Tool : Απηό ην εξγαιείν καο επηηξέπεη λα κεηαθηλήζνπκε
έλα Layer ε έλα ζπγθεθξηκέλν θνκκάηη ηεο εηθόλαο πνπ έρνπκε επηιέμεη.
Select Tool / Lasso Tool : καο επηηξέπεη λα επηιέμνπκε κηα πεξηνρή ηεο εηθόλαο
ρξεζηκνπνηώληαο έλα παξαιιειόγξακκν ε κηα έιιεηςε επίζεο κε ην Lasso
Tool
-25-
κπνξνύκε λα ζρεδηάζνπκε κηα πεξηνρή ε νπνία επηιέγεηαη.
Magic Wand Tool : Έλα αξθεηά ρξήζηκν εξγαιείν δηόηη καο επηηξέπεη λα
επηιέμνπκε κηα πεξηνρή απηόκαηα. Έηζη κπνξνύκε γηα παξάδεηγκα λα
Αθαηξέζνπκε ην background από κηα εηθόλα.
Eyedropper Tool : ρξεζηκνπνηώληαο απηό ην εξγαιείν κπνξνύκε λα
Δπηιέμνπκε ην ρξώκα πνπ βξίζθεηαη θάησ από ην εξγαιείν.
Brush / Pencil Tool : Τν ζπγθεθξηκέλν εξγαιείν είλαη ηδηαίηεξα ρξήζηκν
Απνηειείηαη από δηάθνξα πηλέια ηα νπνία κπνξνύκε λα ηα ξπζκίζνπκε
όπσο γηα παξάδεηγκα πόζν δηάθαλε ζα είλαη ε πηλειηά πνπ ζα θάλνπκε
θαζώο ην ρξώκα θαη κέγεζνο πνπ ζα έρεη. Από ηελ άιιε ην Pencil Tool
έρεη κηα ζεκαληηθή δηαθνξά από ην Brush tool δηόηη όηαλ ζρεδηάδνπκε
κε απηό δελ εμνκαιύλνληαη νη πιεπξέο θαη νη άθξεο πνπ ζρεδηάζακε.
Clone Tool : Απηό ην εξγαιείν καο επηηξέπεη λα αληηγξάθνπκε κηα πεξηνρή
θξαηώληαο παηεκέλν ην πιήθηξν Alt θαη κεηά λα ζρεδηάδνπκε ηελ πεξηνρή
πνπ αληηγξάςακε ζε έλα άιιν κέξνο ηεο εηθόλαο
Eraser Tool : Μαο δίλεη ηελ δπλαηόηεηα λα ζβήζνπκε κηα πεξηνρή
ρξεζηκνπνηώληαο θάπνην πηλέιν ηεο επηινγήο καο
Paint Bucket Tool / Gradient Tool : Μπνξνύκε λα γεκίζνπκε κηα πεξηνρή κε
θάπνην ρξώκα θαη ην Gradient Tool καο δίλεη ηελ δπλαηόηεηα λα κεηαβνύκε
νκαιά από έλα ρξώκα ηεο επηινγήο καο ζε έλα άιιν ρξώκα.
Βlur / Sharpen / Smudge Tool : Τν Blur Tool θάλεη κηα πεξηνρή λα θαίλεηαη πην
ζνιή ελώ ην Sharpen Tool θάλεη κία πεξηνρή λα θαίλεηαη κε κεγαιύηεξε
ιεπηνκέξεηα . To smudge tool αιινηώλεη κηα πεξηνρή ηεο εηθόλαο
αλαθαηεύνληαο ηα ρξώκαηα ηεο.
Dodge / Burn / Sponge Tool : Τν dodge Tool θάλεη ην ρξώκα ζε κηα πεξηνρή
ηεο εηθόλαο πην αλνηρηόρξσκν ελώ ην Burn Tool ζθνπξαίλεη ην ρξώκα
ην Sponge Tool αθαηξεί ε πξνζζέηεη ρξώκα ζε κηα πεξηνρή ηεο εηθόλαο
Pen Tool : Απηό ην εξγαιείν καο δίλεη ηελ δπλαηόηεηα λα ηξαβήμνπκε κηα
γξακκή ε νπνία κπνξεί λα είλαη επζεία ε θακπύιε θαη κεηά λα ηελ ζρεδηάζνπκε
Path Selection Tool / Direct Selection Tool : Μαο επηηξέπεη λα επηιέμνπκε έλα
ηκήκα κηαο γξακκήο θαη λα ην επεμεξγαζηνύκε αλάινγα.
-26-
Rectangle / Rounded Rectangle / Eclipse Tool : Με ηα παξαπάλσ
εξγαιεία κπνξνύκε λα δεκηνπξγήζνπκε έλα ζρήκα ηεο επηινγήο καο θαη
λα ην πξνζαξκόζνπκε αλάινγα πρ ρξώκα κέγεζνο γξακκήο
3.4 Cocos 2d Animation Editor
Τν Cocos 2d animation editor έρεη εξγαιεία ηα νπνία καο επηηξέπνπλ λα δώζνπκε
κηα ε πεξηζζόηεξεο θηλήζεηο ζηνλ ραξαθηήξα πνπ ζρεδηάδνπκε. Σε αληίζεζε κε αιιά
εξγαιεία επηηξέπεη ηελ δεκηνπξγία ελόο ραξαθηήξα από μερσξηζηά κέξε/θνκκάηηα
αληί γηα ην θιαζζηθό frame by frame animation.
Δηθόλα 19: Cocos animation studio
Τν cocos animation editor απνηειείηαη από 2 Panel :
1. Τν Pose Mode ζην νπνίν πξνζζέηνπκε ηηο εηθόλεο πνπ απνηεινύλ ηνλ
ραξαθηήξα καο θαη ηα ηνπνζεηνύκε θαη ηα πεξηζηξέθνπκε ζηελ θαηάιιειε
ζέζε. Δπίζεο κπνξνύκε λα πξνζζέζνπκε ηα ιεγόκελα Bones ώζηε λα
δηεπθνιπλζνύκε αξγόηεξα ζην ζηάδην ηνπ Animation.
-27-
2. Τν Animation Panel ζην πάλσ κέξνο κπνξνύκε λα θηλήζνπκε ηα κέξε ηνπ
ραξαθηήξα πνπ ζέινπκε θαη θάησ ππάξρνπλ ηα key frames.
Αλάκεζα ζηα key frames ν ππνινγηζηήο ππνινγίδεη απηόκαηα ηελ θίλεζε ηνπ
ραξαθηήξα , απηό απνηειεί κεγάιε επθνιία.
3.5 Η βιβλιοθήκη Cocos-2d-x
Τν cocos-2d-x είλαη κηα open source βηβιηνζήθε κε MIT License πνπ παξέρεη κία
πξνγξακκαηηζηηθή δηαζύλδεζε (Application programming interface) θαη κπνξεί λα
ηξέμεη ζε πνιιέο πιαηθόξκεο. Μαο παξέρεη αξθεηέο δπλαηόηεηεο ηόζν γηα ηα γξαθηθά
όζν θαη γηα ηελ ινγηθή ηνπ παηρληδηνύ πρ physics ηα animation ηνπ ήρνπ θαη άιια.
Απηά όια πξαγκαηνπνηνύληαη κε ηελ θιήζε δηαθόξσλ κεζόδσλ πνπ καο παξέρεη ε
βηβιηνζήθε παξαθάησ αλαθέξνληαη ιεηηνπξγίεο ηεο :
- Sprite creation : Μπνξνύκε λα δεκηνπξγήζνπκε ηα ιεγόκελα Sprite ηα νπνία
νπζηαζηηθά είλαη δηζδηάζηαηεο εηθόλεο θαη ηα νπνία κεηά έρνπκε ηελ
δπλαηόηεηα λα πξνζαξκόζνπκε ην κέγεζνο ηελ ζέζε ηνπο θαη ηελ θιίζε/γσλία
κε θαηάιιειεο εληνιέο πνπ καο παξέρεη ε βηβιηνζήθε
- Scene Graph : Οη ζθελέο είλαη έλαο ηξόπνο λα νξγαλώζνπκε ην πεξηερόκελν
ηνπ παηρληδηνύ καο θάζε ζθελή κπνξεί λα απνηειείηαη από κηα ε πεξηζζόηεξεο
επηκέξνπο ζθελέο
- Actions : Τα Actions καο επηηξέπνπλ λα κεηαθηλήζνπκε έλα Sprite
ζηελ ηνπνζεζία πνπ ζέινπκε θαη ζηνλ ρξόλν πνπ ζέινπκε λα θηλεζεί.
- Parent Child : Η βηβιηνζήθε καο δίλεη ηελ δπλαηόηεηα λα ζπζρεηίζνπκε δπν
Sprites/Nodes έηζη ώζηε λα έρνπλ ηελ ζρέζε γνληνύ-παηδηνύ επνκέλσο νη
αιιαγέο ζηνλ γνληό επεξεάδνπλ θαη ην παηδί ηνπ ην αληίζηξνθν δελ ηζρύεη.
- Logging : Μπνξνύκε λα εκθαλίζνπκε κελύκαηα πνπ ζα καο βνεζήζνπλ
θαηά ηελ δεκηνπξγία ηνπ πξνγξάκκαηνο απηό γίλεηαη κε ηελ εληνιή log ε
CCLOG.
- Easing : Με απηή ηελ δπλαηόηεηα κπνξνύκε λα εμνκαιύλνπκε ην animation ε ην
action ελόο sprite ώζηε λα έρνπκε έλα πην θαιό απνηέιεζκα.
- Transitioning between Scene (Μεηάβαζε ζηηο ζθελέο) : Τν cocos2d-x επηηξέπεη
λα κεηαβνύκε από ηελ κηα ζθελή ζηελ άιιε επίζεο έρνπκε ηελ δπλαηόηεηα λα
πξνζζέζνπκε θάπνην εθέ ζηελ κεηάβαζε απηή.
-28-
- UI Components (Δηεπαθή ρξήζηε) : Μαο δίλεη ηελ δπλαηόηεηα λα θηηάμνπκε
labels, buttons, menus, sliders . Τα labels είλαη επηθεθαιίδεο γηα ηηο νπνίεο
κπνξνύκε λα επηιέμνπκε γξακκαηνζεηξά επίζεο κπνξνύκε λα πξνζζέζνπκε θαη
θάπνην εθέ εάλ ην επηζπκνύκε. Έπεηηα ππάξρνπλ ηα menu items ηα νπνία όηαλ ν
ρξήζηεο ηα θιηθάξεη θαινύλ κηα ζπλάξηεζε ε νπνία θάλεη κηα ζπγθεθξηκέλε
ιεηηνπξγία. Δπίζεο ππάξρεη θαη ην TextField ην νπνίν επηηξέπεη ζηνλ ρξήζηε λα
εηζάγεη έλα θείκελν.
- TileMap : Φξεζηκνπνηώληαο κηα εθαξκνγή πνπ κπνξεί λα παξάγεη αξρεία
ηύπνπ
TMX όπσο ην Tiled κπνξνύκε λα θνξηώζνπκε νιόθιεξνπο ράξηεο.
- Particle System : Έλα ζύζηεκα ην νπνίν καο επηηξέπεη λα δεκηνπξγήζνπκε
δηάθνξα εθέ ηα νπνία αλαθέξνληαη παξαθάησ εθόζνλ ηα ήδε ππάξρνληα εθέ
δελ καο θαιύπηνπλ κπνξνύκε λα ξπζκίζνπκε κόλνη καο ηηο παξακέηξνπο έηζη
ώζηε λα έρνπκε ην επηζπκεηό απνηέιεζκα
ParticleFire: Point particle system.
-ParticleFireworks: Point particle system.
-ParticleSun: Point particle system.
-ParticleGalaxy: Point particle system.
-ParticleFlower: Point particle system.
-ParticleMeteor: Point particle system.
-ParticleSpiral: Point particle system.
-ParticleExplosion: Point particle system.
-ParticleSmoke: Point particle system
-ParticleSnow: Point particle system
-ParticleRain: Point particle system.
-29-
- Parallax : Φξεζηκνπνηείηαη γηα λα καο δώζεη ηελ εληύπσζε όηη θηλείηαη ε εηθόλα
ηνπ background
- Event Despatcher : Μαο δίλεη ηελ δπλαηόηεηα λα ρξεζηκνπνηνύκε θάπνην
Input ώζηε ν ρξήζηεο λα κπνξεί λα αιιεινεπηδξά κε ηελ εθαξκνγή
Τα θύξηα Events είλαη ηα παξαθάησ:
- EventListenerTouch
Λακβάλεη είζνδν αθήο όπσο γηα παξάδεηγκα από έλα θηλεηό αθήο
- EventListenerKeyboard
Λακβάλεη είζνδν από ην πιεθηξνιόγην
- EventListenMouse
Λακβάλεη είζνδν από ην πνληίθη πρ νη ζπληεηαγκέλεο ηνπ
- Τξηζδηάζηαηα γξαθηθά (3D) : Δθηόο από δπζδηάζηαηα γξαθηθά ε
βηβιηνζήθε καο επηηξέπεη ηελ δεκηνπξγία ηξηζδηάζηαησλ γξαθηθώλ.
Παξαθάησ αλαθέξνληαη ζπλνπηηθά ε νξνινγία πνπ ρξεηάδεηαη γηα λα
θαηαιάβνπκε πσο ιεηηνπξγνύλ ηα ηξηζδηάζηαηα παηρλίδηα:
• Mesh
Έλα mesh απνηειείηαη από ζεκεία ζηνλ ρώξν ηα νπνία νλνκάδνληαη
vertices.
• Model
Τν κνληέιν είλαη έλα ζύλνιν από meshes ην νπνίν κπνξνύκε λα ην θάλνπκε
Render θαη ζπγθεθξηκέλα ζηελ βηβιηνζήθε αλαπαξηζηάηε σο Sprite3D.
• Texture
-30-
Οη επηθάλεηεο ησλ κνληέισλ κπνξνύλ λα έρνπλ απνηππσκέλα πάλσ ηνπο κηα
εηθόλα ώζηε λα έρνπκε έλα πην αιεζνθαλέο απνηέιεζκα.
• Camera
Γηα λα κπνξνύκε λα δνύκε ηνλ ηξηζδηάζηαην ρώξν πνπ δεκηνπξγήζακε
ρξεηαδόκαζηε κηα θάκεξα.
• Light
Ο θσηηζκόο ησλ κνληέισλ αιιάδεη αλάινγα κε ηνλ θσηηζκό πρ ε κεξηά ηνπ
κνληέινπ πνπ αληηθξίδεη ην θσο είλαη πην θσηεηλή ελώ ε άιιε ζθνηεηλή
• Animation
Τα ηξηζδηάζηαηα κνληέια πνπ έρνπκε θνξηώζεη κπνξνύκε λα ηα θάλνπκε λα
θηλνύληαη ζπλήζσο απηό γίλεηαη ζε έλα πξόγξακκα όπσο ην 3d Blender θαη
κεηά ην θνξηώλνπκε ζηελ βηβιηνζήθε
- Skybox : Μαο δίλεη ηελ δπλαηόηεηα λα πξνζζέζνπκε κηα εηθόλα γύξσ από ηελ
ηξηζδηάζηαηε ζθελή πνπ έρνπκε θηηάμεη.
- Terrain : Έλα ηνπίν κε δηαθνξεηηθό ζρήκα θαη δηαζηάζεηο
- BillBoard : Μηα εηθόλα πνπ πάληα θνηηάδεη ηελ θάκεξα απηό γηα παξάδεηγκα
κπνξεί λα ρξεζηκνπνηεζεί γηα λα θηηάμνπκε δέλδξα
- Physics : Κάλεη ην παηρλίδη λα έρεη κηα αιεζνθάλεηα ζηηο θηλήζεηο ησλ Sprite
απηό επηηπγράλεηαη κε ηελ πξνζνκνίσζε ηεο βαξύηεηαο ηεο ηξηβήο θαζώο θαη
ηεο ζύγθξνπζεο αλάκεζα ζηα αληηθείκελα.
Παξαθάησ αλαιύνληαη νξηζκέλα αληηθείκελα πνπ ρξεζηκνπνηεί ην Physics
engine:
-31-
- Physics Bodies : Πεξηέρνπλ βαζηθέο πιεξνθνξίεο γηα ην αληηθείκελν
όπσο γηα παξάδεηγκα ηελ κάδα ηελ ζέζε θαη ηελ ηαρύηεηα πνπ έρεη
- Material : Πεξηγξάθεη ραξαθηεξηζηηθά ηνπ αληηθεηκέλνπ όπσο ε
ππθλόηεηα ηνπ , ε ηξηβή θαη ε ειαζηηθόηεηα ηνπ.
- Shapes : Μαο δίλεη ηελ δπλαηόηεηα λα έρεη ην αληηθείκελν πνπ
επηζπκνύκε έλα ζρήκα βάζε ηνπ νπνίνπ λα ππνινγίδνληαη νη
ζπγθξνύζεηο , παξαθάησ αλαθέξνληαη ηα ζρήκαηα απηά.
- PhysicsShapeCircle
- PhysicsShapePolygon
- PhysicsShapeBox.
- PhysicsShapeEdgeSegment
- PhysicsShapeEdgePolygon
- PhysicsShapeEdgeBoxHollow
- PhysicsShapeEdgeChain
4 Δναλλακηικέρ πποηάζειρ ςλοποίηζηρ
Πεξηγξάθνληαη δηάθνξεο βηβιηνζήθεο θαη engine ηα νπνία κπνξνύλ λα
ρξεζηκνπνηεζνύλ γηα λα αλαπηπρζεί έλα 2d παηρλίδη αλ θαη πνιιέο από ηηο παξαθάησ
έρνπλ 3d δπλαηόηεηεο θαη ππνζηεξίδνπλ κηα ε πεξηζζόηεξεο γιώζζεο
πξνγξακκαηηζκνύ.
-32-
4.1 Η βιβλιοθήκη SDL
Η βηβιηνζήθε SDL (Simple DirectMedia Layer) είλαη κηα open source βηβιηνζήθε
γξακκέλε ζηελ γιώζζα C. Δίλαη open source θαη είλαη ζπκβαηή κε ηελ άδεηα MIT
ε ζπγθεθξηκέλε άδεηα επηηξέπεη ηελ ρξήζε θαη ηξνπνπνίεζε ηνπ θώδηθα ηεο
βηβιηνζήθεο αθόκα θαη γηα εθαξκνγέο πνπ έρνπλ θέξδνο.
Υπνζηεξίδεη ηα παξαθάησ ιεηηνπξγηθά Windows, Mac OS X, Linux, iOS θαη
Android.
Παξαθάησ δίλεηαη σο παξάδεηγκα ν θώδηθαο πνπ κπνξεί λα εκθαλίζεη κηα εηθόλα ζηελ
νζόλε:
-33-
if (SDL_Init(SDL_INIT_VIDEO) != 0)
{
std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
return 1;
}
SDL_Window *win = SDL_CreateWindow("Hello World!", 100, 100, 640, 480,
SDL_WINDOW_SHOWN);
if (win == nullptr)
{
std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
SDL_Quit();
return 1;
}
SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED |
SDL_RENDERER_PRESENTVSYNC);
if (ren == nullptr){
SDL_DestroyWindow(win);
std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
SDL_Quit();
return 1;
}
std::string imagePath = "hello.bmp";
SDL_Surface *bmp = SDL_LoadBMP(imagePath.c_str());
if (bmp == nullptr){
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl;
SDL_Quit();
return 1;
}
//To use a hardware accelerated texture for rendering we can create one from
//the surface we loaded
SDL_Texture *tex = SDL_CreateTextureFromSurface(ren, bmp);
//We no longer need the surface
SDL_FreeSurface(bmp);
if (tex == nullptr){
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() <<
std::endl;
SDL_Quit();
return 1;
}
for (int i = 0; i < 3; ++i){
//First clear the renderer
SDL_RenderClear(ren);
//Draw the texture
SDL_RenderCopy(ren, tex, NULL, NULL);
//Update the screen
SDL_RenderPresent(ren);
//Take a quick break after all that hard work
SDL_Delay(1000);
}
//Clean up our objects and quit
SDL_DestroyTexture(tex);
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
SDL_Quit();
return 0;
-34-
}
Παξόια απηά πνπ καο πξνζθέξεη ε βηβιηνζήθε SDL δελ καο παξέρεη δπλαηόηεηεο Physics
νύηε δηθηπαθήο εθαξκνγήο.
4.2 Η βιβλιοθήκη SFML
Η βηβιηνζήθε SFML σο θύξηα γιώζζα πξνγξακκαηηζκνύ ηελ C++ αιιά
ππνζηεξίδεη θαη άιιεο γιώζζεο όπσο C# Java θαη Python επίζεο ππνζηεξίδεη ηηο εμήο
πιαηθόξκεο Windows , Linux , Mac OS X.
Δίλαη αλνηρηνύ ινγηζκηθνύ θαη ζπγθεθξηκέλα έρεη ηελ άδεηα ZLIB
ε νπνία καο επηηξέπεη λα θάλνπκε ηελ εθαξκνγή είηε θιεηζηνύ θώδηθα ε θαη αλνηρηνύ
γηα εθαξκνγή κε ζηόρν ην θέξδνο ε δσξεάλ.
Μαο παξέρεη δηάθνξεο ιεηηνπξγείεο όπσο νη παξαθάησ :
Input , Multi-threading , ζρεδηαζκόο 2d sprite , ήρνο θαη εθαξκνγέο πνπ
ρξεζηκνπνηνύλ δίθηπν.
Παξαθάησ δίλεηαη κία απιή εθαξκνγή γξακκέλε ζε SMFL θαη C++ ε νπνία
δεκηνπξγεί έλα παξάζπξν γξάθεη έλα θείκελν παίδεη κηα κνπζηθή θαη εκθαλίδεη κηα
εηθόλα ζηελ νζόλε:
#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
int main()
{
// Create the main window
sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window");
// Load a sprite to display
sf::Texture texture;
if (!texture.loadFromFile("cute_image.jpg"))
return EXIT_FAILURE;
sf::Sprite sprite(texture);
// Create a graphical text to display
sf::Font font;
if (!font.loadFromFile("arial.ttf"))
return EXIT_FAILURE;
sf::Text text("Hello SFML", font, 50);
// Load a music to play
sf::Music music;
if (!music.openFromFile("nice_music.ogg"))
return EXIT_FAILURE;
-35-
// Play the music
music.play();
// Start the game loop
while (window.isOpen())
{
// Process events
sf::Event event;
while (window.pollEvent(event))
{
// Close window: exit
if (event.type == sf::Event::Closed)
window.close();
}
// Clear screen
window.clear();
// Draw the sprite
window.draw(sprite);
// Draw the string
window.draw(text);
// Update the window
window.display();
}
return EXIT_SUCCESS;
}
Η βηβιηνζήθε SMFL δελ ππνζηεξίδεη επίζεκα ηα ιεηηνπξγηθά Android θαη iOS
επίζεο δελ ππάξρεη ππνζηήξημε Physics.
4.3 Η βιβλιοθήκη libGDX
H αλνηρηνύ θώδηθα βηβιηνζήθε libGDX είλαη γξακκέλε θαη ρξεζηκνπνηεί ηελ
γιώζζα Java έρεη ηελ άδεηα Apache 2 ε νπνία καο επηηξέπεη λα ρξεζηκνπνηήζνπκε
ηελ βηβιηνζήθε γηα εθαξκνγή κε ε θαη ρσξίο θέξδνο θαη ππνζηεξίδεη ηηο πιαηθόξκεο
Windows, Linux, Mac OS X, Android ,BlackBerry, iOS επίζεο έρεη ππνζηήξημε γηα
web εθαξκνγέο ζηνπο browser Chrome, Safari, Opera, Firefox.
Μεξηθέο από ηηο δπλαηόηεηέο ηεο πεξηγξάθνληαη παξαθάησ :
- δηζδηάζηαηα θαη ηξηζδηάζηαηα γξαθηθά
- Physics (Box2D)
- file io
- user input
-36-
- audio (WAV, MP3 ,OGG)
Παξαθάησ δίλεηαη ν θώδηθαο πνπ ρξεηάδεηαη γηα λα εκθαληζηεί κηα εηθόλα ζηελ νζόλε:
package com.gamefromscratch.graphicsdemo;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
public class GraphicsDemo implements ApplicationListener {
private SpriteBatch batch;
private Texture texture;
private Sprite sprite;
@Override
public void create() {
batch = new SpriteBatch();
texture = new Texture(Gdx.files.internal("data/jet.png"));
sprite = new Sprite(texture);
}
@Override
public void dispose() {
batch.dispose();
texture.dispose();
}
@Override
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
batch.begin();
sprite.draw(batch);
batch.end();
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
}
-37-
Μεξηθά από ηα αξλεηηθά ηεο libgdx είλαη όηη ε δελ δηαζέηεη ηόζν θαιό
documentation , παξαδείγκαηα θαη όηη είλαη αξθεηά ρακεινύ επηπέδνπ ,
ζε ζρέζε κε άιιεο βηβιηνζήθεο.
4.4 Html 5 και javascript βιβλιοθήκη Phaser
Γηα Web εθαξκνγέο κπνξνύκε λα ρξεζηκνπνηήζνπκε κηα βηβιηνζήθε ε νπνία
ρξεζηκνπνηεί html 5 κέζσ ηνπ ζηνηρείνπ <canvas> ζην νπνίν κπνξνύκε ζρεδηάζνπκε
γξαθηθά κε ηελ βνήζεηα ηεο javascript.
Σπγθεθξηκέλα ε βηβιηνζήθε Phaser είλαη open source 2D θαη έρεη ηελ άδεηα MIT
Παξαθάησ δίλνληαη κεξηθέο από ηηο δπλαηόηεηεο πνπ καο πξνζθέξεη όπσο θαη επίζεο
θώδηθαο πνπ δείρλεη πσο ιεηηνπξγεί ε βηβιηνζήθε :
- Sprites
- Animation
- Physics
- Input (touch , mouse and keyboard)
- Sound
- Tilemaps
- Particles
var game = new Phaser.Game(800, 600, Phaser.AUTO, 'phaser-example', { preload: preload,
create: create, update: update });
function preload() {
-38-
game.load.image('lazur', 'assets/pics/thorn_lazur.png');
game.load.spritesheet('mummy', 'assets/sprites/metalslug_mummy37x45.png', 37, 45,
18);
}
var back;
var mummy;
var anim;
var loopText;
function create() {
back = game.add.image(0, -400, 'lazur');
back.scale.set(2);
back.smoothed = false;
mummy = game.add.sprite(200, 360, 'mummy', 5);
mummy.scale.set(4);
mummy.smoothed = false;
anim = mummy.animations.add('walk');
anim.onStart.add(animationStarted, this);
anim.onLoop.add(animationLooped, this);
anim.onComplete.add(animationStopped, this);
anim.play(10, true);
}
function animationStarted(sprite, animation) {
game.add.text(32, 32, 'Animation started', { fill: 'white' });
}
function animationLooped(sprite, animation) {
if (animation.loopCount === 1)
{
loopText = game.add.text(32, 64, 'Animation looped', { fill: 'white' });
}
else
{
loopText.text = 'Animation looped x2';
animation.loop = false;
}
}
function animationStopped(sprite, animation) {
game.add.text(32, 64+32, 'Animation stopped', { fill: 'white' });
}
function update() {
if (anim.isPlaying)
{
-39-
back.x -= 1;
}
}
Παξόιεο ηηο επθνιίεο πνπ καο πξνζθέξεη κηα web εθαξκνγή ε javascript είλαη πην αξγή
από κηα γιώζζα πνπ κεηαθξάδεηαη θαηεπζείαλ ζε γιώζζα κεραλήο νπόηε
θαη έρεη πην ρακειή απόδνζε
5 Κώδικαρ και επεξηγήζειρ
Παξνπζηάδεηαη θαη αλαιύεηαη ν θώδηθαο θαζώο θαη ηα θύξηα κέξε πνπ απνηεινύλ ηνλ
«ζθειεηό» ηνπ παηρληδηνύ όπσο θαη ηα βήκαηα γηα ηελ δεκηνπξγία ελόο Project ζην
Visual Studio ζε πεξηβάιινλ Windows.
5.1 Δγκαηάζηαζη ηηρ βιβλιοθήκηρ cocos2d-x
Αξρηθά θαηεβάδνπκε από ηελ ζειίδα ηελ πην πξόζθαηε έθδνζε ηεο βηβιηνζήθεο
-40-
Μεηά πξέπεη λα εγθαηαζηήζνπκε ηελ έθδνζε 2 ηνπ Python :
Έπεηηα πάκε ζηελ θνλζόια ησλ Windows θαη γξάθνπκε ηελ εμήο εληνιή
Ώζηε λα δεκηνπξγεζεί ην project ηνπ Visual Studio :
-41-
cd cocos2d-x : Δθεί πνπ απνζεθεύζακε/εμάγαγέ ηα αξρεία ηεο βηβιηνζήθεο
setup.py
cocos new MyGame -p com.MyCompany.MyGame -l cpp -d Directory
MyGame: ην όλνκα ηνπ project
-p com.MyCompany.MyGame: package name for android
-l cpp: ε γιώζζα πξνγξακκαηηζκνύ , κπνξνύκε λα επηιέμνπκε αλάκεζα ζε cpp θαη lua
-d : εδώ απνζεθεύεηαη ην project.
5.2 Κώδικαρ
Σε απηό ην θεθάιαην αλαιύεηαη ν θώδηθαο θαζώο θαη επεμεγείηαη ε βηβιηνζήθε
cocos2d-x ν νπνίνο είλαη γξακκέλνο ζηελ γιώζζα C++.
Τν πξόγξακκα μεθηλάεη ζην αξρείν AppDelegate κε ηελ ζπλάξηεζε
bool AppDelegate::applicationDidFinishLaunching()
Σηελ νπνία δεκηνπξγείηαη ε νζόλεο ηεο εθαξκνγήο , γίλεηαη δεκηνπξγία ηνπ
Opengl θαη θαζνξίδεηαη ε αλάιπζε ηεο νζόλεο
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
glview = GLViewImpl::create("My Game");
glview->setFrameSize(1024, 768);
director->setOpenGLView(glview);
Έπεηηα πξέπεη λα νξίζνπκε κηα ζθελή (scene) κε ηελ νπνία ζα ηξέμεη
auto menu = MainMenu::createScene();
director->runWithScene(menu);
-42-
Δπίζεο ππάξρνπλ δύν ζπλαξηήζεηο νη νπνίεο αλαιακβάλνπλ λα ζηακαηήζνπλ κεξηθέο
ιεηηνπξγίεο ηεο εθαξκνγήο όηαλ ε εθαξκνγή δελ είλαη ελεξγή
void AppDelegate::applicationDidEnterBackground()
{
Director::getInstance()->stopAnimation();
// if you use SimpleAudioEngine, it must be pause
// SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
}
// this function will be called when the app is active again
void AppDelegate::applicationWillEnterForeground()
{
Director::getInstance()->startAnimation();
}
Σην παξαθάησ θνκκάηη θώδηθα δεκηνπξγνύκε ηελ βαζηθή ζθελή όπνπ νξίδνπκε όηη ζα
ηξέρεη κε Physics θαζνξίδνπκε ηελ βαξύηεηα επίζεο δεκηνπξγνύκε ηελ δηεπαθή πνπ ζα
έρεη πιεξνθνξίεο όπσο ε δσή ηνπ παίρηε νη πόληνη θαη όηη άιιν ρξεηαζηνύκε.
Απαξαίηεην γηα λα ιεηηνπξγήζεη ε ζθελή (scene) πνπ δεκηνπξγήζακε είλαη λα
θηηάμνπκε θαη έλα layer
Scene* MainScene::createScene()
{
// 'scene' is an autorelease object
auto scene = Scene::createWithPhysics();
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
scene->getPhysicsWorld()->setGravity(Vec2(0,-1400));
// 'layer' is an autorelease object
auto layer = MainScene::create();
UserInterface* _hud = UserInterface::createLayer("The Enemy is approaching!");
scene->addChild(_hud, 1000);
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
}
-43-
Σηνλ παξαθάησ θώδηθα θάλνπκε ηα εμήο νξίδνπκε ηελ update ζπλάξηεζε ε νπνία
είλαη απαξαίηεηε γηα ην παηρλίδη, επίζεο νξίδνπκε κηα ζπλάξηεζε ε νπνία αλαιακβάλεη
λα επεμεξγάδεηαη ηα collision, έλα άιιν απαξαίηεην ζηνηρείν είλαη λα θνξηώζνπκε ην
animation ηνπ παίρηε ην νπνίν δεκηνπξγήζεθε ζην Cocos animation studio
bool MainScene::init()
{
//////////////////////////////
// 1. super init first
if ( !Layer::init() )
{
return false;
}
this->scheduleUpdate();
auto contactListener = EventListenerPhysicsContact::create();
contactListener->onContactBegin = CC_CALLBACK_1(MainScene::onContactBegin, this);
this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(contactListener,
this);
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
cocostudio::ArmatureDataManager::getInstance()-
>addArmatureFileInfo("test_animation.ExportJson");
sprite = Hero::CreateWithFile("test_animation");
Τν επόκελν βήκα είλαη λα δώζνπκε ζηνλ παίρηε έλα bounding box θαη λα ξπζκίζνπκε
ηηο ζπγθξνύζεηο (collisions) απηό γίλεηαη κε ηνλ παξαθάησ θώδηθα
material.density = 0.1;
material.restitution = 0.0;
material.friction = 0.5;
auto test = sprite->getBoundingBox().getMaxX() * 2;
phybody = PhysicsBody::createBox(Size(sprite->getBoundingBox().getMaxX() , sprite-
>getBoundingBox().getMaxY()), material);
sprite->setPhysicsBody(phybody);
phybody->setContactTestBitmask(0xFFFFFFFF);
phybody->setMass(10);
//CCLOG("%f", x);
phybody->setAngularVelocityLimit(0);
Αθνινπζεί ν θώδηθαο πνπ αλαιακβάλεη λα ρεηξηζηεί ηελ είζνδν ηνπ ρξήζηε από ην
πιεθηξνιόγην , απηό γίλεηαη δειώλνληαο 2 ζπλαξηήζεηο κηα όηαλ παηάκε έλα πιήθηξν
θαη ε άιιε όηαλ ην αθήλνπκε .
-44-
input = new InputHandler();
auto Keyboardlistener = EventListenerKeyboard::create();
Keyboardlistener->onKeyPressed = CC_CALLBACK_2((InputHandler::onKeyPressed), input);
Keyboardlistener->onKeyReleased = CC_CALLBACK_2(InputHandler::onKeyReleased, input);
Director::getInstance()->
getEventDispatcher()->addEventListenerWithSceneGraphPriority(Keyboardlistener, this);
Σηε ζπλέρεηα νξίδνπκε ην Pause Layer ην νπνίν είλαη έλα θνπκπί ην νπνίν εκθαλίδεηαη
θάησ από ηνλ παίρηε.
//PAUSE
pauseL = PauseLayer::createPauseLayer();
pauseL->runAction(Follow::create(this, Rect::ZERO));
pauseL->retain();
Μεηά βιέπνπκε ηνλ θώδηθα γηα ηελ δεκηνπξγία ησλ πιαηθνξκώλ κέζσ ηεο θιάζεο
Platform θαη ζπγθεθξηκέλα κε ηελ ζπλάξηεζε CreatePlatforms επίζεο πξνζζέηνπκε κηα
εηθόλα (texture) ζε θάζε πιαηθόξκα αλάινγα κε ηελ πίζηα πνπ είκαζηε
Platform* platform_obj = new Platform();
tvectors = platform_obj->CreatePlatforms(sprite->getContentSize(),sprite-
>getscalefactor());
for (int i = 0; i != tvectors.size(); i++)
{
if (lvl == level_snow){
tvectors.at(i)->setTexture("snow_tile.png");
}
this->addChild(tvectors.at(i));
}
Τν επόκελν βήκα είλαη λα δώζνπκε κηα αθεηεξία ζηνλ παίρηε καο
//start at the first tile wich is tile number 0
-45-
sprite->startpos = tvectors.at(0)->getPosition();
sprite->startpos.y = sprite->startpos.y*1.5;
sprite->setPosition(sprite->startpos);
Σηνλ παξαθάησ θώδηθα πξνζζέηνπκε ηνπο ερζξνύο πνπ βξίζθνληαη πάλσ ζηα θνπηηά
(tiles) κε κηα πηζαλόηεηα θάζε tile λα έρεη ερζξό απηό γίλεηαη κε ηελ βνήζεηα ηεο
θιάζεο Platform θαη ηεο ζπλάξηεζεο CreatePlatforms
Platform* platform_obj = new Platform();
tvectors = platform_obj->CreatePlatforms(sprite->getContentSize(),sprite-
>getscalefactor());
for (int i = 0; i != tvectors.size(); i++)
{
if (lvl == level_snow){
tvectors.at(i)->setTexture("snow_tile.png");
}
this->addChild(tvectors.at(i));
}
Σηνλ παξαθάησ θώδηθα δεκηνπξγνύκε έλα physics body γηα ην sprite ην νπνίν
αληηπξνζσπεύεη ηνλ ερζξό ώζηε λα κπνξνύκε λα ην ρξεζηκνπνηήζνπκε αξγόηεξα
spiked_enemy = Enemy::CreateWithFile("ball_enemyC.png");
this->addChild(spiked_enemy, 1000);
spiked_enemy->setScale(sprite->getscalefactor()*0.5);
PhysicsBody* phyenemy = PhysicsBody::createBox(
Size(spiked_enemy->getBoundingBox().getMaxX()*2,spiked_enemy-
>getBoundingBox().getMaxY()*2));
spiked_enemy->setPhysicsBody(phyenemy);
phyenemy->setDynamic(false);
Μέζσ ηεο ζπλάξηεζεο PopulateLevel δεκηνπξγνύκε ηνπο ερζξνύο πάλσ ζηηο
πιαηθόξκεο κε κηα πηζαλόηεηα πνπ έρνπκε θαζνξίζεη θαη ην απνηέιεζκα ην
απνζεθεύνπκε ζε έλα vector.
-46-
std::vector< Enemy *> vecEn =spiked_enemy->populateLevel( 40,tvectors);
//begin spawning enemies from second platform wich is platform .at(1)
for (int i = 1; i != vecEn.size(); i++)
{
this->addChild(vecEn.at(i), i + 10);
vecEn.at(i)->setScale(sprite->getscalefactor()*0.5);
PhysicsBody* phye = PhysicsBody::createBox(Size(spiked_enemy-
>getBoundingBox().getMaxX() * 2, spiked_enemy->getBoundingBox().getMaxY() * 2));
phye->setContactTestBitmask(0xFFFFFFFF);
vecEn.at(i)->setPhysicsBody(phye);
vecEn.at(i)->getPhysicsBody()->setDynamic(false);
//vecEn.at(i)->setPhysicsBody(phyenemy);
}
for (int i = 1; i < tvectors.size(); i++)
{
if (tvectors.at(i)->getHasEnemy() == false){
tvectors.at(i)->getPhysicsBody()->setDynamic(true);
tvectors.at(i)->getPhysicsBody()->setGravityEnable(false);
}
}
Έπεηηα δεκηνπξγνύκε έλα particle effect από απηά ηα νπνία είλαη δηαζέζηκα ζηελ
βηβιηνζήθε ην ζπγθεθξηκέλν είλαη ρηόλη θαη ξπζκίδνπκε νξηζκέλεο παξακέηξνπο
if (lvl== level_snow){
_psnow = ParticleSnow::create();
this->addChild(_psnow, 1000);
_psnow->setSpeed(100);
_psnow->setSpeedVar(50);
}
Μεηά έρνπκε ηελ ζπλάξηεζε onEnter ε νπνία εθηειείηαη κηα θνξά όηαλ μεθηλάεη λα
ηξέμεη ε ζθελή MainScene
void MainScene::onEnter()
{
CCNode::onEnter();
this->scheduleUpdate();
this->runAction(Follow::create(sprite, Rect::ZERO));
}
Παξαθάησ βξίζθεηαη ν θώδηθαο ηεο Update ζπλάξηεζεο ε νπνία ηξέρεη
60 θνξέο αλά δεπηεξόιεπην αιιά αλ ην επηζπκνύκε κπνξνύκε λα αιιάμνπκε
-47-
απηή ηελ ξύζκηζε. Δίλαη κηα πνιύ ζεκαληηθή ζπλάξηεζε ε νπνία απνηειεί ην loop ηνπ
παηρληδηνύ ζηελ νπνία ειέγρνπκε γηα ην input ηνπ ρξήζηε , θηλνύκε ηνλ ραξαθηήξα θαη
ηα tiles.
void MainScene::update(float dt)
{
//MOVING PLATFORMS
for (int i = 1; i < tvectors.size(); i++)
{
if (tvectors.at(i)->getHasEnemy() == false)
{
//tvectors.at(i)->getPhysicsBody()->setLinearDamping(1.0f);
tvectors.at(i)->getPhysicsBody()->addMass(999999999999);
tvectors.at(i)->getPhysicsBody()->setAngularVelocityLimit(0);
tvectors.at(i)->getPhysicsBody()->setAngularVelocity(0);
static float timer = 0;
timer = timer + dt;
//time = 5sec
if (timer < 50.0f)
tvectors.at(i)->getPhysicsBody()->setVelocity(Vec2(50,0));
if (timer > 50.0f)
{
tvectors.at(i)->getPhysicsBody()->setVelocity(Vec2(-50, 0));
}
if (timer > 100)
timer = 0;
}
}
static bool added = false;
if (input->getPaused() == true && added==false){
Director::getInstance()->getRunningScene()->pause();
sprite->getAnimation()->pause();
Director::getInstance()->getRunningScene()->getPhysicsWorld()->setSpeed(0);
pauseL->setPosition(Vec2(sprite->getPositionX(), sprite->getPositionY()));
this->addChild(pauseL, 10000);
added = true;
}
else if (input->getPaused() == false && added == true)
{
sprite->getAnimation()->resume();
Director::getInstance()->resume();
Director::getInstance()->getRunningScene()->getPhysicsWorld()->setSpeed(1);
pauseL->removeFromParent();
added = false;
}
phybody->setVelocityLimit(1000);
-48-
//CCLOG("%f", dt);
if (input->getJumped())
{
if (input->getjumpCounter() <= 2)
this->phybody->applyImpulse(Vect(0, 30000 * sprite->getscalefactor()));
input->setJumped(false);
}
if (input->getmovedLeft() && !(input->getmovedRight() ))
{
this->phybody->applyImpulse(Vect(-300, 0));
//phybody->setVelocityLimit(700);
Vec2 temp2 = phybody->getVelocity();
if (temp2.y > 50 || temp2.y < -50)
phybody->setVelocity(Vec2(phybody->getVelocity().x*0.95, phybody-
>getVelocity().y));
}
else if (input->getmovedRight() && !( input->getmovedLeft() ) )
{
this->phybody->applyImpulse(Vect(300, 0));
//phybody->setVelocityLimit(700);
Vec2 temp2 = phybody->getVelocity();
if (temp2.y > 10 || temp2.y < -10)
phybody->setVelocity(Vec2(phybody->getVelocity().x*0.95, phybody-
>getVelocity().y));
}
else{
//Reduse speed when release keys
Vec2 temp2 = phybody->getVelocity();
if (temp2.x > 10 || temp2.x < -10)
phybody->setVelocity(Vec2(phybody->getVelocity().x*0.75, phybody-
>getVelocity().y));
}
float speedx = phybody->getVelocity().x;
float speedy = phybody->getVelocity().y;
if (speedx > 10 && speedy > -1 && speedy < 1 && input->getmovedRight() ){
//input->jumpcounter = 0;
curr_anime = walk_right;
if (curr_anime == walk_right&&prev_anime != walk_right){
if (sprite->getScaleX() < 0)
sprite->setScaleX(sprite->getScaleX()*-1);
sprite->getAnimation()->playWithIndex(1);
}
}
if (speedx < -10 && speedy>-1 && speedy < 1 && input->getmovedLeft())
{
//input->jumpcounter = 0;
-49-
curr_anime = walk_left;
if (curr_anime == walk_left&&prev_anime != walk_left)
{
if (sprite->getScaleX() > 0)
sprite->setScaleX(sprite->getScaleX()*-1);
sprite->getAnimation()->playWithIndex(1);
}
}
if (speedy > 10)
{
curr_anime = jumping;
if (curr_anime == jumping && prev_anime != jumping)
{
sprite->getAnimation()->playWithIndex(2);
}
}
if (speedy < -50)
{
curr_anime = falling;
if (curr_anime == falling && prev_anime != falling)
{
sprite->getAnimation()->playWithIndex(3);
}
}
if (speedx < 50 && speedx > -50 && speedy < 50 && speedy > -50)
{
//input->jumpcounter = 0;
curr_anime = idle;
if (curr_anime == idle&&prev_anime != idle)
{
//sprite->setScaleX(sprite->getScaleX()*-1);
sprite->getAnimation()->playWithIndex(0);
}
}
Έπεηηα αθνινπζεί ν θώδηθαο γηα ηνλ εληνπηζκό ζπγθξνύζεσλ αλάκεζα ζηα sprite ηνπ
παηρληδηνύ ε ζπλάξηεζε onContactBegin εθηειείηαη όηαλ γίλεη κία ηέηνηα ζύγθξνπζε
bool MainScene::onContactBegin(cocos2d::PhysicsContact &contact)
{
Node *a = contact.getShapeA()->getBody()->getNode();
Node *b = contact.getShapeB()->getBody()->getNode();
std::string ac = a->getName();
std::string bc = b->getName();
Node *tilenode;
if (a->getName() == "tile")
-50-
tilenode = a;
else tilenode = b;
//player Tile collision
if (ac == "test_animation" && bc == "tile" || ac == "tile" && bc == "test_animation"
){
auto spritey = sprite->getPositionY();
auto tilenodey = tilenode->getPositionY();
auto cdata =contact.getContactData()->normal.y;
if (spritey > tilenodey && (cdata >= -1 || cdata<=1) ){
input->setJumpCounter(0);
return true;
}
else return false;
}
Node*t;
//player Enemy collision
if (ac == "test_animation" && bc == "enemy" || ac == "enemy" && bc ==
"test_animation")
{
Hero::hp--;
if (lvl == level_grass)
phybody->applyImpulse(-100000 * contact.getContactData()->normal);
if (lvl == level_snow)
phybody->applyImpulse(100000 * contact.getContactData()->normal);
return true;
}
}
Σηε ζπλέρεηα ζην αξρείν Platform.cpp έρνπκε ηνλ θώδηθα ν νπνίνο δεκηνπξγεί ηηο
πιαηθόξκεο ζε ηπραία ζεκεία ηεο πίζηαο κε ηελ ρξήζε ηεο uniform_int_distribution
std::vector<Platform*> Platform::CreatePlatforms(cocos2d::Size spriteSize,float
spriteScalef)
{
std::vector<Platform*> tilevector;
std::random_device rd;
// seed algorithm with rd
std::mt19937 mt(rd());
//range
std::uniform_int_distribution<int> dist(1, 3);
std::uniform_int_distribution<int> dist12(1, 100);
std::uniform_int_distribution<int> dist23(2, 3);
//generate random sector
int randsector = dist(mt);
int secpos1 = 0;
int secpos2 = static_cast<int>(spriteSize.width*0.25 * 3);
-51-
int secpos3 = static_cast<int>(spriteSize.width*0.25 * 6);
int Swidth = static_cast<int> (spriteSize.width*spriteScalef);
int Sheigth = static_cast<int> (spriteSize.height*spriteScalef);
int minheight = static_cast<int>(Sheigth * 1.5);
int maxheight = static_cast<int>(Sheigth * 1.9);
std::uniform_int_distribution<int> sector1(0, Swidth*1.5);
int randpos1 = sector1(mt);
std::uniform_int_distribution<int> height(minheight, maxheight);
int platformh = height(mt);
//int plength1 = randpos1 + Swidth;
float start = 0;
switch (randsector)
{
case 1:
start = secpos1;
break;
case 2:
start = secpos2;
break;
default:
start = secpos3;
break;
}
PhysicsBody* platforms;
auto sp = Sprite::create("tile_new.png");
int prevheight = 0;
Vec2 PolyVector[4];
float spriteSfactor = spriteScalef;
sp->setScale(0.2);
//sp->setScaleX(5 * spriteSfactor);
PolyVector[0] = Vec2(sp->getBoundingBox().getMaxX(), sp->getBoundingBox().getMaxY());
PolyVector[1] = Vec2(sp->getBoundingBox().getMaxX(), sp->getBoundingBox().getMinY());
PolyVector[2] = Vec2(sp->getBoundingBox().getMinX(), sp->getBoundingBox().getMinY());
PolyVector[3] = Vec2(sp->getBoundingBox().getMinX(), sp->getBoundingBox().getMaxY());
struct secCounter
{
int sec1 = 0;
int sec2 = 0;
int sec3 = 0;
}Scounter;
int prevsec = 0;
int temprand = 0;
Platform* tiles;
for (int i = 0; i <20; i++)
{
tiles = Platform::CreateWithFile("tile_new.png");
-52-
//tiles->setScaleY(2.8*spriteSfactor);
//tiles->setScaleX(5 * spriteSfactor);
tiles->setScale(0.2);
tiles->setName("tile");
platforms = PhysicsBody::createPolygon(PolyVector, 4);
platforms->setDynamic(false);
platforms->setContactTestBitmask(0xFFFFFFFF);
tiles->setPhysicsBody(platforms);
tiles->setPosition(start + randpos1, platformh);
//this->addChild(tiles, i * 10);
tilevector.push_back(tiles);
randpos1 = sector1(mt);
prevheight = height(mt);
platformh = prevheight + platformh;
prevsec = randsector;
//randsec=rand(1,3);
temprand = dist12(mt);
if (prevsec == 1){
if (temprand > 80)
randsector = 1;
else if (temprand <= 80 /*&& temprand>40*/)
randsector = 2;
//else
//randsector = 3;
}
else if (prevsec == 2){
if (temprand > 80)
randsector = 2;
else if (temprand <= 80 && temprand>40)
randsector = 1;
else
randsector = 3;
}
else
{
if (temprand > 80)
randsector = 3;
else if (temprand <= 80 /*&& temprand>40*/)
randsector = 2;
// else
// randsector = 1;
}
switch (randsector)
{
case 1:
start = secpos1;
break;
case 2:
start = secpos2;
-53-
break;
default:
start = secpos3;
break;
}
switch (randsector)
{
case 1:
start = secpos1;
break;
case 2:
start = secpos2;
break;
default:
start = secpos3;
break;
}
}
return tilevector;
}
Αθνινπζεί ν θώδηθαο ζην αξρείν Input.cpp ην νπνίν αλαιακβάλεη ηελ είζνδν ηνπ
ρξήζηε από ην πιεθηξνιόγην.
Τν πξώην θνκκάηη ηνπ θώδηθα θαιείηαη όηαλ ν ρξήζηεο παηάεη έλα πιήθηξν
InputHandler::InputHandler()
{
jump = false;
moveright = false;
moveleft = false;
jumpcounter = 0;
paused = false;
}
//Implementation of the keyboard event callback function prototype
void InputHandler::onKeyPressed(EventKeyboard::KeyCode keyCode, Event* event)
{
//log("Key with keycode %d pressed", keyCode);
/*if (keyCode == EventKeyboard::KeyCode::KEY_SPACE)
reset = true;*/
switch (keyCode)
{
case EventKeyboard::KeyCode::KEY_ESCAPE:
if (paused==true)
paused = false;
-54-
else paused = true;
break;
case EventKeyboard::KeyCode::KEY_UP_ARROW:
jump = true;
jumpcounter++;
break;
case EventKeyboard::KeyCode::KEY_RIGHT_ARROW:
moveright = true;
break;
case EventKeyboard::KeyCode::KEY_LEFT_ARROW:
moveleft = true;
break;
default:
break;
}
}
Τν δεύηεξν θνκκάηη ηνπ θώδηθα εθηειείηαη όηαλ ν ρξήζηεο αθήλεη έλα πιήθηξν
void InputHandler::onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event)
{
//log("Key with keycode %d released", keyCode);
switch (keyCode)
{
case EventKeyboard::KeyCode::KEY_SPACE:
case EventKeyboard::KeyCode::KEY_UP_ARROW:
jump = false;
break;
case EventKeyboard::KeyCode::KEY_RIGHT_ARROW:
moveright = false;
break;
case EventKeyboard::KeyCode::KEY_LEFT_ARROW:
moveleft = false;
break;
default:
break;
}
}
Δπίζεο έρνπκε ην αξρείν Foo.h ζην νπνίν πινπνηείηαη ν παίρηεο δίλνληαο
ηνπ πόληνπο δσήο θαζώο θαη κηα αξρηθή ζέζε θιεξνλνκεί από ηελ θιάζε
Armature δηόηη ν παίρηεο έρεη ηδηόηεηεο animation
-55-
class Hero : public cocostudio::Armature{
float scalefactor;
//float correction;
public:
static int hp;
cocos2d::Vec2 startpos;
cocos2d::Vec2 getStartpos();
float getscalefactor();
float getoffsetY();
Hero();
~Hero();
static Hero* CreateWithFile(char*);
void setStartPos(cocos2d::Vec2 sp);
};
Δπίζεο ζηα αξρεία UserInterface.cpp θαη UserInterface.h έρνπκε ηνλ θώδηθα πνπ
αλαιακβάλεη λα παξνπζηάζεη ζηελ νζόλε ηελ δσή ηνπ παίρηε πνληνπο θαη άιια
Κιεξνλνκεί απν ηελ θιάζε Layer
class UserInterface : public cocos2d::Layer
{
Sprite* heartsp;
std::vector<Sprite*> heartvec;
public:
int hp;
UserInterface();
~UserInterface();
virtual void update(float dt);
static UserInterface* createLayer(const std::string& _message);
void initOptions(const std::string& _message);
virtual void onEnter();
inline virtual cocos2d::Label* getMessageLabel() { return _messageLabel; };
private:
cocos2d::Label* _messageLabel;
};
#endif // _MESSAGEHUD_HPP_
-56-
UserInterface::UserInterface() {}
UserInterface::~UserInterface() {}
UserInterface* UserInterface::createLayer(const std::string& _message)
{
UserInterface* a = new UserInterface();
a->create();
//a->setColor(cocos2d::Color3B(0, 0, 0));
//a->setContentSize(cocos2d::Size::Size(1, 1));
//a->setAnchorPoint(cocos2d::Vec2(0, 0));
a->initOptions(_message);
return a;
}
void UserInterface::initOptions(const std::string& _message)
{
_messageLabel = Label::createWithTTF(_message.c_str(), "fonts/Marker Felt.ttf",36);
//_messageLabel->setColor(cocos2d::Color3B(255, 215, 0));
addChild(_messageLabel, 1);
_messageLabel->setPosition(cocos2d::Vec2(Director::getInstance()-
>getVisibleSize().width,
Director::getInstance()->getVisibleSize().height));
hp = Hero::hp;
Director* director = Director::getInstance();
for (int i = 0; i <hp; i++){
heartsp = Sprite::create("heart.png");
heartvec.push_back(heartsp);
heartsp->setScale(0.5);
// heartsp->setOpacity(200);
heartsp->setPosition(director->getVisibleOrigin().x + heartsp-
>getBoundingBox().getMaxX()+i*100, director->getVisibleSize().height - heartsp-
>getBoundingBox().getMaxY());
this->addChild(heartsp);
}
this->scheduleUpdate();
}
void UserInterface::update(float dt)
{
if (Hero::hp<hp){
if (heartvec.size() > 0) {
heartvec.back()->removeFromParent();
heartvec.pop_back();
}
hp--;
}
//CCLOG("%d",heartvec.size());
-57-
/*if (heartsp != NULL){
heartsp->removeFromParent();
heartsp = NULL;
}*/
}
void UserInterface::onEnter()
{
6 ςμπεπάζμαηα
Μηα εθαξκνγή θαη πην ζπγθεθξηκέλα έλα παηρλίδη δηζδηάζηαην απνηειείηαη από
νξηζκέλα ζηνηρεία όπσο γηα παξάδεηγκα ε είζνδνο ηνπ ρξήζηε (user input)
έλα physics engine ηα παξαπάλσ αλαπηύρζεθαλ ζηα πξνεγνύκελα θεθάιαηα θαη
απνηεινύλ γλώζεηο νη νπνίεο κπνξνύλ λα εθαξκνζηνύλ ζε έλα δηζδηάζηαην παηρλίδη
αθόκα θαη ζε έλα ηξηζδηάζηαην παηρλίδη.
Τν θνκκάηη ησλ γξαθηθώλ είλαη επίζεο πνιύ βαζηθό δηόηη απηό βιέπεη ν ρξήζηεο,
ζε απηή ηελ πηπρηαθή έγηλε εθκάζεζε θαη ρξήζε πξνγξακκάησλ απαξαίηεησλ γηα ηελ
δεκηνπξγία δηζδηάζηαησλ γξαθηθώλ.
Τέινο ππάξρεη ην θνκκάηη ηνπ θώδηθα πνπ απαηηεί ηδηαίηεξε πξνζνρή θαη ζην νπνίν
έγηλε εθκάζεζε θαη ρξήζε ηεο γιώζζαο C++ θαη ηεο βηβιηνζήθεο cocos2d-x.
-59-
Βιβλιογπαθία
[1] Accelerated C++ (Andrew Koenig and Barbara Moo)
[2] Effective Modern C++ (Scott Meyers)
[3] Beginning C++ Through Game Programming
[3] http://en.cppreference.com/
[4] https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview
[4] http://www.cocos2d-x.org/docs/ProgrammersGuide.pdf
Παπάπηημα Α
Οδεγίεο ρξήζεο εθαξκνγήο :
Παξαθάησ πεξηγξάθεηαη ν ηξόπνο ρξήζεο ηεο εθαξκνγήο θαζώο θαη ηα πιήθηξα
πνπ πξέπεη λα παηήζεη ν ρξήζηεο γηα λα θηλεζεί κέζα ζηελ πίζηα.
Αξρηθά εκθαλίδεηαη ην Menu ζην νπνίν πξέπεη λα παηήζνπκε Play,
ζηελ νζόλε παξνπζηάδεηαη ν παίθηεο ηνλ νπνίν κπνξνύκε λα ρεηξηζηνύκε πεδόληαο ζηηο
πιαηθόξκεο κε ζθνπό λα θηάζνπκε ζην ηέινο ηεο πηζηαο απνθεύγνληαο ηνπο ερζξνύο
νη νπνίνη βξίζθνληαη πάλσ ζηηο πιαηθόξκεο. Δπίζεο νξηζκέλεο πιαηθόξκεο θηλνύληαη
νπόηε ρξεηάδεηαη πξνζνρή ζηνλ ρεηξηζκό ηνπ ήξσα.
-60-
Τα πιήθηξα πνπ ρξεζηκνπνηνύληαη ζηελ εθαξκνγή είλαη ηα εμήο :
- Key_up : Κάλεη ηνλ παίρηε λα ρνξνπεδάεη , κπνξνύκε λα ην παηήζνπκε δύν θνξέο
εηζη ώζηε ν ήξσαο λα πεδήμεη πην ςειά πξάγκα ην νπνίν είλαη απαξαίηεην γηα λα πάκε
από πιαηθόξκα ζε πιαηθόξκα.
- Key_right : Μεηαθηλεί ηνλ ήξσα ζηα δεμηά (Μπνξεί λα ρξεζηκνπνηεζεί θαη όηαλ ν
ήξσαο βξίζθεηαη ζηνλ αέξα)
- Key_left : Μεηαθηλεί ηνλ ήξσα ζηα αξηζηεξά (Μπνξεί λα ρξεζηκνπνηεζεί θαη όηαλ ν
ήξσαο βξίζθεηαη ζηνλ αέξα)
- Key_Escape : Μαο δίλεη ηελ δπλαηόηεηα λα «παγώζνπκε» ην παηρλίδη θαη λα ην
ζπλερίζνπκε όηαλ ζέινπκε, επίζεο κπνξνύκε λα επηζηξέςνπκε ζην αξρηθό Menu θαη λα
ηεξκαηίζνπκε ηελ εθαξκνγή
-61-
Ο ήξσαο έρεη 3 δσέο νη νπνίεο βξίζθνληαη πάλσ αξηζηεξά , νηαλ ν ήξσαο
ζπγθξνπζηεί κε έλαλ απν ηνπο ερζξνύο απσζείηαη απν απηόλ θαη ράλεη κηα δσή. Οηαλ
ράζνπκε θαη ηελ ηειεπηαία δσή ν παίρηεο ηνπνζεηείηαη πάιη ζηελ αξρή ηνπ επηπέδνπ.
Οηαλ δνύκε ηα πνιύρξσκα ππξνηερλήκαηα ζην ηέινο ηνπ επηπέδνπ ζεκαίλεη νηη
ν παίρηεο ηεξκάηηζε.