AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi DelphiX+Kollision+Kein leichtes Problem
Thema durchsuchen
Ansicht
Themen-Optionen

DelphiX+Kollision+Kein leichtes Problem

Ein Thema von ISAS · begonnen am 9. Feb 2004 · letzter Beitrag vom 11. Feb 2004
Antwort Antwort
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, 17: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
ATwardz

Registriert seit: 12. Mai 2003
205 Beiträge
 
Delphi 7 Professional
 
#2

Re: DelphiX+Kollision+Kein leichtes Problem

  Alt 9. Feb 2004, 21:28
Habe mir das noch nicht angeguckt aber du musst auf jedenfall diesen code nehmen!

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
Begin
  Y:=Y+32;
  h:=1;
end;
  If isdown in form1.dxinput1.states
  Then
Begin
  Y:=Y-32;
  h:=2;
end;
  If isleft in form1.dxinput1.states
  Then
Begin
  X:=X+32;
  h:=3;
end;
  If isright in form1.dxinput1.states
  Then
Begin
  X:=X-32;
  h:=4;
end;
end;
Weil sonst ist h immer 4!

Glaube nicht das das Problem dadurch gelöst ist aber es muss zumindest so sein um überhaupt zu funktzen!

ich schau mal

@wardz
-->-->
Dreamteam: Delphi und Bier!
  Mit Zitat antworten Zitat
ATwardz

Registriert seit: 12. Mai 2003
205 Beiträge
 
Delphi 7 Professional
 
#3

Re: DelphiX+Kollision+Kein leichtes Problem

  Alt 10. Feb 2004, 13:55
Hi,
keine Lösung aber nahe dran!

Delphi-Quellcode:
Procedure Tgegenstand.DoMove(MoveCount: Integer);
Begin
  Inherited domove(movecount);
  If isup in form1.dxinput1.states
  Then
  Begin
  Player.y:=Player.Y-1;
  Player.collision;
  Player.Y:=Player.Y+1;
  If g=0 then y:=y+1;
  g:=0;
  end;

  If isleft in form1.dxinput1.states
  Then
  Begin
  Player.x:=Player.x-1;
  Player.collision;
  Player.x:=Player.x+1;
  If g=0 then x:=x+1;
  g:=0;
  end;

  If isdown in form1.dxinput1.states
  Then
  Begin
  Player.y:=Player.Y+1;
  Player.collision;
  Player.Y:=Player.Y-1;
  If g=0 then y:=y-1;
  g:=0;
  end;

  If isright in form1.dxinput1.states
  Then
  Begin
  Player.x:=Player.x+1;
  Player.collision;
  Player.x:=Player.x-1;
  If g=0 then x:=x-1;
  g:=0;
  end;

end;


Procedure TPlayer.docollision(sprite:Tsprite;var done:boolean);
Begin
if sprite is TGegenstand then
Begin
 g:=1;
end;
end;
Der Code benutz den Plyer um zu prüfen ob eine Collision beim nächsten Schritt stattfinden würde! Je nachdem wir der Schritt ausgeführ oder nicht!
Allerdeings bleiben manche Büsche ein Pixel zurück!<-- Warm das so ist weiss ich nicht ,leider!

Das Problem ist das DelphiX nicht kapiert das es alle Gegenstände vom Typ TGegenstand identisch behandeln soll!

Vielleicht kann dir hier jemand weiter helfen!

http://terraqueous.f2o.org/dgdev/viewforum.php?f=15
-->-->
Dreamteam: Delphi und Bier!
  Mit Zitat antworten Zitat
Benutzerbild von ISAS
ISAS

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

Re: DelphiX+Kollision+Kein leichtes Problem

  Alt 11. Feb 2004, 12:40
Danke einmal für die Antwort.

Bei deiner letzten Lösung: Nimm mal statt X:=X+1, X:=X+16 oder so. Dann geht das Bild 16 Pixel weiter. Wenn du nun immer hintereinander die gleiche Kollision verursacht, wiederholt sich der Vorgang und die Büsche sind dann einmal irgendwo. Also nach links drücken, collision, nach rechts drücken, nach links drücken, coll.....

Das der Computer nicht alle nimmt, genau an dem liegt mein Problem. Könnte das lvl vielleicht immer wieder neu laden. Dass geht aber nicht, da Gegner, Gegenstände etc. immer neue positionen bekommen können. Das Problem liegt schon seit Monaten an dem, dass der Spieler im Mittelpukt fixiert ist. So hab ich eine bestimmte Ladeprozedure schreiben müssen und nun is das mit der Kollision. Hab natürlich ein Programm, wo der Spieler sich bewegt und die Büsche stehen bleiben. Das will ich aber nicht, da ich das Spiel Tibia nachmachen will. Tibia ist fast gleich wie Diablo, wo der Spieler auch im Mittelpunkit fixiert ist. Finde, dass das den Spielspass um einiges steigert.

Wenn das doch endlich mal funktionieren würde. Wieso der Computer das so dumm löst, weiss ich auch nicht.
Signatur wurde auf Wunsch geändert. Deswegen einfach hier drauf klicken-> www.geggi.at.gg
  Mit Zitat antworten Zitat
ATwardz

Registriert seit: 12. Mai 2003
205 Beiträge
 
Delphi 7 Professional
 
#5

Ohne Kollision!

  Alt 11. Feb 2004, 14:54
Hätte da vielleicht ne Lösung!
Du willst di Schritte ja in 32 Pixelabständen machen nicht wahr!?
Du lädst die Karte in ein Array und könntest doch in diesem kontrollieren ob der Spieler nach rechts,links,... gehen kann!
0 1 2 3 4 5
1
2
3
4
5

Beispiel!
du drückst die linke Taste, dein Player befindet sich an der Arrayposition[2,1] und der das Programm kontrolliert ob auf Array[1,1] ein Busch oder Gegenstand ist, wenn dies der fall ist wird keine bewegung der Büsche ausgelöst ansonsten werden alle Büsche bewegt(Solang keine Kollision vorlag, hat das Programm ja alle Büsche richtig bewegt)

Also ich habe es zwar noch nicht ausprobiert aber es müsste zu 99% klappen!

@wardz
-->-->
Dreamteam: Delphi und Bier!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz