Geb mal den Quellcode rein (nicht den ganzen, sondern nur an dem Teil, an dem es leigen müsste):
Erörterung des Problems habe ich zum Schluss angegeben.
Erstellen von TGegenstand:
Delphi-Quellcode:
constructor TGegenstand.Create(AParent: TSprite ); //TGegenstand bekommt nachher
inherited Create(AParent); //mehrere Bilder und Kordinaten zugewiesen.
Image:=Form1.DXImageList1.Items[1]; //Weiter unten angegeben.
Width := Image.Width;
Height := Image. Height;
Visible:=True;
end;
Die Ladeprozedure: (Hier wird TGegenstand auch seinen Kordinaten und seinem Bild zugewiesen)
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject); //Die Ladeprozedure
var
i,typ:integer;
data:TIniFile;
secname:string;
sections:TStrings;
var S,T: string;
begin
Player:=TPlayer.Create(DXSpriteEngine1.Engine);
HG:=THintergrund.Create(DXSpriteEngine1.Engine);
g:=0;
if opendialog1.execute then
Data:=TIniFile.Create(opendialog1.Filename);
sections:=TStringList.Create;
data.readsections(sections);
for i:=0 to (sections.Count-1) do
begin
secname:=sections.Strings[i]; //secname bekommt zB. 001_001 zugewiesen
typ:=data.readinteger(secname,'typ',0); //der typ wird rausgelesen
s := Copy(secname, 1, 3); //s bekommt den ersten Wert von secname
t := Copy(secname, 5, 3); //t bekommt den dritten Wert von secname
With TGegenstand.Create(DXSpriteEngine1.Engine) do
Begin
if typ=1 then Image:=Form1.DXImageList1.Items[1];
if typ=2 then Image:=Form1.DXImageList1.Items[2];
X:=strtoint(s)*32-32;
Y:=strtoint(t)*32-32;
end;
end;
end;
Kollision und Bewegung:
Delphi-Quellcode:
Procedure Tgegenstand.DoMove(MoveCount: Integer);
Begin
Inherited domove(movecount);
Player.collision;
if g=0 then begin //Wenn keine collision vorhanden ist, kann man sich bewegen
If isup in form1.dxinput1.states
Then
Y:=Y+32;
h:=1;
If isdown in form1.dxinput1.states
Then
Y:=Y-32;
h:=2;
If isleft in form1.dxinput1.states
Then
X:=X+32;
h:=3;
If isright in form1.dxinput1.states
Then
X:=X-32;
h:=4;
end;
if g=1 then begin //wenn eine collision vorhanden ist, dann soll er die Gegenstände
//um eines zurück geben. Das brauch ich, weil mein Spieler im
if h=1 then Y:=Y-32; //Mittelpunkt fixiert ist und sich nur die Gegensände bewegen solln
if h=2 then Y:=Y+32;
if h=3 then X:=X-32;
if h=4 then X:=X-32;
g:=0; //Kollision wird dann aufgehoben
end;
end;
Procedure TPlayer.docollision(sprite:Tsprite;var done:boolean);
Begin
if sprite is TGegenstand then
Begin
g:=1;
end;
end;
Nun habe ich ein Problem, was ich einfach nicht zu lösen schaffe. Es hat mit der Kollision zu tun. Das Level wird geladen und erstellt. Wenn ich nun die Kollision weglasse, dann funktioniert alles. Da ich aber die Kollision brauche und mein Problem ja in der Kollision liegt, kann ich das nicht weglassen. Die Kollision funktioniert ja eigentlich, doch irgendwie nicht richtig. Wie soll ich das erklären?? Ich geb mal meine File dazu, da es fast unmöglich ist, dieses Problem zu erklären. Das Einzige, was ich schreiben kann, ist, dass die Kollision nur zwischen dem Spieler und dem TGegenstand +die weiter oben liegen erfolgt. Die weiter rechts oder weiter unten vom Spieler sind, bekommen die Kollision nicht zu spüren, sondern bewegen sich ganz normal weiter. Das heisst, dass nicht alle die Kollision erfahren. Sozusagen nur die: Player.X<=Gegenstand.X und das gleiche mit Y.
PS: Das, mit der zu schnellen Spielerbegwegung muss ich nur mit einem Timer regulieren. Funktioniert zurzeit nicht, da das mit der Kollision nicht funktioniert.
PPS: Man darf nicht auf der Taste oben bleiben, sondern kurz oder langsam hintereinander die Pfeiltasten drücken. Muss nur noch machen, dass die Kollision schon vorher gemacht wird. Sonst geht der Spieler auf den Gegenstand und dann wieder zurück.