Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

09.01.2007, 17:23

Frage zur Zeit

Hallo
ich habe da ein kleines Problem
Ich bin dabei so ne art Pacman zu machen.
Der Aufbau ist ca. so:
Win32 Projekt
Ich habe mein Spielfeld

int Spielheld[x][y] und mit switch case zeichne ich es auf den bildschirm
die bewegung der Spielfigur geht momentan über WM_KEYDOWN

wenn man eine Taste drückt rückt die Figur um ein Feld weiter jenachdem links,rechts,hoch,runter.

So nun meine Frage ich möchte die Zeitsteuerung einbauen ich weis aber nicht wie ich es genau machen soll dass sich erstens das Spiel auf allen Rechnern gleich verhält und wenn ich Gegner einbaue und die sich bewegen sich eben um ein Feld pro Sekunde zum beispiel fortbewegen.

Wie könnte ich das am besten impletieren also es sind alles int werte der spieler bewegt sich immer um 20 pixel pro bewegung fort hat da vieleicht jemand eine Idee.

Danke

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

2

09.01.2007, 17:30

Da es ein Win32-Projekt ist kannst du einfach einen Timer setzen. Wenn deine Figuren sich zum Beispiel 2 Felder pro Sekunde bewegen dürfen machst du SetTimer(hWnd, TimerID, 500) [hab die Syntax grad nicht im Kopf aber sowas, näheres bei MSDN]. Dann bewegst du deine Gegner einfach in jedem WM_TIMER. Mit dem Spieler kannst du es eigentlich genau gleich machen. Du musst dann einfach die Eingabe puffern. Zum Beispiel könntest du speichern ob zuletzt nach oben, unten, links oder rechts gedrückt wurde und die Spielerfigur dann jedes mal in WM_TIMER ein Feld in diese Richtung bewegen.

Das gibt dann allerdings ein wenig ruckartige Bewegungen, macht es aber sehr einfach und macht es dann auch einfach zu prüfen ob der Gegner den Spieler jetzt gefressen hat und so...

Diese Methode ist auf allen Systemen gleichschnell wenn deine Berechnungen in WM_TIMER weniger als eine halbe Sekunde dauert und das sollte wirklich auf jedem heutigen PC möglich sein...
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

3

09.01.2007, 17:37

Also ich würde das ganze anders machen wenn du etwas mehr Spaß beim spielen nachher haben willst wird dadurch aber ein weniger kompliziert. David Scherfgen erwänt diese methode auch.

Du kannst deine Programme in zwei Abschnitte unterteilen und zwar in MOVE und RENDER. Du musst dann die Zeit messen wie lange jeder Rechner braucht für die MOVE Funktion und die RENDER Funktion. Wenn dies geschehen legst du für dich auf deinem rechner fest wie weit sich der PACMAN bewegen soll. Dann ziehst du prozentuell von den Geschritten des PACMAN's immer die Differenz der Zeitmessung ab. Dadurch bewegt sich der Pacman auf jedem rechner gleich schnell.

Nehmen wir an du spielst das spiel auf einem rechner mit 1.3 GHz und er bewegt sich 20 Pixel. Jetzt sagen wir die Maschine hat aber nur 50 MHz dann bewegt sich der Pacman beispielweiße (nur einfach so dahergesagt) 100 Pixel und wenn der Rechner 4 GHz hat wird sich der Pacman nur 5 Pixel pro tastendruch bewegen.

Meine Empfehlung wäre diese Methode die du auch in Zukunft brauchen wirst.

4

09.01.2007, 21:45

Ich komme da gerade nicht weiter ich weiss wie ich es bei einem Sprite wo um float werte verschoben wird machen muss

if(GetAsyncKeyState(VK_LEFT) & 0x8000)
{
Sprite.Move(LEFT,fTime);
}
mit der Zeit wie es in Davids buch steht aber bei dem klappt es jetzt nicht da ich meine figuren immer um 1 verschiebe denn die funktion erwartet einen int wert

HRESULT Blt( DWORD x, DWORD y, CSurface* pSurface, RECT* prc = NULL );

so kann ich in der bewegung nicht mit der zeit multiplizieren
das klingt alles ein bischen komisch naja.
Wie sieht es eigentlich aus wenn ich in der Schleife mit Sleep(500) unterbreche gehört nicht gerade zum guten programmierstil oder?

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

5

09.01.2007, 21:56

klar du kannst doch einfach auf ganzzahl casten [(int)bla], oder runden?. (ceil, floor)

Ich weiss jetzt nicht wie du dein Projekt von der "Architektur" aufgebaut hast, daher ist es schlichtweg unmgl. dir eine effiziente Zeitsteuerung zu zeigen.

6

09.01.2007, 21:59

ja das weiß ich schon aber wenn ich meinen Zeitwert in int caste kommt 0 raus

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

7

09.01.2007, 22:05

wenn du die Zeit castest, ja aber du sollst ja koord * zeit rechnen und das dann casten.

prüfe am anfang auch das die zeit nicht genau 0 ist. (wenn ja setz es einfach auf 0.000001f;


Aber ich glaub der ganze Anfang ist hier nicht sooo toll, das mit Render und Move zu machen - ich würde lieber das mit Timern machen. Wenn Timer zuende, alles berechnen und neu zeichnen.

Werbeanzeige