From be3223b28d3decd5e6f08a08f8020d4efc437a95 Mon Sep 17 00:00:00 2001 From: Sage Vaillancourt Date: Sat, 25 Jan 2025 10:05:48 -0500 Subject: [PATCH] Init commit. Very basic swing and hit physics. Pitches every 5 seconds. Not much else! --- main.lua | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 main.lua diff --git a/main.lua b/main.lua new file mode 100644 index 0000000..0c24ed8 --- /dev/null +++ b/main.lua @@ -0,0 +1,100 @@ +import 'CoreLibs/graphics.lua' +import 'CoreLibs/animator.lua' +import 'CoreLibs/easing.lua' + +local gfx = playdate.graphics +playdate.display.setRefreshRate(50) + +gfx.setBackgroundColor(gfx.kColorWhite) + +lastPosition = playdate.getCrankPosition() + +-- text = "Oop" + +timeSinceLastSwing = 999999 + +local ball = gfx.image.new(10, 10, gfx.kColorBlack) +local animationDuration = 2000 +local ballStartY, endY = -20, 250 +local easingFunction = playdate.easingFunctions.outQuint +local ballAnimator = gfx.animator.new(animationDuration, ballStartY, endY, easingFunction) + +local screenW, screenH = 400, 240 +local centerX, centerY = screenW / 2, screenH / 2 +local batBaseX, batBaseY = centerX - 34, 200 + +local circleR = 45 + +local ballY = ballStartY +local lastBallY = ballY +local ballX = 200 +local ballVelX, ballVelY = 0, 0 + +local batTipX = 0 +local batTipY = 0 + +local hit = false + +function pitch() + ballAnimator:reset() + ballVelX = 0 + ballVelY = 0 + ballX = 200 + hit = false +end + +function playdate.AButtonDown() + pitch() +end + +local pitchClockSec = 5 +local elapsedTime = 0 + +function playdate.update() + local deltaTime = playdate.getElapsedTime() + playdate.resetElapsedTime() + elapsedTime = elapsedTime + deltaTime + + if elapsedTime > pitchClockSec then + elapsedTime = 0 + pitch() + end + + gfx.clear() + crankChange, acceleratedChange = playdate.getCrankChange() + + if hit then + ballX = ballX + ballVelX + ballY = ballY + ballVelY + else + ballY = ballAnimator:currentValue() + end + + batAngle = math.rad(playdate.getCrankPosition() + 180) + batTipX = batBaseX + (circleR * math.sin(batAngle)) + batTipY = batBaseY + (circleR * math.cos(batAngle)) + + if hit == false and + --(lastBallY - 2) < batTipY and ballY >= batTipY and batTipX > ballX then + math.abs(ballY - batTipY) < 10 and batTipX > ballX then -- math.abs(batTipX - ballX) < 10 then + ballAngle = batAngle + math.rad(90) + mult = math.abs(acceleratedChange / 15) + ballVelX = mult * -15 * math.sin(ballAngle) + ballVelY = mult * 5 * math.cos(ballAngle) + if ballVelY > 0 then + ballVelX = ballVelX * -1 + ballVelY = ballVelY * -1 + end + hit = true + end + lastBallY = ballY + + gfx.setColor(gfx.kColorBlack) + -- ball:draw(ballX, ballY) + gfx.setLineWidth(2) + gfx.drawCircleAtPoint(ballX, ballY, 8) + + gfx.setLineWidth(5) + gfx.drawLine(batBaseX, batBaseY, batTipX, batTipY) +end +