An example of adding functionality to turtles and working with instances
Log in to post a comment.
Canvas.setpenopacity(.2)
// adding some functionality to Turtle
Turtle.prototype.currentPos = [0, 0]
Turtle.prototype.currentAngle = 0
Turtle.prototype.move = function(forward, right) {
this.forward(forward)
this.right(right)
angleRadians = Math.PI * 2 * this.currentAngle / 360
this.currentPos[1] += forward * Math.sin(angleRadians)
this.currentPos[0] += forward * Math.cos(angleRadians)
this.currentAngle += right
}
Turtle.prototype.jump1 = function(x, y) {
this.penup()
this.goto(x, y)
this.pendown()
this.currentPos = [x, y]
}
// defining an object that has its own turtles
function Shell (angle, alternation, range, startX, startY, startAngle) {
this.turtle = new Turtle()
this.line = new Turtle()
this.turtle.move(0, startAngle)
this.turtle.jump1(startX, startY)
this.walk = function(i) {
newAngle = i % alternation > alternation / 2 ? angle : -angle
this.turtle.move(2, newAngle)
this.line.jump1(startX, startY)
this.line.goto(this.turtle.currentPos[0], this.turtle.currentPos[1])
return i < range
}
this.getPosition = function() {
return this.turtle.currentPos
}
}
// instancing the object
const angleRange = 10
const positionRange = 100
const numShells = 60
shells = []
for (i = 0; i < numShells; i++) {
shells[i] = new Shell(
20 + angleRange * rand(),
10,
90 + rand() * 90,
positionRange * rand(),
positionRange * rand(),
rand() * 360
)
}
// applying walk to all objects
function walk(i) {
shells = shells.filter(shell => shell.walk(i))
return shells.length > 0
}
function rand() {
return Math.random() * 2 - 1
}