Code Sketch
Gaming Example
// a simple game to demo/test gaming features of Kojo
// works with Kojo version 291211-1 and later
val len = 4
val d = math.sqrt(2*len*len)
val d2 = d/2
val d4 = d/4
def p1 = pict { t =>
import t._
setAnimationDelay(10)
invisible()
forward(len)
right(135)
forward(d2)
right()
forward(d2)
}
def p2 = p1
def p3 = pict { t =>
import t._
invisible()
setAnimationDelay(10)
right()
forward(len/2)
left(135)
forward(d4)
left()
forward(d4)
}
def p4 = p3
def p6 = pict { t =>
import t._
setAnimationDelay(10)
invisible()
repeat (4) {
forward(d4)
right()
}
}
def p5 = pict { t =>
import t._
setAnimationDelay(10)
invisible()
right()
forward(len/2)
left()
forward(len/2)
left(135)
forward(d2)
}
def p7 = pict { t =>
import t._
setAnimationDelay(10)
invisible()
right()
forward(len/2)
left(45)
forward(d4)
left(135)
forward(len/2)
left(45)
forward(d4)
}
val tgreen = Color(0, 255, 0, 150)
def guy = GPics(
rot(-120) -> p3,
rot(150) * trans(0, -3.5) -> p1,
flipY * rot(120) * trans(1.5, 0) -> p7,
rot(150) * trans(-1, -4.5) -> p5,
rot(-165) * trans(-4.47, -3.9) -> p4,
rot(150) * trans(1, -6.5) -> p2,
trans(-1.75, 5.4) * rotp(30, d4, 0) -> p6
)
def line(size: Int) = Pic { t =>
import t._
setAnimationDelay(0)
invisible()
forward(size)
}
val goodguy = fillColor(yellow) * trans(5, 2) * scale(0.3) -> guy
val badguy = fillColor(black) * scale(0.3) -> guy
val badguy2 = fillColor(black) * trans(-10, 0) * scale(0.3) -> guy
val badguy3 = fillColor(black) * trans(10, 0) * scale(0.3) -> guy
val sleft = trans(-18, -7) -> line(14)
val stop = trans(-18, 7) * rot(-90) -> line(36)
val sright = trans(18, -7) -> line(14)
val sbot = trans(-18, -7) * rot(-90) -> line(36)
val stage = GPics(
sleft,
stop,
sright,
sbot
)
val lostMsg = Pic { t =>
import t._
invisible()
write("You Lost!")
}
val wonMsg = Pic { t =>
import t._
invisible()
write("You Won!")
}
setUnitLength(Cm)
clear()
playMp3Loop("Cave.mp3")
invisible()
setBackground(Color(150, 150, 255))
show(stage)
show(goodguy)
show(badguy)
show(badguy2)
show(badguy3)
lostMsg.translate(-20, 0)
wonMsg.translate(-20, 0)
show(lostMsg)
show(wonMsg)
lostMsg.invisible()
wonMsg.invisible()
lostMsg.translate(20, 0)
wonMsg.translate(20, 0)
val bf = 2
val sf = 1.5
val speed = 0.4
val VEdge = Vector2D(0, 1)
val HEdge = Vector2D(1, 0)
def badBehavior(me: Picture, bvec: Vector2D) {
bvec.rotate(randomDouble(10)-5)
me.transv(bvec)
if (me.collidesWith(sright)) {
val a = bvec.angle(VEdge)
val a2 = if (a > 90) 180 - a else a
val d = if (bvec.heading >= 0) 1 else -1
bvec.rotate(2*d*a2)
me.transv(bvec * bf)
}
else if (me.collidesWith(sleft)) {
val a = bvec.angle(VEdge)
val a2 = if (a > 90) 180 - a else a
val d = if (bvec.heading >= 90 && bvec.heading <= 180) -1 else 1
bvec.rotate(2*d*a2)
me.transv(bvec * bf)
}
else if (me.collidesWith(stop)) {
val a = bvec.angle(HEdge)
val a2 = if (a > 90) 180 - a else a
val d = if (bvec.heading >= 90) 1 else -1
bvec.rotate(2*d*a2)
me.transv(bvec * bf)
}
else if (me.collidesWith(sbot)) {
val a = bvec.angle(HEdge)
val a2 = if (a > 90) 180 - a else a
val d = if (bvec.heading <= 0 && bvec.heading >= -90) 1 else -1
bvec.rotate(2*d*a2)
me.transv(bvec * bf)
}
}
val vec = Vector2D(0, speed)
badguy.act { me =>
badBehavior(me, vec)
}
val vec2 = Vector2D(speed, 0)
badguy2.act { me =>
badBehavior(me, vec2)
}
val vec3 = Vector2D(-speed, 0)
badguy3.act { me =>
badBehavior(me, vec3)
}
goodguy.act { me =>
if (isKeyPressed(Kc.VK_RIGHT)) {
me.translate(speed * sf, 0)
}
if (isKeyPressed(Kc.VK_LEFT)) {
me.translate(-speed * sf, 0)
}
if (isKeyPressed(Kc.VK_UP)) {
me.translate(0, speed * sf)
}
if (isKeyPressed(Kc.VK_DOWN)) {
me.translate(0, -speed * sf)
}
}
def time = System.currentTimeMillis
val startTime = time
goodguy.act { me =>
if (me.collidesWith(badguy) ||
me.collidesWith(badguy2) ||
me.collidesWith(badguy3) ||
me.collidesWith(stage)) {
stopAnimation()
lostMsg.visible()
}
if (time - startTime > 60 * 1000) {
stopAnimation()
wonMsg.visible()
}
}
activateCanvas()