Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Andorra und Newton (https://www.delphipraxis.net/107060-andorra-und-newton.html)

Neutral General 21. Jan 2008 17:06


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:
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;
Gruß
Neutral General

igel457 21. Jan 2008 18:16

Re: Andorra und Newton
 
Hallo,

bevor du "InitializeShape" ausrufst, muss die Sprite-Grafik geladen sein, bzw. "Width" und "Height" gesetzt.

Neutral General 22. Jan 2008 11:13

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:
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;
Frozen := true; friert das Sprite sofort ein und unterbricht es bei allen physikalischen "Tätigkeiten" :mrgreen:

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

igel457 22. Jan 2008 11:47

Re: Andorra und Newton
 
Was passiert, wenn du beim Aufprall Velocity auf Null setzt?

Neutral General 22. Jan 2008 12:08

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 02:56 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