four points

heres a small game I made inspired by three points:

touch to rotate the square and make sure the colored balls hit the matching colored sides.

-- Four Points

displayMode(FULLSCREEN)
supportedOrientations(PORTRAIT)
function setup()
    colors = { color(0, 99, 255, 255), color(162, 0, 255, 255), color(234, 189, 70, 255), color(79, 232, 79, 255) }
    target = { size = WIDTH / 5, angle = 0, x = WIDTH / 2, y = HEIGHT / 4 }
    makeTargetImage()
    
    maxBallSpeed = 12
    ballSize = WIDTH / 20

    sounds = {
        rotate = function() sound("Game Sounds One:Whoosh 1") end,
        score = function() sound("Game Sounds One:Bell 2") end
    }

    reset()
end

function makeTargetImage()
    local tmesh = mesh()
    local lb, rb, rt, lt, c = vec2(0, 0), vec2(target.size, 0), vec2(target.size, target.size), vec2(0, target.size), vec2(target.size / 2, target.size / 2)
    tmesh.vertices = { lt, c, rt, rt, c, rb, rb, c, lb, lb, c, lt }
    local mcolors = {}
    for i = 1, #colors  do
        for v = 1, 3 do
            table.insert(mcolors, colors[i])
        end
    end
    tmesh.colors = { unpack(mcolors) }

    target.image = image(target.size, target.size) setContext(target.image)
    tmesh:draw()
    setContext()
end

function reset()
    score = 0
    if target.rotating then
        tween.stop(target.rotating)
        target.rotating = nil
    end
    target.angle = 0
    balls = {}
    ballSpeed = 6

    spawnBall()
end

function spawnBall()
    local ball = { y = HEIGHT + ballSize / 2, col = math.random(1, #colors) }
    table.insert(balls, ball)
end

function draw()
    background(255, 255, 255, 255)

    -- Balls
    local topCol = specialModulo(math.ceil(((target.angle % 360) / 90) + 1), 4)
    for i = #balls, 1, -1 do
        local ball = balls[i]

        ball.y = ball.y - ballSpeed

        fill(colors[ball.col]) noStroke()
        ellipse(WIDTH / 2, ball.y, ballSize)

        if ball.y <= HEIGHT / 2 and not ball.spawned then
            spawnBall()
            ball.spawned = true
        end
        if ball.y <= target.y + target.size / 2 then
            if ball.col == topCol then
                score = score + 1
                ballSpeed = math.min(ballSpeed + 0.2, maxBallSpeed)

                table.remove(balls, i)

                sounds.score()
            else
                reset()
            end
        end
    end

    -- Square
    pushMatrix()
    translate(target.x, target.y)
    rotate(target.angle)
    sprite(target.image)
    popMatrix()

    -- Score
    fill(127) font("HelveticaNeue-CondensedBold") fontSize(WIDTH / 10) 
    text(score, WIDTH / 2, HEIGHT - fontSize())
    fontSize(WIDTH / 20)
    text("tap to rotate", WIDTH / 2, (target.y - target.size / 2) / 2)
end

function touched(t)
    if t.state == ENDED then
        if target.rotating then
            tween.stop(target.rotating)
            target.angle = target.rotating.target.angle
        end

        target.rotating = tween(0.1, target, { angle = target.angle + 90 })

        sounds.rotate()
    end
end

-- Same as a % b, except that if a is a multiple b it returns b not 0
function specialModulo(a, b)
    local mod = b * (a/b - math.floor(a/b))
    if mod == 0 then
        mod = b
    end
    
    return mod
end

EDIT: Fixed a bug with it turning wrong after a restart, added a max speed for the balls

The user and all related content has been deleted.

@NatTheCoder, no you can use the code if you would like.

The user and all related content has been deleted.

@JakAttak very nice!

I love the rotating square! Could I use the rotating square in a game I am making?

Thanks!

Very nice game

@Jmv38, @West, thanks!

@austinmccoy, yes you may use parts of the code in your game.

The user and all related content has been deleted.

@NatTheCoder What do you mean? You didn’t share any code, and @JakAttak made this project.

@NatTheCoder if you’re giving us updates about your project, you should make a new discussion or wait until it’s done.

Stop making great games. :wink:

The user and all related content has been deleted.

The user and all related content has been deleted.

@NatTheCoder I’m sure everyone would love to see your code, but please finish your update and post one final product in this discussion to prevent spamming. :slight_smile:

@NatTheCoder lol it does seem like that…