Keep Up!

Blitz3D Forums/Blitz3D Beginners Area/Keep Up!

Hello, All

I've got yet another problem. :(, I've been trying to make my own Breakout clone, i've got a pad that can move left and right and a ball that bounces around. Now if i leave the pad alone the ball bounces around without any lag or slow down...but soon as i start moving the pad both the pad and the ball slows down. this is very frustrating as i've just got everything working...

Source:

AppTitle "BreakIn!"

Local ScreenHeight = 165
Local ScreenWidth = 165
Graphics ScreenWidth,ScreenHeight

Local Pad = LoadImage("Pad.bmp")
Local PadX = ScreenWidth / 2 - ImageWidth(Pad) / 2
Local PadY = 128
Local PadSpeed = 15

Local Ball = LoadImage("Ball.bmp")
Local BallX = ScreenWidth / 2 - ImageWidth(Ball) / 2
Local BallY = PadY - ImageHeight(Ball)
Local BallSpeed = 0
Local BallDirection = 1

MaskImage Pad,250,250,250
MaskImage Ball,250,250,250

SetBuffer BackBuffer()

ClsColor 250,250,250

While Not KeyDown(1)

Cls
DrawImage Pad,PadX,PadY
DrawImage Ball,BallX,BallY
Flip

If KeyDown(203) And PadX => 1 Then PadX = PadX - 1: Delay PadSpeed ; Move Pad Left
If KeyDown(205) And PadX <= ScreenWidth - ImageWidth(Pad)-1 Then PadX = PadX + 1: Delay PadSpeed ; Move Pad Right

;;;;; If Ball Hits Sides Of Screen ;;;;;
; Collision Detection: Wall:Left
If BallX <= 0 And BallDirection = 1 Then BallDirection = 2
If BallX <= 0 And BallDirection = 4 Then BallDirection = 3
; Collision Detection: Wall:Top
If BallY <= 0 And BallDirection = 1 Then BallDirection = 4
If BallY <= 0 And BallDirection = 2 Then BallDirection = 3
; Collision Detection: Wall:Right
If BallX => ScreenWidth - ImageWidth(Ball) And BallDirection = 3 Then BallDirection = 4
If BallX => ScreenWidth - ImageWidth(Ball) And BallDirection = 2 Then BallDirection = 1
; Collision Detection: Wall:Bottom
If BallY => ScreenHeight - ImageHeight(Ball) And BallDirection = 3 Then BallDirection = 2
If BallY => ScreenHeight - ImageHeight(Ball) And BallDirection = 4 Then BallDirection = 1

;;;;; If Ball Hits Pad ;;;;;
If BallDirection = 4 And BallY => PadY - ImageHeight(Pad)+1 And BallY <= PadY And BallX <= PadX + ImageWidth(Pad)-1 And BallX => PadX - ImageWidth(Ball)+1 Then BallDirection = 1
If BallDirection = 3 And BallY => PadY - ImageHeight(Pad)+1 And BallY <= PadY And BallX <= PadX + ImageWidth(Pad)-1 And BallX => PadX - ImageWidth(Ball)+1 Then BallDirection = 2
; Collision Detection: Pad:Bottom
If BallDirection = 2 And BallY <= PadY + ImageHeight(Pad)-1 And BallY => PadY And BallX <= PadX + ImageWidth(Pad)-1 And BallX => PadX - ImageWidth(Ball)+1 Then BallDirection = 3
If BallDirection = 1 And BallY <= PadY + ImageHeight(Pad)-1 And BallY => PadY And BallX <= PadX + ImageWidth(Pad)-1 And BallX => PadX - ImageWidth(Ball)+1 Then BallDirection = 4
; Collision Detection: Pad:Right
If BallDirection = 4 And BallX <= PadX + ImageWidth(Ball)-1 And BallX => PadX And BallY => PadY - ImageHeight(Pad)+1 And BallY <= PadY + ImageHeight(Pad)-1 Then BallDirection = 2
If BallDirection = 1 And BallX <= PadX + ImageWidth(Ball)-1 And BallX => PadX And BallY => PadY - ImageHeight(Pad)+1 And BallY <= PadY + ImageHeight(Pad)-1 Then BallDirection = 3
; Collision Detection: Pad:Left
If BallDirection = 2 And BallX => PadX - ImageWidth(Ball)+1 And BallX <= PadX And BallY => PadY - ImageHeight(Pad)+1 And BallY <= PadY + ImageHeight(Pad)-1 Then BallDirection = 1
If BallDirection = 4 And BallX => PadX - ImageWidth(Ball)+1 And BallX <= PadX And BallY => PadY - ImageHeight(Pad)+1 And BallY <= PadY + ImageHeight(Pad)-1 Then BallDirection = 3

