Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo
Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo
Politica, accademia e industria a confronto su mercato unico, sicurezza e competitività. Nei laboratori di Vimercate, Nokia ha mostrato le nuove generazioni di chip ottici e i test che ogni prodotto deve superare prima di arrivare sul mercato
In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi
In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi
Abbiamo assemblato e provato la Fiido Nomads Pro, evoluzione del modello da trekking già presente nella gamma, che migliora in tutto, soprattutto grazie al motore centrale, fluido e potente. Ottima app, costruzione solida e prezzo ok completano il quadro
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente
Google Pixel Watch 5 ha affinato una formula già convincente con hardware più veloce, Gemini offline e nuovi strumenti per sport e benessere. Abbiamo provato la versione LTE da 41 mm, comoda anche di notte e ben proporzionata sui polsi piccoli. Il design resta un punto di forza, ma l'autonomia premia ancora il 45 mm e alcune funzioni AI non sono disponibili in Italia: ecco che cosa cambia rispetto a Watch 4 e quale formato conviene scegliere oggi
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-07-2007, 10:56   #1
stdecden
Member
 
L'Avatar di stdecden
 
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...
stdecden è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2007, 11:11   #2
pisto
 
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
  Rispondi citando il messaggio o parte di esso
Old 19-07-2007, 11:19   #3
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
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();
};
e:

Codice:
class Player:public Livello {

};
Allora:

Codice:
Player p;
p.collide();
Come pure:

Codice:
class Player:public Livello {

    public:
        void muovi() {
            collide();
        }
};
A parole, l'estensione ti permette di considerare i membri non privati di Livello come se fossero dichiarati in Player.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2007, 17:27   #4
stdecden
Member
 
L'Avatar di stdecden
 
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"
stdecden è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2007, 18:25   #5
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da stdecden Guarda i messaggi
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"
Da nessuno dei due...stai cercando di inserire a forza una funzionalità in un oggetto che non la vuole Ecco perché non ti torna. Se ti fa storcere il naso significa che c'è qualcosa che non va

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);
   }
}
Object lo farei molto semplice, l'unica cosa che gli assegnerei sarebbe uno Sprite.

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);
  };
};
Da notare che queste InputAction con un po' di lavoro possono essere anche Action generiche da applicare agli oggetti generici (come anche astronavi nemiche o spari). Ad esempio Level potrebbe eseguire una sequenza di queste Action a seconda del timer che gli viene passato.
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2007, 19:44   #6
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
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 ). Il risultato è che se po' fa. Cioè creando cellule specializzate è possibile realizzare una sorta di organismo che "vive" grazie alla produzione di un impulso da parte di una delle sue cellule.

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!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2007, 21:06   #7
stdecden
Member
 
L'Avatar di stdecden
 
Iscritto dal: Apr 2007
Messaggi: 263
Grazie mille per le vostre risposte .

Mi metteró subito al lavoro e a testare i vostri suggerimenti!!!
stdecden è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2007, 22:27   #8
cionci
Senior Member
 
L'Avatar di cionci
 
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 Ho corretto...
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo Nokia Innovation Day 2026: la sovranità e...
In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi In sella alla Fiido Nomads Pro: e-bike con motor...
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente Recensione Google Pixel Watch 5: sembra lo stess...
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto ASUS Zenbook 14 (UX3480AA): tanta autonomia con ...
MSI PRO MAX: QD-OLED ultrawide per lavorare, creare e giocare MSI PRO MAX: QD-OLED ultrawide per lavorare, cre...
Ray-Ban Meta Audio: arrivano gli occhial...
Apple TV 4K: chip A19, CPU più veloce de...
Il mercato console sprofonda: i rincari ...
Apple Home Collection: videocamere 2,5K,...
Apple presenta HomeView, il nuovo hub do...
Apple HomePod mini 2 arriva in Italia: a...
SFSCON 2026: la sovranità digital...
Cooler Master GPU Shield arriva in Europ...
Wolters Kluwer Tax & Accounting pote...
NVIDIA accelera il DLSS 5: il nuovo mode...
Character.ai in bancarotta, Disney pront...
realme passa a ColorOS 17 con Android 17...
OPPO presenta ColorOS 17: più flu...
Giochi PS2 su smartphone Android: ARMSX2...
Ecco il nuovo tool semplificato per alle...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:48.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v