Προγραµµατισµός ΕΡΓΑΣΙΑ ΕΞΑΜΗΝΟΥ ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Σχετικά έγγραφα
ΕΡΓΑΣΙΑ ΕΞΑΜΗΝΟΥ - ΜΕΡΟΣ Γ'

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 15/11/09, 23:59

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 2 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 7/1/2014, 22:00

ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ, ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΚΑΙ ΔΙΚΤΥΩΝ, ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: Πέµπτη 17/12/2015, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 15/11/10, 23:59

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 5 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 5 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 4 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

ΣΕΤ ΑΣΚΗΣΕΩΝ 1. Προθεσµία: Τρίτη 4/11/2014, 22:00

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 3 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

1 ο Εργαστήριο Συντεταγμένες, Χρώματα, Σχήματα

Το δεύτερο παιχνίδι ΤΟΥΒΛΑΚΙΑ

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 8/1/12, 22:00

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 4 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

ΣΕΤ ΑΣΚΗΣΕΩΝ 1. Προθεσμία: Τετάρτη 9/11/2016, 21:00

2 ο Εργαστήριο Αλληλεπίδραση και Animation

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 22/12/10, 23:59

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 5/12/10, 23:59

Μάθημα 1: Εισαγωγή. Κάνε κλικ την εντολή "κινήσου" και με το ποντίκι πατημένο μετέφερε τη στη περιοχή σεναρίων.

Κεφάλαιο 1: Κίνηση και γεωμετρικά σχήματα

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 13/1/13, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 18/12/12, 22:00

4 ο Εργαστήριο Τυχαίοι Αριθμοί, Μεταβλητές Συστήματος

ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ Η/Υ, ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ

2. Κάντε κλικ στο παράθυρο όψης Top για να το ενεργοποιήσετε, ώστε να σχεδιάσετε το πάτωµα του δωµατίου.

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 22/12/2016, 21:00

Οδηγίες εγκατάστασης και χρήσης Java σε προσωπικό υπολογιστή

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσμία: Τετάρτη 23/11/2016, 21:00

Προγραμματισμός Ι Εργαστήριο 8ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 8 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Λεπτομέριες τοιχοποιίας Σχεδίαση κάτοψης

ΣΕΤ ΑΣΚΗΣΕΩΝ 1. Προθεσµία: 3/12/2018, 23:59

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσμία: 17/1/14, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: Τετάρτη 7/12/2016, 21:00

21. ΦΥΛΛΟ ΕΡΓΑΣΙΑΣ 4 - ΔΗΜΙΟΥΡΓΩΝΤΑΣ ΜΕ ΤΟ BYOB BYOB. Αλγόριθμος Διαδικασία Παράμετροι

Άσκηση 6 Σύνθετα Αντικείµενα. Στόχος της άσκησης

Ανάλυση εικόνων DSLR με το πρόγραμμα IRIS

Παλέτα Κίνηση. Καλό είναι πριν ξεκινήσετε το παρακάτω φυλλάδιο να έχετε παρακολουθήσει τα παρακάτω δύο videos: a) Εισαγωγή στο περιβάλλον του Scratch

Προγραµµατισµός Ι Εργαστήριο 3ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 3 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Μάθημα 1 ο : Εντολές κίνησης

Προγραμματισμός Ι Εργαστήριο 8ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 8 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Πίνακες, περιγράµµατα και σκίαση

ΣΕΤ ΑΣΚΗΣΕΩΝ 1. Προθεσµία: Τρίτη 10/11/2015, 22:00

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Μαθήματα Scratch -Δραστηριότητα 1 Παλέτα Κίνηση

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

> μεγαλύτερο <= μικρότερο ή ίσο < μικρότερο == ισότητα >= μεγαλύτερο ή ίσο!= διαφορετικό

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Βασικές Εντολές MicroWorlds Pro.

Οδηγίες κατασκευής Ιστοσελίδων µε το πρόγραµµα FRONTPAGE 2003

Προγραμματισμός Ι Εργαστήριο 9ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 9 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Άσκηση 5 Ανύψωση Σχηµάτων. Στόχος της άσκησης

Ζωγραφική έναντι Κατασκευής

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: Τετάρτη 25/11/2015, 22:00

Προγραµµατισµός Ι Εργαστήριο 9ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 9 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Παιχνιδάκια με τη LOGO

Παλέτα Κίνηση. Για να μετακινήσουμε ένα αντικείμενο χρησιμοποιούμε την εντολή ΚΙΝΗΣΟΥ

Hase οδηγίες χρήσης.

Π.Τ..Ε. Σηµειώσεις Σεµιναρίου «Τα µήλα των Εσπερίδων», Η ζωγραφική (Paint) Τα µενού της ζωγραφικής

Hase οδηγίες χρήσης.

ΑΝΤΙΓΡΑΦΗ ΑΡΧΕΙΟΥ ΣΕ ΔΙΣΚΕΤΑ ΑΝΤΙΓΡΑΦΗ ΑΡΧΕΙΟΥ ΑΠΟ ΔΙΣΚΕΤΑ. Από τον κατάλογο που εμφανίζεται επιλέγω: Αποστολή προς Δισκέτα (3,5)

Γεωµετρικές Κατασκευές & Χρήση εντολών

Δημιουργία παιχνιδιού με το Game Maker

Εφαρμογή δημιουργίας σεναρίων Sctatch

Σύντομος οδηγός αναφοράς Για Windows Έκδοση 4.0

Movie Maker (Δημιουργία βίντεο)

Οδηγίες για προσθήκη Web Frames Tools to the Quick Access Bar σε μεταγενέστερη έκδοση του Word

3 ο εργαστήριο Scratch for NinjaCoders

Προγραμματιστικό Περιβάλλον

αιδευτι κό υλικό Γιώργος Καινουργιάκης Ιούνιος 2009

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Βυζαντινός Ρεπαντής Κολλέγιο Αθηνών 2010

Παιδαγωγική προσέγγιση: Πρόταση για την διδασκαλία της έννοιας αλγόριθµός στο περιβάλλον MicroWorlds Pro

Τσαουσάκης Σταύρος ΠΕ70 ΦΥΛΛΟ ΕΡΓΑΣΙΑΣ 3

( Απάντηση: Ο τόνος βρίσκεται δεξιά από το γράμμα Λ. ) ( Απάντηση: Κρατάμε πατημένο το πλήκτρο Shift και πατάμε το πλήκτρο 8. )

Γ ΓΥΜΝΑΣΙΟΥ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕ ΤΗ ΓΛΩΣΣΑ MicroWorlds Pro

Οδηγίες για την εγκατάσταση του πακέτου Cygwin

Άσκηση 6 Ανύψωση Σχηµάτων. Στόχος της άσκησης

Hase οδηγίες χρήσης.

Πρακτική εφαρμογή στην ειδικότητα: Λογισμικό για τη δημιουργία εργασίας εξαμήνου

Δημιουργία μιας εφαρμογής Java με το NetBeans

Προγραμματισμός Ι Εργαστήριο 5ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 5 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

ΕΡΓΑΣΤΗΡΙΟ FRONT PAGE 3

ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ Σύντομη εισαγωγή στο εργαστήριο

ΕΡΓΑΣΤΗΡΙΟ 16. Χρησιμοποιώντας τον Αποσφαλματιστή (Debugger) του Eclipse

lab1: Εισαγωγή σε Linux

Το τρίτο παιχνίδι ΛΑΒΥΡΙΝΘΟΣ ΜΕ ΕΜΠΟΔΙΑ

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 27/11/11, 22:00

Σχεδίαση με το AutoCAD

Ενότητα 15 Μορφοποίηση της Γραφικής Παράστασης

Προγραμματισμός. Το περιβάλλον του scratch

