Zitat:
Mal ne doofe Idee: kann es sein das du Player irgendwo freigegeben hast (ist das ein Objekt oder ein Record?) Was sagt die Glaskugel?
Kann eigentlich nicht sein, da
A: player ist in der procedure mit var übergeben worden, sonst aber ein array [1..8] of tplayer (record)
B: Ich davor und danach darauf zugreifen kann, wenn ich die o.g. Zeilen auskommentiere
C: Ich recht wenig freigebe, da das meiste statisch ist und ich mich so nicht drum kümmern muss
Das ganze Projekt ist eine Art Brettspiel. Bis zu 8 Spieler können durch 5 Aktionen pro Zug über ein Spielfeld sich bewegen und müssen Punkte erreichen. Dabei werden sie zusätzlich von den verschiedenen Feldern des Spielfeldes bewegt.
Heißt also in der Berechnung hat jeder Spieler eine X und Y Koordinate sowie eine Orientierung (halt die Eigenschaft angle, also 0, 90, 180, 270° als 0-3 dargestellt).
Zur Anzeige der Bewegung wird dafür wieder rückwärts eine "Animation" erstellt, sprich es wird gespeichert, wie der Spieler bewegt wurde und er wird fürs Anzeigen zurückbewegt. Diese "Animation" wird dann immer weiter verringert, bis der Spieler da angezeigt wird, wo er tatsächlich steht. Das funktionioniert auch ohne die drei Zeilen ohne Probs. Nur sind die unumgänglich um die Spieler zu drehen (oder wie könnte man das einfacher machen?)
Ein paar Definitionen von TPlayer etc. :
Delphi-Quellcode:
type
TPlayer = record
X, Y, angle: byte;
//Animation
ani_x, ani_y, ani_z, ani_angle, ani_wait: array of smallint;
ani_count: byte;
//... unwichtige booleanwerte für Handkarten etc, noch nicht implementiert...
end;
const
Move_1 = $01;
Move_2 = $02;
Move_3 = $03;
Turn_Left = $04;
Turn_Right = $05;
U_Turn = $06;
Back_Up = $07;
Die Methode mit der Berechnung:
Delphi-Quellcode:
procedure execute(befehl: byte; var Aplayer: tplayer);
var i: byte;
begin
if (befehl = 0) or (befehl > 7) then exit;
if befehl <= move_3 then
for i := 1 to befehl do
begin
moveplayer(aplayer, aplayer.angle);
end
else
if befehl = Turn_left then
begin
aplayer.angle := (aplayer.angle - 1 + 4) mod 4;
addanimate(aplayer, AT_Angle, +30);
end
else
if befehl = Turn_Right then
begin
aplayer.angle := (aplayer.angle + 1 + 4) mod 4;
addanimate(aplayer, AT_Angle, -30);
end
else
if befehl = U_Turn then
begin
aplayer.angle := (aplayer.angle + 2 + 4) mod 4;
if random(2) = 1 then addanimate(aplayer, AT_Angle, -60)
else
addanimate(aplayer, AT_Angle, +60);
end
else
if befehl = Back_Up then
begin
moveplayer(aplayer, (aplayer.angle + 2 + 4) mod 4);
end;
end;
Moveplayer und addanimate arbeiten ohne Probleme und auch das Auskommentiere schafft keine Besserung.
P.S.: Player heißt da Aplayer, da Player im Hauptprogramm eben ein Array ist