Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά...

71
ΑΣΕΙ ΘΕΑΛΙΑ ΧΟΛΗ ΣΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ Σμήμα Μηχανικών Πληροφορικής ΣΕ Δημιουργία παιχνιδιοφ ςτη C++ Π ΣΤΧΙΑΚΗ Ε ΡΓΑΙΑ ΜΑΡΚΟΤ ΓΙΩΡΓΟ(ΑΜ: Σ03274) Επιβλέπων: Κακαρόντζας Γεώργιος, Επίκουρος καιηγητθς ΛΑΡΙΑ 2017

Transcript of Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά...

Page 1: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

ΑΣΕΙ ΘΕΑΛΙΑ ΧΟΛΗ ΣΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ

Σμήμα Μηχανικών Πληροφορικής ΣΕ

Δημιουργία παιχνιδιοφ

ςτη C++

ΠΣΤΧΙΑΚΗ ΕΡΓΑΙΑ

ΜΑΡΚΟΤ ΓΙΩΡΓΟ(ΑΜ: Σ03274)

Επιβλέπων: Κακαρόντζας Γεώργιος, Επίκουρος καιηγητθς

ΛΑΡΙΑ 2017

Page 2: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε
Page 3: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

«Εγώ ν/ε Μάξθνπ Γεώξγηνο , δειώλω ππεύζπλα όηη ε παξνύζα Πηπρηαθή Εξγαζία κε ηίηιν

Δεκηνπξγία παηρληδηνύ ζηελ C++ είλαη δηθή κνπ θαη βεβαηώλω όηη:

Σε όζεο πεξηπηώζεηο έρω ζπκβνπιεπηεί δεκνζηεπκέλε εξγαζία ηξίηωλ, απηό

επηζεκαίλεηαη κε ζρεηηθή αλαθνξά ζηα επίκαρα ζεκεία.

Σε όζεο πεξηπηώζεηο κεηαθέξω ιόγηα ηξίηωλ, απηό επηζεκαίλεηαη κε ζρεηηθή αλαθνξά

ζηα επίκαρα ζεκεία. Με εμαίξεζε ηέηνηεο πεξηπηώζεηο, ην ππόινηπν θείκελν ηεο

πηπρηαθήο απνηειεί δηθή κνπ δνπιεηά.

Αλαθέξω ξεηά όιεο ηηο πεγέο βνήζεηαο πνπ ρξεζηκνπνίεζα.

Σε πεξηπηώζεηο πνπ ηκήκαηα ηεο παξνύζαο πηπρηαθήο έγηλαλ από θνηλνύ κε ηξίηνπο,

αλαθέξω ξεηά πνηα είλαη ε δηθή κνπ ζπλεηζθνξά θαη πνηα ηωλ ηξίηωλ.

Γλωξίδω πωο ε ινγνθινπή απνηειεί ζνβαξόηαην παξάπηωκα θαη είκαη ελήκεξνο(-ε) γηα

ηελ επέιεπζε ηωλ λνκίκωλ ζπλεπεηώλ»

Υπνγξαθή

Μάξθνπ Γηώξγνο

Page 4: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

Δγθξίζεθε από ηελ ηξηκειή εμεηαζηηθή επηηξνπή

Σόπος:

Ημερομηνία:

ΕΠΙΣΡΟΠΗ ΑΞΙΟΛΟΓΗΗ

1.

2.

3.

Page 5: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-i-

Πεπίλητη

Η εξγαζία απηή απνηειείηαη από ηελ αλάπηπμε ελόο 2D platformer παηρληδηνύ

Η γιώζζα πξνγξακκαηηζκνύ πνπ έρεη επηιερζεί είλαη ε C++ θαη ζα

γίλεη ε ρξήζε ηεο βηβιηνζήθεο cocos2d-x πνπ παξέρεη αξθεηά εξγαιεία

θαη ιεηηνπξγίεο γηα ηελ αλάπηπμε ελόο παηρληδηνύ.

Η εξγαζία πεξηιακβάλεη επίζεο ην ζρεδηαζκό γξαθηθώλ κε ηα θαηάιιεια

πξνγξάκκαηα.

Page 6: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε
Page 7: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-iii-

Δςσαπιζηίερ

Θα ήζεια λα επραξηζηήζσ γνλείο θαη ζπγγελείο γηα ηελ ζπλερή ζηεξημή ηνπο

θαζώο θαη ηνπο θαζεγεηέο κνπ γηα ηηο γλώζεηο πνπ κνπ κεηέδσζαλ.

Μάξθνπ Γηώξγνο

5/4/2017

Page 8: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε
Page 9: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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

Page 10: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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

Page 11: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-1-

1 Διζαγυγή

Η αλάπηπμε ελόο παηρληδηνύ απνηειείηαη από νξηζκέλα ζηάδηα.

