Autor Beitrag
wdbee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: So 07.01.07 21:56 
Aktuelles:

Der Delphin V1.00 fährt seine ersten Rennen und Band 2 des Tutoriums ist fertig (siehe unten). wdbee

Delphin V1.00 ist ein TORCS-Roboter, der komplett in Delphi programmiert wurde (Turbo Delphi 2006).

TORCS steht für "The Open Racing Car Simulator" und ist ein Open Source Project, dass für Linux, Windows und andere Betriebssysteme verfügbar ist. Bisher mussten TORCS-Roboter in C oder C++ programmiert werden.
Auf seiner Hompage stellt Bernhard Wymann ein Tutorial zur Verfügung, dass sehr detaillert zeigt, wie ein TORCS-Roboter in C++ programmiert werden kann. Delphin V1.00 ist nun eine Alternative für Windows. In der Leistung ist dieser Roboter mit dem von Bernhard Wymann vorgestellten bt-Roboter vergleichbar.

TORCS - "The Open Racing Car Simulator"

Auf den ersten Blick erscheint TORCS als ein Computerspiel wie viele andere auch. Simuliert werden Autorennen, bei denen ein menschlicher Spieler gegen computergesteuerte Gegner antritt. Dabei stehen verschiedene Rennstrecken und Autotypen zur Auswahl.
Das besondere an TORCS ist aber, dass jeder eigene Gegner programmieren oder auch eigene Rennstrecken entwerfen kann. Selbst eigene Rennwagen lassen sich integrieren! Zum einen ist TORCS ein "Open Source Project", dass für verschiedene Betriebssysteme wie Linux und Windows verfügbar ist. Zum anderen wird ein computergesteuerter Gegner durch ein "Shared Object" (so) bzw. eine "Dynamic Link Library" (dll) mit einer relativ einfachen Schnittstelle im "C-Stil" realisiert.
Diese Programmerweiterungen werden "Roboter" genannt. Legt man im vorgesehenen Verzeichnis für den neuen Roboter ein Unterverzeichnis an und kopiert die DLL dort hin, kann TORCS mit dem neuen Roboter zusammenarbeiten. Analog lassen sich so eigene Rennstrecken und Rennwagen bereitstellen.
Genau das ist es, was TORCS interessant macht. Nicht das Spiel Mensch gegen Computer sondern Roboter gegen Roboter reizt den Programmierer zum mitmachen.
Im Internet werden auch Meisterschaften ausgetragen, an denen jeder mit einem eigenen Roboter teilnehmen kann.
Bisher wurden die Rennen unter Linux durchgeführt und die Roboter mussten in C oder C++ programmiert werden. Zwar werden mit TORCS auch einige Roboter mitgeliefert - in den Download-Paketen mit Quellcode sind auch die Sourcecodes dieser Roboter enthalten - aber die wichtigste Quelle von Informationen für die Programmierung eines TORCS-Roboters ist das Robot-Tutorial von Bernhard Wymann.
Hier wird Schritt für Schritt gezeigt, was ein Roboter können muss und wie sich das realisieren lässt.
Allerdings muss der angehende Roboter-Programmierer einiges an Wissen mitbringen, um die dort bereitgestellten Quellen so anzupassen, dass er sie für einen eigenen Roboter verwenden kann.
Linux-Anwender sind das ja gewohnt, es macht ihnen sogar Spaß.

Windows-Anwender sind da einfach zu verwöhnt.
Um ihnen und besonders Programmier-Einsteigern den Anfang zu erleichtern, wurde der TORCS-Roboter "Delphin" geschaffen. Er ist komplett in Delphi programmiert und stellt einige Units und Klassen bereit, mit denen sich sehr einfach ein TORCS-Roboter realisieren lässt. Die Schnittstelle zu TORCS ist in einer separaten Wrapper-Unit gekapselt, so dass ein Delphi-Programmierer ohne C-Kenntnisse auskommen kann.

Auf dieser Basis ist TORCS ein Top-Thema für Projekte in Schulen oder anderen inhomogenen Gruppen, denn hier können nicht nur eigene Roboter gegeneinander antreten. Rennwagen und Team-Logo können künstlerisch gestaltet werden und ein Designwettbewerb mag manchen Teilnehmer mehr reizen.
Ein Roboter fährt den Rennwagen mehr oder weniger gut, aber die Abstimmung des Rennwagens auf die Rennstrecke ist auch ein Thema. Wer ist der beste Mechaniker, findet die optimale Abstimmung der Bremsen und des Fahrwerkes?

