Code Sketch


alok
By: Mhalsakant School
Category: Art
// --- Kojo Vector Art: Dancing & Singing Robot (Jana Gana Mana) ---
cleari()
setBackground(Color(10, 15, 30)) // Cosmic Night Background

// 1. Draw Starry Background
def drawStars(): Unit = {
  val starColors = List(Color(255, 255, 255), Color(255, 215, 0), Color(0, 255, 255))
  for (i <- 0 until 40) {
    val x = (i * 37) % 500 - 250
    val y = (i * 53) % 400 - 200
    val star = Picture.circle(2)
    star.setFillColor(starColors(i % starColors.length))
    star.setPenColor(noColor)
    star.setPosition(x, y)
    draw(star)
  }
}

// 2. Draw Dancing Robot
def drawRobot(danceStep: Double): Unit = {
  // Body Bounce Offset based on animation
  val bounce = Math.sin(danceStep * 2) * 8
  
  // Robot Head
  val head = Picture.rect(40, 35)
  head.setFillColor(Color(200, 200, 220))
  head.setPenColor(Color(0, 150, 255))
  head.setPenThickness(2)
  head.setPosition(0, 50 + bounce)
  draw(head)

  // Robot Eyes (Glowing Green)
  val leftEye = Picture.circle(4)
  leftEye.setFillColor(Color(0, 255, 100))
  leftEye.setPenColor(noColor)
  leftEye.setPosition(-10, 58 + bounce)
  draw(leftEye)

  val rightEye = Picture.circle(4)
  rightEye.setFillColor(Color(0, 255, 100))
  rightEye.setPenColor(noColor)
  rightEye.setPosition(10, 58 + bounce)
  draw(rightEye)

  // Antenna
  val antennaRod = Picture.line(0, 15)
  antennaRod.setPenColor(Color(255, 215, 0))
  antennaRod.setPenThickness(3)
  antennaRod.setPosition(0, 67 + bounce)
  draw(antennaRod)

  val antennaBall = Picture.circle(5)
  antennaBall.setFillColor(Color(255, 69, 0))
  antennaBall.setPenColor(noColor)
  antennaBall.setPosition(0, 82 + bounce)
  draw(antennaBall)

  // Robot Torso (Tiranga Colors)
  val torso = Picture.rect(60, 50)
  torso.setFillColor(Color(255, 153, 51)) // Saffron
  torso.setPenColor(Color(255, 255, 255))
  torso.setPenThickness(2)
  torso.setPosition(0, 0 + bounce)
  draw(torso)

  // Chest Emblem (Mini Ashok Chakra circle)
  val chestSymbol = Picture.circle(12)
  chestSymbol.setFillColor(Color(255, 255, 255))
  chestSymbol.setPenColor(Color(0, 56, 168))
  chestSymbol.setPenThickness(2)
  chestSymbol.setPosition(0, 0 + bounce)
  draw(chestSymbol)

  // Robot Left Arm (Swinging up and down)
  val leftArmAngle = Math.toRadians(Math.sin(danceStep) * 45)
  val leftArm = Picture.rect(12, 40)
  leftArm.setFillColor(Color(180, 180, 200))
  leftArm.setPenColor(Color(0, 150, 255))
  leftArm.setPosition(-40, 10 + bounce)
  draw(leftArm)

  // Robot Right Arm (Swinging opposite)
  val rightArm = Picture.rect(12, 40)
  rightArm.setFillColor(Color(180, 180, 200))
  rightArm.setPenColor(Color(0, 150, 255))
  rightArm.setPosition(40, 10 + bounce)
  draw(rightArm)

  // Robot Legs (Stepping/Dancing)
  val leftLegOffset = Math.sin(danceStep) * 10
  val leftLeg = Picture.rect(14, 40)
  leftLeg.setFillColor(Color(18, 136, 7)) // Green
  leftLeg.setPenColor(Color(255, 255, 255))
  leftLeg.setPosition(-18, -45 + bounce - leftLegOffset)
  draw(leftLeg)

  val rightLeg = Picture.rect(14, 40)
  rightLeg.setFillColor(Color(18, 136, 7)) // Green
  rightLeg.setPenColor(Color(255, 255, 255))
  rightLeg.setPosition(18, -45 + bounce + leftLegOffset)
  draw(rightLeg)
}

// 3. Floating Musical Notes Animation
def drawMusicNotes(step: Double): Unit = {
  for (i <- 0 until 5) {
    val x = -180 + (i * 80)
    val y = 120 + Math.sin(step + i) * 15
    val note = Picture.text("?", 18)
    note.setPenColor(Color(255, 215, 0, 200))
    note.setPosition(x, y)
    draw(note)
  }
}

// 4. Synchronized National Anthem Lyrics Display
def drawAnthemLyrics(step: Double): Unit = {
  val lyrics = List(
    "Jana Gana Mana Adhinayaka Jaya He",
    "Bhagya Vidhata",
    "Punjab Sindhu Gujarat Maratha",
    "Dravida Utkala Banga",
    "Vindhya Himachal Yamuna Ganga",
    "Uchchala Jaladhi Taranga",
    "Tava Shubha Name Jage",
    "Tava Shubha Ashish Mange",
    "Gahe Tava Jaya Gatha",
    "Jana Gana Mangala Dayaka Jaya He",
    "Jaya Hey, Jaya Hey, Jaya Hey,",
    "Jaya Jaya Jaya, Jaya He!"
  )
  
  // Calculate current lyric index based on animation step
  val index = ((step / 15.0).toInt) % lyrics.length
  
  val anthemText = Picture.text(lyrics(index), 14)
  anthemText.setPenColor(Color(255, 255, 255))
  anthemText.setPosition(-160, -140)
  draw(anthemText)
  
  val subTitle = Picture.text("?? NATIONAL ANTHEM ??", 11)
  subTitle.setPenColor(Color(255, 153, 51))
  subTitle.setPosition(-90, -170)
  draw(subTitle)
}

// 5. Continuous Animation Loop for Dancing & Singing
var globalStep = 0.0

animateWithState(0.0) { angle =>
  erasePictures()
  
  drawStars()
  drawMusicNotes(angle * 0.1)
  drawRobot(angle * 0.1)
  drawAnthemLyrics(globalStep)
  
  globalStep += 0.05
  (angle + 3.0) % 360.0
}