7 ο Εργαστήριο Θόρυβος 2Δ, Μετακίνηση, Περιστροφή

Πως θα κατασκευάσω το πρώτο πρόγραμμα;

A7.2 Δημιουργία Απλής Γραφικής Εφαρμογής σε Περιβάλλον Scratch

Εργαστήριο 1-1 η Άσκηση - Ανάλυση

Transcript:

ΕΡΓΑΣΙΑ ΕΞΑΜΗΝΟΥ ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2009-2010 Προθεσµία ΚΥΡΙΑΚΗ 17/1/10, 23:59 Οµάδες Σε αυτή την εργασία µπορείτε να δουλέψετε σε οµάδες µέχρι δύο ατόµων. Η αντιγραφή/κλοπή/µοίρασµα κώδικα εκτός οµάδας απαγορεύονται αυστηρώς. Γενική περιγραφή εργασίας Ο σκοπός της εργασίας του εξαµήνου είναι να χρησιµοποιήσετε τις γνώσεις σας C και µια απλή βιβλιοθήκη γραφικών για να προγραµµατίσετε ένα παιχνίδι. Θα ξεκινήσετε µε απλά γραφικά και σιγά σιγά θα προσθέτετε επιπλέον λειτουργίες ώσπου στο τέλος θα έχετε ένα παιχνίδι µε τα παρακάτω χαρακτηριστικά: Πολλαπλά αντικείµενα που κινούνται Πολλαπλά αντικείµενα που αλλάζουν κατάσταση καθώς κινούνται Αλληλεπίδραση µε πληκτρολόγιο και ποντίκι Πολλαπλά αντικείµενα που καταστρέφονται Πολλαπλά αντικείµενα που δηµιουργούνται Λειτουργικότητα save/load Εµφάνιση σκορ Επιπλέον, µπορείτε να προσθέσετε και δικά σας χαρακτηριστικά στο παιχνίδι, όπως για παράδειγµα επίπεδα, µενού οδηγιών κτλ. Demo Κατεβάστε από τη σελίδα του εργαστηρίου και αποσυµπιέστε το demo. Περιέχει τα αρχεία introglutlib.h, introglutlib.c και mygame.c. Ακολουθείστε τις οδηγίες που αναγράφονται στο παράρτηµα Α για να κάνετε compile και να εκτελέσετε το πρόγραµµα (χρειάζονται και τα τρία αρχεία). Η εικόνα που εµφανίζεται είναι ένα δείγµα του τι µπορείτε να κάνετε µε τη βιβλιοθήκη γραφικών που ορίζεται στα αρχεία introglutlib.h, και introglutlib.c. Πριν ξεκινήσετε Το παράθυρο στο οποίο σχεδιάζονται οι εικόνες έχει διαστάσεις 800 500 (τα µεγέθη αυτά ορίζονται στο introglutlib.h και µπορείτε να τα αλλάξετε). Το σηµείο (0,0) βρίσκεται στην κάτω αριστερά γωνία. Η µονάδα µέτρησης είναι το pixel. Μην αλλάξετε τις διαστάσεις γιατί δε θα λειτουργει σωστά στο παιχνίδι σας.

Πριν ξεκινήσετε είναι καλή ιδέα να σχεδιάσετε την εικόνα σας σε χαρτί. Προτείνουµε να χρησιµοποιήσετε τετραγωνισµένο χαρτί το οποίο µπορείτε να εκτυπώσετε από sites όπως τα http://cstein.kings.cam.ac.uk/paper/squares.html http://www.mathsphere.co.uk/resources/mathspherefreegraphpaper.htm Η εικόνα που θα σχεδιάσετε έχει ένα νοητό "κέντρο" και µια νοητή µονάδα µεγέθους. Για παράδειγµα, αν σχεδιάζετε ένα ανθρωπάκι, το νοητό κέντρο µπορεί να είναι το κέντρο του κεφαλιού του (ας πούµε (x, y)) και η µονάδα µεγέθους η ακτίνα του κύκλου/κεφαλιού (ας την πούµε size). Με βάση αυτά µπορείτε να υπολογίσετε πού πρέπει να τοποθετηθούν τα υπόλοιπα κοµµάτια και πόσο µεγάλα θα είναι. Για παράδειγµα, η µύτη µπορεί να είναι µια γραµµή από το (x,y) µέχρι το (x+size*0.1, y+size*0.1). Το αριστερό µάτι θα είναι ένας κύκλος µε κέντρο (xsize*0.5, y+size*0.33) ενώ το δεξί µάτι θα είναι στη θέση (x+size*0.5, y+size*0.33). Με αυτό τον τρόπο, κάθε κοµµάτι του ανθρώπου θα είναι εκφρασµένο σε σχέση µε τα x, y, size. Με το να δίνετε διαφορετικές τιµές σε αυτές τις ποσότητες, θα µπορείτε να σχεδιάζετε ανθρωπάκια σε διαφορετικές θέσεις και µε διαφορετικό µέγεθος. Αυτό το βήµα είναι απαραίτητο για να µπορέσετε να έχετε κίνηση. Επιπλέον, µπορείτε να χρησιµοποιήσετε τον παράγοντα direction (κατεύθυνση), που τυπικά θα έχει τιµη -1 ή 1 για να κάνετε το αντικείµενο που σχεδιάζετε να "κοιτά" προς τη µία ή την άλλη κατεύθυνση. Δείτε τον κώδικα στο mygame.c. Η κατεύθυνση έχει χρησιµοποιηθεί στη συνάρτηση που σχεδιάζει τα ψάρια. Κοιτώντας τον κώδικα στο mygame.c θα δείτε ότι χρησιµοποιούµε πολλές µεταβλητές για να κρατάµε τη θέση και το µέγεθος των επιµέρους τµηµάτων κάθε σχήµατος. Αυτό είναι απαραίτητο και πολύ σηµαντικό για την καλή λειτουργία του προγράµµατος, γιατί κάνει ξεκάθαρο το ποιες εντολές σχεδιάζουν κάθε κοµµάτι και επιτρέπει να κάνετε εύκολα αλλαγές στο µέγεθος ή στη θέση των επιµέρους κοµµατιών. Μελετήστε τις συναρτήσεις για το ψάρι και για το UFO. Τι χρειάζεται να κάνετε ΞΕΚΙΝΗΣΤΕ ΝΩΡΙΣ. Το πρώτο βήµα είναι να σχεδιάσετε τα βασικά αντικείµενα του παιχνιδιού σας. Υπάρχουν δύο τύποι αντικειµένων. Αυτά που κινούνται και αυτά που είναι µέρος του background. Τα αντικείµενα που κινούνται πρέπει να σχεδιάζονται όπως περιγράφεται στο προηγούµενο κεφάλαιο (δηλαδή πρέπει να καταλήξετε σε µια σειρά εκφράσεων της µορφής x a*size, y a*size.) Τα αντικείµενα του background µπορούν να έχουν απόλυτες συντεταγµένες και µέγεθος. Τα αντικείµενα που κινούνται πρέπει να είναι τουλάχιστον τόσο πολύπλοκα όσο το ψάρι. Πρέπει να έχετε τουλάχιστον δύο διαφορετικά αντικείµενα µε δυνατότητα κίνησης. Η κλήσεις των συναρτήσεων που σχεδιάζουν αντικείµενα πρέπει να βρίσκονται µέσα στη mydisplay(). Το δεύτερο βήµα είναι η εισαγωγή πολλαπλών αντικειµένων που κινούνται. Τα αντικείµενα αυτά θα δηµιουργούνται και θα καταστρέφονται δυναµικά κατά τη διάρκεια της εκτέλεσης. Για λόγους ευκολίας, θα χρησιµοποιήσουµε το παράδειγµα του ψαριού στην παρακάτω περιγραφή. Για κάθε ένα από τα κινούµενα αντικείµενα χρειάζεται να αποθηκευτούν οι τιµές των διαφόρων ιδιοτήτων τους όπως για παράδειγµα συντεταγµένες, κατεύθυνση κίνησης, µέγεθος, ταχύτητα, χρώµα, κατάσταση, υπόλοιπες ζωές κτλ. Αυτό γίνεται µε τη χρήση struct. Κατασκευάστε µια linked list µε όποια µορφή επιθυµείτε (απλή, διπλή κτλ) από αντικείµενα

