Ball an Wand abprallen
- lassma-asma
- Beiträge: 107
- Registriert: 10.07.2007 09:14
- Wohnort: Saarland
Ball an Wand abprallen
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
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
- lassma-asma
- Beiträge: 107
- Registriert: 10.07.2007 09:14
- Wohnort: Saarland
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.
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.
- lassma-asma
- Beiträge: 107
- Registriert: 10.07.2007 09:14
- Wohnort: Saarland
- lassma-asma
- Beiträge: 107
- Registriert: 10.07.2007 09:14
- Wohnort: Saarland
- lassma-asma
- Beiträge: 107
- Registriert: 10.07.2007 09:14
- Wohnort: Saarland
Hi,
[Edit]
Hier ist noch ein Code zu einem kleinen Ping Pong, vllt. machste nochwas draus:
[/Edit]
Gruß
Scarabol
Code: Alles auswählen
BallAngle = 30
; hier kollidiert der Ball mit der Wand
BallAngle = 180-BallAngle
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
Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea
PB-V: 4
WinXP
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea
PB-V: 4
WinXP