Einzelnen Beitrag anzeigen

Benutzerbild von ISAS
ISAS

Registriert seit: 24. Sep 2003
Ort: Vietnam
205 Beiträge
 
Delphi 4 Standard
 
#1

DelphiX+Kollision+Kein leichtes Problem

  Alt 9. Feb 2004, 18:43
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.
Angehängte Dateien
Dateityp: zip rollenspiel.zip (231,5 KB, 21x aufgerufen)
Signatur wurde auf Wunsch geändert. Deswegen einfach hier drauf klicken-> www.geggi.at.gg
  Mit Zitat antworten Zitat