(δηλαδή λίστα από structs). Κατασκευάστε µια συνάρτηση InitializeObjects() η οποία δεν παίρνει παραµέτρους, δεν επιστρέφει τίποτα και στο σώµα της αρχικοποιεί τη λίστα, κι αν χρειάζεται της προσθέτει µερικά αρχικά αντικείµενα. Είναι καλή ιδέα να χρησιµοποιείστε rand() για να δώσετε τυχαίες - αλλά νόµιµες - τιµές σε διάφορα πεδία. Καλέστε την InitializeObjects() µέσα από τη main, πριν από την κλήση στην initgraphics(); Τώρα, µπορείτε να εµφανίσετε τα αντικείµενα στην οθόνη. Μέσα στη mydisplay, χρησιµοποιείστε επανάληψη για να διατρέξετε τη λίστα και να σχεδιάσετε κάθε αντικείµενο στην οθόνη καλώντας την αντίστοιχη συνάρτηση. Μέχρι στιγµής, τα αντικείµενα δεν κινούνται. Για να µπορούµε να κινήσουµε τα αντικείµενα πρέπει πρώτα να ξέρουµε πώς το glut "ζωγραφίζει" στην οθόνη. Παρατηρείστε ότι η main() στο mygame.c περιέχει µια κλήση στη συνάρτηση glutmainloop(); Η συνάρτηση αυτή περιέχει µια επανάληψη η οποία καλεί διαρκώς τη συνάρτηση σχεδιασµού (mydisplay) και τις συναρτήσεις εισόδου (mymouse, mykeyboard). Με άλλα λόγια φανταστείτε πως η glutmainloop() είναι κάπως έτσι: void glutmainloop() { while (1) { mydisplay(); mykeyboard(); mymouse(); } } Ο µόνος τρόπος τερµατισµού είναι µε εντολή exit µέσα από µια από τις myx συναρτήσεις (παρατηρείστε τον κώδικα στη mykeyboard και mymouse) Επιστρέφουµε τώρα στην κίνηση. Αν η mydisplay() περιέχει, για παράδειγµα, DrawFish(x, y, z, GO_LEFT); τότε, λόγω του κρυφού while στη glutmainloop, το πρόγραµµα ζωγραφίζει διαρκώς ένα ψάρι στη θέση (x, y), µε µέγεθος z το οποίο κοιτά αριστερά. Για να µπορέσουµε να κάνουµε το ψάρι να κινείται, θα πρέπει σε κάθε επανάληψη να αλλάζουµε τη θέση του, δηλαδή να αντικαταστήσουµε τον παραπάνω κώδικα: x = x + bhma; DrawFish(x, y, z, GO_LEFT); Μην ξεχνάτε πως η αρχική τιµή του x έχει τεθεί στην InitializeObjects(). Κάντε τα αντικείµενα να κινούνται προς κάποια κατεύθυνση (οριζόντια ή κατακόρυφα ή διαγώνια ή µε κάποιο πιο πολύπλοκο τρόπο) χρησιµοποιώντας την ιδέα της προηγούµενης παραγράφου. Όταν τα αντικείµενα φτάνουν στην άκρη της οθόνης, δεν πρέπει να εξαφανίζονται. Μπορείτε να τα κάνετε να αλλάξουν κατεύθυνση, ή να εµφανιστούν στην άλλη πλευρά ή να κάνουν γκελ, κτλ. Το επόµενο βήµα είναι να προσθέσετε αλληλεπίδραση µε το ποντίκι. Προσθέστε κώδικα στη mymouse που να ελέγχει αν ο χρήστης έχει πατήσει το ποντίκι (GLUT_DOWN) κι αν ναι, ποιο κουµπί (GLUT_LEFT, GLUT_RIGHT), κι αναλόγως µε τη θέση που έγινε το click εκτελεί την αντίστοιχη λειτουργία. Το πρόγραµµά σας θα πρέπει να κάνει διάκριση ανάµεσα στο αν ο χρήστης έκανε click πάνω σε κάποιο από τα αντικείµενα ή κάπου αλλού και να κάνει κάτι διαφορετικό σε κάθε περίπτωση. Ανάλογα µε το παιχνίδι σας, µπορεί να θέλετε να προσθέσετε κώδικα και στη mykeyboard.

Πληροφορίες για τις τιµές "ειδικών" πλήκτρων µπορείτε να βρείτε στο http://www.lighthouse3d.com/opengl/glut/index.php?5 Το πρόγραµµά σας πρέπει να καταστρέφει και να δηµιουργεί αντικείµενα ως αποτέλεσµα συγκρούσεων µεταξύ αντικειµένων. To πρόγραµµά σας πρέπει να παρέχει save/load λειτουργικότητα. Πρέπει να αποθηκεύονται σε αρχείο αρκετές πληροφορίες ώστε όταν "φορτώνεται" το σωσµένο παιχνίδι, να µπορεί να συνεχίσει από εκεί που είχε µείνει. Το πότε και πώς γίνεται save και load, τι πληροφορίες αποθηκεύονται, τι είδους αρχεία χρησιµοποιούνται (text ή binary) είναι δική σας απόφαση. Η πιο απλή ιδέα είναι να σώζετε πάντα κατά την έξοδο, και να φορτώνετε πάντα (εφόσον υπάρχει το αρχείο) κατά την είσοδο. Μια πιο ενδιαφέρουσα ιδέα είναι να δίνετε στο χρήστη την επιλογή του αν θα κάνει save ή load. Τέλος, προσθέστε στο πρόγραµµά σας µηχανισµό υπολογισµού και εµφάνισης σκορ. Είστε ελεύθεροι να προσθέσετε και επιπλέον λειτουργίες όπως οθόνη µε οδηγίες, επιλογή δυσκολίας, επίπεδα, κτλ. Μην ξεχάσετε να βάλετε καλά σχόλια στο πρόγραµµά σας, να δίνετε περιγραφικά ονόµατα στις µεταβλητές και να έχετε καλή στοίχιση. Μην ξεχάσετε να ελευθερώσετε όλη τη δυναµικά δεσµευµένη µνήµη. Πώς να παραδώσετε την εργασία σας Δηµιουργείστε ένα φάκελο µε όνοµα επώνυµο1_επώνυµο2 όπου επώνυµο1 και επώνυµο2 (αν υπάρχει) είναι τα επώνυµα των µελών της οµάδας. Βεβαιωθείτε ότι το mygame.c περιέχει (σε σχόλια) τα ονόµατα και ΑΕΜ των µελών. Αντιγράψτε το δικό σας mygame.c µέσα στο φάκελο. Συµπιέστε το φάκελο µε την εντολή tar ώστε να δηµιουργηθεί το επώνυµο1_επώνυµο2.tgz : tar czf επώνυµο1_επώνυµο2.tgz επώνυµο1_επώνυµο2 Το ένα µέλος της οµάδας πρέπει να αναλάβει να στείλει το tgz αρχείο. Το tgz αρχείο πρέπει να σταλεί συννηµένο σε email. Ο τίτλος (subject) πρέπει να είναι project 2009. Η διεύθυνση που θα το στείλετε είναι ce120lab@gmail.com. Επίσης, στείλτε αντίγραφο (cc) και στα δύο µέλη της οµάδας. Μέσα στο σώµα του email γράψτε τα ονόµατα και αριθµούς µητρώου και των δύο µελών.

ΠΑΡΑΡΤΗΜΑ Α : ΕΚΤΕΛΕΣΗ ΠΡΟΓΡΑΜΜΑΤΩΝ ΜΕ GLUT Εκτέλεση σε MacBook 1. Ανοίξτε το Xcode 2. Επιλέξτε το µενού File->New Project 3. Στο παράθυρο που ανοίγει βρείτε το Command Line Utility, ανοίξτε το κι επιλέξτε Standard Tool. 4. Πατήστε Next και δώστε όνοµα και τοποθεσία στο project. Στο τέλος, πατήστε Finish 5. Στο παράθυρο που ανοίγει, κάντε δεξί click στο Source κι επιλέξτε Add->Existing FrameWorks 6. Ανοίξτε το Frameworks folder, επιλέξτε GLUT.framework και µετά Add 7. Επαναλάβετε τα βήµατα 5-6 για το OpenGL.framework 8. Κάντε πάλι δεξί click στο Source αλλά αυτή τη φορά επιλέξτε Add->Existing Files 9. Επιλέξτε τα introglutlib.c, introglutlib.h, mygame.c και µετά Add 10. Κάντε click στο Source. Δεξιά φαίνονται τα αρχεία που περιλαµβάνονται στο project. Κάντε δεξί click στο main.c κι επιλέξτε Delete. Στο επόµενο παράθυρο επιλέξτε Delete References & Files 11. Κάντε click στο "Build & Go" για να κάνετε compile κι εκτέλεση. Εκτέλεση σε Linux στο εργαστήριο Κάντε compile µε την εντολή gcc -Wall -o mygame introglutlib.c mygame.c -lglut -lgl -lglu (Ο χαρακτήρας µετά το - στα -lglut, -lgl, -lglu είναι el) Τρέξτε το εκτελέσιµο./mygame Εκτέλεση σε Linux στο σπίτι Χρειάζεστε τι βιβλιοθήκη glut. Πηγαίνετε στο YaST (όσοι έχετε OpenSuse) ή στο Adept ή Synaptic (όσοι έχετε Ubuntu) και γράψτε glut. Από τα πακέτα που θα εµφανιστούν επιλέξτε και εγκαταστήστε τα freeglut και freeglut-devel. Αφού κάνετε την εγκατάσταση, για να εκτελέσετε το πρόγραµµα που σας δίνουµε ακολουθείστε τις παραπάνω οδηγίες για Linux στο εργαστήριο.

