Transparent Shells

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.jump = 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.jump(startX, startY)
    
    this.walk = function(i) {
        newAngle = i % alternation > alternation / 2 ? angle : -angle
        this.turtle.move(2, newAngle)
        this.line.jump(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 
}