Code Sketch


7313
By: Mhalsakant School
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()
}