Zitat von
himitsu:
Delphi hat mit zwar gleichen Typendeklaration einige Progleme.
Das beschriebene Problem konnte ich ja nun mittlerweile lösen, jetzt tritt für mich aber erneut ein (wahrscheinlich) ähnlich geartetes Problem auf - sind meine ersten Versuche mit Klassen und Objekten:
Delphi-Quellcode:
unit AKarten;
// Klasse der Aktionskarten
interface
uses DXDraws, DXClass,DXSprite, SysUtils, EKarten;
Type TACard =
class(TImageSpriteEx)
// Felder
private
fname:
String;
// Kartenname;
fed:
String;
// Kürzel der Edition, z.B. 'WC'
fnummer:
String;
// Nummer der Karte, z.B. 39
fcid : integer;
// lfd. Nummer im Stapel
fcowner: integer;
// Spieler, der die Karte besitzt
// Methoden
function getName:
String;
procedure setName(
Name:
String);
function getED:
String;
procedure setED(Edition:
String);
function getNummer:
String;
procedure setNummer(Nummer:
String);
function getCID: integer;
procedure setCID(CID: integer);
function getCOwner: integer;
procedure setCOwner(COwner: integer);
public
property Name:
string read getName
write setName;
property Edition:
string read getED
write setED;
property Nummer:
string read getNummer
write setNummer;
property CID: integer
read getCID
write setCID;
property COwner: integer
read getCOwner
write setCOwner;
procedure DoMove(MoveCount: Integer);
override;
procedure DoCollision(Sprite: TSprite;
var Done: Boolean);
override;
procedure LoadECard(Imagelist: TDXImageList);
// Lädt das Bild der Karte
end;
implementation
...
procedure TACard.LoadECard(ImageList: TDXImageList);
var
ix: integer;
strCName:
String;
bImGFound: Boolean;
begin
bImgFound:=false;
strCname:=fed+fnummer;
for ix:=0
to Imagelist.Items.Count-1
do
begin
if Imagelist.Items.Items[ix].Name=strCName
then
begin
bImgFound:=true;
Break;
end;
end;
if bIMgFound=false
then
begin
ImageList.Items.Add;
with ImageList.Items[ImageList.Items.Count-1]
do
begin
Picture.LoadFromFile (MYPFAD+fed+'
\small\'+fnummer+'
.jpg');
fname:=strCName;
Name := fname;
PatternWidth := 0;
PatternHeight := 0;
SkipHeight := 0;
SkipWidth := 0;
SystemMemory := False;
//Transparent := Transp;
//TransparentColor := TranspColor;
Restore;
end;
end;
Image:=Imagelist.Items.Find(strCName);
end;
In der Game-
Unit ist deklariert
type ADummy = array of TACard;
und
ADeck1, AADeck1: ADummy;
Erstellt werden die
ADeck1-Objekte in einer Schleife mit:
Delphi-Quellcode:
inc(iA);
SetLength(ADeck1,iA);
ADeck1[iA-1]:=TACard.Create(frmMain.DXSpriteEngine1.Engine);
ADeck1[iA-1].Edition:=strLeft(S,2);
ADeck1[iA-1].Nummer:=strRight(S,Length(S)-2);
ADeck1[iA-1].CID:=iA-1;
ADeck1[iA-1].COwner:=0;
ADeck1[iA-1].LoadECard(frmMain.DXCards);
ADeck1[iA-1].Height:=127;
ADeck1[iA-1].Width:=90;
ADeck1[iA-1].X:=200+(iA*20);
ADeck1[iA-1].Y:=250;
Das Mischen der Karten funktioniert mit Eurer Hilfe nun super mit:
Delphi-Quellcode:
function MixACards(Var AParam: ADummy): ADummy;
var
CDummy: TACard;
ix, ir: integer;
begin
SetLength(Result, Length(AParam));
for ix:=0 to High(AParam) do
begin
ir:=Random(High(AParam));
CDummy:=Aparam[ix];
AParam[ix]:=AParam[ir];
AParam[ir]:=CDummy;
end;
end;
Wenn in der Mischroutine
AParam[ix]:=AParam[ir];
funktioniert, warum klappt dann dies nicht?
Delphi-Quellcode:
Setlength(AADeck1,1);
AADeck1[0]:=TACard.Create(frmMain.DXSpriteEngine1.Engine);
AADeck1[0]:=ADeck1[High(ADeck1)];
Der Compilerlauf ist fehlerfrei, jedoch bricht das Programm mit einem "
Access-Violation" beim "Draw" der SpriteEngine ab. Kommentiere ich die Drei Zeilen aus, gibt es keine Probleme.
Sorry, wenn das Ganze nun etwas länger geworden ist, aber ich bin ja lernwillig