Σηα παξαθάησ θεθάιαηα ζα αλαπηπρζεί ε δηαδηθαζία απηή δειαδή ζα γίλεη παξνπζίαζε

θαη επεμήγεζε ηνπ θώδηθα θαη ησλ εξγαιείσλ πνπ ρξεζηκνπνηήζεθαλ, απηά είλαη ην

Visual studio γηα ηελ επεμεξγαζία ηνπ θώδηθα ην Adobe Illustrator, θαη ην Gimp ην γηα

ηελ δεκηνπξγία ησλ γξαθηθώλ.

Η γιώζζα πξνγξακκαηηζκνύ πνπ επηιέρζεθε είλαη ε C++.

Θα αλαθεξζνύλ ηα επηκέξνπο ραξαθηεξηζηηθά ηεο γιώζζαο πνπ ρξεζηκνπνηήζεθαλ,

ζα γίλεη ε ηζηνξηθή αλαδξνκή ηεο γιώζζαο θαζώο θαη νη ηζηνξηθέο εμειίμεηο πνπ

νδήγεζαλ ζηελ δεκηνπξγία ηεο. Δπίζεο ζα γίλεη αλαθνξά ζηελ ηζηνξία ησλ

ειεθηξνληθώλ παηρληδηώλ όπσο θαη νη θνλζόιεο γηα ηηο νπνίεο αλαπηύρζεθαλ έηζη ώζηε

λα ππάξμεη κηα νινθιεξσκέλε εηθόλα γηα ηα ειεθηξνληθά παηρλίδηα.

Page 12: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε
Page 13: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-3-

2 ΙΣΟΡΙΚΗ ΑΝΑΓΡΟΜΗ ΓΛΧΧΝ ΠΡΟΓΡΑΜΜΑΣΙΜΟΤ ΚΑΙ ΗΛΔΚΣΡΟΝΙΚΧΝ ΠΑΙΥΝΙΓΙΧΝ

Σην παξαθάησ θεθάιαην αλαιύεηαη ε ηζηνξία θπξίσο ηεο C++ θαη νη γεληέο ησλ

γισζζώλ πξνγξακκαηηζκνύ θαη θαζώο θαη ε ηζηνξία ησλ ειεθηξνληθώλ παηρληδηώλ

όπσο ην hardware από ην νπνίν απνηεινύληαλ νη θνλζόιεο.

2.1 Γενιέρ Γλυζζών ππογπαμμαηιζμού

1. Η πξώηε γιώζζα πξνγξακκαηηζκνύ ήηαλ ε γιώζζα κεραλήο

Ο πξνγξακκαηηζηήο έπξεπε λα γξάςεη ηνλ θώδηθα σο κηα

αθνινπζία 0 θαη 1 .

Ο πξώηνο ειεθηξνληθόο ππνινγηζηήο όπσο θαίλεηαη ζηελ Δηθόλα 1 : Colossus

Mark 2 δεκηνπξγήζεθε από Άγγινπο απνθξππηνγξάθνπο θαηά ηελ

δηάξθεηα ηνπ Β΄ παγθνζκίνπ πνιέκνπ θαη πξνγξακκαηηδόηαλ γπξίδνληαο ηνπο

θαηάιιεινπο δηαθόπηεο

Δηθόλα 1 : Colossus Mark 2

Page 14: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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 : Γεληέο γισζζώλ πξνγξακκαηηζκνύ θαίλνληαη νη

γεληέο ησλ γισζζώλ θαη ελδεηθηηθά κεξηθέο γξακκέο θώδηθα

Page 15: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-5-

Δηθόλα 2 : Γεληέο γισζζώλ πξνγξακκαηηζκνύ

Page 16: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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

Page 17: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-7-

2.3 Ιζηοπία ηυν βινηεοπαισνιδιών

Η ηζηνξία ησλ πξώησλ βηληενπαηρληδηώλ μεθηλάεη από ην 1950 όπνπ αθαδεκατθνί

εξεπλεηέο θαη επηζηήκνλεο ησλ ππνινγηζηώλ ζρεδίαδαλ απιά παηρλίδηα θαη

πξνζνκνηώζεηο. Τα βηληενπαηρλίδηα έγηλαλ επξέσο γλσζηά θαηά ηελ πεξίνδν

ηνπ 1970 θαη 1980 κε ηα arcade games θαη ηηο θνλζόιεο παηρληδηώλ.

Ο όξνο βηληενπαηρλίδη πεξηιακβάλεη έλα κεγάιν εύξνο ηερλνινγηώλ ζηηο

κέξεο καο αιιά ζπλδέεηαη κε έλα παηρλίδη πνπ παίδεηαη ζε πιηθό θαηαζθεπαζκέλν

από ειεθηξνληθά θπθιώκαηα έρνπλ κηα κνξθή δηαδξαζηεθόηεηαο κε ηνλ παίρηε

