Seite 2 von 3

Verfasst: 27.11.2007 21:51
von Zero_Cool
Hallo,

Erst einmal vielen Danke für eure tolle Hilfe! Die Box Schleife funktioniert perfekt, genau das habe ich gesucht!

Irgendwie muss ich in der Schule gepennt haben, bei Orthogonalsteigung verstehe ich nur Bahnhof!

m=-m :shock:

Ich glaube ich muss deinen Beitrag noch 10 mal lesen, dann verstehe ich es vielleicht. Leider ist mir zurzeit noch nicht klar, wie ich das ganze mit Pure Basic verbinden soll?

Gehe ich recht in der Annahme das du mir versuchst zu erklären, das ich nicht den Winkel brauche, sondern die Steigung in Metern (m)? Wenn ja, wie berechne ich die Steigung in Pure Basic? Dazu kommen noch negative und positive Werte... wie kann ein so einfaches Programm so schwer sein :mrgreen:

Aber ich gebe natürlich nicht auf, ich arbeite an einer Revolution :allright:

Verfasst: 27.11.2007 22:26
von Zaphod
Das ist einfacher als es aussieht. Denk mal nach, du hast eine Geschwindigkeit und eine Richtung des Balles. Geschwindigkeit und Richtung kannst du einfach in den Werten ausdrücken, um die dein Ball pro Frame in Richtung der X-Achse und y-Achse verschoben werden muss.

Richtungswechsel können damit schon damit ausgedrückt werden, in dem du einfach je nach Situation den x oder y wert in sein negativ wandelst (* -1 rechnen).

Du hast eine Bande oben und unten und zwei Paddles... mehr gibt es nicht an potentiellen Richtungswechlsern... den Rest überlasse ich mal deiner Phantasie ;)

Verfasst: 27.11.2007 23:16
von Zero_Cool
Okay, alles klar. Mal schauen, ob das klappt. :mrgreen: Danke! Kleine weitere Frage,

Ich bin bei der Collision Abfrage gelandet. Damit der Ball von Links nach Rechts wandert und umgekeht, habe ich folgenden Code verwendet,

Code: Alles auswählen

; Collision Rechts
If SpriteCollision(1, 780, y, 5, bx, 300)
mx=-3
EndIf

; Collision Links
If SpriteCollision(0, 10, y, 5, bx, 300)
mx+3
EndIf

bx+mx ; Bewegung x-Achse
Irgendiwe finde ich den Code unschön. (bx+mx heisst ja nichts anderes als, 0++3 und 0+-3) Ist das so korrekt? Oder löst man das anders?

Verfasst: 28.11.2007 01:20
von Zaphod
na ich glaube nicht dass das so ist wie du es dir vorgestellt hast...

variable+wert ist äquivalent zu variable=variable+wert
variable = wert ist da schon was anderes ;)

Verfasst: 29.11.2007 01:03
von Zero_Cool
Alles klar, ist ja logisch :oops: Danke.

Nun, die Kollisionsabfrage funktioniert, das Game Design ist soweit fertig. Jetzt kommen die beiden schwierigsten Sachen. Habe mir 40 Minuten "pong" You-tube Videos angeschaut, aber werde irgendwie nicht schlau daraus.

Problem 1:
Wie Programmiere ich die Computer-Intelligenz? Einfach den Y Wert des Balles nehmen und ein Delay einbauen? Kann ich mir irgendwie schwer vorstellen? Wir würdet Ihr das lösen?

Problem 2:
Der Winkel wird ausschliesslich von den beiden Platten und deren Geschwindigkeiten bestimmt. (die Wand oben und unten ist lediglich m=-m, das habe ich verstanden :mrgreen:) Wie genau soll ich die Geschwindigkeit der Platte in den Abprallwinkel des Balles, respektive in den y-Wert des Balles umrechnen?

Verfasst: 29.11.2007 01:04
von Zero_Cool
Hier noch der aktuelle Code,

Code: Alles auswählen

;- Konstante 

width = 810 
height = 610 

cr.d = 0
cl.d = 0
cr$ = StrD(cr,0)
cl$ = StrD(cl,0)

bx = 200 ; x-Achse
mx = 3

by = 305 ; y-Achse
my = 3

;- Initialisation 

If Not OpenWindow(0, 0, 0, width, height, "Pong", #PB_Window_ScreenCentered) 
End 
EndIf 

If Not (InitKeyboard() And InitSprite()) 
End 
EndIf 

If Not OpenWindowedScreen(WindowID(0), 0, 0, width, height, 0, 0, 0) 
End 
EndIf 

;- Schriftart

If Not LoadFont(0, "OCR A Std", 80) 
End 
EndIf 

;-Sprites

If Not CreateSprite(0, 20, 100) 
End 
EndIf 

If StartDrawing(SpriteOutput(0)) 
Box(0, 0, 20, 100, $FFFFFF) 
StopDrawing() 
EndIf 

; Sprite Rechts

If Not CreateSprite(1, 20, 100) 
End 
EndIf 

If StartDrawing(SpriteOutput(1)) 
Box(0, 0, 20, 100, $FFFFFF) 
StopDrawing() 
EndIf 

; Sprite Oben

If Not CreateSprite(2, 800, 10) 
End 
EndIf 

If StartDrawing(SpriteOutput(2)) 
For n=0 To 800 Step 20 
Box(n-10, 0, 10, 10, $FFFFFF) 
Next 
StopDrawing() 
EndIf 

; Sprite Unten

If Not CreateSprite(3, 800, 10) 
End 
EndIf 

If StartDrawing(SpriteOutput(3)) 
For n=0 To 800 Step 20 
Box(n-10, 0, 10, 10, $FFFFFF) 
Next 
StopDrawing() 
EndIf 

; Sprite Mitte

If Not CreateSprite(4, 10, 560) 
End 
EndIf 

If StartDrawing(SpriteOutput(4)) 
For n=0 To 600 Step 20 
Box(0, n-10, 10, 10, $FFFFFF) 
Next 
StopDrawing() 
EndIf 

; Sprite Ball

If Not CreateSprite(5, 20, 20) 
End 
EndIf 

If StartDrawing(SpriteOutput(5)) 
Box(0, 0, 20, 20, $FFFFFF) 
StopDrawing() 
EndIf 

; Sprite Links (Goal)

If Not CreateSprite(6, 10, 560) 
End 
EndIf 

If StartDrawing(SpriteOutput(6)) 
Box(0, 0, 10, 560, $000000) 
StopDrawing() 
EndIf 

; Sprite Rechts (Goal)

If Not CreateSprite(7, 10, 560) 
End 
EndIf 

If StartDrawing(SpriteOutput(7)) 
Box(0, 0, 10, 560, $000000) 
StopDrawing() 
EndIf 

;- Endlose Schleife 

Define y = (height - 100) / 2
Repeat    
  
ExamineKeyboard() ; Aktualisiert den Tastatur-Status 
ClearScreen(RGB(0, 0, 0)) 
  
; Inhalt 
If KeyboardPushed(#PB_Key_Up)
If y <= 20
y = 20 
Else 
y - 3 
EndIf 
EndIf 
  
If KeyboardPushed(#PB_Key_Down) 
If y => height - 120
y = height - 120 
Else 
y + 3 
EndIf 
EndIf 

; Collision Rechts
If SpriteCollision(1, 780, cy, 5, bx, by)
mx=-3
EndIf

; Collision Links
If SpriteCollision(0, 10, y, 5, bx, by)
mx=3
EndIf

; Collision Rechts (Goal)
If SpriteCollision(6, 800, 20, 5, bx, by)
cr.d + 1
cr$ = StrD(cr,0)
bx = 200
mx = 3 

by = 305
my = 3
EndIf

; Collision Links (Goal)
If SpriteCollision(7, 0, 20, 5, bx, by)
cl.d + 1
cl$ = StrD(cl,0)
bx = 200
mx = 3 

by = 305
my = 3
EndIf

; Collision Oben
If SpriteCollision(2, 0, 10, 5, bx, by)
my=3
EndIf

; Collision Unten
If SpriteCollision(3, 0, 590, 5, bx, by)
my=-3
EndIf

bx+mx ; Bewegung x-Achse
by+my ; Bewegung y-Achse
cy=by ; Bewegung Ki-Spieler
  
DisplaySprite(0, 10, y) ; Spieler Links
DisplaySprite(1, 780, cy) ; Spieler Rechts
DisplaySprite(2, 0, 10)  ; Sprite Oben
DisplaySprite(3, 0, 590) ; Sprite Unten
DisplaySprite(4, 400, 20) ; Sprite Mitte
DisplaySprite(5, bx, by) ; Sprite Ball
DisplaySprite(6, 0, 20) ; Goal Links
DisplaySprite(7, 800, 20) ; Goal Rechts

;-Counter
StartDrawing(ScreenOutput()) 
DrawingFont(FontID(0)) 
DrawingMode(#PB_2DDrawing_Transparent) 
DrawText(310, 35, cl$, $FFFFFF) 
StopDrawing() 

StartDrawing(ScreenOutput()) 
DrawingFont(FontID(0)) 
DrawingMode(#PB_2DDrawing_Transparent) 
DrawText(423, 35, cr$, $FFFFFF) 
StopDrawing()
  
FlipBuffers() 
  
; Window-Events abarbeiten 

While WindowEvent()
Wend 

Until KeyboardReleased(#PB_Key_Escape) 
Ich weiss, nicht perfekt. Aber für den Anfang :mrgreen:

Verfasst: 29.11.2007 01:34
von Thalius
Wie Programmiere ich die Computer-Intelligenz? Einfach den Y Wert des Balles nehmen und ein Delay einbauen? Kann ich mir irgendwie schwer vorstellen? Wir würdet Ihr das lösen?
Wenn dein Computer sich zb auf der Y Achse bewegt ist das einfachste mal den Computerschläger mit der Y Achse des Balls anzupassen ... raffinierter wirds mit nem kleinen randomdelay und beschleunigungskurve - damit hast du dann einen nicht-so-perfekten Computergegener.

Thalius

Verfasst: 29.11.2007 13:56
von 50-Pfennig
Zero_Cool hat geschrieben: Problem 2:
Der Winkel wird ausschliesslich von den beiden Platten und deren Geschwindigkeiten bestimmt. (die Wand oben und unten ist lediglich m=-m, das habe ich verstanden :mrgreen:) Wie genau soll ich die Geschwindigkeit der Platte in den Abprallwinkel des Balles, respektive in den y-Wert des Balles umrechnen?
Also ich denke, du gehst bei deinem Pong davon aus, dass es sich bei den Bewegungen um gleichförmige Bewegunen handelt....
Das bedeutet, die Geschwindigkeit ändert sich nach dem Abprallen nicht. Falls dein Pong den Gravitationsgesetzen entsprechen soll (Ist aber ja nicht Sinn der sache), musst du beachten, dass die Ballgeschwindigkeit pro Sekunde um 9.81 m/s abnimmt. Das ist aber überflüssig, denn das Gegner Paddel ist ja auch oben, das würde bedeuten, der Ball würde mit Gravitationsgesetzten langsamer bei deinem Gegner-Paddel ankommen als bei dir, denn er ist dann mal angenommen oben.

Mach dir also um die Geschwindigkeit keine Sorgen, die bleibt konstant.

Die Flugbahn könnte beispielsweise so beschaffen sein:

Code: Alles auswählen

xPos=xPos+Schrittweite

yPos = Steigung*xPos
Dann müsstest du prüfen, ob der Ball kollidiert (bsp.)...

Code: Alles auswählen

If Kollision()=1
 Steigung=-Steigung
EndIf
So in der Art müsste es funktionieren...

post scriptum: Mit "m" ist nicht die Masseinheit Meter gemeint, sondern das ist ein festgelegter Variablenname für die Steigung einer linearen Kurve.

Verfasst: 30.11.2007 18:47
von SimonSimCity
Ich hab mich auch mal an die Programmierung gemacht, und aus dem Code auf der 1. Seite was gebastelt:

Code: Alles auswählen

;- Konstante

width      = 800
height     = 600
By         = (Random(190)+7)*3
Bychange   = 0
Bxchange   = 0
Bx         = 401
PlayerRight= 0
PlayerLeft = 0
;- Initialisation

If Not OpenWindow(0, 0, 0, width, height, "Pong", #PB_Window_ScreenCentered)
End
EndIf

If Not (InitKeyboard() And InitSprite())
End
EndIf

If Not OpenWindowedScreen(WindowID(0), 0, 0, width, height, 0, 0, 0)
End
EndIf

;- Schriftart

If Not LoadFont(0, "OCR A Std", 80)
End
EndIf

;-Sprites

If Not CreateSprite(6, 20, 100)
End
EndIf

If StartDrawing(SpriteOutput(6))
Box(0, 0, 20, 100, $FFFFFF)
StopDrawing()
EndIf

; Sprite Rechts

If Not CreateSprite(7, 20, 100)
End
EndIf

If StartDrawing(SpriteOutput(7))
Box(0, 0, 20, 100, $FFFFFF)
StopDrawing()
EndIf

; Sprite Oben

If Not CreateSprite(2, 800, 10)
End
EndIf

If StartDrawing(SpriteOutput(2))
Box(0, 0, 800, 10, $FFFFFF)
StopDrawing()
EndIf

; Sprite Unten

If Not CreateSprite(3, 800, 10)
End
EndIf

If StartDrawing(SpriteOutput(3))
Box(0, 0, 800, 10, $FFFFFF)
StopDrawing()
EndIf

; Sprite Mitte

If Not CreateSprite(4, 10, 560)
End
EndIf

If StartDrawing(SpriteOutput(4))
Box(0, 0, 10, 600, $FFFFFF)
StopDrawing()
EndIf

; Sprite Ball

If Not CreateSprite(5, 10, 10)
End
EndIf

If StartDrawing(SpriteOutput(5))
Box(0, 0, 10, 10, $FFFFFF)
StopDrawing()
EndIf

; Sprite Links (Goal)

If Not CreateSprite(0, 10, 560)
End
EndIf

If StartDrawing(SpriteOutput(0))
Box(0, 0, 10, 560, $000000)
StopDrawing()
EndIf

; Sprite Rechts (Goal)

If Not CreateSprite(1, 10, 560)
End
EndIf

If StartDrawing(SpriteOutput(1))
Box(0, 0, 10, 560, $000000)
StopDrawing()
EndIf

;- Endlose Schleife

Define y = (height - 100) / 2
Repeat   
 
ExamineKeyboard() ; Aktualisiert den Tastatur-Status
ClearScreen(RGB(0, 0, 0))
 
;{ Tastaturereignisse
If KeyboardPushed(#PB_Key_Up)
If y <= 20
y = 20
Else
y - 3
EndIf
EndIf
 
If KeyboardPushed(#PB_Key_Down)
If y => height - 120
y = height - 120
Else
y + 3
EndIf
EndIf
;}

;{ Bewegung des Balles
If Bychange=1
  If By = 21
    Beep_(520, 50)
    Bychange=0
  Else
    By - 3
  EndIf
Else
  If By = height - 30
    Beep_(520, 50)
    Bychange=1
  Else
    By + 3
  EndIf
EndIf

If Bxchange=1
  If Bx = 29 And SpriteCollision(5, Bx, By, 6, 10, y)
    Beep_(700, 50)
    Bxchange=0
  ElseIf Bx < 29 
    Bxchange=0
    PlayerLeft + 1
    Beep_(195, 300)
  Else
    Bx - 3
  EndIf
Else
  If Bx = 761 And SpriteCollision(5, Bx, By, 7, 770, y)
    Beep_(700, 50)
    Bxchange=1
  ElseIf Bx > 761
    Bxchange=1
    PlayerRight + 1
    Beep_(195, 300)
  Else
    Bx + 3
  EndIf
EndIf
;}

DisplaySprite(0, 0, 20)   ; Goal Links
DisplaySprite(1, 790, 20) ; Goal Rechts
DisplaySprite(2, 0, 10)   ; Sprite Oben
DisplaySprite(3, 0, 580)  ; Sprite Unten
DisplaySprite(4, 395, 20) ; Sprite Mitte
DisplaySprite(5, Bx, By) ; Sprite Ball
DisplaySprite(6, 10, y)   ; Spieler Links
DisplaySprite(7, 770, y)  ; Spieler Rechts

;-Counter Linker Spieler
StartDrawing(ScreenOutput())
DrawingFont(FontID(0))
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(310, 15, Str(PlayerLeft), $FFFFFF)
StopDrawing()

;-Counter Rechter Spieler
StartDrawing(ScreenOutput())
DrawingFont(FontID(0))
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(430, 15, Str(PlayerRight), $FFFFFF)
StopDrawing()
 
FlipBuffers()

While WindowEvent()
Wend

Delay(10)

Until KeyboardReleased(#PB_Key_Escape)

Verfasst: 30.11.2007 18:53
von SimonSimCity
sry für den Doppel post, aber das muss sein...


Falls jemand noch einen BOT einbauen will: Diese paar Zeilen bei Z. 187 einfügen:

Code: Alles auswählen

;{ BOT
  If By > 68 And By < (height - 77)
    y=By -47
  EndIf
;}
Falls jemand Spaß dran hat:
Dies ist ein Projekt von mir an den DrawMania-Regeln.
Wenn jemand diese Regeln weiterhin weiter halten will darf er an diesem Code weiterarbeiten.
Ich habe noch folgende Wünsche:
- 4-Spieler Modus (Oben+Links+Unten+Rechts)
- Netzwerkfähig
- Einen Bot, gegen den man auch gewinnen kann!