; Move Ball Around The Screen
If BallSpeed > 0 And BallDirection = 1 Then BallX = BallX - 2: BallY = BallY - 2: Delay BallSpeed ; Move Ball Top:Left
If BallSpeed > 0 And BallDirection = 2 Then BallX = BallX + 2: BallY = BallY - 2: Delay BallSpeed ; Move Ball Top:Right
If BallSpeed > 0 And BallDirection = 3 Then BallX = BallX + 2: BallY = BallY + 2: Delay BallSpeed ; Move Ball Bottom:Right
If BallSpeed > 0 And BallDirection = 4 Then BallX = BallX - 2: BallY = BallY + 2: Delay BallSpeed ; Move Ball Bottom:Left

; Start Ball Moving If It's Not
If BallSpeed = 0 And KeyDown(57) Then BallSpeed = 10

Wend
End

Could it be due to the fact i've got to many IF statements?

Hey, the delay command halts the entire program from running, that's where the slowdown is coming from. Everytime you move the bat, your delaying the game for x number of millisecs().
How about this. I've put in a millisecs() timer. If 20 millisecs() has passed then the key for moving the pad will be checked. Taken out PadSpeed variable and put in pad_time and pad_timer. Adjust pad_time for faster/slower pad movement.

AppTitle "BreakIn!" 

Local ScreenHeight = 165 
Local ScreenWidth = 165 
Graphics ScreenWidth,ScreenHeight 

Local Pad = LoadImage("Pad.bmp") 
Local PadX = ScreenWidth / 2 - ImageWidth(Pad) / 2 
Local PadY = 128 

Local Ball = LoadImage("Ball.bmp") 
Local BallX = ScreenWidth / 2 - ImageWidth(Ball) / 2 
Local BallY = PadY - ImageHeight(Ball) 
Local BallSpeed = 0 
Local BallDirection = 1 

MaskImage Pad,250,250,250 
MaskImage Ball,250,250,250 

SetBuffer BackBuffer() 

ClsColor 250,250,250 

Global pad_time=20; This is the time in millisecs() the keys that move the pad will be checked
Global pad_timer-millisecs(); This is the counter for the pad time

While Not KeyDown(1) 

Cls 
DrawImage Pad,PadX,PadY 
DrawImage Ball,BallX,BallY 
Flip 

If Millisecs()>pad_time+pad_timer then; if pad_time amount of millisecs() has passed then do pad movement
   pad_timer=millisecs(); resets timer
   If KeyDown(203) And PadX => 1 Then PadX = PadX - 1; Move Pad Left 
   If KeyDown(205) And PadX <= ScreenWidth - ImageWidth(Pad)-1 Then PadX = PadX + 1; Move Pad Right 
end if
;;;;; If Ball Hits Sides Of Screen ;;;;; 
; Collision Detection: Wall:Left 
If BallX <= 0 And BallDirection = 1 Then BallDirection = 2 
If BallX <= 0 And BallDirection = 4 Then BallDirection = 3 
; Collision Detection: Wall:Top 
If BallY <= 0 And BallDirection = 1 Then BallDirection = 4 
If BallY <= 0 And BallDirection = 2 Then BallDirection = 3 
; Collision Detection: Wall:Right 
If BallX => ScreenWidth - ImageWidth(Ball) And BallDirection = 3 Then BallDirection = 4 
If BallX => ScreenWidth - ImageWidth(Ball) And BallDirection = 2 Then BallDirection = 1 
; Collision Detection: Wall:Bottom 
If BallY => ScreenHeight - ImageHeight(Ball) And BallDirection = 3 Then BallDirection = 2 
If BallY => ScreenHeight - ImageHeight(Ball) And BallDirection = 4 Then BallDirection = 1 

;;;;; If Ball Hits Pad ;;;;; 
If BallDirection = 4 And BallY => PadY - ImageHeight(Pad)+1 And BallY <= PadY And BallX <= PadX + ImageWidth(Pad)-1 And BallX => PadX - ImageWidth(Ball)+1 Then BallDirection = 1 
If BallDirection = 3 And BallY => PadY - ImageHeight(Pad)+1 And BallY <= PadY And BallX <= PadX + ImageWidth(Pad)-1 And BallX => PadX - ImageWidth(Ball)+1 Then BallDirection = 2 
; Collision Detection: Pad:Bottom 
If BallDirection = 2 And BallY <= PadY + ImageHeight(Pad)-1 And BallY => PadY And BallX <= PadX + ImageWidth(Pad)-1 And BallX => PadX - ImageWidth(Ball)+1 Then BallDirection = 3 
If BallDirection = 1 And BallY <= PadY + ImageHeight(Pad)-1 And BallY => PadY And BallX <= PadX + ImageWidth(Pad)-1 And BallX => PadX - ImageWidth(Ball)+1 Then BallDirection = 4 
; Collision Detection: Pad:Right 
If BallDirection = 4 And BallX <= PadX + ImageWidth(Ball)-1 And BallX => PadX And BallY => PadY - ImageHeight(Pad)+1 And BallY <= PadY + ImageHeight(Pad)-1 Then BallDirection = 2 
If BallDirection = 1 And BallX <= PadX + ImageWidth(Ball)-1 And BallX => PadX And BallY => PadY - ImageHeight(Pad)+1 And BallY <= PadY + ImageHeight(Pad)-1 Then BallDirection = 3 
; Collision Detection: Pad:Left 
If BallDirection = 2 And BallX => PadX - ImageWidth(Ball)+1 And BallX <= PadX And BallY => PadY - ImageHeight(Pad)+1 And BallY <= PadY + ImageHeight(Pad)-1 Then BallDirection = 1 
If BallDirection = 4 And BallX => PadX - ImageWidth(Ball)+1 And BallX <= PadX And BallY => PadY - ImageHeight(Pad)+1 And BallY <= PadY + ImageHeight(Pad)-1 Then BallDirection = 3 

; Move Ball Around The Screen 
If BallSpeed > 0 And BallDirection = 1 Then BallX = BallX - 2: BallY = BallY - 2: Delay BallSpeed ; Move Ball Top:Left 
If BallSpeed > 0 And BallDirection = 2 Then BallX = BallX + 2: BallY = BallY - 2: Delay BallSpeed ; Move Ball Top:Right 
If BallSpeed > 0 And BallDirection = 3 Then BallX = BallX + 2: BallY = BallY + 2: Delay BallSpeed ; Move Ball Bottom:Right 
If BallSpeed > 0 And BallDirection = 4 Then BallX = BallX - 2: BallY = BallY + 2: Delay BallSpeed ; Move Ball Bottom:Left 

; Start Ball Moving If It's Not 
If BallSpeed = 0 And KeyDown(57) Then BallSpeed = 10 

Wend 
End


Oh right, i think i get it, but does it matter how many IF statements i use, or do IF statements not effect the speed of the game?

No, if statement won't really affect the speed of the game. They are executed lightning quick.

If you have about ten thousand if statements, it might make a difference...

Even ten thousand should be okay.