var pos1, pos2, pos3, pos4;
var velocity1, velocity2, velocity3, velocity4;
var trail1 = []; // Trail for the first ghost
var trail2 = []; // Trail for the second ghost
var maxTrailLength = 50; // Max length of the trail
function setup() {
let sketchCanvas = createCanvas(600,600);
sketchCanvas.parent('sketchContainer');
fill(255);
pos1 = createVector(200, 200);
velocity1 = createVector(1, 0);
pos2 = createVector(550, 300);
velocity2 = createVector(-1, 0);
pos3 = createVector(100, 300);
velocity3 = createVector(-0.5, 0);
pos4 = createVector(250, 100);
velocity4 = createVector(-1, 0);
}
function draw() {
background(0);
// First ghost's behavior (normal size, no rotation)
moveGhost(pos1, velocity1, trail1);
drawTrail(trail1, 255,10,random(0, 255));
drawGhost(pos1, 'red', 1, 0); // Normal size, no rotation
// Second ghost's behavior (rotating, normal size)
moveGhost(pos2, velocity2, trail2);
drawTrail(trail2, 10,50,random(0, 255));
drawGhost(pos2, 'pink', 1, frameCount * 0.05); // Normal size, rotating
// Green ghost (big and slow, no rotation)
moveGhost(pos3, velocity3, trail2);
drawTrail(trail1, 20,50,random(0, 255));
drawGhost(pos3, 'green', 2, 0); // Larger, no rotation
// Yellow ghost (big and rotating)
moveGhost(pos4, velocity4, trail1);
drawTrail(trail1, 100,27,random(0, 255));
drawGhost(pos4, 'yellow', 2, frameCount * 0.1); // Larger, rotating
// Handle collision for ghost1
checkCollision(pos1, velocity1);
// Handle collision for ghost2
checkCollision(pos2, velocity2);
// Handle collision for ghost3
checkCollision(pos3, velocity3);
// Handle collision for ghost4
checkCollision(pos4, velocity4);
}
function moveGhost(pos, velocity, trail) {
var direction = createVector(mouseX, mouseY);
direction.sub(pos); // Vector from pos to mouse
direction.normalize(); // Direction with a length of 1
direction.mult(0.1); // Scale down the vector for speed
velocity.add(direction); // Adjust velocity based on direction
pos.add(velocity); // Update position
// Store current position in the trail array
trail.push(createVector(pos.x, pos.y));
// If the trail gets too long, remove the oldest point
if (trail.length > maxTrailLength) {
trail.shift();
}
}
function drawTrail(trail, r, g, b) {
// Draw the trail
noFill();
beginShape();
for (let i = 0; i < trail.length; i++) {
let t = map(i, 0, trail.length, 0, 255); // Fade effect
stroke(r,g,b, t); // Change alpha value to fade over time
vertex(trail[i].x, trail[i].y); // Draw line connecting the trail points
}
endShape();
}
function drawGhost(pos, color, scaleSize, rotationAngle) {
push();
fill(255);
noStroke();
translate(pos.x, pos.y);
rotate(rotationAngle); // Apply rotation
scale(scaleSize); // Apply scaling
ghost(0, 0, color); // Draw the ghost at the origin
pop();
}
// Ghost's body and features
function ghost(x, y, color) {
body(x, y, color);
whiteEye(x, y, 'white');
blueEye(x, y, 'blue');
leg(x, y, 0);
}
function body(x, y, c) {
fill(c);
rect(x - 24.5, y - 4.5, 49, 30); // bottom half of ghost
ellipse(x, y, 49, 49); // top half of ghost
}
function whiteEye(x, y, c) {
fill(c); // eye whites
ellipse(x - 10, y - 5, 15, 15);
ellipse(x + 10, y - 5, 15, 15);
}
function blueEye(x, y, c) {
fill(c); // blue part of eyes
ellipse(x + 10, y - 5, 10, 10);
ellipse(x - 10, y - 5, 10, 10);
}
function leg(x, y, c) {
// bottom triangles (ghost "legs")
fill(c);
triangleMove(x - 25, y + 25.5);
triangleMove(x - 5, y + 25.5);
}
function triangleMove(x, y) {
triangle(x, y, x + 15, y - 10, x + 30, y);
}
// Check for boundary collisions
function checkCollision(pos, velocity) {
// Boundary collision for y
if (pos.y < 0 || pos.y > height) {
velocity.y = -velocity.y;
pos.add(velocity);
}
// Boundary collision for x
if (pos.x < 0 || pos.x > width) {
velocity.x = -velocity.x;
pos.add(velocity);
}
}