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 - [C# + XNA] mappa 2D & collisione
Forum - C# / VB.NET - [C# + XNA] mappa 2D & collisione

Avatar
crybot (Member)
Pro


Messaggi: 115
Iscritto: 13/09/2011

Segnala al moderatore
Postato alle 13:30
Mercoledì, 22/02/2012
salve, apro questo topic per chiedervi qualche consiglio riguardo un piccolo gioco in 2D che sto creando. Il gioco in questione e` un remake del celeberrimo impossible game per ios/android/windows phone ecc.ecc.
questo e` un video del gioco: http://www.youtube.com/watch?v=_E96i-u_5E0

come da titolo, vorrei chiedervi, visto che le mie ricerche continue sul caro amico google non hanno dato frutti, come creare e successivamente stampare a schermo una mappa per un gioco del genere. Ho visto che molti per i giochi in 2D adottano un paradigma tile-based, ovvero un file di testo con delle lettere che indicano gli oggetti che andranno a creare la mappa. Io pero`, come si puo` vedere nel video, ho bisogno di coordinate precise per tutti gli oggetti che andranno ad ostacolare il giocatore, quindi avevo pensato ad un file xml da caricare ad ogni lancio del gioco, con gli attributi X e Y di tutti gli oggetti della mappa. e` un metodo sbagliato secondo voi?

mentre ci pensate, vi lascio un altro quesito:

nel video che ho linkato, si vede chiaramente come il cubo "esploda" andando contro i triangolini, mentre salti sopra i quadrati. e` pero` ovvio che il cubo debba esplodere anche quando va contro i quadrati, senza saltarci sopra... come posso implementare una collisione del genere? come faccio a capire se il giocatore a saltato sopra il quadrato o ci e` andato contro? pensavo di cambiare leggermente colore ai bordi e di implementare una per-pixel collision detection, cosi` da poter essere sicuro di come il giocatore viene a contatto con questi ostacoli. questo pero` rallenterebbe il gioco... quindi anche qui la mia domanda e`, avete qualche consiglio?

grazie ;)

PM
Avatar
Snogar (Normal User)
Pro


Messaggi: 130
Iscritto: 09/01/2012

Up
0
Down
V
Segnala al moderatore
Postato alle 16:30
Mercoledì, 22/02/2012
Per il primo quesito, non  penso sia sbagliato, tanto un file devi caricare e il tipo di file non è che influisce molto.

Sul secondo quesito credo basti confrontare l'altezza del "personaggio" con quella della piattaforma e nel caso sia uguale o inferiore esegui l'esplosione.

e` una soluzione alla quale non avevo pensato. provo subito, ma credo che possa funzionare. lascio comunque aperta la discussione, nel caso qualcuno avesse qualche altro consiglio ;) - crybot - 22/02/12 17:28


PM
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Up
0
Down
V
Segnala al moderatore
Postato alle 19:27
Mercoledì, 22/02/2012
Posso aiutarti in questo modo.

Ti consiglio prima di tutto di crearti una struttura e una magari una lista.
oppure semplicemente un array di byte che forma la mappa.
in questo modo

Codice sorgente - presumibilmente C++

  1. //Texture 0 e cubo1.png
  2. //Texture 1 e cubo2.png
  3.  
  4. Texture[] Tex;
  5.  
  6. struct DataObject {
  7.  
  8. public int ID;
  9. public int x;
  10. public int y;
  11. public bool coll;
  12. }
  13.  
  14. List<DataObject> MapData = new List<DataObject>();




Il file di mappa lo puoi strutturare in questo modo
esempio se teniamo conto che ogni oggetto misura 32x32 pixel


### File Mappa ####
tex:0,x:40,y:100,true;
tex:0,x:70,y:100,true;
tex:1,x:100,y:100,false;
tex:1,x:200,y:100,true;

#####


Composizione mappa

Codice sorgente - presumibilmente C# / VB.NET

  1. DataObject d = new DataObject;
  2. StreamReader sr = new StreamReader(Mappa)
  3. string riga;
  4.  
  5. while((riga = sr.ReadLine()) != null) {
  6.  
  7. string[] t = riga.split(',');
  8.  
  9.  
  10. string[] t2 = t[0].Split(':');
  11. d.ID = int.Parse(t2[1]);
  12.  
  13. t2 = t[1].Split(':');
  14. d.x = int.Parse(t2[1]);
  15.  
  16. t2 = t[2].Split(':');
  17. d.y = int.Parse(t2[1]);
  18.  
  19. t2 = t[3].Split(':');
  20. d.coll = bool.Parse(t2[1]);
  21.  
  22. }





Per fare un detect di collisione usa
(in questo caso come ti avevo detto esempio Larghezza e altezza = 32)

MapData.coll == true && MapData.X => PosizionePlayer &&  MapData.X < PosizionePlayer + 32

collisione ok



per creare una sorta di scrolling ti basta piazziare una sola variabile tipo int cioè steps

spritebatch.draw(Texture,MapData.X - steps,Mapdata.Y,Color.White);

nel caso del video interessa solo l'asse X

Mentre la posizione del player resta inviariata, perchè sono gli oggetti a spostarsi e non il player.

Spero di averti spiegato nei migliori dei modi cosa intendo.



Ultima modifica effettuata da Thejuster il 22/02/2012 alle 19:29


PM