όπσο γηα παξάδεηγκα έλα ρεηξηζηήξην θαη πξνβάιινληαη ζε κηα νζόλε.

2.3.1 Σα ππώηα βινηεοπαισνίδια

Οη πξώηνη ειεθηξνληθνί ππνινγηζηέο ζπγθεθξηκέλα ν Αγγιηθήο θαηαζθεπήο

Collosus θαη ν Ακεξηθαληθήο θαηαζθεπήο ENIAC πνπ θαηαζθεπάζηεθαλ θαηά ηνλ Β΄

παγθόζκην πόιεκν. Αξγόηεξα μεθίλεζε ε αξρηηεθηνληθή απνζεθεπκέλσλ

πξνγξακκάησλ όπσο ε αξρηηεθηνληθή von Neumann θαηά ηελ νπνία ν ειεθηξνληθόο

ππνινγηζηήο απνζεθεύεη ζηελ κλήκε ηνπ δεδνκέλα θαη εληνιέο.

Φξεζηκνπνηώληαο απηή ηελ αξρηηεθηνληθή νη ειεθηξνληθνί ππνινγηζηέο κπνξνύζαλ

λα επαλαπξνγξακκαηηζηνύλ έηζη ώζηε λα κπνξνύλ λα ιύζνπλ δηάθνξα πξνβιήκαηα.

Έηζη πνιιά παλεπηζηήκηα , θξαηηθνί νξγαληζκνί θαη κεγάιεο εηαηξίεο άξρηζαλ λα

ρξεζηκνπνηνύλ ππνινγηζηέο.

Τν πξώην βηληενπαηρλίδη πνπ αλαπηύρζεθε κε ζθνπό ηελ ςπραγσγία θαη όρη

γηα λα δείμεη θάπνηα ηερλνινγία ήηαλ ην Tennis for Two ην νπνίν ζρεδηάζηεθε από ηνλ

William Higinbotham ζε αλαινγηθό ππνινγηζηή θαη ηα γξαθηθά ηνπ εκθαλίδνληαλ

ζε έλαλ παικνγξάθν όπσο θαίλεηαη ζηελ Δηθόλα 4 : Tennis for two.

Page 18: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-8-

Δηθόλα 4 : Tennis for two

Τν 1961 ζην παλεπηζηήκην ησλ ΗΠΑ MIT (Massachusetts Institute of

Technology) απόθηεζε έλαλ ππνινγηζηή PDP-1 έηζι από ηοσς Steve Russell, Martin

Graetz, and Wayne Wiitanen δημιοσργήθηκε ηο Spacewar!

Σο παιτνίδι αποηελούνηαν από δσο διαζηημόπλοια ηα οποία τειριζόνηοσζαν από παίκηες

και προζπαθούζαν να καηαζηρέυοσν ηο ένα ηο άλλο.

Δηθόλα 5 : Spacewar!

Με ηελ πάξνδν ησλ ρξόλσλ νη ππνινγηζηηθνί πόξνη απμάλνληαλ θαη ε αλάπηπμε

Γισζζώλ πςεινύ επηπέδνπ είρε σο απνηέιεζκα ηελ δεκηνπξγία παηρληδηώλ από

θνηηεηέο αιιά ηα παηρλίδηα απηά έκελαλ ζηα εξγαζηήξηα ησλ παλεπηζηεκίσλ

Page 19: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-9-

ρσξίο λα γίλνπλ επξέσο γλσζηά

2.3.2 Η ππώηη οικιακή κονζόλα

Η πξώηε θνλζόια πνπ πξννξηδόηαλ γηα νηθηαθή ρξήζε θπθινθόξεζε

ζηηο αγνξέο ηεο Ακεξηθήο ην 1972 με ονομαζία Magnavox Odyssey θαη

ν θαηαζθεπαζηήο ηνπ ήηαλ ν Ralph Baer.

Η θνλζόια κπνξνύζε λα ζπλδεζεί κε ηελ ηειεόξαζε αιιά δελ ππνζηήξηδε

ήρν. Τα παηρλίδηα πνπ θπθινθόξεζαλ ήηαλ πιαθέηεο πνπ θαζόξηδαλ ην πσο ζα

ηξέμεη ην ζύζηεκα θαη όρη απνζεθεπκέλα πξνγξάκκαηα ,ε αξρηθή ηηκή ηνπ ήηαλ 99 $ .

Δηθόλα 6 : Η θνλζόια Magnavox Odyssey

2.3.3 Η απσή ηυν arcade παισνιδιών

Τν πξώην arcade παηρλίδη πνπ ήηαλε επξέσο γλσζηό δεκηνπξγήζεθε από ηελ εηαηξία

Atari ην 1972, ην Pong έηξερε ζε έλα κεράλεκα ην νπνίν ιεηηνπξγνύζε κε θέξκαηα θαη

ζεκείσζε κεγάιε επηηπρία.

Page 20: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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

Page 21: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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.

Page 22: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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

Page 23: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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 θαη γηα απηό ηνλ ιόγν

είλαη γξήγνξε θαη κπνξεί λα ηξέμεη ζε πνιιά ιεηηνπξγηθά.

Page 24: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-14-

Δηθόλα 10: Opengl Application

Παξαθάησ γίλεηαη αλάιπζε ηεο ιεηηνπξγίαο ηνπ Opengl θαζώο θαη ηα ζηάδηα από ηα

νπνία πξέπεη λα πξαγκαηνπνηεζνύλ ώζηε λα έρνπκε έλα απνηέιεζκα ζηελ νζόλε καο :

Page 25: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-15-

Δηθόλα 11: Opengl Rendering Pipeline

- Vertex Specification :

Σε απηό ην ζηάδην ηα vertices πεξλάλε ζηελ θάξηα γξαθηθώλ απηά ηα

vertices κπνξεί λα πεξηγξάθνπλ ηξίγσλα , ζεκεία ε γξακκέο θάζε vertex

πεξηγξάθεηαη κέζσ ησλ αληηθεηκέλσλ Vertex Array Objects ην νπνίν πεξηγξάθεη

ηελ κνξθή πνπ ζα έρεη ην vertex θαη ην Vertex Buffer Objects ην νπνίν

απνζεθεύεη ηα δεδνκέλα

- Vertex Rendering :

Page 26: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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 :

Πξνζζέηεη πεξηζζόηεξα ηξίγσλα ζηελ ήδε ππάξρνπζα γεσκεηξία έηζη ώζηε λα

θαίλεηαη κε πεξηζζόηεξε ιεπηνκέξεηα όπσο θαίλεηαη θα ζηελ παξαθάησ εηθόλα

Page 27: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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 {

Page 28: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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 :

Δδώ γίλνληαη δηάθνξεο πξνεηνηκαζίεο ώζηε λα παξαρζεί ην ηειηθό απνηέιεζκα

πνπ ζα εκθαληζηεί ζηελ νζόλε.

Page 29: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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) , γηα ηελ δεκηνπξγία θνξκώλ κε ηελ βνήζεηα

ελόο δηαδξαζηηθνύ πεξηβάιινληνο. Δπίζεο παξέρεη ηελ δπλαηόηεηα δεκηνπξγίαο

θαη ζρεδίαζεο κηαο ηζηνζειίδαο.

Page 30: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-20-

Δηθόλα 15 : Visual Studio IDE

3.1.1 Η διαδικαζία εύπεζηρ ζθαλμάηυν (Debugging)

Απηή ε δηαδηθαζία είλαη πνιύ ζεκαληηθή δηόηη καο επηηξέπεη λα εθηειέζνπκε

θνκκάηηα ηνπ θώδηθα γξακκή πξνο γξακκή έηζη ώζηε λα κπνξνύκε λα ειέγμνπκε ην

πξόγξακκα θαη λα εληνπίζνπκε ηπρόλ ιάζε , επίζεο κπνξνύκε λα

παξαθνινπζήζνπκε ηηο ηηκέο ησλ κεηαβιεηώλ.

Τν Visual studio καο παξέρεη ηα θαηάιιεια εξγαιεία ώζηε λα κπνξέζνπκε λα

θάλνπκε έιεγρν ησλ ζθαικάησλ θαη ζπγθεθξηκέλα καο επηηξέπεη λα βάινπκε ηα

ιεγόκελα Break Points κε ηα νπνία ζηακαηάκε ηελ εθηέιεζε ηνπ πξνγξάκκαηνο ζην

ζεκείν ζην νπνίν εηζάγακε ην Break Point ζηε ζπλέρεηα κπνξνύκε λα εθηειέζνπκε

ηνλ θώδηθα γξακκή πξνο γξακκή κε ηα πιήθηξα F10 θαη F11 ή από ηηο αληίζηνηρεο

επηινγέο ζην κελνύ.

Σην debug mode ηνπ Visual Studio εκθαλίδνληαη ηα παξάζπξα Locals θαη

Autos, ζε απηά ηα παξάζπξα εκθαλίδνληαη νη κεηαβιεηέο έηζη ώζηε λα κπνξνύκε λα

παξαθνινπζήζνπκε ηηο ηηκέο πνπ παίξλνπλ.

Page 31: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-21-

Δηθόλα 16 : Visual Studio Debugger

3.1.2 Η διαδικαζία μεηαγλώηηιζηρ (compilation) ενόρ ππογπάμμαηορ

Η δηαδηθαζία ηεο κεηαγιώηηηζεο πεξηιακβάλεη νξηζκέλα ζηάδηα

απηά είλαη ηα εμήο :

