|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Apr 2007
Messaggi: 263
|
piccola domanda sull OOP
Salve a tutti!
Ho un problema con l'OOP Prendiamo il caso di un RPG-Game Ho un Oggetto Livello, che contiene un Oggetto Player il Player prende l'input dalla tastiera e si muove di conseguenza, peró prima deve verificare che non ci sia una collisione. Ed ecco il problema: mettiamo che la funzione per il rilevamento della collisione é nella classe Livello(bool collide(rect rectangle)). come si fá in c++ ad accedere ad una funzione dell' oggetto padre??? In questo caso Player dovrebbe accedere a collide della classe Livello!? Magari sbaglio tutto con l'oop e in questo caso sarei molto contento se mi potreste illustrare un'alternativa al mio problema... |
|
|
|
|
|
#2 |
|
Messaggi: n/a
|
cioè se ho capito bene non sai come far testare all'oggetto Player se sta sbattendo contro un muro del livello? beh, se la funzione di Player per muoverlo è muovi() e se all'interno di essa devi controllare prima le collisioni, allora l'oggetto Player deve essere in qualche modo informato in che livello si trova... magari al momento della creazione...
però io, anche se non ho ancora mai creato un qualcosa di così complesso, non sarebbe meglio (o solo + sensato) creare un'entità/oggetto esterno che controlla le collisioni? perché se tipo il Player urta un altro Player, o definisci un modo per notificare ad un Player che è stato urtato, oppure strutturi il tutto facendo che Player è solo un'entità passiva, che si muove e non cerca collisioni finché non gli vengono notificate da questo Dio che trova le collisioni... magari come funzionalità è lo stesso, ma a me questo modello piace di + adesso aspetto i pareri dei guru |
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
La seconda è una questione di C++ più che di orientamento agli oggetti.
Se: Codice:
class Livello {
public:
void collide();
};
Codice:
class Player:public Livello {
};
Codice:
Player p; p.collide(); Codice:
class Player:public Livello {
public:
void muovi() {
collide();
}
};
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Apr 2007
Messaggi: 263
|
Grazie per le vostre risposte.
Per programmare un rpg mi consigliate di far muovere i personaggi all'oggetto livello oppure di far si che i Personaggi si regolino da soli. Dovendomi peró cosí incasinare con funzioni e dati degli oggetti "Genitori" |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Ad esempio: //aggiunge nuovi oggetti che vanno creati all'istante indicato dal timer engine->getLevel()->addNewObjects(timer); //muove fisicamente gli oggetti engine->updateObjects(timer); //fa il check sulle collisioni engine->checkCollision(); //disegna gli sprite degli oggetti (anche con gli effetti della collisione) engine->draw(); Codice:
void Engine::updateObjects(Timer timer)
{
for(list<Object *>::iterator it = objects.begin(); it != objects.end(); it++)
{
(*it)->update(timer);
}
}
Una cosa del genere: Codice:
class Sprite
{
Image data;
double x;
double y;
public:
Sprite(string filename, double x = 0.0L, double y = 0.0L);
void moveTo(double x, double y);
void moveBy(double dx, double dy);
double getX();
double getY();
Image getData();
};
class Object
{
Sprite *sprite;
Engine *engine
public:
Object(Sprite *sprite, Engine *engine);
virtual const Sprite *getSprite();
virtual void update(Timer timer);
};
//ad esempio Player
class Player: public Object
{
int identifier;
Input *input;
list<InputAction> actions;
public:
Player(int identifier, Sprite *sprite, engine): Object(sprite, engine);
virtual void update(Timer timer)
{
// questo metodo privato produce gli InputAction in base allo stato di input
processInput(input, timer);
for(List<InputEvent>::iterator it = actions.begin(); it != actions.end(); it++)
{
(*it).apply();
}
actions.clear();
};
//scrivo la classe InputAction per farti capire
class InputAction
{
public:
InputAction();
virtual void apply() = 0;
};
//scrivo FireAction e MoveLeftAction per farti capire
class FireAction: public InputAction
{
Engine *engine;
public:
FireAction(Engine * engine, int x, int y);
virtual void apply()
{
engine->addObject(new SimpleFire(x, y));
};
};
class MoveLeftAction: public InputAction
{
double speed;
public:
MoveLeftAction(double speed, Object *object);
virtual void apply()
{
object->getSprite()->moveBy(-speed, 0);
};
};
Poi potresti caricare queste Action da un file (con gli istanti e i vari parametri) e così è semplicissimo creare una specie di scripting per i livelli. Ultima modifica di cionci : 19-07-2007 alle 22:26. |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Tempo fa feci un esperimento organizzato in un modo non concretamente diverso da quello proposto da cionci ma, forse, concettualmente diverso.
Ogni elemento del gioco, dai personaggi allo sfondo, è un "Cellula". Una cellula è qualcosa che possiede un riferimento ad un'altra Cellula. Una Cellula è qualcosa di "vivo" e tale vitalità è espressa dalla capacità di reagire ad un impulso. Insomma una Cellula è semplicemente: class Cell: +void shock(); +void link(Cell aCell); +bool isAlive(); Provai poi ad applicare questo modello ad un gioco esistente (chissà quale Che magari non ve ne frega niente ma ve l'ho detto lo stesso
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Apr 2007
Messaggi: 263
|
Grazie mille per le vostre risposte
Mi metteró subito al lavoro e a testare i vostri suggerimenti!!! |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Avevo lasciato qualche nome sbagliato a giro
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:48.




















