Code Sketch


sniper_0718
By: Mhalsakant School
Category: Art
cleari()

// =========================
// PURE WHITE DEFENDER - MONOCHROME EDITION
// =========================

// Deep black asphalt road
val road = Picture.rectangle(400, 700)
road.setFillColor(Color(18, 18, 18, 255))
road.setPenColor(noColor)
road.setPosition(-200, -350)
road.draw()

// Asphalt road borders (dark grey shoulders)
val leftShoulder = Picture.rectangle(12, 700)
leftShoulder.setFillColor(Color(35, 35, 35, 255))
leftShoulder.setPenColor(noColor)
leftShoulder.setPosition(-200, -350)
leftShoulder.draw()

val rightShoulder = Picture.rectangle(12, 700)
rightShoulder.setFillColor(Color(35, 35, 35, 255))
rightShoulder.setPenColor(noColor)
rightShoulder.setPosition(188, -350)
rightShoulder.draw()

// Crisp white center lane dividers
val dash1 = Picture.rectangle(4, 50)
dash1.setFillColor(white)
dash1.setPenColor(noColor)
dash1.draw()

val dash2 = Picture.rectangle(4, 50)
dash2.setFillColor(white)
dash2.setPenColor(noColor)
dash2.draw()

val dash3 = Picture.rectangle(4, 50)
dash3.setFillColor(white)
dash3.setPenColor(noColor)
dash3.draw()

val dash4 = Picture.rectangle(4, 50)
dash4.setFillColor(white)
dash4.setPenColor(noColor)
dash4.draw()

val dash5 = Picture.rectangle(4, 50)
dash5.setFillColor(white)
dash5.setPenColor(noColor)
dash5.draw()

// =========================
// PLAYER DEFENDER (ALL WHITE / ALPINE SPEC)
// =========================

// Main Body (Pure White)
val car = Picture.rectangle(64, 106)
car.setFillColor(white)
car.setPenColor(Color(225, 225, 225, 255))
car.draw()

// Roof Top (Also matching White for a sleek full-white look)
val roofTop = Picture.rectangle(58, 80)
roofTop.setFillColor(white)
roofTop.setPenColor(Color(210, 210, 210, 255))
roofTop.draw()

// Roof Rack Frame (Subtle grey accent)
val roofRack = Picture.rectangle(52, 70)
roofRack.setFillColor(noColor)
roofRack.setPenColor(Color(180, 180, 180, 255))
roofRack.draw()

// Premium Dark Tint Windshield & Windows
val windshield = Picture.rectangle(52, 24)
windshield.setFillColor(Color(15, 25, 35, 255))
windshield.setPenColor(Color(5, 10, 15, 255))
windshield.draw()

val sideWindowL = Picture.rectangle(10, 32)
sideWindowL.setFillColor(Color(15, 25, 35, 255))
sideWindowL.setPenColor(noColor)
sideWindowL.draw()

val sideWindowR = Picture.rectangle(10, 32)
sideWindowR.setFillColor(Color(15, 25, 35, 255))
sideWindowR.setPenColor(noColor)
sideWindowR.draw()

// Front Grille & Signature Round Headlights
val grille = Picture.rectangle(36, 12)
grille.setFillColor(Color(30, 30, 30, 255))
grille.setPenColor(white)
grille.draw()

val headlightL = Picture.circle(5)
headlightL.setFillColor(yellow)
headlightL.setPenColor(noColor)
headlightL.draw()

val headlightR = Picture.circle(5)
headlightR.setFillColor(yellow)
headlightR.setPenColor(noColor)
headlightR.draw()

// Heavy Duty All-Terrain Wheels
val wheel1 = Picture.rectangle(14, 28)
wheel1.setFillColor(Color(15, 15, 15, 255))
wheel1.setPenColor(black)
wheel1.draw()

val wheel2 = Picture.rectangle(14, 28)
wheel2.setFillColor(Color(15, 15, 15, 255))
wheel2.setPenColor(black)
wheel2.draw()

val wheel3 = Picture.rectangle(14, 28)
wheel3.setFillColor(Color(15, 15, 15, 255))
wheel3.setPenColor(black)
wheel3.draw()

val wheel4 = Picture.rectangle(14, 28)
wheel4.setFillColor(Color(15, 15, 15, 255))
wheel4.setPenColor(black)
wheel4.draw()

// =========================
// ENEMY TRAFFIC (DARK GRAY SUV)
// =========================

val enemy = Picture.rectangle(60, 100)
enemy.setFillColor(Color(70, 75, 80, 255))
enemy.setPenColor(Color(40, 40, 40, 255))
enemy.draw()

val enemyWindshield = Picture.rectangle(48, 22)
enemyWindshield.setFillColor(Color(15, 25, 35, 255))
enemyWindshield.setPenColor(noColor)
enemyWindshield.draw()

val enemyTaillightL = Picture.rectangle(8, 4)
enemyTaillightL.setFillColor(Color(255, 0, 0, 255))
enemyTaillightL.setPenColor(noColor)
enemyTaillightL.draw()

val enemyTaillightR = Picture.rectangle(8, 4)
enemyTaillightR.setFillColor(Color(255, 0, 0, 255))
enemyTaillightR.setPenColor(noColor)
enemyTaillightR.draw()