-Preprocessing : Καηά ηελ δηαδηθαζία απηή ηα αθαηξνύληαη ηα ζρόιηα από ηνλ πεγαίν

θώδηθα θαη επεμεξγάδνληαη εθθξάζεηο όπσο #include #define επίζεο κπνξεί λα

αγλνήζεη θώδηθα πνπ βξίζθεηαη αλακεζά ζε #if #ifdef #ifndef.

-Compilation : Ο κεηαγισηηηζηήο είλαη ππεύζπλνο γηα ηελ παξαγσγή ηνπ θώδηθα

ζε ζπκβνιηθή γιώζζα assembly , Έηζη από ηνλ θώδηθα ζε assembly παξάγεηαη ην

object file ην νπνίν πεξηέρεη ηνλ θώδηθα ζε δπαδηθή κνξθή.

-Linking : Παξάγεηαη ην ηειηθό εθηειέζηκν πξόγξακκα ην νπνίν κπνξεί λα εθηειέζεη ν

Page 32: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-22-

ππνινγηζηήο , επίζεο κπνξεί λα δεκηνπξγεζεί κηα δπλακηθή ε ζηαηηθή βηβιηνζήθε,ε

νπνία κπνξεί κε ηελ ζεηξά ηεο λα ρξεζηκνπνηεζεί ζε θάπνην άιιν πξόγξακκα.

Ο Linker αληηθαζηζηά ηηο αλαθνξέο ζε ζύκβνια κε ηηο πξαγκαηηθέο δηεπζύλζεηο

νη νπνίεο κπνξεί λα βξίζθνληαη ζηα αληίζηνηρα object files ε ζε θάπνηα βηβιηνζήθε.

Δηθόλα 17 : Η δηαδηθαζία κεηαγιώηηηζεο ελόο πξνγξάκκαηνο

3.2 Adobe Illustrator

Τν Adobe Illustrator είλαη έλα πξόγξακκα δεκηνπξγίαο vector γξαθηθώλ.

Τν Adobe illustrator είλαη ηδαληθό γηα ζρεδίαζε ραξαθηήξσλ 2d παηρληδηώλ επίζεο

κηα πνιύ ζπρλή ρξήζε ηνπ είλαη γηα ηελ δεκηνπξγία ινγόηππσλ γηα εηαηξίεο ε

δηαθεκίζεηο.

Έλα από ηα πιενλεθηήκαηα πνπ έρεη είλαη όηη κπνξεί λα δεκηνπξγήζεη εηθόλεο θαη

ζρήκαηα αλεμαξηήησο αλάιπζεο.

Page 33: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-23-

Δηθόλα 18: Adobe illustrator

Μεξηθά από ηα εξγαιεία πνπ παξέρεη είλαη ηα εμήο :

Selection tool (Δξγαιείν επηινγήο) Φξεζηκνπνηώληαο ην selection tool

κπνξνύκε λα κεηαθηλήζνπκε ζρήκαηα θαη γξακκέο.

Direct Selection tool : Απηό ην εξγαιείν είλαη ηδηαίηεξα ρξήζηκν γηαηί καο

επηηξέπεη λα επηιέμνπκε ηα ζεκεία ελόο ζρεδίνπ θαη λα ηα κεηαθηλήζνπκε

όπσο επηζπκνύκε ώζηε λα θηηάμνπκε ην ζρέδην πνπ ζέινπκε.

Magic Wand Tool : Μαο δίλεη ηελ δπλαηόηεηα λα επηιέμνπκε απηόκαηα κηα

πεξηνρή κε θξηηήξην ηα δηάθνξα ρξώκαηα/ζρέδηα πνπ ππάξρνπλ.

Lasso Tool : Μαο επηηξέπεη λα ζρεδηάζνπκε κηα πεξηνρή θαη επηιέγεη βάζε ηνπ

ζρεδίνπ πνπ θάλακε.

Pen Tool : Απηό ην εξγαιείν ρξεζηκνπνηείηαη γηα ηελ δεκηνπξγία ζρεδίσλ

κε ηελ βνήζεηα επζείσλ ε θακππιώλ. Δπίζεο παξέρεη ηελ δπλαηόηεηα

πξνζζήθεο ε αθαίξεζεο ζεκείσλ πάλσ ζην ζρέδην ην νπνίν θάλακε.

Type Tool : Μπνξνύκε λα επηιέμνπκε κηα γξακκαηνζεηξά, κέγεζνο θαη ρξώκα

θαη λα γξάςνπκε θάπνην θείκελν.

Page 34: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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

Page 35: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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 : Μαο επηηξέπεη λα επηιέμνπκε έλα

ηκήκα κηαο γξακκήο θαη λα ην επεμεξγαζηνύκε αλάινγα.

Page 36: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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.

Page 37: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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 επηηξέπεη

λα κεηαβνύκε από ηελ κηα ζθελή ζηελ άιιε επίζεο έρνπκε ηελ δπλαηόηεηα λα