TORCS kommt mit relativ geringen Hardware-Anforderungen zu brauchbaren Ergebnissen. Benötigt wird nur ein PC mit Windows XP (bei Verwendung des Delphins als Basis) und einer Grafikkarte, die 3D unterstützt. Selbst auf Motherboards mit integriertem Grafikchip kann das gehen, wenn aktuelle 3D-Treiber installiert sind!
Alle erforderlichen Programme sind kostenfrei im Internet als Download erhältlich.

Edit: Um den zweiten Band des Tutoriums anhängen zu können, wurde der Anhang des Bildes entfernt. Dafür gibt es weiter unten im Thread die Möglichkeit, ein Video zu laden, dass einen besseren Eindruck vermittelt als ein stehendes Bild.

Auch Einsteiger können hier gerne mitmachen, wer Fragen hat bekommt Antwort, wer Hilfe braucht, dem soll geholfen werden.
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von wdbee am Sa 10.02.07 17:08, insgesamt 1-mal bearbeitet
Florian.K
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win Xp Prof. & SP 2
Delphi 10 Lite
BeitragVerfasst: Mo 08.01.07 08:24 
Großen Respekt
freedy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 403
Erhaltene Danke: 1

Winows 7
Delphi XE
BeitragVerfasst: Mo 08.01.07 10:47 
Hi!

Das könnte ja sogar mal richtig Spaß machen... kannte ich vorher gar nicht.
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Di 09.01.07 22:43 
Boah, klingt das geil! Na, wer hat Lust zum 1. offiziellen Windows-TORCS-Wettbewerb? Ich habs mir noch net angeguckt, aber ich mach trotzdem mit :mrgreen:.

Gibt es schon sowas wie einen TORCS-Wettbewerb unter Windows? Wenn nicht, was das richtig super!


EDIT: Musste {$IFDEF TORCS_V1.3.0} auskommentieren, sonst hätte er nicht kompiliert.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
wdbee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Mi 10.01.07 18:55 
@GTA-Place:
Ich habe, bevor ich das hier veröffentlicht habe, mit Bernhard Wymann Kontakt aufgenommen. Fazit: Wenn es eine entsprechende Anzahl von Teilnehmern gibt, setzt er uns eine Windows-Delphi-Meisterschaft auf dem Server auf. Die Roboter sollten dann unter Turbo-Delphi 2006 übersetzt werden können, denn es müssen immer die Quellen bereitgestellt werden, keine DLLs (Wegen Viren usw.).
Das könnte dann so ähnlich aussehen, wie die TORCS-Meisterschaft für LINUX. Dort waren es bisher maximal 8 Teams, die in einem Jahr teilgenommen haben. Pro Team starten zwei Roboter, macht dann also 16 Fahrzeuge. Aber es würden speziell zum Anfang auch weniger Teams reichen, um interessante Rennen zu fahren.

Der Roboter, der hier vorgestellt wird, umfasst schon alle Funktionen, die gebraucht werden, auch wenn die Lösungen z. T. noch nicht ideal sind. Im Tutorium sind die noch nicht alle beschrieben, aber es liegen ja alle Quellen offen, und Fragen lassen sich im Forum vorab klären, bis der Rest als Tutorium verfügbar ist.
Ausnahme: Pit-Sharing (Wenn mehrere Fahrzeuge sich eine Box Teilen müssen). Das ist neu in TORCS V1.3.0 und im Delphin noch nicht realisiert.

Mit TORCS_V1.3.0 wird zwichen den Datenstrukturen von TORCS V1.2.4 und TORCS V1.3.0 unterschieden, da hat sich einiges geändert. Wer nur TORCS V1.3.0 verwendet, kann die Unterscheidung raus schmeißen.
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mi 10.01.07 19:02 
Die DLL geht bei mir nicht. Bekomme beim Rennstart eine Zugriffsverletzung.


EDIT:
1x bei delphin-NewTrack, Konsole sagt: OnGetParam <<<
1x bei delphin-NewTrack, Konsole sagt: NewRace 0 >>>
1x bei delphin-Drive, Konsole sagt: GfParmWriteFile ... graph.xml file written