ΠΑΡΑΡΤΗΜΑ Β : ΔΙΑΘΕΣΙΜΕΣ ΣΥΝΑΡΤΗΣΕΙΣ Συναρτήσεις σχεδιασµού Συνάρτηση Επεξήγηση DrawLine(x0, y0, x1, y1) Σχεδιάζει µια γραµµή από το σηµείο (x0, y0) έως το σηµείο (x1, y1) DrawBox (x0, y0, x1, y1) DrawFillBox (x0, y0, x1, y1) DrawFillTriangle(x0, y0, x1, y1, x2, y2) DrawEllipse(xctr, yctr, radiusx, radiusy) DrawFillEllipse(xctr, yctr, radiusx, radiusy) DrawCircle(xctr, yctr, radius) DrawFillCircle(xctr, yctr, radius) DrawArc (xctr, yctr, radius, startangle, endangle) DrawPieArc (xctr, yctr, radius, startangle, endangle) DrawText2D(font, x0, y0, pstring) ClearWindow() SetPenColor(red, green, blue) Σχεδιάζει ένα ορθογώνιο παραλληλόγραµµο µε κάτω αριστερή γωνία στο σηµείο (x0, y0) και πάνω δεξιά γωνία στο σηµείο (x1, y1). H παραλλαγή Fill γεµίζει το παραλληλόγραµµο µε το τρέχον χρώµα. Σχεδιάζει και γεµίζει µε χρώµα ένα τρίγωνο του οποίου οι τρεις κορυφές είναι στα σηµεία (x0, y0), (x1, y1), (x2, y2) Σχεδιάζει (και η Fill γεµίζει µε χρώµα) µια έλλειψη µε κέντρο (xctr, yctr), ακτίνα οριζοντίου άξονα radiusx και ακτίνα καθέτου άξονα radiusy Σχεδιάζει (και η Fill γεµίζει µε χρώµα) ένα κύκλο µε κέντρο (xctr, yctr) και ακτίνα radius Σχεδιάζει ένα τόξο του κύκλου µε κέντρο (xctr, yctr) και ακτίνα radius, από τη γωνία startangle έως τη γωνία endangle. Οι γωνίες µετρώνται σε µοίρες, σχεδιάζονται αριστερόστροφα και το µηδέν είναι στο πιο δεξί σηµείο του κύκλου. Σχεδιάζει και γεµίζει µε χρώµα ένα κυκλικό τοµέα του κύκλου µε κέντρο (xctr, yctr) και ακτίνα radius, από τη γωνία startangle έως τη γωνία endangle. Οι γωνίες µετρώνται σε µοίρες, σχεδιάζονται αριστερόστροφα και το µηδέν είναι στο πιο δεξί σηµείο του κύκλου. Γράφει το κείµενο pstring στο σηµείο (x0, y0) σε τυπογραφικό στοιχείο font. Οι πιθανές τιµές του font έχουν οριστεί στην αρχή του introglutlib.h "Σβήνει' την επιφάνεια του παραθύρου γεµίζοντάς το µε το τρέχον χρώµα. Θέτει το τρέχον χρώµα στην τιµή που ορίζεται από τα red, green, blue, τα οποία παίρνουν double τιµές από 0 έως 255. Δείτε την περιγραφή στο introglutlib.h για τους συνδυασµούς των βασικών χρωµάτων.

SetBackgndColor(red, green, blue) SetDottedLines() SetSolidLines() SetLineWidth(w) Pause(ms) Θέτει το χρώµα που χρησιµοποιεί η ClearWindow() και καλεί την ClearWindow() Κάνει όλες τις συναρτήσεις να σχεδιάζουν διακεκοµµένες γραµµές Κάνει όλες τις συναρτήσεις να σχεδιάζουν συνεχείς γραµµές (δηλαδή όχι διακεκοµµένες) Θέτει το πάχος των γραµµών ίσο µε w pixels Παύει για ms milliseconds ανάµεσα σε frames. Για πιο οµαλό animation, είναι καλύτερα το ms να είναι λιγότερο από 166. Callback συναρτήσεις Αυτές είναι ειδικές συναρτήσεις τις οποίες ορίζετε αλλά δεν καλείτε ποτέ απευθείας. Το Glut τις καλεί µόνο του όποτε χρειάζεται. mydisplay() Συνάρτηση mykeyboard(key, x, y) mymouse(button, state, x, y) Επεξήγηση Η βασική συνάρτηση του προγράµµατος. Εδώ τοποθετείται ο κώδικας (κυρίως κλήσεις συναρτήσεων) που σχεδιάζει την εικόνα. Εδώ τοποθετείται ο κώδικας που λέει στο πρόγραµµα τι να κάνει όταν πατηθεί ένα πλήκτρο (key) Εδώ τοποθετείται ο κώδικας που λέει στο πρόγραµµα τι να κάνει όταν πατηθεί ένα κουµπί του ποντικιού. Το κουµπί (button) µπορεί να είναι αριστερό (GLUT_LEFT) ή δεξί (GLUT_RIGHT). Η κατάσταση (state) του κουµπιού µπορεί να είναι πατηµένο (GLUT_DOWN) ή όχι (GLUT_UP). Το σηµείο στο οποίο έγινε κλικ έχει συντεταγµένες (x,y)