![]() |
Andorra und Newton
Hi,
Ich hab ein kleines Problem mit Newton im Bezug auf Andorra2D. Ich habe zwei Sprites. 1. Boden: TPhysicalBoxSprite; 2. Player1: TPhysicalBoxSprite Player1: Mass := 1; Boden: Typ := ptStatic; Beide wurden mit InitializeShape; initialisiert. Wenn ich das Projekt starte dann fällt der Spieler... ... durch den Boden hindurch. Er sollte ja eigentlich auf dem Boden aufknallen. Ich habe mir auch mal die Demo angeschaut die bei Andorra dabei ist, aber da wird auch nichts anders gemacht..
Delphi-Quellcode:
Gruß
PhApp := TPhysicalApplication.Create(AdEngine);
PhApp.SolverModel := smExact; Player1 := TPhysicalBoxSprite.Create(AEngine); Player1.Mass := 1; Player1.InitializeShape; boden := TPhysicalBoxSprite.Create(ADEngine) boden.Image := AdImages.Find('test'); boden.Y := 300; boden.Typ := ptStatic; boden.InitializeShape; Neutral General |
Re: Andorra und Newton
Hallo,
bevor du "InitializeShape" ausrufst, muss die Sprite-Grafik geladen sein, bzw. "Width" und "Height" gesetzt. |
Re: Andorra und Newton
Hi,
Danke.. Hab ich auch eben grad festgestellt :wall: Hab da aber noch ne weitere Frage.... Wenn ein Sprite auf den Boden fällt, dann springt es nochmals etwas nach oben, knallt wieder auf und springt wieder ein bisschen und landet dann endlich. Also sone Art "Flummieeffekt". Kann man das irgendwie ausschalten? Mich stört das. Ich dachte mal daran die Masse des fallenden Objekts groß genug zu machen. Nach meinem physikalischen Verständnis sollte da dann eigentlich nichts mehr hüpfen. Funktioniert aber leider nicht. Mein zweiter Ansatz war folgendes:
Delphi-Quellcode:
TDragonSprite = class(TPhysicalBoxSprite)
private FFrozen: Boolean; procedure SetFrozen(const Value: Boolean); protected procedure DoMove(TimeGap:double); override; procedure DoCollision(Sprite: TSprite; var Done: Boolean); override; public property Frozen: Boolean read FFrozen write SetFrozen; procedure Stop; end;
Delphi-Quellcode:
Frozen := true; friert das Sprite sofort ein und unterbricht es bei allen physikalischen "Tätigkeiten" :mrgreen:
procedure TDragonSprite.SetFrozen(const Value: Boolean);
begin FFrozen := Value; Active := not Value; CanDoMoving := not Value; if Value then Typ := ptStatic else Typ := ptDynamic; InitializeShape; end; procedure TDragonSprite.Stop; begin Frozen := true; Frozen := false; end; Meine Idee: Bei der Kollision mit dem Boden Stop; aufrufen. So würde das Sprite gestoppt, es würde nicht mehr hochspringen und danach kann es wieder gegebenenfalls auf weitere Kräfte reagieren. Soooweit die Theorie. Geplante Durchführung:
Delphi-Quellcode:
procedure TDragonSprite.DoMove(TimeGap: double);
begin inherited DoMove(TimeGap); Collision; end; procedure TDragonSprite.DoCollision(Sprite: TSprite; var Done: Boolean); begin inherited DoCollision(Sprite,Done); if Sprite is TPhysicalBoxSprite then Stop; end; Problem: Es kommt zu keiner Kollision! Anscheinend berührt das Sprite beim "Aufprall" nie wirklich das andere Sprite. Keine Ahnung. Jedenfalls würde ich gerne wissen was ich da machen kann.. Gruß Neutral General |
Re: Andorra und Newton
Was passiert, wenn du beim Aufprall Velocity auf Null setzt?
|
Re: Andorra und Newton
Hi,
Ja das funktioniert. (Obwohl ich dachte, das ich das schon versucht hätte.. :gruebel: ) Das Problem ist halt immernoch das ich die Kollision nicht mitbekomme... Gruß Neutral General |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 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 by Thomas Breitkreuz