Pendenze a 45 ° in un platform 2D basato su piastrelle


12

Voglio avere semplici pendenze a 45 ° nel mio platform basato su piastrelle, tuttavia non riesco proprio a ridurre l'algoritmo. Dai un'occhiata al codice e al video, forse mi manca l'ovvio?

//collisionRectangle is the collision rectangle of the player with 
//origin at the top left and width and height
//wantedPosition is the new position the player will be set to.
//this is determined elsewhere by checking the bottom center point of the players rect
if(_leftSlope || _rightSlope)
{        
    //Test bottom center point
    var calculationPoint = new Vector2(collisionRectangle.Center.X, collisionRectangle.Bottom);
    //Get the collision rectangle of the tile, origin is top-left
    Rectangle cellRect =
        _tileMap.CellWorldRectangle(
            _tileMap.GetCellByPixel(calculationPoint));
    //Calculate the new Y coordinate depending on if its a left or right slope
    //CellSize = 8
    float newY = _leftSlope
                            ? (calculationPoint.X % CellSize) + cellRect.Y
                            : (-1 * (calculationPoint.X % CellSize) - CellSize) + cellRect.Y;
    //reset variables so we dont jump in here next frame
    _leftSlope = false;
    _rightSlope = false;
    //now change the players Y according to the difference of our calculation
    wantedPosition.Y += newY - calculationPoint.Y;
}

Video di come appare: http://youtu.be/EKOWgD2muoc


1
I vettori non sono fantastici? : D
Gustavo Maciel,

Risposte:


10

Da quello che ho capito leggendo la tua domanda, vuoi calcolare la Yposizione corretta , data una Xposizione del giocatore. Questo è piuttosto banale. Dai un'occhiata a questa immagine:

pendenza

Supponendo che la piastrella del pendio sia in una data posizione x,y(l'origine è in basso a sinistra come nell'immagine). Hai la posizione del giocatore, x1la larghezza e l'altezza della tessera inclinata ( u, v). x, ye x1sono coordinate mondiali.

Dati questi parametri, la posizione Y dei tuoi giocatori ( y1) sarebbe:

y1 = y + (x1 - x) * (v / u)

Se hai a che fare solo con angoli di 45 gradi, diventa ancora più semplice:

y1 = y + (x1 - x)

Se la pendenza è inversa, è:

y1 = y + (v - (x1 - x))

dopo aver applicato la correzione @SkimFlux più il tuo nuovo formulare e alcune cose stupide che ho trascurato ha funzionato. Grazie.
xNidhogg,

Non potresti usare y = mx + b per un calcolo più semplice?
ashes999,

@ ashes999 Non penso che diventi molto più semplice di quello che ho scritto. Cosa sono me bnel tuo calcolo?
bummzack,

@bummzack m è la tua pendenza (1 per una pendenza di 45 gradi verso il basso, -1 per la salita) e b sarebbe l'intercetta sull'asse x. Algebra di grado 9. Sto solo dicendo.
ashes999,

@ ashes999 Sì, è passato molto tempo. Sentiti libero di pubblicare questa equazione come risposta.
bummzack,

8

Sebbene questa abbia già una risposta, permettimi di offrire un'altra equazione:, y = mx + bdove y è la coordinata calcolata, m è la pendenza (-1 per giù a 45 gradi, 1 per su a 45 gradi) e b è l'intercetta y - - la coordinata y dove x = 0.

Ciò consente una flessibilità leggermente maggiore; puoi cambiare m per calcolare una pendenza diversa da 45 gradi. Ad esempio, una m di pi / 3 ti dà una pendenza di 30 gradi.


4

Puoi trovare molto valore in questo sito: http://info.sonicretro.org/Sonic_Physics_Guide

In particolare per ciò che stai cercando, consulta la sezione Piastrelle solide: pendenze e curve. Fondamentalmente ti mostra come si ritiene che ciò sia stato realizzato nei primi giochi di Sonic.


lettura interessante, ma troppo complessa. Questo tipo di pendenza è l'unico che desidero, quindi dovrebbe semplificare la soluzione. Una mappa di altezza / sensore / sistema scanner sarebbe eccessiva per questo. Grazie per aver scavato il link, però.
xNidhogg,

2

Potresti voler esaminare la teoria dell'asse separato, risolverà il tuo problema di pendenza, ma richiede un bel po 'di matematica e la teoria stessa richiede un po' di tempo per girare la testa. Ti ho collegato a un tutorial e un libro che lo spiega meglio

Tutorial metanetsoftware

Real-Time-Collision Detection-


è troppo, imo. Questo è un caso altamente semplificato e non ci sarebbe bisogno di altri usi di SAT. Grazie per aver dedicato del tempo a recuperare i link, però.
xNidhogg,

2

Penso che tu abbia un errore diverso da qualche altra parte, o non stai impostando i flag _leftSlope / _rightSlope al momento giusto. Questo codice non tocca affatto il movimento X, ma questo sembra essere il tuo problema nel video.

È necessario verificare se tali flag sono attivati ​​affatto. Quindi controlla il rilevamento della collisione orizzontale: non vuoi che si inneschi su un pendio.


oh dio giusto. In realtà non voglio il rilevamento delle collisioni orizzontale o verticale quando ciò accade. Ho completamente dimenticato di disabilitarlo. Sembra in qualche modo migliore ora, ma non ancora fatto. Grazie.
xNidhogg,
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.