Δημοσιεύτηκε: 03 Ιαν 2012, 16:13
από migf1
Star_Light έγραψε:migf1 φοβερο!!!!! Ειδικα τα γραφικα στην τριλιζα.... σε C το έγραψες επειδη καπου ειδα οτι λες για OOP χρησιμοποιησες και C++ καθολου?
αν και νομιζω η βιβλιοθηκη για τα γραφικα μαλλον σε C++ θα ειναι γιατι η C δεν μπορει να "σηκωσει" γραφικο περιβαλλον.

Παρολαυτά φαινεται τρομερό


Ευχαριστώ!

Καθαρή C, τίποτε άλλο (αφού έχουμε πως με C μπορείς να κάνεις τα πάντα, άλλα πιο εύκολα, άλλα πιο δύσκολα :)
Το GTK+ είναι γραμμένο αποκλειστικά σε C και είναι καθαρά Object Oriented framework, βασισμένο πάνω στο GObject της glib.

OOP είναι και το abstraction του κώδικα που έγραψα, η προσέγγιση δηλαδή στην επίλυση του ζητούμενου. Κατά βαση, ως φιλοσοφία δηλαδή, τα περιβάλλοντα Game, Gui, GamePlay είναι abstract objects, παρόλο που δεν κάθισα να υλοποιήσω abstract constructors/deconstructors, public & private μεθόδους (member functions) κλπ για το καθένα τους... γιατί δεν είχε και πολύ νόημα σε αυτό το μικρούλι πρόγραμμα.

Μπορείς για παράδειγμα να φτιάξεις κάτι τέτοιο σε ξεχωριστό source module, π.χ. animal.h (σε spoiler)...

Spoiler: show
Κώδικας: Επιλογή όλων

#enum { MAMAL=0 /* rest of animal types here */ };

typedef struct Animal Animal;
struct Animal {
/* public data */
int type;
int age;
...
/* public methods */
Bool (*SetType)( Animal *self, int type );
Bool (*SetAge)( Animal *self, int age );
int (*GetType)( Animal *self );
int (*GetAge)( Animal *self );
...
/* private data & methods */
...
};

...
/* ---------------------------------------------- */
int animal_get_type( Animal *self )
{
/* do some error checking here ... */

return self->type;
}
/* ---------------------------------------------- */
int animal_get_age( Animal *self )
{
/* do some error checking here ... */

return self->age;
}
/* ---------------------------------------------- */
Bool animal_set_type( Animal *self, int type )
{
if ( !self || INVALID(type) )
return FALSE;

self->type = type;
return TRUE;
}
/* ---------------------------------------------- */
Bool animal_set_age( Animal *self, int age )
{
if ( !self || INVALID(type) )
return FALSE;

self->type = age;
return TRUE;
}
/* ---------------------------------------------- */
void freeAnimal( Animal *self )
{
if ( self )
free( self);
return;
}
/* ---------------------------------------------- */
Animal *newAnimal()
{
Animal *self = calloc( sizeof(Animal) );
if ( self )
return NULL;

/* give initial (default) values to public data */
self->type = MAMAL;
self->age = 0;
...

/* initialize public methods */
self->SetType = &animal_set_type;
self->SetAge = &animal_set_age;
self->GetType = &animal_get_type;
self->GetAge = &animal_get_age;
...

/* initialize private data & methods here ... */

return self;
}

και κατόπιν στο source module της main() να γράφεις OO κώδικα όπως ο παρακάτω...
Κώδικας: Επιλογή όλων

#include "animal.h"
...
int main( void )
{
Animal *dog = newAnimal();
Animal *cat = newAnimal();

dog.SetType( dog, MAMAL);
dog.SetAge( dog, 2 );
...
printf("the cat is %d years old\n", cat.GetAge(cat) );
printf("the dog is of type %d\n", dog.GetType(dog) );
...
freeAnimal( dog );
freeAnimal( cat );
return 0;
}

Στον κώδικα της τρίλιζας εγώ δεν ασχολήθηκα με ξεχωριστές υλοποιήσεις κλάσεων κλπ, απλώς μπορείς να θεωρήσεις πως τα Game, GamePlay, Gui είναι abstract objects (θα μπορούσαν να θεωρηθούν και κλάσεις αν το είχα έτσι ώστε να "γεννούν" objects). Πάντως κι έτσι όπως τον έχω τον κώδικα, μπορεί κάλλιστα να το θεωρήσει κανείς overkill (εξού και το όνομά του, :lol:)

Για την εικόνα τώρα, απλά την πήρα από την Wikipedia: http://nrm.wikipedia.org/wiki/File:Jogo ... ac_toe.png, τις αφαίρεσα ότι δεν ήθελα (αν δείτε στις ενώσεις του πλέγματος φαίνεται πως εκεί υπήρχε γραμμή στην αριστερή διαγώνιο) και την έσπασα σε κομμάτια, που τα χρησιμοποιώ στο παιχνίδι. Αυτά τα κομμάτια είναι απλές .png εικόνες, και βρίσκονται μέσα στον φάκελο /gui του παιχνιδιού.

ΥΓ. Τελικά το δοκίμασε κανείς σε Linux να μου πει αν είναι όλα OK;