πξνζζέζνπκε θάπνην εθέ ζηελ κεηάβαζε απηή.

Page 38: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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.

Page 39: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-29-

- Parallax : Φξεζηκνπνηείηαη γηα λα καο δώζεη ηελ εληύπσζε όηη θηλείηαη ε εηθόλα

ηνπ background

- Event Despatcher : Μαο δίλεη ηελ δπλαηόηεηα λα ρξεζηκνπνηνύκε θάπνην

Input ώζηε ν ρξήζηεο λα κπνξεί λα αιιεινεπηδξά κε ηελ εθαξκνγή

Τα θύξηα Events είλαη ηα παξαθάησ:

- EventListenerTouch

Λακβάλεη είζνδν αθήο όπσο γηα παξάδεηγκα από έλα θηλεηό αθήο

- EventListenerKeyboard

Λακβάλεη είζνδν από ην πιεθηξνιόγην

- EventListenMouse

Λακβάλεη είζνδν από ην πνληίθη πρ νη ζπληεηαγκέλεο ηνπ

- Τξηζδηάζηαηα γξαθηθά (3D) : Δθηόο από δπζδηάζηαηα γξαθηθά ε

βηβιηνζήθε καο επηηξέπεη ηελ δεκηνπξγία ηξηζδηάζηαησλ γξαθηθώλ.

Παξαθάησ αλαθέξνληαη ζπλνπηηθά ε νξνινγία πνπ ρξεηάδεηαη γηα λα

θαηαιάβνπκε πσο ιεηηνπξγνύλ ηα ηξηζδηάζηαηα παηρλίδηα:

• Mesh

Έλα mesh απνηειείηαη από ζεκεία ζηνλ ρώξν ηα νπνία νλνκάδνληαη

vertices.

• Model

Τν κνληέιν είλαη έλα ζύλνιν από meshes ην νπνίν κπνξνύκε λα ην θάλνπκε

Render θαη ζπγθεθξηκέλα ζηελ βηβιηνζήθε αλαπαξηζηάηε σο Sprite3D.

• Texture

Page 40: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-30-

Οη επηθάλεηεο ησλ κνληέισλ κπνξνύλ λα έρνπλ απνηππσκέλα πάλσ ηνπο κηα

εηθόλα ώζηε λα έρνπκε έλα πην αιεζνθαλέο απνηέιεζκα.

• Camera

Γηα λα κπνξνύκε λα δνύκε ηνλ ηξηζδηάζηαην ρώξν πνπ δεκηνπξγήζακε

ρξεηαδόκαζηε κηα θάκεξα.

• Light

Ο θσηηζκόο ησλ κνληέισλ αιιάδεη αλάινγα κε ηνλ θσηηζκό πρ ε κεξηά ηνπ

κνληέινπ πνπ αληηθξίδεη ην θσο είλαη πην θσηεηλή ελώ ε άιιε ζθνηεηλή

• Animation

Τα ηξηζδηάζηαηα κνληέια πνπ έρνπκε θνξηώζεη κπνξνύκε λα ηα θάλνπκε λα

θηλνύληαη ζπλήζσο απηό γίλεηαη ζε έλα πξόγξακκα όπσο ην 3d Blender θαη

κεηά ην θνξηώλνπκε ζηελ βηβιηνζήθε

- Skybox : Μαο δίλεη ηελ δπλαηόηεηα λα πξνζζέζνπκε κηα εηθόλα γύξσ από ηελ

ηξηζδηάζηαηε ζθελή πνπ έρνπκε θηηάμεη.

- Terrain : Έλα ηνπίν κε δηαθνξεηηθό ζρήκα θαη δηαζηάζεηο

- BillBoard : Μηα εηθόλα πνπ πάληα θνηηάδεη ηελ θάκεξα απηό γηα παξάδεηγκα

κπνξεί λα ρξεζηκνπνηεζεί γηα λα θηηάμνπκε δέλδξα

- Physics : Κάλεη ην παηρλίδη λα έρεη κηα αιεζνθάλεηα ζηηο θηλήζεηο ησλ Sprite

απηό επηηπγράλεηαη κε ηελ πξνζνκνίσζε ηεο βαξύηεηαο ηεο ηξηβήο θαζώο θαη

ηεο ζύγθξνπζεο αλάκεζα ζηα αληηθείκελα.

Παξαθάησ αλαιύνληαη νξηζκέλα αληηθείκελα πνπ ρξεζηκνπνηεί ην Physics

engine:

Page 41: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-31-

- Physics Bodies : Πεξηέρνπλ βαζηθέο πιεξνθνξίεο γηα ην αληηθείκελν

όπσο γηα παξάδεηγκα ηελ κάδα ηελ ζέζε θαη ηελ ηαρύηεηα πνπ έρεη

