Code Sketch
7313
Category: Art
cleari()
// =========================
// COUNTER CAR - SPEED GAME
// =========================
val road = Picture.rectangle(400, 700)
road.setFillColor(Color(45, 45, 48, 255))
road.setPenColor(noColor)
road.setPosition(-200, -350)
road.draw()
// Road border
val leftBorder = Picture.rectangle(8, 700)
leftBorder.setFillColor(white)
leftBorder.setPenColor(noColor)
leftBorder.setPosition(-200, -350)
leftBorder.draw()
val rightBorder = Picture.rectangle(8, 700)
rightBorder.setFillColor(white)
rightBorder.setPenColor(noColor)
rightBorder.setPosition(192, -350)
rightBorder.draw()
// Center road lines
val dash1 = Picture.rectangle(6, 60)
dash1.setFillColor(yellow)
dash1.setPenColor(noColor)
dash1.draw()
val dash2 = Picture.rectangle(6, 60)
dash2.setFillColor(yellow)
dash2.setPenColor(noColor)
dash2.draw()
val dash3 = Picture.rectangle(6, 60)
dash3.setFillColor(yellow)
dash3.setPenColor(noColor)
dash3.draw()
val dash4 = Picture.rectangle(6, 60)
dash4.setFillColor(yellow)
dash4.setPenColor(noColor)
dash4.draw()
val dash5 = Picture.rectangle(6, 60)
dash5.setFillColor(yellow)
dash5.setPenColor(noColor)
dash5.draw()
// =========================
// PLAYER CAR
// =========================
val car = Picture.rectangle(58, 100)
car.setFillColor(Color(0, 150, 255, 255))
car.setPenColor(white)
car.draw()
val carWindow = Picture.rectangle(42, 30)
carWindow.setFillColor(Color(20, 40, 60, 255))
car.setPenColor(noColor)
carWindow.draw()
// Wheels
val wheel1 = Picture.circle(12)
wheel1.setFillColor(black)
wheel1.setPenColor(noColor)
wheel1.draw()
val wheel2 = Picture.circle(12)
wheel2.setFillColor(black)
wheel2.setPenColor(noColor)
wheel2.draw()
// =========================
// ENEMY CAR
// =========================
val enemy = Picture.rectangle(58, 100)
enemy.setFillColor(Color(220, 40, 40, 255))
enemy.setPenColor(white)
enemy.draw()
val enemyWindow = Picture.rectangle(42, 30)
enemyWindow.setFillColor(Color(20, 40, 60, 255))
enemyWindow.setPenColor(noColor)
enemyWindow.draw()
// =========================
// DASHBOARD
// =========================
val title = Picture.text("COUNTER CAR", 25)
title.setFillColor(white)
title.setPosition(-360, 310)
title.draw()
val speedText = Picture.text("SPEED: 0 KM/H", 22)
speedText.setFillColor(Color(0, 255, 100, 255))
speedText.setPosition(-360, 270)
speedText.draw()
val gearText = Picture.text("GEAR: 1", 20)
gearText.setFillColor(white)
gearText.setPosition(-360, 235)
gearText.draw()
val brakeText = Picture.text("BRAKE: OFF", 18)
brakeText.setFillColor(white)
brakeText.setPosition(120, 300)
brakeText.draw()
val controls = Picture.text(
"? ? STEER 1-5 GEAR SPACE ACCELERATE B BRAKE R RESET",
14
)
controls.setFillColor(Color(0, 230, 255, 255))
controls.setPosition(-360, -320)
controls.draw()
// =========================
// VARIABLES
// =========================
var carX = -29.0
var speed = 20.0
var gear = 1
var enemyY = 350.0
var dashY = 0.0
var braking = false
// =========================
// POSITIONS
// =========================
def updatePositions() = {
car.setPosition(carX, -230)
carWindow.setPosition(carX - 21, -195)
wheel1.setPosition(carX - 24, -250)
wheel2.setPosition(carX + 24, -250)
enemy.setPosition(40, enemyY)
enemyWindow.setPosition(40 - 21, enemyY + 25)
dash1.setPosition(0, dashY + 250)
dash2.setPosition(0, dashY + 80)
dash3.setPosition(0, dashY - 90)
dash4.setPosition(0, dashY - 260)
dash5.setPosition(0, dashY - 430)
speedText.update("SPEED: " + speed.toInt + " KM/H")
gearText.update("GEAR: " + gear)
if (braking)
brakeText.update("BRAKE: ON")
else
brakeText.update("BRAKE: OFF")
}
// =========================
// ANIMATION
// =========================
animate {
// Steering
if (isKeyPressed(Kc.VK_LEFT)) {
carX -= 8
}
if (isKeyPressed(Kc.VK_RIGHT)) {
carX += 8
}
// Keep car on road
if (carX < -150)
carX = -150
if (carX > 90)
carX = 90
// Accelerate
if (isKeyPressed(Kc.VK_SPACE)) {
speed += 1.5
}
// Maximum speed
if (speed > 200)
speed = 200
// Brake
if (isKeyPressed(Kc.VK_B)) {
braking = true
speed -= 4
} else {
braking = false
}
if (speed < 0)
speed = 0
// Gear
if (isKeyPressed(Kc.VK_1))
gear = 1
if (isKeyPressed(Kc.VK_2))
gear = 2
if (isKeyPressed(Kc.VK_3))
gear = 3
if (isKeyPressed(Kc.VK_4))
gear = 4
if (isKeyPressed(Kc.VK_5))
gear = 5
// Gear affects speed
val maxSpeed = gear match {
case 1 => 40
case 2 => 80
case 3 => 120
case 4 => 160
case 5 => 200
}
if (speed > maxSpeed)
speed = maxSpeed
// Road animation
dashY -= speed * 0.12
if (dashY < -170)
dashY = 0
// Enemy movement
enemyY -= speed * 0.10
if (enemyY < -400) {
enemyY = 400
}
// Collision
if (
Math.abs(carX - 40) < 55 &&
Math.abs(-230 - enemyY) < 90
) {
speed = 0
brakeText.update("CRASH!")
}
// Update
updatePositions()
}
// =========================
// RESET
// =========================
onKeyPress {
case Kc.VK_R =>
carX = -29.0
speed = 20.0
gear = 1
enemyY = 350.0
dashY = 0.0
braking = false
updatePositions()
}