// Player float playerX, playerY; Boolean lightOn; float playerHeading; Boolean[] keyState; ArrayList chaser; Boolean dead; // spawning int chaserLimit; int timer; void setup() { size(512, 512, P2D); playerX = width / 2; playerY = height / 2; lightOn = false; keyState = new Boolean[300]; for (int i = 0; i < 300; i ++) { keyState[i] = false; } strokeWeight(2); ellipseMode(CENTER); chaser = new ArrayList(); chaserLimit = 16; timer = 0; dead = false; frameRate(60); } void draw() { // update float dX = 0; float dY = 0; if ((keyState[39]) || (keyState[68])) { dX = PLAYER_SPEED; } if ((keyState[38]) || (keyState[87])) { dY = -PLAYER_SPEED; } if ((keyState[37]) || (keyState[65])) { dX = -PLAYER_SPEED; } if ((keyState[40]) || (keyState[83])) { dY = PLAYER_SPEED; } float newX = playerX + dX; float newY = playerY + dY; if (sqrt(pow(newX - width / 2, 2) + pow(newY - width / 2, 2)) < width / 2 - PLAYER_SIZE / 2) { if (!dead) { playerX = newX; playerY = newY; } } // turn light on if (!dead && mousePressed) { lightOn = true; } else { lightOn = false; } // update light angle playerHeading = atan2(mouseY - playerY, mouseX - playerX); // add chasers if (chaser.size() < chaserLimit) { float chaserHeading = random(TWO_PI); chaser.add(new Chaser( width / 2 + 0.75 * width * cos(chaserHeading), width / 2 + 0.75 * width * sin(chaserHeading))); } // increase chaser limit timer ++; chaserLimit = 8 + (int) (timer / 480); // update chasers for (int i = 0; i < chaser.size(); i ++) { chaser.get(i).update(); } // remove inactive chasers int i2 = 0; while (i2 < chaser.size()) { if (chaser.get(i2).active) { i2 ++; } else { chaser.remove(i2); } } // draw background(64); if (!dead) { if (lightOn) { drawLight(playerHeading); } drawLine(playerHeading); drawPlayer(playerX, playerY); } for (int i = 0; i < chaser.size(); i ++) { chaser.get(i).draw(); } drawFrame(); } void keyPressed() { keyState[keyCode] = true; print("Key " + keyCode + " pressed\n"); if (key == 'r') { setup(); } } void keyReleased() { keyState[keyCode] = false; } void drawPlayer(float x, float y) { if (lightOn) { stroke(32); fill(192); } else { stroke(0); fill(96); } ellipse(x, y, PLAYER_SIZE, PLAYER_SIZE); } void drawLine(float lightHeading) { if (lightOn) { stroke(255); } else { stroke(32); } line(playerX, playerY, mouseX, mouseY); } void drawLight(float lightHeading) { stroke(255); fill(192); triangle(playerX, playerY, playerX + BEAM_LENGTH * cos(lightHeading - LIGHT_ANGLE / 2), playerY + BEAM_LENGTH * sin(lightHeading - LIGHT_ANGLE / 2), playerX + BEAM_LENGTH * cos(lightHeading + LIGHT_ANGLE / 2), playerY + BEAM_LENGTH * sin(lightHeading + LIGHT_ANGLE / 2)); } void drawFrame() { fill(0); noStroke(); int offsetX = width / 2; int offsetY = width / 2; float radius = width / 2; float outerRadius = 0.75 * width; float angle2; for (float angle = 0; angle < TWO_PI; angle += TWO_PI / 128) { angle2 = angle + TWO_PI / 128; triangle( offsetX + outerRadius * cos(angle), offsetY + outerRadius * sin(angle), offsetX + radius * cos(angle), offsetY + radius * sin(angle), offsetX + radius * cos(angle2), offsetY + radius * sin(angle2)); triangle( offsetX + radius * cos(angle2), offsetY + radius * sin(angle2), offsetX + outerRadius * cos(angle), offsetY + outerRadius * sin(angle), offsetX + outerRadius * cos(angle2), offsetY + outerRadius * sin(angle2)); } }