- Material : Πεξηγξάθεη ραξαθηεξηζηηθά ηνπ αληηθεηκέλνπ όπσο ε

ππθλόηεηα ηνπ , ε ηξηβή θαη ε ειαζηηθόηεηα ηνπ.

- Shapes : Μαο δίλεη ηελ δπλαηόηεηα λα έρεη ην αληηθείκελν πνπ

επηζπκνύκε έλα ζρήκα βάζε ηνπ νπνίνπ λα ππνινγίδνληαη νη

ζπγθξνύζεηο , παξαθάησ αλαθέξνληαη ηα ζρήκαηα απηά.

- PhysicsShapeCircle

- PhysicsShapePolygon

- PhysicsShapeBox.

- PhysicsShapeEdgeSegment

- PhysicsShapeEdgePolygon

- PhysicsShapeEdgeBoxHollow

- PhysicsShapeEdgeChain

4 Δναλλακηικέρ πποηάζειρ ςλοποίηζηρ

Πεξηγξάθνληαη δηάθνξεο βηβιηνζήθεο θαη engine ηα νπνία κπνξνύλ λα

ρξεζηκνπνηεζνύλ γηα λα αλαπηπρζεί έλα 2d παηρλίδη αλ θαη πνιιέο από ηηο παξαθάησ

έρνπλ 3d δπλαηόηεηεο θαη ππνζηεξίδνπλ κηα ε πεξηζζόηεξεο γιώζζεο

πξνγξακκαηηζκνύ.

Page 42: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-32-

4.1 Η βιβλιοθήκη SDL

Η βηβιηνζήθε SDL (Simple DirectMedia Layer) είλαη κηα open source βηβιηνζήθε

γξακκέλε ζηελ γιώζζα C. Δίλαη open source θαη είλαη ζπκβαηή κε ηελ άδεηα MIT

ε ζπγθεθξηκέλε άδεηα επηηξέπεη ηελ ρξήζε θαη ηξνπνπνίεζε ηνπ θώδηθα ηεο

βηβιηνζήθεο αθόκα θαη γηα εθαξκνγέο πνπ έρνπλ θέξδνο.

Υπνζηεξίδεη ηα παξαθάησ ιεηηνπξγηθά Windows, Mac OS X, Linux, iOS θαη

Android.

Παξαθάησ δίλεηαη σο παξάδεηγκα ν θώδηθαο πνπ κπνξεί λα εκθαλίζεη κηα εηθόλα ζηελ

νζόλε:

Page 43: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

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

Page 44: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

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

Page 45: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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

Page 46: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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() {

}

}

Page 47: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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() {

Page 48: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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)

{

Page 49: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-39-

back.x -= 1;

}

}

Παξόιεο ηηο επθνιίεο πνπ καο πξνζθέξεη κηα web εθαξκνγή ε javascript είλαη πην αξγή

από κηα γιώζζα πνπ κεηαθξάδεηαη θαηεπζείαλ ζε γιώζζα κεραλήο νπόηε

θαη έρεη πην ρακειή απόδνζε

5 Κώδικαρ και επεξηγήζειρ

Παξνπζηάδεηαη θαη αλαιύεηαη ν θώδηθαο θαζώο θαη ηα θύξηα κέξε πνπ απνηεινύλ ηνλ

«ζθειεηό» ηνπ παηρληδηνύ όπσο θαη ηα βήκαηα γηα ηελ δεκηνπξγία ελόο Project ζην

Visual Studio ζε πεξηβάιινλ Windows.

5.1 Δγκαηάζηαζη ηηρ βιβλιοθήκηρ cocos2d-x

Αξρηθά θαηεβάδνπκε από ηελ ζειίδα ηελ πην πξόζθαηε έθδνζε ηεο βηβιηνζήθεο

Page 50: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-40-

Μεηά πξέπεη λα εγθαηαζηήζνπκε ηελ έθδνζε 2 ηνπ Python :

Έπεηηα πάκε ζηελ θνλζόια ησλ Windows θαη γξάθνπκε ηελ εμήο εληνιή

Ώζηε λα δεκηνπξγεζεί ην project ηνπ Visual Studio :

Page 51: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

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

Page 52: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

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

}

Page 53: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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 ζπλαξηήζεηο κηα όηαλ παηάκε έλα πιήθηξν

θαη ε άιιε όηαλ ην αθήλνπκε .

Page 54: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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

Page 55: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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.

Page 56: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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 θνξέο αλά δεπηεξόιεπην αιιά αλ ην επηζπκνύκε κπνξνύκε λα αιιάμνπκε

Page 57: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

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

Page 58: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

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

Page 59: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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")

Page 60: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

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

Page 61: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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");

Page 62: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

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

Page 63: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

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

Page 64: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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

Page 65: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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_

Page 66: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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());

Page 67: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-57-

