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