Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - gravità in XNA
Forum - C# / VB.NET - gravità in XNA

Avatar
Due (Normal User)
Pro


Messaggi: 68
Iscritto: 19/10/2007

Segnala al moderatore
Postato alle 18:02
Lunedì, 08/09/2008
Sto provando il tutorial di totem sull'xna in vb.net ed è magnifico :love:..così dopo aver fatto il Breakout volevo provare a fare una cosa un po' diversa da solo, ma visto che sono un disastro ho già due problemi :asd:
1) Nel mio gioco ho creato un terreno e uno sprite che rappresenta il giocatore. Lo sprite può muoversi a sinistra e a destra; lo sprite si carica a una certa quota e quando va a sbattere contro il terreno si ferma la caduta. Il problema e farlo saltare...non so come fare, ho provato con qualcosa del genere:
Codice sorgente - presumibilmente VB.NET

  1. If KeyState.IsKeyDown(Keys.Up) Then
  2.    User.Position += New Vector2(0, -UserMaxAltitude)
  3.    UserSpeed = 3
  4.    User.Velocity = New Vector2(0, UserSpeed)
  5. End If


in cui "user" è l'oggetto che rappresenta il giocatore e usermaxaltitude sarebbe (almeno in teoria ma non funziona) l'altezza massima a cui può arrivare quando salta...il problema è che quando salta va tanto più in alto quanto si tiene premuto keyup. E non solo, uno può farlo saltare ancora anche prima che sia tornato giù.
Insomma come potrei fare a creare un effetto di gravità realistico quando salta?

2)Vorrei far sì che il gioco non sia contenuto tutto nell'area visibile dal giocatore..mi spiego: se il giocatore va verso destra, il programma deve tenere sempre al centro dello schermo l'oggetto user e mostrare al giocatore ciò che c'è verso destra man mano che prosegue..non so se mi sono spiegato..

Comunque complimentoni davvero totem per il lavoro sull'XNA nel tuo sito :k:

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 18:23
Lunedì, 08/09/2008
Se ti è piaciuto questo, impazzirai per il tutorial sul 3D :D

Allora, parliamo della gravità. Bisogna avere un po' di confidenza col moto parabolico e l'accelerazione. Confido che tu l'abbia studiato a scuola.
Se tu vuoi far saltare il tuo personaggio, allora basterà un'unica pressione del pulsante Su per attivare il salto. Quindi, per prima cosa, dovresti mettere una variabile booleana che ti dica quando il personaggio sta saltando:
Private IsJumping As Boolean = False
O, più in generale, possiamo considerare che tale variabile sia vera quando il personaggio è in aria. Ora, in Update, metterai un uleriore controllo:
Codice sorgente - presumibilmente VB.NET

  1. If KeyState.IsKeyDown(Keys.Up) And (IsJumping = False) Then
  2.   IsJumping = True
  3. End If


Ora, quando si salta si imprime una forza sul terreno, che, per il terzo principio della dinamica, provoca la reazione su di noi e ci fa accelerare verso l'alto. Per semplicità, assumiamo che questa spinta provochi un aumento della velocità del personaggio verso l'alto di, ammettiamo, 3 unità. Nel codice usiamo PGSpeed per indicare la velocità del personaggio:
Codice sorgente - presumibilmente VB.NET

  1. If KeyState.IsKeyDown(Keys.Up) And (IsJumping = False) Then
  2.   IsJumping = True
  3.   PGSpeed += New Vector(0, -3)
  4. End If


Ora dobbiamo pensare alla gravità. Quindi, scriviamo una procedura che verrà richiamata in update che applichi le regole del moto parabolico, diminuendo la velocità e ritrascinando il malcapitato verso il basso:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub Gravity(ByVal Time As Single)
  2.   PGSpeed -= New Vector2(0, G * Time)
  3. End Sub


Ci sono due nuovi variabili: G, costante di gravità, che definirai tu stesso, e Time, che serve per calcolare la giusta risultante. Consideriamo Time il tempo che intercorre tra l'inizio del salto e il momento corrente. Perciò occorre un'altra variabile che indichi il momento d'inizio del salto:
Codice sorgente - presumibilmente C# / VB.NET

  1. Private JumpStart As Single


e poi:
Codice sorgente - presumibilmente VB.NET

  1. If KeyState.IsKeyDown(Keys.Up) And (IsJumping = False) Then
  2.   IsJumping = True
  3.   PGSpeed += New Vector(0, -3)
  4.   JumpStart = GameTime.TotalGameTime.TotalSeconds
  5. End If
  6.  
  7. If IsJumping Then
  8.   Gravity(GameTime.TotalGameTime.TotalSeconds - JumpStart)
  9. End If


(GameTime è un parametro di Update)
Prova un po' a bilanciare G e il vettore velocità per non farlo schizzare fuori dallo schermo.
Ah, ovviamente devi vedere anche quando ritorna a terra e disattivare IsJumping.

P.S.: ho scritto tutto a mano e a memoria perchè sono sul portatile, quindi non assicuro che vada.

Ultima modifica effettuata da Il Totem il 08/09/2008 alle 18:27
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 18:33
Lunedì, 08/09/2008
Scusa mi ero dimenticato il secondo problema.
Allora, potresti, in ogni update, spostare il personaggio al centro dello schermo e, dopo aver comparato la visibilità con la posizione, disegnare solo gli oggetti visibili. Se, ad esempio, dichiari un cactus (!) alle coordinate (2000, 600), quando il giocatore avrà posizione X come minimo 1500, disegni il cactus su (Larghezza Schermo / 2 + (Cactus.X - Personaggio.X)). Ovviamente la posizione del giocatore deve essere ricalcolata ogni frame perchè lui, in pratica, sta sempre fermo al centro dello schermo.

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:38
Sabato, 13/09/2008
Un "grazie" sarebbe stato gradito...

PM Quote