/*if (heartsp != NULL){

heartsp->removeFromParent();

heartsp = NULL;

}*/

}

void UserInterface::onEnter()

{

6 ςμπεπάζμαηα

Μηα εθαξκνγή θαη πην ζπγθεθξηκέλα έλα παηρλίδη δηζδηάζηαην απνηειείηαη από

νξηζκέλα ζηνηρεία όπσο γηα παξάδεηγκα ε είζνδνο ηνπ ρξήζηε (user input)

έλα physics engine ηα παξαπάλσ αλαπηύρζεθαλ ζηα πξνεγνύκελα θεθάιαηα θαη

απνηεινύλ γλώζεηο νη νπνίεο κπνξνύλ λα εθαξκνζηνύλ ζε έλα δηζδηάζηαην παηρλίδη

αθόκα θαη ζε έλα ηξηζδηάζηαην παηρλίδη.

Τν θνκκάηη ησλ γξαθηθώλ είλαη επίζεο πνιύ βαζηθό δηόηη απηό βιέπεη ν ρξήζηεο,

ζε απηή ηελ πηπρηαθή έγηλε εθκάζεζε θαη ρξήζε πξνγξακκάησλ απαξαίηεησλ γηα ηελ

δεκηνπξγία δηζδηάζηαησλ γξαθηθώλ.

Τέινο ππάξρεη ην θνκκάηη ηνπ θώδηθα πνπ απαηηεί ηδηαίηεξε πξνζνρή θαη ζην νπνίν

έγηλε εθκάζεζε θαη ρξήζε ηεο γιώζζαο C++ θαη ηεο βηβιηνζήθεο cocos2d-x.

Page 68: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε
Page 69: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-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,

ζηελ νζόλε παξνπζηάδεηαη ν παίθηεο ηνλ νπνίν κπνξνύκε λα ρεηξηζηνύκε πεδόληαο ζηηο

πιαηθόξκεο κε ζθνπό λα θηάζνπκε ζην ηέινο ηεο πηζηαο απνθεύγνληαο ηνπο ερζξνύο

νη νπνίνη βξίζθνληαη πάλσ ζηηο πιαηθόξκεο. Δπίζεο νξηζκέλεο πιαηθόξκεο θηλνύληαη

νπόηε ρξεηάδεηαη πξνζνρή ζηνλ ρεηξηζκό ηνπ ήξσα.

Page 70: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-60-

Τα πιήθηξα πνπ ρξεζηκνπνηνύληαη ζηελ εθαξκνγή είλαη ηα εμήο :

- Key_up : Κάλεη ηνλ παίρηε λα ρνξνπεδάεη , κπνξνύκε λα ην παηήζνπκε δύν θνξέο

εηζη ώζηε ν ήξσαο λα πεδήμεη πην ςειά πξάγκα ην νπνίν είλαη απαξαίηεην γηα λα πάκε

από πιαηθόξκα ζε πιαηθόξκα.

- Key_right : Μεηαθηλεί ηνλ ήξσα ζηα δεμηά (Μπνξεί λα ρξεζηκνπνηεζεί θαη όηαλ ν

ήξσαο βξίζθεηαη ζηνλ αέξα)

- Key_left : Μεηαθηλεί ηνλ ήξσα ζηα αξηζηεξά (Μπνξεί λα ρξεζηκνπνηεζεί θαη όηαλ ν

ήξσαο βξίζθεηαη ζηνλ αέξα)

- Key_Escape : Μαο δίλεη ηελ δπλαηόηεηα λα «παγώζνπκε» ην παηρλίδη θαη λα ην

ζπλερίζνπκε όηαλ ζέινπκε, επίζεο κπνξνύκε λα επηζηξέςνπκε ζην αξρηθό Menu θαη λα

ηεξκαηίζνπκε ηελ εθαξκνγή

Page 71: Δηιουργία παιχιδιοφ ςτη C++ - TEILARΠίλαθαο 1 : Τρληθά ραξαθεξηηθά πιαθέαο Pacman CPU Zilog Z80 at 3,072 Mhz ROM 16 KB (Γηα απνζήθπε

-61-

Ο ήξσαο έρεη 3 δσέο νη νπνίεο βξίζθνληαη πάλσ αξηζηεξά , νηαλ ν ήξσαο

ζπγθξνπζηεί κε έλαλ απν ηνπο ερζξνύο απσζείηαη απν απηόλ θαη ράλεη κηα δσή. Οηαλ

ράζνπκε θαη ηελ ηειεπηαία δσή ν παίρηεο ηνπνζεηείηαη πάιη ζηελ αξρή ηνπ επηπέδνπ.

Οηαλ δνύκε ηα πνιύρξσκα ππξνηερλήκαηα ζην ηέινο ηνπ επηπέδνπ ζεκαίλεη νηη

ν παίρηεο ηεξκάηηζε.