![]() |
Logik Problem
Hi,
Irgendwie steh ich grad total aufm Schlauch -.- Guckt mal: ![]() Meine Logik war jetzt folgende - Der Spieler (S) kollidiert mit der Wand (W) rechts (also rechte Seite von Spieler gegen Linke Seite von Wand) wenn folgendes erfüllt ist:
Delphi-Quellcode:
Irgendwie haut das aber nicht hin^^ Der Spieler kollidiert immer.. Auch wenn ich irgendwo draufstehe..
if (X + Width >= ASprite.X) and (Y + Height >= ASprite.Y) and (Y <= ASprite.Y + ASprite.Height) then
//... Gruß Neutral General |
Re: Logik Problem
Wer ist denn ASprite?
|
Re: Logik Problem
Ich gehe davon aus, dass das bestimmt ein TImageSprite der Andorra ist.
|
Re: Logik Problem
Richtig. Das ganze is voll unlogisch... Was muss denn alles erfüllt sein damit eindeutig klar ist das das Sprite (A) von links gegen die rechte Seite eines andere Sprites (B) stößt ?
1. Der rechteste Punkt von A muss größer oder gleich dem linkesten Punkt von B sein. (A.x + A.Width >= B.X) 2. Außerdem darf der "Boden" von A mindestens den Y Wert haben den B hat. (A.Y + A.Height >= B.Y) 3. .. und der "Kopf" darf max. so weit oben sein wie der Y Wert des Bodens von B. (A.Y <= B.Y + B.Height) DAS wäre meine Logik.. Aber das geht praktisch hinten und vorne nicht. Dabei z.B hab ich auch ne Kollision wenn ich Meter weit über dem Sprite B schwebe... Alles seltsam -.- Gruß Neutral General |
Re: Logik Problem
Delphi-Quellcode:
Du musst in jedem Schritt deines Kollisionssystems dir die Koordinaten des Spielers im letzten Schritt holen. war er vorher links von der Kante eine Wand und ist jetzt rechts davon, kollidiert er(entsprechend für alle anderen richtungen).
//Pseudocode; KoSy-Nullpunkt links oben
if (Player.WasLeft(Wall)) and (Player.RightEdge >= Wall.LeftEdge) then CollisionHorz(Player, Wall); //Selbes für .WasRight if (Player.WasAbove(Wall)) and (Player.BottomEdge >= Wall.TopEdge) then CollisionVert(Player, Wall); //Selbes für .WasBelow Deinen Code-Schnipsel kann ich leider nicht interpretieren: ENotEnoughInputException:'Cannot resolve Qualified Names' ;) |
Re: Logik Problem
Und du hast es auch wirklich so umgesetzt?
IntersectRect, wäre übrigens noch die billige Alternative :zwinker: |
Re: Logik Problem
Also ich will/mache es so:
Ich habe ein Set:
Delphi-Quellcode:
Ist z.B ckRight im Set dann kann der Spieler nicht mehr nach rechts gehen:
TCollisionKind = (ckNone, ckLeft, ckTop, ckRight, ckBottom);
TCollisionPoints = Set of TCollisionKind;
Delphi-Quellcode:
In TTestSprite (mein Spieler) DoCollision:
var FCollision: TCollisionPoints;
if (GetAsyncKeyState(VK_RIGHT) < 0) and (not (ckRight in FCollision)) then begin // ... end;
Delphi-Quellcode:
=>
procedure TTestSprite.DoCollision(Sprite: TSprite; var Done: boolean);
begin inherited DoCollision(Sprite,Done); FCollision := GetCollisionPoints(Sprite);
Delphi-Quellcode:
Ich hoffe das sind genug Infos :)
function TTestSprite.GetCollisionPoints(
ASprite: TSprite): TCollisionPoints; begin // Nix machen wenn man mit dem Hintergrund kollidiert oder mit sich selbst if (ASprite is TBackGroundSprite) or (ASprite is TTestSprite) then exit; Result := FCollision; if (X + Width >= ASprite.X) and (Y + Height >= ASprite.Y) and (Y <= ASprite.Y + ASprite.Height) then Result := Result + [ckRight] else Result := Result - [ckRight]; //... end; Gruß Neutral General |
Re: Logik Problem
Also, es ist sehr kompliziert zu überprüfen ob der Spieler sich in/an einem gegenstand befindet.
Sehr viel einfacher ist es, zu überprüfen, ob er im letzten frame links von der linken kante des gegenstands war und nun plötzlich rechts davon ist. |
Re: Logik Problem
Zitat:
|
Re: Logik Problem
dazwischen? Naja, kommt drauf an auf wie viel fps du das ding kriegst. Dann wird die Toleranz sehr schnell sehr klein.
PS: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz