AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Problem mit Geschwndigkeits-Berechnung bei Singleplayer Spiel
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Geschwndigkeits-Berechnung bei Singleplayer Spiel

Ein Thema von Gimp · begonnen am 28. Jan 2011 · letzter Beitrag vom 29. Jan 2011
Antwort Antwort
Gimp

Registriert seit: 27. Dez 2007
7 Beiträge
 
Delphi 2006 Personal
 
#1

Problem mit Geschwndigkeits-Berechnung bei Singleplayer Spiel

  Alt 28. Jan 2011, 13:05
Hallo!

edit:
Crossposting Delphi Forum:
http://www.delphi-forum.de/topic_Zei...me_103845.html

Damit ihr nicht zurückschreckt: Es geht um ein etwas älteres Singleplayer Spiel. Das Thema "Hooking" und Assembler ist noch etwas neu für mich, Zeitberechnungen in Spielen erst recht. Ich habe nun vor, die Geschwindigkeit des lokalen Spielers zu erhöhen. Die Funktion die ich hooke, ist ein __thiscall, der this Pointer ist hierbei der Pointer zur Einheit, für welche die Geschwindigkeit berechnet werden soll. Die Funktion an sich scheint definitiv richtig, allerdings verstehe ich die Berechnung durch die 2 Parameter welche beide vom Typ DWORD sind nicht so recht. Die Berechnung läuft scheinbar über GetTickCount()

Folgende Parameter werden übergeben:

Parameter 1: 28986122
Parameter 2: 28986110

Die umgekehrte push Reihenfolge habe ich natürlich beachtet, die Parameter sind so in der Reihenfolge also korrekt.

Anfangs ging ich von einer recht simplen Berechnung aus, doch leider wurde ich wohl getäuscht. Folgende Funktion habe ich mir hier zusammengebastelt:
Delphi-Quellcode:
procedure hook_CalculateSpeed(dwTime1, dwTime2: Cardinal); stdcall;
var
  pLocal, pTemp: Pointer;
  dwTemp: Cardinal;
const
  factor: float = 1.0;
begin
  asm
    pushad
  end;

  // Pointer zur Einheit kopieren
  asm
    mov eax, [ecx+$100]
    mov pTemp, eax
  end;

  pLocal := GetMyUnitPointer();

  if (pLocal = pTemp) then
  begin
    dwTemp := dwTime1 - dwTime2;
    dwTemp := dwTemp * Trunc(factor);

    dwTime1 := dwTime1 + dwTemp;
    dwTime2 := dwTime2 + dwTemp;
  end;

  asm
    popad
  end;

  oCalculateSpeed(dwTime1, dwTime2);
end;
Die Funktion an sich läuft ohne Probleme durch. Der Pointer-Check ob es denn auch meine Einheit ist funktioniert ebenfalls. Nun scheint es aber einen simplen Fehler mit großen Auswirkungen in meinem Code zu geben, denn meine Geschwindigkeit erhöht sich kein bisschen, selbst wenn ich den factor auf * 100 drehe.

dwTime1 & 2 direkt * 50 zu multiplizieren funktioniert ohne Probleme, mir kommt es aber nicht recht clever vor, den Wert bei jeder Bewegung derartig zu erhöhen :S Sind beide Werte (dwTime1, dwTime2) exakt gleich, kann ich mich schließlich gar nicht mehr bewegen, dwTime1 muss scheinbar höher sein.

Ich würde mich wirklich riesig freuen, wenn hier schon jemand Erfahrungen mit solchen Berechnungen gemacht hat. und mich ein wenig in die richtige Richtung lenken könnte.

lg

Geändert von Gimp (28. Jan 2011 um 23:44 Uhr) Grund: Beitrag ebenfalls im Delphi Forum veröffentlicht, angepasst
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: Problem mit Geschwndigkeits-Berechnung bei Singleplayer Spiel

  Alt 29. Jan 2011, 20:02
Warum
Delphi-Quellcode:
  dwTime1 := dwTime1 + dwTemp;
  dwTime2 := dwTime2 + dwTemp;
?
Letzendlich bleibt die Differenz zwischen dwTime1 und dwTime2 gleich?!

Ich würde den größeren dwTime-Wert um dwTemp erhöhen und sehen, was es für Auswirkungen hat!

MfG
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz