Einzelnen Beitrag anzeigen

RebellX

Registriert seit: 21. Feb 2009
8 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Zugriffsverletzung nach Modulus

  Alt 20. Apr 2010, 23:47
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
  Mit Zitat antworten Zitat