AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi DelphiX: Kollision bei 2 Sprites.
Thema durchsuchen
Ansicht
Themen-Optionen

DelphiX: Kollision bei 2 Sprites.

Ein Thema von Kihaku · begonnen am 9. Sep 2003 · letzter Beitrag vom 9. Sep 2003
Antwort Antwort
Kihaku

Registriert seit: 7. Sep 2003
Ort: Hagen
22 Beiträge
 
#1

DelphiX: Kollision bei 2 Sprites.

  Alt 9. Sep 2003, 02:34
Hi
hätte auch mal ne frage zu ner Kollisions abfrage bei 2 Sprites, weil ich nicht das richtige für mich beim suchen im Forum gefunden habe:


Also ich habe ne Spielfigur (Sprite) und nen Stein. ich möchte jetzt das die Figur nicht durch den Stein laufen kann. Es soll keine Pixelgenaue Abfrage sein, sondern nur als Quadrat.

Meine Move anweisung ist folgende:

Delphi-Quellcode:
procedure TAnimation.DoMove(MoveCount: Integer);
begin
  inherited DoMove(MoveCount);


  if isUp in Form1.DXInput1.States then
  begin
    y := y - speed;
    AnimCount := 3;
    AnimLooped := True;
    AnimSpeed := 100/1000;
    AnimStart := 6;
  end
  else

  if isDown in Form1.DXInput1.States then
  begin
    y := y + speed;
    AnimCount := 3;
    AnimLooped := True;
    AnimSpeed := 100/1000;
    AnimStart := 9;
  end
  else

  if isLeft in Form1.DXInput1.States then
  begin
    x := x - speed;
    AnimCount := 3;
    AnimLooped := True;
    AnimSpeed := 100/1000;
    AnimStart := 0;
  end
  else

  if isRight in Form1.DXInput1.States then
  begin
    x := x + speed;
    AnimCount := 3;
    AnimLooped := True;
    AnimSpeed := 100/1000;
    AnimStart := 3;
  end
  else
  begin
    AnimSpeed := 0;
  end;

  Collision;

end;


und die Collisions abfrage lautet wie folgt:

Delphi-Quellcode:
procedure TAnimation.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
  if sprite is TGegenstand then
    begin
      beep;
      dead;
    end;
end;


Wie ihr seht, habe ich noch nichts richtiges gefunden. Ich hatte es mal mit dem hier probiert:


Delphi-Quellcode:
procedure TAnimation.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
  if sprite is TGegenstand then
    begin
      beep;
      speed := 0;
    end
    else
    begin
      speed := 2;
    end;
end;

Dann hällt er zwar an, aber ich kann nichtmehr weglaufen.

Wie mache ich das denn nun, das er nicht durchlaufen kann???


Danke im Vorraus!!!
  Mit Zitat antworten Zitat
Kihaku

Registriert seit: 7. Sep 2003
Ort: Hagen
22 Beiträge
 
#2

Re: DelphiX: Kollision bei 2 Sprites.

  Alt 9. Sep 2003, 04:14
Und noch eine Frage:

neue Frage, neuer Thread.
[edit=Luckie]Mfg, Luckie[/edit]
  Mit Zitat antworten Zitat
Blechwolf

Registriert seit: 9. Sep 2003
Ort: Aachen
126 Beiträge
 
Delphi 7 Professional
 
#3

Re: DelphiX: Kollision bei 2 Sprites.

  Alt 9. Sep 2003, 09:36
Salut,
ich kann Dir zwar keine spezielle Delphi-Antwort auf Deine Frage geben, weil ich spowas bisher immer nur mit C++ und OpenGL gemacht habe, mein Tip wäre, wenn Du ne Kollision hast, dann setz Deine Figur doch einfach eine X-Koordinate zurück, damit Du nicht mehr in der Box Deines Steins bist. So wie das nämlich aussieht, und sich auch anhört, hast Du das Problem, daß Du zwar dann anhälst, aber immer noch in der Bounding-Box Deines Steins stehst, und deswegen immer wieder ne Kollision findest.

Gruß
Blechwolf
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (engl. Sprichwort)
  Mit Zitat antworten Zitat
Kihaku

Registriert seit: 7. Sep 2003
Ort: Hagen
22 Beiträge
 
#4

Re: DelphiX: Kollision bei 2 Sprites.

  Alt 9. Sep 2003, 12:16
Hi, ich habe das jetzt so gemacht, ich habe jeder Richtung nen Integer zugeteilt "Direction". wenn ich nach oben gehen wird er auf 0 gesetzt, nach rechts auf 1, nach unten auf 2 und nach links auf 3.

dann habe ich das zu meiner kollision geschrieben:


Delphi-Quellcode:
procedure TAnimation.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
  if sprite is TGegenstand and (Direction = 0) or (Direction = 1) or (Direction = 2) or (Direction = 3) then
    begin
      beep;
      speed := -2;
    end
    else
    begin
    speed := 2;
    end;
end;


EDIT!!!
Also ich merke gerade das diese version nicht sinnvoll ist. Wenn ich das Bild berühre, werde ich zwar zb nach hinten gesetzt, aber die Steuerung bleibt danach invertiert, obwohl ich das object garnichtmehr berühre.

Und so toll ist diese Variante nicht, mit dem einfach nach hinten setzen.
Gibts nicht ne einfachere version wo man einfach nur sagt das dieser block nicht passable ist??

Cu
  Mit Zitat antworten Zitat
Blechwolf

Registriert seit: 9. Sep 2003
Ort: Aachen
126 Beiträge
 
Delphi 7 Professional
 
#5

Re: DelphiX: Kollision bei 2 Sprites.

  Alt 9. Sep 2003, 13:32
Hmmm, das war jetzt nicht so direkt die Lösung an die ich gedacht habe.
Meine Variante sah vor, daß Du direkt in die Koordinaten eingreifst (so wie in Deiner Move Anweisung) und das Speed einfach auf 0 setzt.
In Pseudocode sollte das dann ungefähr so aussehen:

If (Collision) then
begin
beep;
speed := 0;

x := x-1;
/* alternativ
y := y-1;
x := x+1;
y := y+1;
oder beides, abhängig von der Kollision */
end
else
begin
end;

Gruß

Blechwolf
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (engl. Sprichwort)
  Mit Zitat antworten Zitat
Kihaku

Registriert seit: 7. Sep 2003
Ort: Hagen
22 Beiträge
 
#6

Re: DelphiX: Kollision bei 2 Sprites.

  Alt 9. Sep 2003, 13:59
Ahh vielen dank, hat funktioniert ! ^^

  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