|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OLiver Super JLI'ler
Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 28.01.2005, 17:02 Titel: Timing mit ungleichmäßiger Bewegung |
|
|
Hallo,
ich bin zur Zeit dabei einen Pacmanklon zu pogrammieren und bin nun auf ein Problem mit dem Timing gestoßen.
Das Spielfeld besteht aus Quadraten die eine Größe von 40x40 besitzen und die Figur des Spielers ist ebenfalls 40x40 Pixel groß. Ich mache das so mit dem Bewegen, dass ich immer die Differenz von der jetzigen Zeit und der letzten Bewegung berechne und diese dann mit einem beliebigen Wert multipliziere, je nachdem um wie viel Pixel sich der Spieler pro Millisekunde bewegen soll. Ein bisschen Code von der Linksbewegung (natürlich dann auch noch für rechts, oben und unten, ist aber dasselbe in grün):
Code: |
if(tasten[DIK_LEFT])
{
if(bsc_player[DIR_LEFT])
{
int speed = sc_player[DIR_LEFT].GetDifferenz()*SPEED_PLAYER;
x-=min(this->LeftDistance(player_rect),speed);
}
sc_player[DIR_LEFT].Reset();
bsc_player[DIR_LEFT]=1;
dir=DIR_LEFT;
}
else
bsc_player[DIR_LEFT]=0;
// -------------------
SpeedControl sc_player[4];
bool bsc_player[4];
// --------------------
class SpeedControl
{
unsigned timo;
public:
void Reset();
unsigned GetDifferenz();
};
void SpeedControl::Reset()
{
timo=timeGetTime();
}
unsigned SpeedControl::GetDifferenz()
{
return timeGetTime()-timo;
}
// --------------------
#define SPEED_PLAYER 0.35
|
So das funktioniert auch wunderbar, Figur bewegt sich flüssig und immer gleich bei unterschiedlicher Framerate. Das Problem ist nur, dass wenn sich der Spieler vor einem Durchgang befindet, der so breit bzw. so groß ist wie er selbst, was natürlich auch ziemlich oft vorkommt. Eine Skizze ( Q = Hindernisse, S = Spieler )
Code: |
QQQ QQQ
QQQ QQQ
QQQ QQQ
S
|
Wenn der Spieler dann die Pfeil-oben und die linke Pfeiltaste drückt, müsste er ja im Gang landen, was aber natürlich eher zufällig passiert, weil die Geschwindigkeit ja eigentlich immer variiert und nicht gleich 1 ist und er somit dann schon wieder vor einem Hinderniss steht.
Ich weiß nicht so richtig wie ich das Problem lösen kann. |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 28.01.2005, 17:18 Titel: |
|
|
Gibt da Feine Möglichkeiten:
1. Gang vergrößern oder Figur verkleinern
2. Rastersystem: Deine Figur kann immer nur in einer Zelle sein z.B. Zelle [4][7], damit wäre das Problem gelöst, aber die Figur wäre nicht mehr so "frei" sondern eher so ans Spielfeld gebunden wie die Figuren in Diablo, C&C und co.
3. Stichwort: A-Stern (A*), mit diesem Wegfindungsalgo könntest Du Deine Figur dort hin lotzen, würd aber auf die Performance drücken ohne ende.
4. Regionen einrichten.
Code: | QQQ QQQ
QQQ QQQ
QQQ QQQ
S# |
Wenn die Figur nun z.B. auf diese Raute kommt (Imaginär gesehen!!!) und der Spieler drückt die Pfeiltaste nach oben, soll die figur in den Gang gehen.
Ich würd mich persönlich für einen Pacman eher auf Methode 2 entscheiden oder wenn Du es "frei" haben willst für Methode 4.
- Patrick _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
OLiver Super JLI'ler
Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 28.01.2005, 17:49 Titel: |
|
|
Eigentlich wollte ich es schon "frei" haben, besonders damit man den Monstern ausweichen kann und sieht einfach besser aus. Ich glaube ich werde mich für Variante I entscheiden, ist das Unkomplizierteste oder ggf für IV aber da müsste ich dann in jeden Level noch die Regionen angeben, was ein bisschen umständlich wäre. |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 28.01.2005, 18:09 Titel: |
|
|
OLiver hat Folgendes geschrieben: | was ein bisschen umständlich wäre. |
Nö, einfach testen ob das Spieler-Rechteck in diesem Rechteck des Feldes ist. sache von 10-20 Zeilen _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
OLiver Super JLI'ler
Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 28.01.2005, 18:23 Titel: |
|
|
Patrick hat Folgendes geschrieben: | OLiver hat Folgendes geschrieben: | was ein bisschen umständlich wäre. |
Nö, einfach testen ob das Spieler-Rechteck in diesem Rechteck des Feldes ist. sache von 10-20 Zeilen |
Ist schon klar, aber dann müsste ich in jedem Level die Regionen definieren, das ist das Problem, die ganzen Levels zu machen macht schon ein Haufen Arbeit, aber dann noch überall die Dinger einzutragen... Oder das Programm müsste die entsprechenden Punkte selbst finden. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 28.01.2005, 18:45 Titel: |
|
|
jo, ist doch nicht schwer? Wenn du es in nem Array hast, zu testen wo Kreuzungen sind... _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 28.01.2005, 18:46 Titel: |
|
|
Wenn Du Rafiniert warst und hast das level so angelegt:
CPP: | unsigned char map[13][13] = {{1,0,1,0,0,2,0,2,0,2,0,2,0},
{0,0,0,0,0,2,0,2,0,2,0,2,0},
{0,0,0,0,0,2,0,2,0,2,0,2,0},
{0,0,0,0,0,2,0,2,0,2,0,2,0},
{0,0,0,0,0,2,0,2,0,2,0,2,0},
{0,0,0,0,1,0,0,2,0,2,0,2,0},
{0,0,0,0,1,0,0,2,0,2,0,2,0},
{0,0,0,0,1,0,0,2,0,2,0,2,0},
{0,0,0,0,1,0,0,2,0,2,0,2,0},
{0,0,0,0,1,0,0,2,0,2,0,2,0},
{0,0,0,0,1,0,0,2,0,2,0,2,0},
{0,0,0,0,1,0,0,2,0,2,0,2,0},
{0,0,0,0,1,0,0,2,0,2,0,2,0}}; |
Dürfte das kein Problem sein
Hast du Jedoch X,Y,W,H angegeben für die Tiles ist das auch sehr easy, dort kannste einfach ne zusatzvariable (enum) hinzufügen und die dann abfragen wenn der Spieler mit diesem Imaginären Tile kollidiert. Wirklich eine popels Arbeit. _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
OLiver Super JLI'ler
Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 28.01.2005, 18:58 Titel: |
|
|
Ich werd's mal versuchen... |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|