I'm making a PONG game in Roblox, but it seems the ball keeps going to The bottom left, and sometimes the bottom right of the screen, the problem with this - is that its supposed to fly left or right, and the collision with the bars and the ball doesn't work, and all this is running in a frame, but even the frame doesn't have collision with the ball.
local UserInputService = game:GetService("UserInputService")
local ball = script.Parent.ball
local frame1 = script.Parent.Frame1
local frame2 = script.Parent.Frame2
local initialDirection = math.random(0, 1) == 0 and -0.01 or 0.01
local ballSpeed = Vector2.new(initialDirection, 0.01)
local function moveFrames(direction)
local newPosition
if direction == "up" then
newPosition = UDim2.new(0, 0, -0.1, 0)
elseif direction == "down" then
newPosition = UDim2.new(0, 0, 0.1, 0)
end
if frame1.Position.Y.Scale + newPosition.Y.Scale >= 0 and frame1.Position.Y.Scale + newPosition.Y.Scale + frame1.Size.Y.Scale <= 1 then
frame1.Position = frame1.Position + newPosition
end
if frame2.Position.Y.Scale + newPosition.Y.Scale >= 0 and frame2.Position.Y.Scale + newPosition.Y.Scale + frame2.Size.Y.Scale <= 1 then
frame2.Position = frame2.Position + newPosition
end
end
local function onInputBegan(input, gameProcessed)
if gameProcessed then return end
if input.KeyCode == Enum.KeyCode.W then
moveFrames("up")
elseif input.KeyCode == Enum.KeyCode.S then
moveFrames("down")
end
end
local function updateBallPosition()
ball.Position = ball.Position + UDim2.new(ballSpeed.X, 0, ballSpeed.Y, 0)
end
local function checkBallCollision()
if ball.Position.Y.Scale <= 0 or ball.Position.Y.Scale + ball.Size.Y.Scale >= 1 then
ballSpeed = Vector2.new(ballSpeed.X, -ballSpeed.Y)
end
if ball.Position.X.Scale <= frame1.Position.X.Scale + frame1.Size.X.Scale and
ball.Position.Y.Scale + ball.Size.Y.Scale >= frame1.Position.Y.Scale and
ball.Position.Y.Scale <= frame1.Position.Y.Scale + frame1.Size.Y.Scale then
ballSpeed = Vector2.new(-ballSpeed.X, ballSpeed.Y)
end
if ball.Position.X.Scale + ball.Size.X.Scale >= frame2.Position.X.Scale and
ball.Position.Y.Scale + ball.Size.Y.Scale >= frame2.Position.Y.Scale and
ball.Position.Y.Scale <= frame2.Position.Y.Scale + frame2.Size.Y.Scale then
ballSpeed = Vector2.new(-ballSpeed.X, ballSpeed.Y)
end
end
local function pongGameLoop()
while true do
checkBallCollision()
updateBallPosition()
wait(0.03)
end
end
UserInputService.InputBegan:Connect(onInputBegan)
pongGameLoop()
Nothing really worked, maybe someone can fix it.
Ball goes to bottom left or bottom right: it happens because in your ballSpeed
variable, speed by Y axis is 0.01
, so to make ball fly left or right: you need to change Y axis to 0
:
local ballSpeed = Vector2.new(initialDirection, 0)
Collision with the bars and the ball doesn't work:
it works fine for me. I think that it does't work for you, because you made size of Frame1
, Frame2
and ball
by Offset
. If you do, change size of these objects to Scale
or change your code.
You can also see game where I tested your code (it expires in 7 days): https://fex.net/s/a5bpt5d