// =========================
// DASHBOARD & HUD
// =========================

val title = Picture.text("DEFENDER 4X4 (FULL WHITE)", 22)
title.setFillColor(white)
title.setPosition(-360, 310)
title.draw()

val speedText = Picture.text("SPEED: 0 KM/H", 20)
speedText.setFillColor(Color(0, 255, 100, 255))
speedText.setPosition(-360, 270)
speedText.draw()

val gearText = Picture.text("GEAR: 1 (LOW)", 18)
gearText.setFillColor(white)
gearText.setPosition(-360, 235)
gearText.draw()

val terrainText = Picture.text("TERRAIN: HIGHWAY ASPHALT", 18)
terrainText.setFillColor(Color(0, 230, 255, 255))
terrainText.setPosition(-360, 200)
terrainText.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",
  13
)
controls.setFillColor(Color(0, 230, 255, 255))
controls.setPosition(-360, -320)
controls.draw()

// =========================
// VARIABLES & PHYSICS
// =========================

var carX = -29.0
var carVelocityX = 0.0
var speed = 10.0
var gear = 1
var enemyX = 40.0
var enemyY = 350.0
var enemySpeed = 35.0
var dashY = 0.0
var braking = false
var crashed = false

// =========================
// POSITIONS
// =========================

def updatePositions() = {
  car.setPosition(carX, -230)
  roofTop.setPosition(carX - 29, -195)
  roofRack.setPosition(carX - 26, -190)
  windshield.setPosition(carX - 26, -190)
  
  sideWindowL.setPosition(carX - 28, -155)
  sideWindowR.setPosition(carX + 18, -155)

  grille.setPosition(carX - 18, -132)
  headlightL.setPosition(carX - 22, -130)
  headlightR.setPosition(carX + 16, -130)

  wheel1.setPosition(carX - 32, -150)
  wheel2.setPosition(carX + 18, -150)
  wheel3.setPosition(carX - 32, -220)
  wheel4.setPosition(carX + 18, -220)

  enemy.setPosition(enemyX, enemyY)
  enemyWindshield.setPosition(enemyX - 24, enemyY + 25)
  enemyTaillightL.setPosition(enemyX - 24, enemyY + 90)
  enemyTaillightR.setPosition(enemyX + 16, enemyY + 90)

  dash1.setPosition(0, dashY + 250)
  dash2.setPosition(0, dashY + 90)
  dash3.setPosition(0, dashY - 70)
  dash4.setPosition(0, dashY - 230)
  dash5.setPosition(0, dashY - 390)

  speedText.update("SPEED: " + speed.toInt + " KM/H")
  gearText.update("GEAR: " + gear + (if(gear <= 2) " (4X4 LOW)" else " (HIGHWAY)"))

  if (crashed) {
    brakeText.update("ROLLED OVER! PRESS R")
  } else if (braking) {
    brakeText.update("BRAKE: ON")
  } else {
    brakeText.update("BRAKE: OFF")
  }
}

// =========================
// ANIMATION LOOP
// =========================

animate {
  if (!crashed) {

    // Steering momentum
    if (isKeyPressed(Kc.VK_LEFT)) {
      carVelocityX -= 0.6
    } else if (isKeyPressed(Kc.VK_RIGHT)) {
      carVelocityX += 0.6
    } else {
      carVelocityX *= 0.75
    }

    if (carVelocityX > 5.0) carVelocityX = 5.0
    if (carVelocityX < -5.0) carVelocityX = -5.0

    carX += carVelocityX

    // Road boundaries
    if (carX < -150) {
      carX = -150
      carVelocityX = 0
    }
    if (carX > 90) {
      carX = 90
      carVelocityX = 0
    }

    // Gearbox limits
    val maxSpeed = gear match {
      case 1 => 35
      case 2 => 70
      case 3 => 110
      case 4 => 150
      case 5 => 180
    }

    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

    // Acceleration & Drag
    if (isKeyPressed(Kc.VK_SPACE)) {
      if (speed < maxSpeed) speed += 0.6
    } else if (isKeyPressed(Kc.VK_B)) {
      braking = true
      speed -= 3.0
    } else {
      braking = false
      speed -= 0.4
    }

    if (speed < 0) speed = 0
    if (speed > maxSpeed) speed = maxSpeed

    // Road lines scrolling
    dashY -= speed * 0.12
    if (dashY < -160) dashY = 0

    // Enemy traffic
    enemyY -= (speed - enemySpeed) * 0.10

    if (enemyY < -450) {
      enemyY = 450
      val lanes = Array(-120.0, -10.0, 70.0)
      enemyX = lanes((Math.random() * 3).toInt)
      enemySpeed = 25.0 + (Math.random() * 25.0)
    }

    // Collision
    if (
      Math.abs(carX - enemyX) < 50 &&
      Math.abs(-230 - enemyY) < 85
    ) {
      crashed = true
      speed = 0
    }
  }

  updatePositions()
}

// =========================
// RESET
// =========================

onKeyPress {
  case Kc.VK_R =>
    carX = -29.0
    carVelocityX = 0.0
    speed = 10.0
    gear = 1
    enemyX = 40.0
    enemyY = 350.0
    dashY = 0.0
    braking = false
    crashed = false
    updatePositions()
}