Skip to content

ActionRPG Link e Gameplay

Alessandro Bria edited this page Sep 22, 2026 · 1 revision

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.

Movimento e presentazione

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().

L'attacco con la spada

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.

Interazione con l'NPC

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.

Segui un'azione nel codice

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.

Sorgenti

Prosegui con UI e portali.

Clone this wiki locally