AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Abprallen des Balles Minigolf

Abprallen des Balles Minigolf

Ein Thema von ncarlos · begonnen am 23. Okt 2008 · letzter Beitrag vom 27. Okt 2008
Antwort Antwort
Seite 1 von 2  1 2   
ncarlos

Registriert seit: 23. Okt 2008
10 Beiträge
 
#1

Abprallen des Balles Minigolf

  Alt 23. Okt 2008, 22:00
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]
  Mit Zitat antworten Zitat
Benutzerbild von Eljey
Eljey

Registriert seit: 5. Mai 2007
56 Beiträge
 
#2

Re: Abprallen des Balles Minigolf

  Alt 23. Okt 2008, 23:04
kannst du mal ein screenshot posten? ich kann mir das grad schlecht vorstellen, vlt. kann ich dir dann weiterhelfen
  Mit Zitat antworten Zitat
ncarlos

Registriert seit: 23. Okt 2008
10 Beiträge
 
#3

Re: Abprallen des Balles Minigolf

  Alt 24. Okt 2008, 00:17
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.
  Mit Zitat antworten Zitat
Benutzerbild von Eljey
Eljey

Registriert seit: 5. Mai 2007
56 Beiträge
 
#4

Re: Abprallen des Balles Minigolf

  Alt 24. Okt 2008, 09:32
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
  Mit Zitat antworten Zitat
zahor

Registriert seit: 27. Jun 2006
Ort: im hintersten Winkel des RAMs
182 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Abprallen des Balles Minigolf

  Alt 24. Okt 2008, 10:42
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.
Real Programmers always confuse Christmas and Halloween because Oct31 = Dec25. - Andrew Rutherford
  Mit Zitat antworten Zitat
zahor

Registriert seit: 27. Jun 2006
Ort: im hintersten Winkel des RAMs
182 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Abprallen des Balles Minigolf

  Alt 24. Okt 2008, 11:10
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.
Real Programmers always confuse Christmas and Halloween because Oct31 = Dec25. - Andrew Rutherford
  Mit Zitat antworten Zitat
ncarlos

Registriert seit: 23. Okt 2008
10 Beiträge
 
#7

Re: Abprallen des Balles Minigolf

  Alt 24. Okt 2008, 14:26
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]
  Mit Zitat antworten Zitat
zahor

Registriert seit: 27. Jun 2006
Ort: im hintersten Winkel des RAMs
182 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Abprallen des Balles Minigolf

  Alt 24. Okt 2008, 14:35
mach denn quelltext doch bitte in delphi-tags (also [ delphi ]QUELLTEXT;[ /delpih ]) nur ohne die leerzeichen!
Real Programmers always confuse Christmas and Halloween because Oct31 = Dec25. - Andrew Rutherford
  Mit Zitat antworten Zitat
ncarlos

Registriert seit: 23. Okt 2008
10 Beiträge
 
#9

Re: Abprallen des Balles Minigolf

  Alt 24. Okt 2008, 17:40
heey! ok habs verstanden danke für dein tipp


Hast du vllt eine Lösung für mein Problem? Ich bin echt ratlos
  Mit Zitat antworten Zitat
ncarlos

Registriert seit: 23. Okt 2008
10 Beiträge
 
#10

Re: Abprallen des Balles Minigolf

  Alt 24. Okt 2008, 19:59
keiner eine idee
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:35 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