/* built with Studio Sketchpad:
* https://sketchpad.cc
*
* observe the evolution of this sketch:
* https://studio.sketchpad.cc/sp/pad/view/ro.kccRJNOfyDj/rev.20
*
* authors:
* GoToLoop
* license (unless otherwise specified):
* creative commons attribution-share alike 3.0 license.
* https://creativecommons.org/licenses/by-sa/3.0/
*/
/**
* Multiple Bullets (v3.30)
* by Ammon.Owed (2013/Jan)
* tweaked by GoToLoop
*
* http://forum.processing.org/one/topic/shoot-multiple-bullets
*
* http://forum.processing.org/one/topic/array-usage-objects-in-general
*
* http://forum.processing.org/one/topic/
* arraylist-confusion-changing-the-variables-of-an-extracted-object-with-get
*
* http://studio.processingtogether.com/sp/pad/export/ro.91kLmk61vAOZp/latest
*/
import java.util.List;
static final int INIT_SIZE = 0100;
//static final List<Bullet> bullets = new ArrayList(INIT_SIZE); // Java
static final List<Bullet> bullets = new ArrayList(); // JS
static final PVector playerPos = new PVector();
static final PVector playerSpd = new PVector();
static final PVector bulletSpd = new PVector();
//static final IntList bulletPool = new IntList(INIT_SIZE); // Java
static final List<Integer> bulletPool = new ArrayList(); // JS
//static final List<Integer> bulletPool = new ArrayList(INIT_SIZE); // P1
static final int PLAYER_VEL = 3, PLAYER_SIZE = 20, FPS = 50;
static final int AIM_SIZE = 5, HOLE_SIZE = PLAYER_SIZE >> 1;
static final int AIM_COLOR = 0, PLAYER_COLOR = #FF0000, BG = -1;
static final String GFX = JAVA2D; // JAVA2D for P2 or P2D for P1
static boolean canCrossScreen = true;
static int prevSize;
void setup() {
size(600, 600, GFX);
frameRate(FPS);
ellipseMode(CENTER);
noSmooth();
noStroke();
noCursor();
playerPos.set(width >> 1, height >> 1, 0);
}
void draw() {
background(BG);
updatePlayer();
confinePlayer();
displayPlayer();
displayAim();
if (mousePressed && frameCount % Bullet.FREQ == 0) addBullet();
fill(Bullet.COLOUR);
int b = bullets.size();
//frame.setTitle("Size: " + (prevSize = b)); // Java only
while (b-- != 0) if (bullets.get(b).script())
//bulletPool.append(b); // Java
bulletPool.add(b); // JS & P1
}
void updatePlayer() {
playerPos.add(playerSpd);
}
void confinePlayer() {
if (canCrossScreen) {
if (playerPos.x > width) playerPos.x = 0;
else if (playerPos.x < 0) playerPos.x = width;
if (playerPos.y > height) playerPos.y = 0;
else if (playerPos.y < 0) playerPos.y = height;
}
else {
playerPos.x = constrain(playerPos.x, HOLE_SIZE, width - HOLE_SIZE);
playerPos.y = constrain(playerPos.y, HOLE_SIZE, height - HOLE_SIZE);
}
}
void displayPlayer() {
fill(PLAYER_COLOR);
ellipse(playerPos.x, playerPos.y, PLAYER_SIZE, PLAYER_SIZE);
fill(BG);
ellipse(playerPos.x, playerPos.y, HOLE_SIZE, HOLE_SIZE);
}
void displayAim() {
fill(AIM_COLOR);
ellipse(mouseX, mouseY, AIM_SIZE, AIM_SIZE);
}
void addBullet() {
bulletSpd.set(mouseX, mouseY, 0);
bulletSpd.sub(playerPos);
bulletSpd.normalize(); // JS
bulletSpd.mult(Bullet.VEL); // JS
//bulletSpd.setMag(Bullet.VEL); // Java
findVacantSlot();
}
void findVacantSlot() {
/*
for (Bullet b: bullets) if (b.isInactive) {
b.rez(playerPos, bulletSpd);
return;
}
bullets.add(new Bullet(playerPos, bulletSpd));
*/
final int bp = bulletPool.size();
//print(bp + "\t"); // Java only
if (bp > 0) bullets.get(bulletPool.remove(bp-1)).rez(playerPos, bulletSpd);
else bullets.add(new Bullet(playerPos, bulletSpd));
}
void keyPressed() {
final int k = keyCode;
if (k == LEFT | k == 'A') playerSpd.x = -PLAYER_VEL;
else if (k == RIGHT | k == 'D') playerSpd.x = PLAYER_VEL;
else if (k == UP | k == 'W') playerSpd.y = -PLAYER_VEL;
else if (k == DOWN | k == 'S') playerSpd.y = PLAYER_VEL;
else if (k == ENTER | k == RETURN | k == ' ')
canCrossScreen = !canCrossScreen;
}
void keyReleased() {
final int k = keyCode;
if ( k == LEFT | k == 'A' && playerSpd.x < 0
|| k == RIGHT | k == 'D' && playerSpd.x > 0 )
playerSpd.x = 0;
else if ( k == UP | k == 'W' && playerSpd.y < 0
|| k == DOWN | k == 'S' && playerSpd.y > 0 )
playerSpd.y = 0;
}
class Bullet {
static final short VEL = 5, DIM = 4, FREQ = 2;
static final color COLOUR = #0000FF;
final PVector pos = new PVector(), spd = new PVector();
boolean isInactive;
Bullet(PVector loc, PVector vel) {
rez(loc, vel);
}
void rez(PVector loc, PVector vel) {
pos.set(loc);
spd.set(vel);
isInactive = false;
}
void display() {
ellipse(pos.x, pos.y, DIM, DIM);
}
void update() {
pos.add(spd);
}
boolean check() {
return pos.x > width | pos.x < 0 | pos.y > height | pos.y < 0;
}
boolean script() {
if (isInactive) return false;
display();
update();
return isInactive = check();
}
}