Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Abprallen des Balles Minigolf (https://www.delphipraxis.net/122889-abprallen-des-balles-minigolf.html)

ncarlos 23. Okt 2008 22:00


Abprallen des Balles Minigolf
 
Heey!

Ich hab folgendes Problem.

Ich möchte ,dass der Ball am Hindernis abgeprallt wird,aber leider geht das nicht.

Der Ball ist als eine Image-Komponente erstellt und das Hindernis auch. Dies wuren zum Spielfeld hinzugefügt.

hier ist der Quelltext:

ball= ist die imagekomponente für dn ball und Hindernis die Imagekomponente für das Hindernis

Delphi-Quellcode:
procedure TForm1.MoveTimer(Sender: TObject);

var n,m:integer;

begin

if (ball.top < 0) or (ball.Top > 520) then y:=-y;
if (ball.left < 0) or (ball.left > 711) then x:=-x;

                                     if (ballposx >= hindernis.left) and (ballposx <= hindernis.left+hindernis.width)
                                     then begin
                                     x:=-x;
                                     y:=-y;
                                     showmessage('x');
                                     end;

                                     if (ballposy >= hindernis.top) and (ballposy <= hindernis.top+hindernis.height)
                                     then begin
                                     x:=-x;
                                     y:=-y;
                                     showmessage('y');
                                     end;

ich bedanke mich jetzt schon bei euch

[edit=Phoenix].NET zu Win32 geändert und Delphi-Tags eingefügt. Bitte das nächste mal etwas mehr aufpassen. Danke. Mfg, Phoenix[/edit]

Eljey 23. Okt 2008 23:04

Re: Abprallen des Balles Minigolf
 
kannst du mal ein screenshot posten? ich kann mir das grad schlecht vorstellen, vlt. kann ich dir dann weiterhelfen

ncarlos 24. Okt 2008 00:17

Re: Abprallen des Balles Minigolf
 
Die Bilder sehen an an sich so aus:

3 Bitmaps.

das eine Bild ist Grün und soll das Spielfeld sein.

das zweite bild ist der Ball ,wekches auf dem Spielfeld positioniert wurde.

und das 3. Bild ist ein Hindernis,welches auch auf dem Spielfeld positioniert wurde.


Ich hab es hinbekommen,dass der Ball beim Zusammenstoßen mit den Rändern des Spielfeldes abgeprallt wird,aber nicht mit einr anderen Image-Komponente.

Eljey 24. Okt 2008 09:32

Re: Abprallen des Balles Minigolf
 
Das erste fragst du aber mit ball.top bzw .left ab, die kollision mit derm hinderniss mit ballpox und ballposy... Hast du auch werte auf diese variablen gespeichert, denn deine abfragen scheinen mir logisch zu sein :-)

zahor 24. Okt 2008 10:42

Re: Abprallen des Balles Minigolf
 
hm... das kann man auch "eleganter" lösen...
TImages sind da ziemlich ungeeignet, ich würde direkt auf das Canvas zeichnen.
Was mir grade auffällt:
Delphi-Quellcode:
if (ball.top < 0) or (ball.Top > 520) then y:=-y;
if (ball.left < 0) or (ball.left > 711) then x:=-x;
Was soll dieser Code machen? Was sind die Zahlen (520 und 711)?
Ich gehe mal davon aus, dass er verhindern soll, dass der Ball aus dem Spielfeld rollt.
Was er aber tut ist irgendwelche Variablen x und y, die Wohl den x- und y-Wert des Balls beschreiben, zu negieren. Anstatt den Ball abprallen zu lassen wird er um 2*Abs(x) bewegt. Geändert werden soll aber nur seine Richtung! Da ist mit deinem Konzept was faul.
Selbiges gilt für
Delphi-Quellcode:
if (ballposx >= hindernis.left) and (ballposx <= hindernis.left+hindernis.width)
then begin
x:=-x;
y:=-y;
showmessage('x');
end;
und
Delphi-Quellcode:
if (ballposy >= hindernis.top) and (ballposy <= hindernis.top+hindernis.height)
then begin
x:=-x;
y:=-y;
showmessage('y');
end;
Immer das gleiche:
Delphi-Quellcode:
 x := -x;
y := -y;
sorry, aber das ist quatsch.

zahor 24. Okt 2008 11:10

Re: Abprallen des Balles Minigolf
 
also ich habs mir grade mal überlegt wie man das machen müsste. Nur so hingeschrieben, nicht ausprobiert.
ich gehe mal davon aus, dass du das nicht objektorientiert machen willst, also:
zuerst braucht man ne variable für die richtung, in die der Ball fliegt.
das ist dann ne gradangabe.
dann muss die timer-methode etwa so aussehen:
Delphi-Quellcode:
procedure TForm1.MoveTimer(Sender: TObject);
  with ball do
  begin
    if (top <= 0) or (top >= hoehe) then
      richtung := Abs(360 - richtung) mod 360;
    if left <= 0 then
      richtung := Abs(180 - richtung) mod 360;
    if left >= breite then
      richtung := Abs(540 - richtung) mod 360;
  end;
also das ist nur das für die Spielfeldwände. dabei ist hoehe die Spielfeldhöhe und breite die Spielfeldbreite. dann musst du das ganze noch zeichnen - die winkel sind wie im einheitskreis angegeben.
sprich 0° ist gerade nach rechts, 90° gerade nach oben, 180° dementsprechend gerade nach links, 270° nach unten, und 360° wieder nach rechts.
bei unklarheiten wie ich auf die richtungsberechnungen gekommen bin frag einfach nach.

ncarlos 24. Okt 2008 14:26

Re: Abprallen des Balles Minigolf
 
Zitat:

if (ball.top < 0) or (ball.Top > 520) then y:=-y;
if (ball.left < 0) or (ball.left > 711) then x:=-x;


abprallen mit den Rändenr funktioniert ja. Ich habe diese Werte durch ausprobieren heurasbekommen.


Nur das Abprallen zweier Imagekomponente funktioniert nicht.



Was muss ich denn da jetzt genau tuen . Ich poste mal eben den ganzen Quelltext.

[b]Wenn ihr das selber ausprobieren wollt nimmt 3 Imagekomponente das eine soll das Spielfeld sein , dann auf dem Spielfeld platziert der Ball und irgendein anderes
Bild ,wo der Ball abgeprallt wird.

In meinem Quelltext ist der Name des Balles einfach ball ,vom Spielfeld = Spielfeld und Hindernis müsst ihr selbst noch machen,weil ich das aus meinem Quelltext hervorgenommen habe

Ich habe meine Abprallmethode mit dem Imagekoponenten aus dem folgenden Quelltext herausgenomme,was ich vorhin gepostet hatte.[b]

Delphi-Quellcode:
unit Ufussball;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls,math, StdCtrls;

type
  TForm1 = class(TForm)
    Spielfeld: TImage;
    Ball: TImage;
    speed: TTimer;
    Move: TTimer;
    power: TScrollBar;
    Panel1: TPanel;
    Label1: TLabel;

    procedure FormCreate(Sender: TObject);
    procedure SpielfeldClick(Sender: TObject);
    procedure speedTimer(Sender: TObject);
    procedure MoveTimer(Sender: TObject);
    procedure SpielfeldMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

  ges:real;       {Geschwindigkeit des Balles}
  ballposx,ballposy:integer; {Ursprüngliche Position des Balles}
  hinposx,hinposy:integer;    {Position des geplanten Balles}
  x,y:integer;                {Koordinaten}
  fall:integer;                 {Für case_abfrage}
  zeiger:tpoint;
  xmouse,ymouse:integer;
  strength:real;
  barpos:integer;
  schlaege:integer;
  implementation

{$R *.dfm}







procedure bewegen ( move:ttimer; speed:ttimer; ball:timage; power:tscrollbar; label1:tlabel);      {Berechnung der Postion vom Ball mit Abhänigkeit der Geschwindikeit}

var bewegenx,bewegeny:integer;
winkel:extended;


begin
speed.Enabled:=false;
      if ballposx > hinposx then bewegenx:=ballposx-hinposx;         {Hinposition ohne die Abhänigkeit der Geschwindkeit berechnet}
      if ballposx < hinposx then bewegenx:=hinposx-ballposx;
      if ballposy > hinposy then bewegeny:=ballposy-hinposy;
      if ballposy < hinposy then bewegeny:=hinposy-ballposy;




{x:= trunc(sin(winkel*pi/180)*ges);}         {Hinpositon mit der Abhängigkeit der Geschwindigkeit}
{y:=trunc(cos(winkel*pi/180)*ges);}
x:=bewegenx;
y:=bewegeny;


if ballposx > hinposx then x:=-x;
if ballposy > hinposy then y:=-y;

x:=trunc(x*ges);
y:=trunc(y*ges);






move.enabled:=true;    {Nun bewegt sich der Ball}
ges:=0;     {Ist für den zweiten Schlag wichtig}
schlaege:=schlaege+1;
label1.Caption:=label1.Caption+inttostr(schlaege);
power.Position:=0;
ballposx:=ball.Left;
ballposy:=ball.Top;
barpos:=-1;




end;



procedure richtung (timer1:TTimer);

begin
timer1.enabled:=true;
hinposx:=xmouse;
hinposy:=ymouse;

{form1.caption:=inttostr(ballposx)+'-'+inttostr(ballposy)+'-'+inttostr(hinposx)+'-'+inttostr(hinposy);}
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ges:=0;
fall:=1;
strength:=-0.1;
ballposx:=ball.Left;
ballposy:=ball.Top;
barpos:=-1;
schlaege:=0;
end;

procedure TForm1.SpielfeldClick(Sender: TObject);


begin
fall:=-fall;             {Bei Klick auf Spielfeld findet ein Vorzeichenwechsel bei fall statt.}


case fall of                            {Bei -1 wird die Geschwindikeit ermittelt und bei 1 wird die Position berechnet.}
-1:richtung(speed);
 1:bewegen(move,speed,ball,power,label1);
end;



end;


procedure TForm1.speedTimer(Sender: TObject);

begin

if trunc(ges) = 2 then begin strength:=-strength; barpos:=-barpos; end;
if frac(ges) < 0 then begin strength:=-strength; barpos:=-barpos; end;

ges:=ges+strength;
power.Position:=power.position+barpos;
form1.caption:=floattostr(ges);
end;


procedure TForm1.MoveTimer(Sender: TObject);
var n,m:integer;

begin

if (ball.top < 0) or (ball.Top > 520) then y:=-y;
if (ball.left < 0) or (ball.left > 711) then x:=-x;
[edit=Phoenix]Delphi-Tags korrigiert. Da gehören keine Leerzeichen rein und alles klein ;-) Mfg, Phoenix[/edit]

zahor 24. Okt 2008 14:35

Re: Abprallen des Balles Minigolf
 
mach denn quelltext doch bitte in delphi-tags (also [ delphi ]QUELLTEXT;[ /delpih ]) nur ohne die leerzeichen!

ncarlos 24. Okt 2008 17:40

Re: Abprallen des Balles Minigolf
 
heey! ok habs verstanden danke für dein tipp ;)


Hast du vllt eine Lösung für mein Problem? Ich bin echt ratlos:(

ncarlos 24. Okt 2008 19:59

Re: Abprallen des Balles Minigolf
 
keiner eine idee :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:46 Uhr.
Seite 1 von 2  1 2      

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