Rendi lenta la cosa veloce (Box2D)


9

Sto lavorando a un gioco che controlli un trabucco per lanciare palle all'avversario.

È come un gioco chiamato "Assedio medievale". Quando il trabucco oscilla il braccio, il giocatore deve cogliere il momento migliore per premere il pulsante e rilasciare la palla. Quindi la palla volerà all'angolo tangente. inserisci qui la descrizione dell'immagine Il mio problema in questo momento è che il braccio del trabucco oscilla troppo velocemente perché il giocatore possa cogliere l'attimo giusto. Nel frattempo deve essere così veloce, altrimenti non può lanciare abbastanza lontano. E c'è una minuscola corda che collega la palla e il braccio del trabucco, se il braccio oscilla troppo lentamente, la palla è appesa alla corda quando il braccio si muove.

Risolvo il problema commutando la dimensione del gradino, ogni volta che il braccio oscilla, cambio la dimensione del gradino da 1/60 a 1/200. E una volta che il giocatore rilascia la palla, torna a 1/60.

Funziona abbastanza bene, tranne per il fatto che il mio gioco è multiplayer con rete. Quindi cambiare passaggio può causare problemi.

Un'altra soluzione che mi viene in mente è quella di permettergli di oscillare lentamente, ma quando il giocatore rilascia la palla, aggiungo manualmente velocità sulla palla mantenendo la sua direzione. Non mi piace molto questa soluzione perché sembra falsa e ho ancora il problema che la palla sia semplicemente appesa alla corda, a meno che non crei una corda molto corta.

Per favore, fai luce su questo, grazie!


MODIFICARE

Grazie per l'input di tutti, risolvo il problema facendo rallentare il braccio e quando il giocatore rilascia la palla, afferrare la velocità della palla e due volte. Sembra esattamente come cambiare la dimensione del passo. C'è solo un'altra cosa che devo fare. Poiché il braccio oscilla molto lentamente, la palla è semplicemente appesa all'estremità del braccio anziché oscillare. Ho risolto questo applicando una forza uguale alla forza gravitazionale sulla palla durante e solo durante il periodo di oscillazione. Quindi non pende più lì, ma oscilla insieme al braccio.

La risposta di @MrCranky è dettagliata e sembra fattibile, quindi la accetterei. :)


Forse potresti spostare lentamente il trabucco, ma moltiplicare le forze che agiscono sulla palla? Non ho mai lavorato con Box2D prima, quindi mi dispiace se questa è un'idea stupida. A parte questo, la mia unica ipotesi sarebbe quella di giocherellare con la massa della palla per vedere se quelli più pesanti o più leggeri potrebbero darti risultati accettabili a velocità più basse. Inoltre, potrebbe valere la pena esaminare la fisica dei trabucchi della vita reale. Quelli sembrano un po ' lenti, quindi forse i dati su di essi (dimensioni, munizioni, forze ecc.) Potrebbero darti alcune idee per il tuo simulato.
Christian,

2
Far sì che la fisica dei computer si comporti come "la cosa reale" è davvero difficile. Quasi tutti i motori fisici simulano corpi rigidi, il che significa che effetti come la flessione del braccio del trebouchet non sono considerati né la fisica della corda né il comportamento materiale in alcun modo accurati, quindi una simulazione esatta senza "imbrogli" è quasi impossibile. Il processo per avvicinarsi a qualcosa che sembra reale va un po 'così: modifica, modifica, modifica, modifica, modifica, modifica, modifica, trucco, modifica, ricomincia, modifica, modifica, modifica, modifica, modifica, modifica, modifica , imbrogliare, modificare.
LearnCocos2D,

4
Kitten Cannon utilizza l'approccio più realistico a questo problema: gli umani sono davvero così cattivi nel manipolare la realtà fisica e hanno bisogno di assistenza meccanica, se si desidera dare la "sensazione" di un trabucco che si muove abbastanza lentamente da consentire a un essere umano di controllare manualmente ma si avvia più veloce di quanto fisicamente possibile, potresti voler creare un'animazione puramente artistica "sparando" e quindi generare la palla in base a dove l'utente interrompe l'animazione.
MickLH,

Risposte:


3

Istintivamente direi che ci manca una parte sostanziale del contesto necessario per rispondere, che è "perché l'aspetto multiplayer ti impedisce di cambiare il timestep?"

Se stai provando a condividere una simulazione fisica tramite una connessione di rete, in genere è una cosa piuttosto difficile da fare. Le simulazioni divergono molto facilmente, e specialmente con le connessioni di rete che possono perdere i pacchetti, è molto difficile tenere insieme le cose.

