3 messaggi dal 31 dicembre 2009
www.wplabs.it
Salve,
Mi sto addentrando per la prima volta nel mondo dello sviluppo mobile, quindi sono ancora inesperto in tal senso.
Sto provando a sviluppare un gioco 2D. Ho un grosso problema nella creazione delle collisioni.
Per quanto riguarda le collisioni sprite to sprite non riscontro problematiche. Questo non è lo stesso per la creazione di collisioni Sprite to Scene.

Il mio progetto è un gioco d'auto dove la pista, più grossa dello schermo, scorre sotto la vettura. vorrei che la vettura quando va sull'erba, rallenti mentre se va contro un muretto si fermi.
Ho trovato un codice sulla rete che dicevano essere compatibile anche per wp, dove fa un calcolo dei colori dei pixel dell'immagine di sfondo, se il colore è diverso da quello indicato, viene considerato collisione. Il risultatò è stato catastrofico; Non funziona in quanto il sistema mi riponde sempre che la collisione non esite, ma in compenso rallenta tutto il gioco diventanto scattosisimo ed inutilizzabile.
Esiste qualche altro sistema per creare delle collisioni Frame to Scene per wp, o devo per forza mettere tanti frame a bordo pista gestendomi centinaia e centinaia di collisioni frame to frame? (la cosa mi risulta anche difficile in quanto la pista ruota in torno alla propria vettura, e questo significherebbe far ruotare, insieme alla pista, ache tutti i muretti, alberi, e altri tipi di ostacoli.

Grazie in anticipo
Antonio
3 messaggi dal 31 dicembre 2009
www.wplabs.it
Rettifico...
Sono riuscito a far funzionare il codice su WP ma rimane incredibilmente lento e poco fluido.
L'immagine caricata è un png a 2 colori. Nel progetto definitivo dovrà avere la dimensione massima supportata dal telefono (2048*2048) ma la prova l'ho fatta con un immagine di 800*480 e risulta uguamente poco fluido e inutilizzabile.
Il codice che ho utilizzato è il seguente:
Public Shared Function CarIsOnRoad(PositionCar As Vector2, TextureCar As Texture2D, TextureRoad As Texture2D) As Boolean
        Dim RectangleCar As New Rectangle(CInt(PositionCar.X), CInt(PositionCar.Y), TextureCar.Width, TextureCar.Height)

        Dim TextureDataRoad As Color()
        TextureDataRoad = New Color(TextureRoad.Width * TextureRoad.Height - 1) {}
        TextureRoad.GetData(TextureDataRoad)

        For i As Integer = RectangleCar.Top To RectangleCar.Bottom - 1
            For j As Integer = RectangleCar.Left To RectangleCar.Right - 1
                If TextureDataRoad(i * TextureRoad.Width + j) <> Color.Gray Then
                    Return False
                End If
            Next
        Next

        Return True
    End Function


Esiste qualche altra soluzione adatta alle prestazioni esigue di uno smartphone?

grazie ancora per l'attenzione
Antonio
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, provo a commentare il tuo post ma tieni presente che non ho mai messo mano su XNA.

luthoraerys ha scritto:

Ho trovato un codice sulla rete che dicevano essere compatibile anche per wp, dove fa un calcolo dei colori dei pixel dell'immagine di sfondo,

Questo però, anche se funzionasse in maniera fluida, sarebbe parecchio limitante perché ti costringerebbe a realizzare ogni oggetto di un colore ben preciso e come conseguenza saresti obbligato ad impiegare una palette con pochissimi colori.

luthoraerys ha scritto:

L'immagine caricata è un png a 2 colori.

Questa è un'immagine provvisoria? Poi caricherai una texture con molti più colori?
Se vuoi dare al tuo gioco un aspetto retrò ed impiegare solo due colori, allora forse conviene rinunciare alla texture e usare solo la geometria per disegnare la pista. Dai un'occhiata a questo, c'è pure il codice sorgente (in phyton) e potresti capire da lì che algoritmo è stato usato per le collisioni.

Se invece hai in mente di usare molti più colori, usa pure una texture ma devi comunque crearti una rappresentazione geometrica della mappa da tenere in memoria e che userai che determinare le collisioni.

luthoraerys ha scritto:

Devo per forza mettere tanti frame a bordo pista gestendomi centinaia e centinaia di collisioni frame to frame? (la cosa mi risulta anche difficile in quanto la pista ruota in torno alla propria vettura, e questo significherebbe far ruotare, insieme alla pista, ache tutti i muretti, alberi, e altri tipi di ostacoli.

No, disegna pure gli ostacoli e la pista sulla stessa immagine, un po' come in questo gioco. Nella rappresentazione geometrica, non disegnare un cerchio per ciascun alberello ma un grosso poligono che racchiude tutti gli alberi vicini tra loro.

luthoraerys ha scritto:

Nel progetto definitivo dovrà avere la dimensione massima supportata dal telefono (2048*2048)


Lo schermo ha una risoluzione molto più bassa, è un peccato caricare una texture così grande. Dovresti ritagliare l'immagine in pezzi più piccoli e caricarli al bisogno quando la vettura sta per attraversarli. Poi, scarichi dalla memoria ciascun frammento nonappena cade fuori dalla visuale.

ciao
Modificato da BrightSoul il 06 gennaio 2012 14.57 -

Enjoy learning and just keep making
3 messaggi dal 31 dicembre 2009
www.wplabs.it
BrightSoul ha scritto:
luthoraerys ha scritto:

Ho trovato un codice sulla rete che dicevano essere compatibile anche per wp, dove fa un calcolo dei colori dei pixel dell'immagine di sfondo,

Questo però, anche se funzionasse in maniera fluida, sarebbe parecchio limitante perché ti costringerebbe a realizzare ogni oggetto di un colore ben preciso e come conseguenza saresti obbligato ad impiegare una palette con pochissimi colori.

Infatti nell'esempio di codice che ho trovato in rete diceva di sovrappore all'immagine bicolore, poi, l'immagine della pista definita. ma se con la sola immagine bicolore mi rallenta tutto, figuriamoci poi con due immagini sovrapposte..

luthoraerys ha scritto:

L'immagine caricata è un png a 2 colori.

Questa è un'immagine provvisoria? Poi caricherai una texture con molti più colori?
Se vuoi dare al tuo gioco un aspetto retrò ed impiegare solo due colori, allora forse conviene rinunciare alla texture e usare solo la geometria per disegnare la pista. Dai un'occhiata a questo, c'è pure il codice sorgente (in phyton) e potresti capire da lì che algoritmo è stato usato per le collisioni.

Se invece hai in mente di usare molti più colori, usa pure una texture ma devi comunque crearti una rappresentazione geometrica della mappa da tenere in memoria e che userai che determinare le collisioni.

Si infatti... poi dovrei caricare una texture con molti più colori... l'idea di usare la geometria per disegnare la pista mi sembra interessante, solo che non so nemmeno da dove cominciare. phyton non lo conosco, e ho sempre lavorato per il web (ASP.NET), questo è il mi oprimo esperimento nel campo videoludico. La mia idea in questo gioco e di far ruotare la pista intorno alla vettura (tipo f1 grand prix per snes... se non viene in mente qui un video... è possibile avere tale risultato usando la geometria per disengare la pista?

luthoraerys ha scritto:

Nel progetto definitivo dovrà avere la dimensione massima supportata dal telefono (2048*2048)


Lo schermo ha una risoluzione molto più bassa, è un peccato caricare una texture così grande. Dovresti ritagliare l'immagine in pezzi più piccoli e caricarli al bisogno quando la vettura sta per attraversarli. Poi, scarichi dalla memoria ciascun frammento nonappena cade fuori dalla visuale.

In realta per l'idea mia, anche 2048*2048 è troppo piccola come immagine della pista... e già avevo in mente di tagliare e fare in modo di caricare pezzi per volta... anche questo per me è, per ora, solo un pensiero, e affronterò il problema dopo aver risolto il primo... :)
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

luthoraerys ha scritto:

La mia idea in questo gioco e di far ruotare la pista intorno alla vettura (tipo f1 grand prix per snes

perfetto, sì infatti immaginavo che fosse qualcosa del genere. Fai bene a voler usare un'immagine da far ruotare sotto la vettura, ma per evitare rallentamenti ricorda che poi dovrai suddividerla in vari pezzi.

luthoraerys ha scritto:

è possibile avere tale risultato usando la geometria per disengare la pista?

No no, la rappresentazione geometrica della pista non va disegnata sullo schermo. E' un qualcosa di molto semplificato ("collezioni di vertici") che devi tenere in memoria e che poi userai per determinare le collisioni.
Qui c'è un articolo che parla di collisioni con XNA:
http://www.codeproject.com/Articles/35718/Collision-detection-in-XNA
Mentre qui trovi un esempio di collision detection con poligoni 2D, che penso sia inerente a ciò che devi realizzare.
http://www.codeproject.com/KB/GDI-plus/PolygonCollision.aspx

Dato che il tuo gioco è in 2D, per creare la rappresentazione geometrica della pista (e degli ostacoli che contiene) potresti realizzare delle immagini vettoriali in formato SVG. Potresti aiutarti disegnando dei tracciati sulla vera pista con un programma gratuito tipo InkScape (o Illustrator se ce l'hai).
Vedo che in XNA le immagini SVG possono essere importate:
http://wam-games.com/2010/04/svg-in-xna/
Quelle saranno la tua fonte di vertici.

Comunque io mi sto avventurando in un terreno che non conosco... probabilmente dovresti affrontare il problema seguendo le indicazioni di un libro, oppure chiedere in un forum specializzato, tipo questo:
http://forums.create.msdn.com/forums/default.aspx?GroupID=6
oppure questo, in italiano:
http://forum.xnaitalia.com/

ciao

Enjoy learning and just keep making
la prima cosa da ottimizzare è come è realizzato lo sfondo.
non puoi controllare continualmente la collisione pixel per pixel.
devi suddividere la pista in elementi differenti e soprapporli, per arrivare a non calcolare mai le collisioni quando sei sull'asfalto.
compito che puoi archiviare velocemente con la collisione per boundaris
box

per non stare a reinventare la ruota ti consiglio di studiare motori già pronti di fisica/collisioni come questo:

http://farseerphysics.codeplex.com/

perche la collisione pixel x pixel è estremamente costosa in termini computazionali.

e per ottenere prerstazioni elevante dovresti andare ad agire direttamente sul backbuffer e fare i tuoi calcoli su quella

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.