EDIT2:
Zu Fehler 1: Der tritt genau hier auf:
ausblenden Delphi-Quelltext
1:
if Seg.SType = TR_STR then					

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
wdbee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Mi 10.01.07 22:19 
Das sieht so aus, als hättest du die Datenstrukturen durcheinander gebracht.
Die ersten Versuche hatte ich mit Delphi 5 unternommen. Dabei stellte sich heraus, dass das Alignment von Delphi (4 Byte) und TORCS (8 Byte) nicht zusammenpassen. Deshalb musste ich an einigen Stellen Dummies in die Record-Definitionen einbauen. Das galt auch schon für TORCS V1.2.4.
Mit TORCS V1.3.0 kamen noch einige zusätzliche Felder in den Records dazu. Die Unterschiede sind an den Stellen zu finden, an denen die Befehle für die bedingte Kompilierung stehen.

Du hattest gepostet, dass du da Änderungen machen musstest (Warum ist mir nicht klar). Schau dir den Teil noch mal im Original an. Ich vermute, dass da der Fehler liegt.
Um selbst die richtigen Werte zu finden, hatte ich die Dump-Funktion eingebaut (UnitTorcsData, Aufruf in UnitTorcsIntf ist nur auskommentiert).
Am Anfang werden die Offsets ausgegeben.
Die Werte, die bei TORCS V1.3.0 verwendet werden, sind:

oIndex: 0
oInfo: 4
oPub: 328
oRace: 664
Priv: 792
oCtrl: 1444
oPitCmd: 1616
oRobot: 1628

Damit solltest du feststellen können, ob das bei dir passt.
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mi 10.01.07 22:52 
Delphi ging nicht in den {$ifdef}-Bereich, weil TORCS_V1.3.0 vermutlich nicht definiert ist ;-) Wo genau muss die Definition das hin? Benutze D7.
user profile iconwdbee hat folgendes geschrieben:
Am Anfang werden die Offsets ausgegeben.
Die Werte, die bei TORCS V1.3.0 verwendet werden, sind:

Was heißt am Anfang und wo genau seh ich das? In der Konsole hab ich die Werte nicht gefunden.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
wdbee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Mi 10.01.07 23:04 
Ich benutze das Feld in den Projektoptionen:

D5: Projekt - Optionen - Verzeichnisse/Bedingungen - Definition: TORCS_V1.3.0

Unter TD2k6 gilt der Weg genauso, auch wenn es ganz anders aussieht.

Da das Projekt mit Turbo Delphi 2006 erzeugt wurde, ist die Definition in der Datei delphin.bdsproj gespeichert, die dein D7 nicht auswertet.

Wer will kann die Definition auch mit {$define TORCS_V1.3.0} an den Anfang der Dateien stellen. Ich ziehe den anderen Weg vor, weil ich dann an einer Stelle die Version ändern kann.

Edit: Die Offsets werden in der Konsole ausgegeben, wenn der Kommentar vor dem Aufruf entfernt wurde. Da dann aber sehr viel Text ausgegeben wird, benutze ich den folgenden Trick: Wenn ich mit der Maus den Button der ScrollBar rechts anklicke und halte, bleibt die Ausgabe stehen, so daß ich die Werte finden und lesen kann. Außerdem habe ich den Puffer des Konsolenfensters entsprechend groß eingestellt.
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mi 10.01.07 23:17 
Zugriffverletzung bleibt, obwohl ich nochmal den Original-Source benutzt habe und TORCS_V1.3.0 (über Optionen) definiert habe.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
wdbee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Mi 10.01.07 23:34 
Dann lass dir mal die Offsets ausgeben.
Kennt D7 Einstellungen für das Alignment?
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Do 11.01.07 00:00 
oIndex, oInfo und oPub sind gleich;
oRace ist 668 statt 664;
Priv ist 796 statt 792;
oCtrl ist 1448 statts 1444;
oPitCmd ist 1620 statts 1616;
oRobot ist 1632 statt 1628;

Also fast alle um 4 größer als normal.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
wdbee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Do 11.01.07 00:12 
Da die Werte Offsets sind, bedeutet das, das in der Datenstruktur vor Race 4 Byte zuviel sind. Das könnte der Wert Dummy1 in TCarElt sein.
Kommentier den mal aus (UnitTorcsTypes).
Den musste ich für meine beiden Delphi-Versionen einschieben.
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Do 11.01.07 00:15 
Und schon ist die ZV weg, thx - aber fahren tut er immer noch nicht. Die ganze Kraft wirkt nach links, als wäre statts gasgeben lenken eingestellt.


EDIT: War noch ne Dummy. Aber er tut jetzt gar nix. Er steht still, Zeit läuft.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
wdbee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Do 11.01.07 00:24 
Also ist das Alignment bei deinem Delphi 7 anders (eingestellt?).
Schau dir mal die anderen Dummies an:
In TCarRaceInfo sind auch zwei. Anhand der Werte die Dump ausgibt, solltest du erkennen können, wann die Werte sinnvoll werden.
Werde morgen noch mal hier nach sehen.

Edit: Wenn Dump aktiviert ist, ist das normal, weil zuviel Text in die Konsole geht. Wie sieht es aus, wenn du Dump deaktivierst?
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Do 11.01.07 08:06 
Dump war deaktiviert. Ich guck mir das heut Mittag nochmal an.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
wdbee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Do 11.01.07 12:23 
Inzwischen konnte ich dein Problem nachvollziehen:

Das Alignment spielt jeweils an zwei Stellen eine Rolle. Die erste ist die Definition der Records selbst (UnitTorcsTypes), wobei die einzelnen Records in sich stimmen müssen und außerdem deren Zusammenfassung im Record TCarElt.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
//==========================================================================*
// Main Car Data record
//--------------------------------------------------------------------------*
  TCarElt = packed record                       // car.h
    Index: Int;         // car index
    Info: TInitCar;     // public
    Pub: TPublicCar;    // public
{$IFDEF TORCS_V1.3.0}
    Dummy1: Int;
{$ELSE}
    Dummy1: Int;
{$ENDIF}
    Race: TCarRaceInfo; // public
    Priv: TPrivCar;     // private
    Ctrl: TCarCtrl;     // private
    PitCmd: TCarPitCmd; // private
    Robot: PRobotItf;   // private
    Next: PCarElt;      // Next in List
    Dummy2: Int;
  end;
//==========================================================================*


Die zweite Stelle ist die Klasse TIPCCarData (UnitTorcsData):
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
type 
  TIPCCarData = class
  private
    // >>> Instanzlokaler Datenbereich:
    oTORCSIndex: Int;                            // Index des Wagens
