Repository navigation
ActionRPG Link e Gameplay
Link è il player di ActionRPG. La scena traduce i tasti in comandi, DynamicObject applica il movimento e Link sceglie animazioni, attacco e interazione. La catena delle collisioni è descritta in Movimento e collisioni; qui interessa il significato dei contatti per il gioco.
RPGGameScene::updateControls() legge le frecce e chiama Link::move(xDir, yDir) ogni frame, salvo camera manuale. DynamicObject::move() aggiorna _facingDir; MovableObject::update() applica le forze sui due assi, attrito quando un asse non ha input e velocity clipping. Non ci sono gravità e salto: Link si muove su un piano top-down.
Il collider di Link è più piccolo dello sprite, soprattutto in altezza. _fit = false consente all'immagine di estendersi oltre il rettangolo logico. Un secondo RenderableObject, posto nel layer sottostante, disegna l'ombra e segue Link durante update(). Le animazioni stand, walk e attack dipendono dallo stato e dalla direzione; per guardare a sinistra lo sprite viene ribaltato orizzontalmente.
_walking viene aggiornato dalla velocità, non direttamente dal tasto. Perciò l'animazione può riflettere un breve movimento residuo durante la frenata. Lo stato _attacking resta attivo per la durata dell'animazione di attacco, misurata da AnimatedSprite::duration().
Alla pressione di A, Link::attack() riproduce un suono, crea una Sword e programma attack_off con lo scheduler dell'oggetto. Alla scadenza disattiva l'attacco ed elimina la spada. Una nuova pressione durante l'attacco resetta lo sprite, chiede l'eliminazione della spada precedente e ne crea una nuova; non avvia un thread.
La Sword è un DynamicObject temporaneo legato a Link. Ogni update legge la direzione corrente, corregge posizione, angolo e flip dello sprite, poi costruisce un collider RotatedRectF la cui rotazione segue AnimatedSprite::currentTime(). Il collider cambia quindi insieme alla fase del colpo: non è un rettangolo fisso davanti al personaggio. Mostrare i collider durante l'animazione aiuta a vedere questa relazione.
Enemy::collision() elimina il nemico quando with è una Sword. In questo esempio non c'è un sistema completo di punti vita o danno: Link::hurt() e Link::die() sono vuoti. Inoltre Sword non implementa un filtro di collisione specifico, quindi la selezione di candidati segue le regole generali di CollidableObject.
Un dettaglio dell'implementazione: nella seconda metà dell'animazione Sword::update() modifica il layer di Link se la spada è dietro di lui. Il controllo corrente può scattare in più update; non considerare quel cambio di layer una transizione garantita una sola volta.
Alla pressione di I, Link::interact() esegue Scene::raycast() su un segmento lungo un'unità nella direzione in cui guarda. Scorre i risultati ordinati e chiama interact() sul primo NPC trovato. Il raycast usa la query spaziale della scena per restringere i candidati e i test intersectsLine() degli oggetti per la geometria effettiva.
L'NPC dell'esempio apre un DialogBox con testo e tre opzioni. Le callback delle opzioni stampano un messaggio: non modificano missioni o inventario. Il dialogo, come le altre scene UI, vive sopra la scena di gioco nello stack e blocca gli input sottostanti.
A -> RPGGameScene::event() -> Link::attack()
-> new Sword(Link) + schedule("attack_off")
-> Sword::update() aggiorna sprite e OBB
-> CollidableObject::detectCollisions()
-> Enemy::collision() -> kill()
kill() marca l'oggetto per la rimozione differita da parte della scena: non va interpretato come una delete immediata. Per inventario, menu e dialogo consulta UI e portali.
Prosegui con UI e portali.
- Panoramica
- Diagramma delle classi
- Architettura e game loop
- Sequenza di un frame
- Input ed eventi
- Scene e oggetti
- Rendering e coordinate
- Sprite e testo
- UI e overlay
- Quadtree
- Servizi e asset
- Estendere il core
- Editor dei livelli
- LevelData e livelli JSON
- Shader