JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=05ae0700484d601a2f25afb5441647a8Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Timing mit ungleichmäßiger Bewegung

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 28.01.2005, 17:02    Titel: Timing mit ungleichmäßiger Bewegung Antworten mit Zitat

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. Sad
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 28.01.2005, 17:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 28.01.2005, 17:49    Titel: Antworten mit Zitat

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 Smile 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 28.01.2005, 18:09    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 28.01.2005, 18:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 28.01.2005, 18:45    Titel: Antworten mit Zitat

jo, ist doch nicht schwer? Wenn du es in nem Array hast, zu testen wo Kreuzungen sind...
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 28.01.2005, 18:46    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 28.01.2005, 18:58    Titel: Antworten mit Zitat

Ich werd's mal versuchen... Rolling Eyes
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum