![]() |
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] |
Re: Abprallen des Balles Minigolf
kannst du mal ein screenshot posten? ich kann mir das grad schlecht vorstellen, vlt. kann ich dir dann weiterhelfen
|
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. |
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 :-)
|
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:
Was soll dieser Code machen? Was sind die Zahlen (520 und 711)?
if (ball.top < 0) or (ball.Top > 520) then y:=-y;
if (ball.left < 0) or (ball.left > 711) then x:=-x; 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:
und
if (ballposx >= hindernis.left) and (ballposx <= hindernis.left+hindernis.width)
then begin x:=-x; y:=-y; showmessage('x'); end;
Delphi-Quellcode:
Immer das gleiche:
if (ballposy >= hindernis.top) and (ballposy <= hindernis.top+hindernis.height)
then begin x:=-x; y:=-y; showmessage('y'); end;
Delphi-Quellcode:
sorry, aber das ist quatsch.
x := -x;
y := -y; |
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:
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.
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; 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. |
Re: Abprallen des Balles Minigolf
Zitat:
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:
[edit=Phoenix]Delphi-Tags korrigiert. Da gehören keine Leerzeichen rein und alles klein ;-) Mfg, Phoenix[/edit]
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; |
Re: Abprallen des Balles Minigolf
mach denn quelltext doch bitte in delphi-tags (also [ delphi ]QUELLTEXT;[ /delpih ]) nur ohne die leerzeichen!
|
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:( |
Re: Abprallen des Balles Minigolf
keiner eine idee :(
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 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