Ball an Wand abprallen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
lassma-asma
Beiträge: 107
Registriert: 10.07.2007 09:14
Wohnort: Saarland

Ball an Wand abprallen

Beitrag 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
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

Benutzeravatar
lassma-asma
Beiträge: 107
Registriert: 10.07.2007 09:14
Wohnort: Saarland

Beitrag von lassma-asma »

ah ja danke ... da war ich auch schon ma ... habs aber nich gerafft ...
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

Beitrag 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.
Benutzeravatar
lassma-asma
Beiträge: 107
Registriert: 10.07.2007 09:14
Wohnort: Saarland

Beitrag 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 !°
Gruß lassma-asma

MultiPONG
HANGMAN


PB 3.94 und PureBasic 4.51 !!!
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

Beitrag 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 ...
Benutzeravatar
lassma-asma
Beiträge: 107
Registriert: 10.07.2007 09:14
Wohnort: Saarland

Beitrag 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 ...
Gruß lassma-asma

MultiPONG
HANGMAN


PB 3.94 und PureBasic 4.51 !!!
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Einfallswinkel = Ausfallswinkel, soll heißen du musst nur den Kehrwert des Winkels bilden.

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
lassma-asma
Beiträge: 107
Registriert: 10.07.2007 09:14
Wohnort: Saarland

Beitrag von lassma-asma »

kannst du mir ma ein codebeispiel bilden ... bitte ...
Gruß lassma-asma

MultiPONG
HANGMAN


PB 3.94 und PureBasic 4.51 !!!
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag 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
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Antworten