//>>>  oTORCSInfo: TInitCar;                        // Infos zum Wagen
    oInfoName: TTorcsName;                       // Driver's name
{$IFDEF TORCS_V1.3.0}
    oInfoTeamName: TTorcsName;                   // Team name
{$ENDIF}
    oInfoCarName: TTorcsName;                    // Car's object name
    oInfoCategory: TTorcsName;                   // Car's category
    oInfoRaceNumber: Int;                        // Car's race number
    oInfoStartRank: Int;                         // Car's starting position
    oInfoDriverType: Int;                        // Driver type
    oInfoSkillLevel: Int;                        // Driver's skill level (0=rookie -> 3=pro)
    oInfoIconColorR: Tdble;                      // Car color in leaders board
    oInfoIconColorG: Tdble;                      // Car color in leaders board
    oInfoIconColorB: Tdble;                      // Car color in leaders board
    oInfoDimension: T3Dd;                        // Car's mesures
    oInfoDrvPos: T3Dd;                           // Driver's position
    oInfoBonnetPos: T3Dd;                        // Bonnet's position
    oInfoTank: Tdble;                            // Fuel tank capacity
    oInfoSteerLock: Tdble;                       // Steer lock angle
    oInfoStatGC: T3Dd;                           // Static pos of GC (should be the origin of car axis)
    oInfoWheel: array [0..3of TWheelSpec;      // Wheels specifications
    oInfoVisualAttr: tVisualAttributes;          // Visual attributes
//<<<
//>>>  oTORCSPub: TPublicCar;
    oPubDynGC: TDynPt;                           // GC data (car axis)
    oPubDynGCg: TDynPt;                          // GC data (world axis)
    oPubPosMat: TSGMat4;                         // Position matrix
    oPubTrkPos: TTrkLocPos;                      // Current track position. The segment is the track segment (not sides)
    oPubState: Int;                              // State of the car.
    oPubCorner: array [0..3of tPosd;
{$IFDEF TORCS_V1.3.0}
  oAlignmentDummy: Int;
{$ELSE}
  oAlignmentDummy: Int;
{$ENDIF}
//<<<
//>>>  oTORCSRace: TCarRaceInfo;
    oRaceBestLapTime: Double;
    oRaceDeltaBestLapTime: Double;
    oRaceCurLapTime: Double;
    oRaceLastLapTime: Double;
    oRaceCurTime: Double;
    oRaceTopSpeed: Tdble;
    oRaceLaps: Int;
    oRaceNbPitStops: Int;
    oRaceRemainingLaps: Int;
    oRacePos: Int;
    oRaceDummy1: Int;
    oRaceTimeBehindLeader: Double;
    oRaceLapsBehindLeader: Int;
    oRaceDummy2: Int;
    oRaceTimeBehindPrev: Double;
    oRaceTimeBeforeNext: Double;
    oRaceDistRaced: Tdble;
    oRaceDistFromStartLine: Tdble;
    oRaceScheduledEventTime: Double;
    oRacePit: PTrackOwnPit;
    oRaceEvent: Int;
    oRacePenaltyList: TCarPenaltyHead; // List of current penalties
//<<<
//>>>  oTORCSPriv: TPrivCar;
    oPrivParamsHandle: Pointer;                  // accessible parameters for modules
    oPrivCarHandle: Pointer;                     // parameters for car caracteristics
    oPrivDriverIndex: Int;                       // index when multiple drivers are in the same dll
    oPrivModName: TTorcsName;                    // dll name
    oPrivWheel: array [0..3of TWheelState;
    oPrivCorner: array [0..3of TPosd;          // car's corners position
    oPrivGear: Int;             // current gear
    oPrivFuel: Tdble;           // remaining fuel (liters)
    oPrivFuel_consumption_total: Tdble; // l
    oPrivFuel_consumption_instant: Tdble; // l/100km (>100 means infinity)
    oPrivEnginerpm: Tdble;
    oPrivEnginerpmRedLine: Tdble;
    oPrivEnginerpmMax: Tdble;
    oPrivEnginerpmMaxTq: Tdble;
    oPrivEnginerpmMaxPw: Tdble;
    oPrivEngineMaxTq: Tdble;
    oPrivEngineMaxPw: Tdble;
    oPrivGearRatio: array [0..MAX_GEARS - 1of Tdble; // including final drive
    oPrivGearNb: Int;                     // incl reverse and neutral
    oPrivGearOffset: Int;                 // gearRatio[gear + gearOffset] is the ratio for gear
    oPrivSkid: array [0..3of Tdble;     // skid intensity
    oPrivReaction: array [0..3of Tdble; // reaction on wheels
    oPrivCollision: Int;
    oPrivSmoke: Tdble;
    oPrivNormal: T3Dd;
    oPrivCollpos: T3Dd; // Collision position, useful for sound
    oPrivDammage: Int;
    oPrivDebug: Int;
    oPrivCollision_state: TCollisionState; // collision state
//<<<
    // Der Rest muss über den Zeiger gehen, da es sich ab hier um
    // Information an TORCS handelt
    oTORCSCtrl: TCarCtrl;
    oTORCSPitCmd: TCarPitCmd;

    // Noch Instanzlokaler Datenbereich:
    oRobot: TRobotItf;
    // <<< Ende Instanzlokaler Datenbereich!


Um schnell zu sein wird der von TORCS gelieferte Speicherbereich des Records TCarElt als Block in das Objekt kopiert. deshalb müssen die instanzlokalen Variablen so angeordnet sein, dass die Zuordnung stimmt.

Bei Turbo Delphi 2006 passt das so wie es war.
Bei D5 und D7 ist das Alignment in den Record-Definitionen um 4 Bytes anders als im Objekt! Aber wenn der AlignmentDummy im Objekt entfernt wird, verschiebt sich das um 8 Byte statt um 4, obwohl der AlignmentDummy nur 4 Bytes lang ist!

Siehe Kontrollausgabe (Erste Spalte der Werte ist das Objekt, zweite die Record-Definition):

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
Turbo Delphi 2006:
TOCRS Alignment Check: (Ohne Änderungen)

Offset(oIndex) : 0000 0000
Offset(oInfo)  : 0004 0004
Offset(oPub)   : 0328 0328
Offset(oRace)  : 0664 0664
Offset(Priv)   : 0792 0792
Offset(oCtrl)  : 1444 1444
Offset(oPitCmd): 1616 1616
Offset(oRobot) : 1628 1628
SizeOf(Index)       : 0004
SizeOf(TInitCar)    : 0324
SizeOf(TPublicCar)  : 0332
SizeOf(TCarRaceInfo): 0128
SizeOf(TPrivCar)    : 0652
SizeOf(TCarCtrl)    : 0172
SizeOf(TCarPitCmd)  : 0012
SizeOf(TRobotItf)   : 0028
SizeOf(TCarElt)     : 1640

Delphi 5:
TOCRS Alignment Check: (Ohne Änderungen an den Recorddefinitionen in UnitTorcsTypes)

Offset(oIndex) : 0000 0000
Offset(oInfo)  : 0004 0004
Offset(oPub)   : 0328 0328
Offset(oRace)  : 0668 0664 < Fehler im Objekt TIPCCarData (UnitTorcsData)
Offset(Priv)   : 0796 0792
Offset(oCtrl)  : 1448 1444
Offset(oPitCmd): 1620 1616
Offset(oRobot) : 1632 1628
SizeOf(Index)       : 0004
SizeOf(TInitCar)    : 0324
SizeOf(TPublicCar)  : 0332
SizeOf(TCarRaceInfo): 0128
SizeOf(TPrivCar)    : 0652
SizeOf(TCarCtrl)    : 0172
SizeOf(TCarPitCmd)  : 0012
SizeOf(TRobotItf)   : 0028
SizeOf(TCarElt)     : 1640


Abhilfe sollte die folgende Änderung in der Klasse TIPCCarData bringen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
type 
  TIPCCarData = class
  private
//>>>+++ Änderung für D5 und D7?:
    // Achtung: 
    // Um die Ausrichtung der Daten im Speicher für die Delphi-Versionen
    // 5 und 7? TORCS-Kompatibel zu erreichen ist hier der AlignmentOffset
    // nötig! 
    oAlignmentOffset: Int;                       // Für D5 und D7?
//<<<+++
    // >>> Instanzlokaler Datenbereich:
    oTORCSIndex: Int;                            // Index des Wagens
    ...


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
Delphi 5: mit AlignmentOffset!
TOCRS Alignment Check: (Ohne Änderungen an den Recorddefinitionen in UnitTorcsTypes)

Offset(oIndex) : 0000 0000
Offset(oInfo)  : 0004 0004
Offset(oPub)   : 0328 0328
Offset(oRace)  : 0664 0664
Offset(Priv)   : 0792 0792
Offset(oCtrl)  : 1444 1444
Offset(oPitCmd): 1616 1616
Offset(oRobot) : 1628 1628
SizeOf(Index)       : 0004
SizeOf(TInitCar)    : 0324
SizeOf(TPublicCar)  : 0332
SizeOf(TCarRaceInfo): 0128
SizeOf(TPrivCar)    : 0652
SizeOf(TCarCtrl)    : 0172
SizeOf(TCarPitCmd)  : 0012
SizeOf(TRobotItf)   : 0028
SizeOf(TCarElt)     : 1640
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Do 11.01.07 14:11 
Das Auto tritt jetzt das Gas voll durch, aber im Gang N. Danach geht Drezahl auf 2 runter und nichts passiert. Außerdem wird schon beim Laden mehrmals angezeigt: "GfParamNum: bad handle".

Offset soweit richtig, bis auf:

SizeOf(CarRaceInfo): 124 statts 128
SifeOf(TCarElt): 1632 statts 1640

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
wdbee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Do 11.01.07 16:36 
Hast du die Record-Definitionen im Originalzustand?
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Do 11.01.07 18:07 
Wunderbar, jetzt funktioniert alles! Danke.

Ich hab mal für alle mit Delphi 5 und Delphi 7, die "bearbeitete Version" angehängt, in der ich außerdem noch folgendes eingefügt habe:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
{$IFDEF TORCS_V1.3.0}
  FuellBytes := oAlignmentDummy;                 // dito
  oAlignmentDummy := FuellBytes;                 // dito
  oAlignmentOffset := 0;                         // dito
{$ELSE}
  FuellBytes := oAlignmentDummy;                 // dito
  oAlignmentDummy := FuellBytes;                 // dito
  oAlignmentOffset := 0;                         // dito
{$ENDIF}

um die Compiler-Warnung wegzubekommen. Die Bedingungen und Ausgabeverzeichnise sind auch richtig eingestellt.


PS: Warum ist hier eigentlich {$ifdef} nötig? Sind doch die selben Zuweisungen.
Einloggen, um Attachments anzusehen!
_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)