Seite 1 von 2
Ball an Wand abprallen
Verfasst: 22.09.2007 15:45
von lassma-asma
Hi leute , ich hab ma wieder ein Problem ...
Ich will grad ma ein kleines Programm schreiben und willte wissen wie ich es hinbekomme dass ein ball zum beispiel von einer wand abprallt ...
und wenn ihr mir helfen könntet es mir zu erklären wäre ich dankbar ...
gruß lassma-asma
Verfasst: 22.09.2007 15:49
von Andreas_S
Verfasst: 22.09.2007 15:51
von lassma-asma
ah ja danke ... da war ich auch schon ma ... habs aber nich gerafft ...
Verfasst: 22.09.2007 16:21
von Tompazi
Das ist im Grunde ganz einfach
Der Bildschirm bzw. das Fenster hat Koordinaten.
Links bzw. oben ist 0
wenn jetzt der Ball von rechts nach Links fliegt und du willst das wenn er den Rand erreicht hat umdreht schreib einfach:
BallX = BallX - 1 ;der ball fliegt nach links
If BallX < 0
BallX = BallX + 1 ; der ball fliegt nach rechts
EndIf
das heißt einfach wenn die X koordinate des Balls unter 0 ist dreht er um.
Verfasst: 22.09.2007 16:26
von lassma-asma
ok
danke schon ma
aber ich meine nich dass er in einem 90° winkel aufkommt sondern zum beispiel 30° oder so ...
HILFE !°
Verfasst: 22.09.2007 16:34
von Tompazi
45 Grad könnte ich noch erklären
BallX = BallX - 1 ;der ball fliegt nach links
If BallX < 0
BallX = BallX + 1 ; der ball fliegt nach rechts
BallY = BallY + 1 ; der ball fliegt nach unten
EndIf
Mehr geht über mein PB wissen ...
Verfasst: 22.09.2007 16:39
von lassma-asma
ok danke noch ma ...
soweit so gut jetzt brauch mir nur noch einer zu erklären wie es dann bei einem anderen x-beliebigen winkel geht ...
Verfasst: 22.09.2007 17:06
von Scarabol
Einfallswinkel = Ausfallswinkel, soll heißen du musst nur den Kehrwert des Winkels bilden.
Gruß
Scarabol
Verfasst: 22.09.2007 17:09
von lassma-asma
kannst du mir ma ein codebeispiel bilden ... bitte ...
Verfasst: 22.09.2007 17:13
von Scarabol
Hi,
Code: Alles auswählen
BallAngle = 30
; hier kollidiert der Ball mit der Wand
BallAngle = 180-BallAngle
[Edit]
Hier ist noch ein Code zu einem kleinen Ping Pong, vllt. machste nochwas draus:
Code: Alles auswählen
#Version = "0.1"
Enumeration
#Player1Up
#Player1Down
#Player1Left
#Player1Right
EndEnumeration
OpenPreferences("config.ini")
PreferenceGroup("Global")
Global Version$ = ReadPreferenceString("Version", #Version)
Global WindowWidth = ReadPreferenceLong("Width", 800)
Global WindowHeight = ReadPreferenceLong("Height", 600)
Global Color_Field = ReadPreferenceLong("Color_Field", RGB(0,128,0))
Global Color_Border = ReadPreferenceLong("Color_Border", #White)
PreferenceGroup("Player1")
Global Menu_Up = ReadPreferenceLong("Up", #PB_Shortcut_Up)
Global Menu_Down = ReadPreferenceLong("Down", #PB_Shortcut_Down)
Global Menu_Left = ReadPreferenceLong("Left", #PB_Shortcut_Left)
Global Menu_Right = ReadPreferenceLong("Right", #PB_Shortcut_Right)
Global Player1Color = ReadPreferenceLong("Color", #Blue)
PreferenceGroup("Player2")
Global Player2Color = ReadPreferenceLong("Color", #Red)
Global BorderWidth.f = WindowWidth/80
Global BorderHeight.f = WindowHeight/60
Global StickWidth.f = WindowWidth/80
Global StickHeight.f = WindowHeight/10
Global Field = CreateImage(#PB_Any, WindowWidth, WindowHeight)
Global Player1X.f = WindowWidth/20
Global Player1Y.f = (WindowHeight-StickHeight)/2
Global Player2X.f = WindowWidth-WindowWidth/40-BorderWidth
Global Player2Y.f = (WindowHeight-StickHeight)/2
Global StepX.f = WindowWidth/40
Global StepY.f = WindowHeight/30
Global HitCounter = 0
Global SpeedCounter = 0
Procedure DrawField()
StartDrawing(ImageOutput(Field))
FrontColor(Color_Border)
Box(0, 0, WindowWidth, WindowHeight)
FrontColor(Color_Field)
Box(BorderWidth, BorderHeight, ImageWidth(Field)-BorderWidth*2, ImageHeight(Field)-BorderHeight*2)
FrontColor(Color_Border)
Box((WindowWidth-BorderWidth)/2, 0, BorderWidth, WindowHeight)
StopDrawing()
EndProcedure
Procedure DrawStickPlayer1()
StartDrawing(ImageOutput(Field))
Box(Player1X, Player1Y, StickWidth, StickHeight, Player1Color)
StopDrawing()
EndProcedure
Procedure DrawStickPlayer2()
StartDrawing(ImageOutput(Field))
Box(Player2X, Player2Y, StickWidth, StickHeight, Player2Color)
StopDrawing()
EndProcedure
Procedure.f GSin(winkel.f)
preturn.f=Sin(winkel*(2*#PI/360))
ProcedureReturn preturn
EndProcedure
Procedure.f GCos(winkel.f)
preturn.f=Cos(winkel*(2*#PI/360))
ProcedureReturn preturn
EndProcedure
Procedure ResetBall()
Global BallX.f = WindowWidth/2
Global BallY.f = WindowHeight/2
Global BallSpeed = 5
Num = Random(1)
If Num = 1
Global BallAngle.f = 110
Else
Global BallAngle.f = 250
EndIf
EndProcedure
Procedure DrawBall()
If BallY > Player1Y And BallY < Player1Y+StickHeight And BallX >= Player1X-5 And BallX <= Player1X+StickWidth+5
BallAngle = 360-BallAngle
HitCounter+1
SpeedCounter+1
EndIf
If BallY > Player2Y And BallY < Player2Y+StickHeight And BallX <= Player2X+5 And BallX >= Player2X-StickWidth+5
BallAngle = 360-BallAngle
HitCounter+1
SpeedCounter+1
EndIf
If BallY <= BorderHeight+5 Or BallY >= WindowHeight-BorderHeight-5
BallAngle = 180-BallAngle
EndIf
BallX+GSin(BallAngle)*BallSpeed
BallY+GCos(BallAngle)*BallSpeed
StartDrawing(ImageOutput(Field))
Circle(BallX, BallY, 10, RGB(64,64,64))
Circle(BallX, BallY, 8, RGB(128,128,128))
StopDrawing()
EndProcedure
Procedure DisplayCounter()
StartDrawing(ImageOutput(Field))
DrawingMode(1)
Text$ = Str(HitCounter)
DrawText(WindowWidth-BorderWidth*2-TextWidth(Text$), BorderHeight*2, Text$)
StopDrawing()
If SpeedCounter >= 10
BallSpeed+1
SpeedCounter = 0
EndIf
EndProcedure
ResetBall()
win = OpenWindow(#PB_Any, 1, 1, WindowWidth, WindowHeight, "Ping Pong - Version: "+Version$, #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
CreateGadgetList(WindowID(win))
FieldGadget = ImageGadget(#PB_Any, 0, 0, WindowWidth(win), WindowHeight(win), ImageID(Field))
AddKeyboardShortcut(win, Menu_Up , #Player1Up)
AddKeyboardShortcut(win, Menu_Down , #Player1Down)
AddKeyboardShortcut(win, Menu_Left , #Player1Left)
AddKeyboardShortcut(win, Menu_Right , #Player1Right)
Cursor = LoadCursor_(0, #IDC_CROSS)
Repeat
EventID = WindowEvent()
SetCursor_(Cursor)
If WindowMouseY(win) <> -1
Player1Y = WindowMouseY(win)-StickHeight/2
If Player1Y < BorderHeight
Player1Y = BorderHeight
ElseIf Player1Y > WindowHeight-BorderHeight-StickHeight
Player1Y = WindowHeight-BorderHeight-StickHeight
EndIf
EndIf
Player2X = WindowWidth-Player1X-BorderWidth
Player2Y = Player1Y
DrawField()
DrawStickPlayer1()
DrawStickPlayer2()
DrawBall()
DisplayCounter()
SetGadgetState(FieldGadget, ImageID(Field))
If BallX < 0
MessageRequester("Spiel Ende", "Spieler 1 hat verloren!", #MB_ICONERROR)
End
EndIf
If BallX > WindowWidth
MessageRequester("Spiel Ende", "Spieler 2 hat verloren!", #MB_ICONERROR)
End
EndIf
Delay(10)
Until EventID = #PB_Event_CloseWindow
End
[/Edit]
Gruß
Scarabol