/* built with Studio Sketchpad:
* https://sketchpad.cc
*
* observe the evolution of this sketch:
* https://studio.sketchpad.cc/sp/pad/view/ro.BSKjx3U7TaF/rev.13
*
* authors:
* GoToLoop
* license (unless otherwise specified):
* creative commons attribution-share alike 3.0 license.
* https://creativecommons.org/licenses/by-sa/3.0/
*/
/**
Spit Fire Sample (v2.71)
by asimes (2013/Apr)
mod GoToLoop
for mnredr
http://forum.processing.org/topic/how-can-i-make-a-ball-always-move-towards-the-player-character
http://studio.processingtogether.com/sp/pad/export/ro.91nVQMnL$v06L/latest
*/
final static String GFX = P2D; // Use JAVA2D for Processing 2+
final static short E_SPD = 25, P_SPD = 5, B_SPD = 5, B_FREQ = 40;
final static short E_SIZE = 50, P_SIZE = 50, B_SIZE = 10;
final static float FPS = 50, BOLD = 2;
final static color E_COL = #00FF00, P_COL = #0000FF, B_COL = #FF0000;
final static color BG = 0100, FG = 0300;
final static byte MAX_BULLETS = 3;
final static PVector[] bullets = new PVector[MAX_BULLETS];
final static PVector[] targets = new PVector[MAX_BULLETS];
final static PVector enemy = new PVector();
final static PVector player = new PVector();
int centerX, centerY, diam, rad, bulletsIdx;
float theta;
void setup() {
size(700, 700, GFX);
frameRate(FPS);
smooth();
strokeWeight(BOLD);
ellipseMode(CENTER);
imageMode(CENTER);
centerX = width >> 1;
centerY = height >> 1;
diam = width - 100;
rad = diam >> 1;
enemy.set(rad, 0, 0);
for (int i = 0; i != MAX_BULLETS; i++) {
bullets[i] = new PVector(1e5, 1e5);
targets[i] = new PVector();
}
}
void draw() {
background(BG);
// Move the enemy in a circle:
//enemy.rotate(-HALF_PI/E_SPD);
enemy.set(cos(theta -= HALF_PI/E_SPD)*rad, sin(theta)*rad, 0);
// Create bullets:
if (frameCount % B_FREQ == 0) spitFire();
// Display all objects:
show();
}
void spitFire() {
// Make the starting position of the bullets be where the enemy is:
bullets[bulletsIdx = (bulletsIdx + 1) % MAX_BULLETS].set(enemy);
// Aim at wherever the player currently is:
final PVector t = targets[bulletsIdx];
//PVector.sub(player, enemy, t);
t.set( PVector.sub(player, enemy) );
// Normalize the direction vector:
t.normalize();
// Multiply by whatever speed you want bullets to move:
t.mult(B_SPD);
}
void show() {
translate(centerX, centerY); // centralizes
fill(FG);
ellipse(0, 0, diam, diam);
fill(E_COL);
ellipse(enemy.x, enemy.y, E_SIZE, E_SIZE);
fill(P_COL);
player.add(random(-P_SPD, P_SPD), random(-P_SPD, P_SPD), 0);
ellipse(player.x, player.y, P_SIZE, P_SIZE);
// Update & display bullets:
showBullets();
}
void showBullets() {
fill(B_COL);
for (int i = 0; i != MAX_BULLETS;) {
PVector b = bullets[i];
b.add(targets[i++]); // updates
ellipse(b.x, b.y, B_SIZE, B_SIZE); // displays
}
}