La risposta semplice e più affidabile alla tua domanda è quella di utilizzare un timestep variabile. Quando ti avvicini al momento della decisione, invece di aggiornare la simulazione fisica di un secondo per ogni secondo del mondo reale che passa, aggiornalo di mezzo secondo o un altro numero adatto. Poiché è un effetto di integrazione, probabilmente sarai in grado di cavartela semplicemente portando la velocità di aggiornamento alla velocità più bassa durante la finestra di decisione, ma puoi anche interpolare rapidamente verso il basso alla velocità più bassa. Ad ogni modo, stai essenzialmente riproducendo la simulazione fisica al rallentatore. Dovrebbe comportarsi in modo perfettamente accurato, abbastanza lentamente da consentire al giocatore di prendere una decisione. Non prenderei in considerazione nessun altro modo di confondere la fisica per farlo funzionare, molto probabilmente funzioneranno tutti orribilmente e non si sentiranno "giusti".

Quindi torniamo all'implementazione della rete. Senza ulteriori informazioni, immagino che tu abbia due scelte. Innanzitutto, se stai operando in blocco con l'altra parte in rete. Quindi, quando un giocatore deve rallentare per prendere una decisione, rallenta entrambi i giocatori allo stesso modo. Questo probabilmente sembrerà fastidioso e strano per il giocatore che non sta sparando, perché confonderà i propri tempi di reazione.

Per il secondo, immagina che due trebuchet si sparino l'un l'altro. Il trabucco richiede 10 secondi per essere lanciato, e la finestra di fuoco inizia a T + 5s. P1 avvia il ciclo di accensione a T + 0 e a T + 5 rallenta la simulazione della fisica locale del 50%. Ci vorranno 15 secondi per giocare durante l'intero ciclo. Quindi a T + 5s, P1 dice a P2 di iniziare a riprodurre il ciclo di lancio 10s a tutta velocità. Quindi P1 vede il ciclo del trabucco richiedere 15 secondi, P2 vede che impiega 10 secondi, ma entrambi i giocatori vedono la fine del ciclo a T + 15 secondi. Quando P1 rilascia effettivamente, dicono a P2 quando nel ciclo nozionale hanno rilasciato. Quindi, se P1 viene rilasciato a T + 10, in realtà è a 7,5 secondi durante il ciclo di lancio di 10 secondi. P2 può quindi mostrare il rilascio a T + 12.5s (7.5s nella sua riproduzione locale del ciclo) ed entrambe le simulazioni dei giocatori dovrebbero aver lanciato il proiettile nello stesso punto fisico del ciclo.

Quindi, in questo secondo approccio, non stai più simulando in modalità passo-passo. Stai eseguendo due simulazioni indipendenti, ma tieni traccia degli input del giocatore. Se ad entrambi viene detto che il giocatore ha rilasciato a 7.5s nel ciclo di lancio, dovrebbero entrambi essere d'accordo su dove atterrerà il proiettile. In pratica, tuttavia, è probabile che divergano molto rapidamente e in qualche modo dovrai sincronizzare gli stati di simulazione.


0

Perché non semplicemente copiare / adattare ciò che esiste già e funziona in casi simili?

inserisci qui la descrizione dell'immagine


0

Se il tuo trabucco si sta muovendo troppo velocemente, la soluzione ovvia sarebbe ridimensionare il tempo per renderlo più lento. Cioè, per ogni secondo del tempo reale, fai passare ad esempio solo 0,1 secondi nella tua simulazione fisica. Ora, dal punto di vista del giocatore, la palla si muoverà 10 volte più lentamente.

In realtà, c'è un altro modo in cui puoi ottenere lo stesso effetto: invece di ridimensionare il tempo, ridimensiona tutte le costanti fisiche che sono in unità incluso il tempo. Ad esempio, l'accelerazione gravitazionale ha unità di velocità / tempo = distanza / tempo², quindi se la gravità è l'unica costante nel tuo gioco, ridimensionandola di un fattore 100 = 10² si ottiene lo stesso effetto del rallentamento del tempo di un fattore 10 .

Naturalmente, se il tuo modello fisico include altre costanti con unità di tempo (o velocità = distanza / tempo, o accelerazione = distanza / tempo², ecc.), Dovrai ridimensionare anche quelle se vuoi mantenere le traiettorie uguali .

Nota che c'è un limite a quanto puoi praticamente andare avanti con questo: se rallenti il ​​tempo, diciamo, di un fattore 100, il tuo trabucco sarà davvero facile da controllare, ma è anche probabile che i tuoi giocatori si annoino aspettando il palle che galleggiano lentamente dopo averle sparate. Se questo è un problema, potresti dover ricorrere a trucchi più avanzati come quelli suggeriti in altre risposte, come l'uso del ridimensionamento del tempo molto lento mentre il trabucco sta sparando, ma passare a una scala temporale più veloce una volta lanciata la palla.


grazie, ma probabilmente non hai visto la mia modifica. Sì, l'ho risolto con l'ultimo metodo nella tua risposta
Arch1tect,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.