Code Sketch
alok
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
}