xxxxxxxxxx
648
//Made by YM_Zhou with p5.js and p5.play
//Unnamed space shooter game
//sprite
let heroPlane;
let heroBullet;
let commonEnemy;
let fastEnemy;
let blockEnemy;
let heart;
let hp;
let score;
let gameover;
let record;
let meteor;
//constants
const maxHP = 5; //maximum hp of hero
// const maxMssl = 2; //maximum number of missiles (unused)
// const maxLas = 1; //maximum number of laser (unused)
const lasC = 1000; //charge needed to get a laser
const sp = 0.6; //speed of the plane
const shootCD = 25; //normal shoot cooldown
const powerUp1CD = 5; //shoot cooldown of more bullet powerup
const up1Time = 180;
const bulletSp = 1; //player bullet speed
const enemyBSp = 1.2;
const afterHit = 10; //player does not take damage 10 frames after hit
const bgSp = 0.3;
const enemyShootCD = 40;
// const heartChance = 2; // enemy drop heart (unused)
//variables
let heroHP = 5; //current hp
// let mssl = 2; //current missile
// let las = 0; //current laser
let shootCounter = 0;
// let lasCharge = 0; //current laser charge
let powerUp = 0; //0:normal;1:veryLowShootCD
let playerHurt = true;
let hitCounter = 0;
let bgY1; //background1
let bgY2; //background2
let generalCount1 = 0;
let point = 0;
let noLife = false;
let nextWave = 60;
let nextType = 0;
let nextNumber = 2;
let time = 0;
//array
let type = [0,1,2];
//image
let star; //background star
let failBlack;
let shield;
//sound
let pickup;
let failure;
let shoot;
let bgm;
//font
let mainFont;
//other
let p1S;
let p2S;
//class
class pUpShow{
constructor(x,y,color,key,point)
{
this.x = x;
this.y = y;
this.color = color;
this.key = key;
this.point = point
}
display(){
fill(0);
textFont(mainFont);
text(this.key)
fill(this.color);
ellipse(this.x,this.y,50)
}
colorC(){
if(point < this.point)
{
this.color = 100
}
else
{
this.color = 255
}
}
}
function preload() {
star = loadImage("bg/star.png");
shoot = loadSound("sfx/shoot.wav");
pickup = loadSound("sfx/pickup.wav");
failure = loadSound("sfx/fail.wav");
bgm = loadSound("bgm.mp3");
/*
shoot sound effect: https://freesound.org/people/MATRIXXX_/sounds/413057/
pickup sound effect:
https://freesound.org/people/suntemple/sounds/253172/
failure sound effect:
https://freesound.org/people/suntemple/sounds/253174/
bgm:
https://freesound.org/people/zagi2/sounds/248117/
*/
mainFont = loadFont("dogicapixel.ttf");
failBlack = loadImage("black.png");
shield = loadImage("object/shield4.png");
}
function setup() {
createCanvas(64, 128);
noSmooth();
bgY1 = height / 2;
bgY2 = -height / 2;
//loadAni
heroBullet = new Group();
heroBullet.addAni("fly", "sprite/heroBullet/bullet.png");
heroBullet.vel.y = -bulletSp;
heroBullet.vel.x = 0;
heroBullet.rotationLock = true;
// heroBullet.scale = 10;
heroBullet.cull(5)
heroPlane = new Sprite(width / 2, height / 2 + 40, 8, 8, "kinematic");
heroPlane.addAni("left", "sprite/hero/heroPlaneL.png");
heroPlane.addAni("right", "sprite/hero/heroPlaneR.png");
heroPlane.addAni("fly", "sprite/hero/heroPlane.png");
// heroPlane.scale = 10;
heroPlane.rotationLock = true;
//common enemy
commonEnemy = new Group();
commonEnemy.addAni("sprite/enemy/common1.png");
commonEnemy.vel.y = 0.5;
// commonEnemy.scale = 10;
commonEnemy.rotationLock = true;
commonEnemy.cull(5)
//fast enemy
fastEnemy = new Group();
fastEnemy.addAni("sprite/enemy/common2.png");
fastEnemy.vel.y = 0.8;
// fastEnemy.scale = 10;
fastEnemy.rotationLock = true;
fastEnemy.cull(5)
//block enemy
blockEnemy = new Group();
blockEnemy.addAni("sprite/enemy/common3.png");
blockEnemy.vel.y = 0.35;
blockEnemy.hp = 3;
// blockEnemy.scale = 10;
blockEnemy.rotationLock = true;
blockEnemy.cull(5)
//meteor
meteor = new Group();
meteor.addAni("object/meteor1.png");
meteor.hp = 2;
// meteor.scale = 10;
meteor.cull(5);
//collectable heart
heart = new Group();
heart.addAni("object/heart.png");
heart.vel.y = 0.3;
// heart.scale = 10;
heart.cull(5)
//for some reason the p5.js text function does not work
hp = new Sprite(width / 2, height / 2 + 100, 1, 1, "none");
hp.textColor = "white";
hp.textSize = 3;
hp.textFont = "mainFont";
hp.color = (0, 0, 0, 0);
score = new Sprite(width / 2, height / 2 + 200, 1, 1, "none");
score.textColor = "white";
score.textSize = 3;
score.textFont = "mainFont";
score.color = (0, 0, 0, 0);
gameover = new Sprite(width / 2, height / 2, 1, 1, "none");
gameover.textColor = "white";
gameover.textSize = 7;
gameover.textFont = "mainFont";
gameover.color = (0, 0, 0, 0);
record = new Sprite(width / 2, height / 2 + 100, 1, 1, "none");
record.textColor = "white";
record.textSize = 3;
record.textFont = "mainFont";
record.color = (0, 0, 0, 0);
//enemy overlap bullet
// testTarget.overlaps(heroBullet,destroyE);
commonEnemy.overlaps(heroBullet, destroyE);
fastEnemy.overlaps(heroBullet, destroyE);
blockEnemy.overlaps(heroBullet, enemyLose);
heroPlane.overlaps(commonEnemy, hitPlayer);
heroPlane.overlaps(fastEnemy, hitPlayer);
heroPlane.overlaps(blockEnemy, hitPlayer);
//layering enemies
fastEnemy.overlaps(commonEnemy);
fastEnemy.overlaps(blockEnemy);
commonEnemy.overlaps(blockEnemy);
heroBullet.overlaps(heroBullet);
// meteor.overlaps(commonEnemy,meteorDes)
// meteor.overlaps(fastEnemy,meteorDes)
// meteor.overlaps(blockEnemy,meteorDes)
// meteor.overlaps(heroPlane,meteorHPlayer)
heart.overlaps(allSprites);
heroPlane.overlaps(heart, heal);
//use p5.sound for loop bgm
bgm.loop();
p1s = new pUpShow(50,50,100,1,20)
p2s = new pUpShow(50,120,100,2,15)
}
function draw() {
time = millis();
background(0);
imageMode(CENTER);
scrollingBg();
heroController();
textFont(mainFont);
hp.text = "HP: " + heroHP;
hp.x = heroPlane.x;
hp.y = heroPlane.y + 8;
score.text = "Score: " + point;
score.x = heroPlane.x;
score.y = heroPlane.y + 11;
if(noLife == true)
{
heroPlane.remove();
heroBullet.remove();
commonEnemy.remove();
fastEnemy.remove();
blockEnemy.remove();
heart.remove();
hp.remove();
score.remove();
}
//spawner list
if(noLife == false)
{
randomGen();
}
// meteorSpawn()
lose();
p1s.display();
p2s.display();
p1s.colorC();
p2s.colorC();
if(heroHP <=0)
{
image(failBlack,width / 2, height / 2)
fill(0);
textFont(mainFont);
gameover.text = "Game Over!";
record.text = "Your final score is " + point;
}
}
function keyPressed(){
cheatMaster();
}
function heroController() {
movementController(sp, 40);
powerController();
cheatMaster();
if (playerHurt == false) {
if (hitCounter >= afterHit) {
playerHurt = true;
} else {
hitCounter++;
}
}
}
function scrollingBg() {
/*
DONE:
make the background looping
*/
if (bgY1 >= (3 * height) / 2) {
bgY1 = -height / 2;
} else {
bgY1 += bgSp;
}
if (bgY2 >= (3 * height) / 2) {
bgY2 = -height / 2;
} else {
bgY2 += bgSp;
}
image(star, width / 2, bgY1);
image(star, width / 2, bgY2);
}
function destroyE(target, bullet) {
//when the bullet hit enemy, destroy it
target.remove();
//remove the bullet as well
bullet.remove();
point += 1;
/*
need to be done:
explosion when the target is destroyed
*/
}
function enemyLose(target, bullet) {
target.hp--;
if (target.hp <= 0) {
target.remove();
point += 2;
}
bullet.remove();
}
function shootController(CD) {
if (kb.pressing(" ") && shootCounter <= 0) {
//if the counter is 0, spawn a bullet
new heroBullet.Sprite(heroPlane.x, heroPlane.y, 3, 6, "kinematic");
// if(powerUp == 0)
// {
shoot.play(0, 1, 0.3);
// }
//when the bullet is shot, set the counter to CD
shootCounter = CD;
// console.log("shoot")
}
if (shootCounter >= 0) {
//if the counter is not 0, reduce to 0 gradually
shootCounter--;
}
}
function enemySpawner(time, type, number, collX, collY) {
/*
adjust the generator so that the sprites would not overlap
update 11.22: this function is finished
*/
let gap = collX;
let block = width / number;
if (frameCount == time) {
for (i = 0; i <= number - 1; i++) {
new type.Sprite(
random(i * block + gap, (i + 1) * block - gap),
0,
collX,
collY
);
}
}
}
function movementController(sp, size) {
//movement controller
if (kb.pressing("ArrowLeft") && !kb.pressing("ArrowRight")) {
heroPlane.ani = "left";
if (heroPlane.x >= size) {
heroPlane.vel.x = -sp;
}
} else if (kb.pressing("ArrowRight") && !kb.pressing("ArrowLeft")) {
heroPlane.ani = "right";
if (heroPlane.x <= width - size) {
heroPlane.vel.x = sp;
}
} else {
heroPlane.ani = "fly";
heroPlane.vel.x = 0;
}
//stuff that deal with strange bug starts HERE, DON'T DELETE!!!!
if (heroPlane.x >= width - size && !kb.pressing("ArrowLeft")) {
heroPlane.ani = "fly";
heroPlane.vel.x = 0;
}
if (heroPlane.x <= size && !kb.pressing("ArrowRight")) {
heroPlane.ani = "fly";
heroPlane.vel.x = 0;
}
//bug dealer ends HERE
if (kb.pressing("ArrowUp") && heroPlane.y >= size) {
heroPlane.vel.y = -sp;
} else if (kb.pressing("ArrowDown") && heroPlane.y <= height - size) {
heroPlane.vel.y = sp;
} else {
heroPlane.vel.y = 0;
}
}
function cheatMaster() {
//powerup controller
if (keyCode == 49 && point >= 20 && powerUp == 0) {
//to more bullet
powerUp = 1;
point -= 10;
}
if (keyCode == 50 && point >= 15 && powerUp == 0) {
new heart.Sprite(random(0, width), 0, 2, 7);
new heart.Sprite(random(0, width), 0, 2, 7);
powerUp = 2;
point -= 15
}
// if (kb.presses("0")) {
// //to normal
// powerUp = 0;
// }
}
function powerController() {
if (powerUp == 0 || powerUp == 2) {
shootController(shootCD);
}
if (powerUp == 1) {
shootController(powerUp1CD);
generalCount1++;
if (generalCount1 >= up1Time) {
powerUp = 0;
generalCount1 = 0;
}
}
}
function hitPlayer(hero, enemy) {
enemy.remove();
point++;
if (playerHurt == true) {
if (heroHP <= 0) {
heroHP = 0;
} else {
heroHP--;
}
playerHurt = false;
// console.log("you r hurt" + heroHP);
} else {
// console.log("lucky you" + heroHP);
}
}
function heal(hero, heart) {
pickup.play();
heart.remove();
if (heroHP < maxHP) {
heroHP++;
}
// console.log(heroHP);
}
function lose() {
if (heroHP <= 0 && noLife == false) {
bgm.pause();
failure.play();
noLife = true;
}
}
function randomGen(){
//need to fix this before final presentation
// console.log(nextWave)
if(nextWave == frameCount)
{
if(nextType == 0)
{
enemySpawner(nextWave,commonEnemy,nextNumber,7,5);
}
else if(nextType == 1)
{
enemySpawner(nextWave,fastEnemy,nextNumber,7,5);
}
else if(nextType == 2)
{
enemySpawner(nextWave,blockEnemy,nextNumber,7,5);
}
if(0<= time <=60000)
{
// console.log("phase 1")
//difficulty 1 (0-1 minute)
nextWave += int(random(60,150));
nextType = random(type);
if (nextType == 0)
{
nextNumber = int(random(2,4));
}
else if (nextType == 1)
{
nextWave -= int(random(0,40));
nextNumber = int(random(2,4));
}
else if (nextType == 2)
{
nextNumber = int(random(1,3));
}
}
else if(60000< time <=150000)
{
//difficulty 2 (1-2.5 minutes)
// console.log("phase 2")
nextWave += int(random(60,120));
nextType = random(type);
if (nextType == 0)
{
nextNumber = int(random(2,5));
}
else if (nextType == 1)
{
nextWave -= int(random(10,40));
nextNumber = int(random(3,5));
}
else if (nextType == 2)
{
nextNumber = int(random(2,3));
}
}
else if(150000< time <=270000)
{
//difficulty 3 (2.5-4.5 minutes)
// console.log("phase 3")
nextWave += int(random(50,110));
nextType = random(type);
if (nextType == 0)
{
nextNumber = int(random(3,5));
}
else if (nextType == 1)
{
nextWave -= int(random(15,40));
nextNumber = int(random(4,5));
}
else if (nextType == 2)
{
nextNumber = int(random(3,4));
}
}
else if(270000< time <=420000)
{
//difficulty 4 (4.5-7 minutes)
// console.log("phase 4")
nextWave += int(random(50,100));
nextType = random(type);
if (nextType == 0)
{
nextNumber = int(random(4,8));
}
else if (nextType == 1)
{
nextWave -= int(random(15,40));
nextNumber = int(random(4,7));
}
else if (nextType == 2)
{
nextNumber = int(random(3,5));
}
}
else
{
//difficulty 5
// console.log("phase 5")
nextWave += int(random(45,80));
nextType = random(type);
if (nextType == 0)
{
nextNumber = int(random(5,10));
}
else if (nextType == 1)
{
nextWave -= int(random(15,40));
nextNumber = int(random(5,8));
}
else if (nextType == 2)
{
nextNumber = int(random(3,6));
}
}
// console.log("next wave has " + nextNumber + " " + nextType + " at frame" + nextWave)
}
// console.log("this is frame " + frameCount)
}
// function meteorSpawn(){
// let meteorT = int(time%100);
// // console.log(meteorT)
// if(meteorT == 0)
// {
// console.log("meteor yes")
// let ranX = random(width);
// let ranVx;
// if(ranX > width / 2)
// {
// let ranVx = random(-3,0)
// }
// else if (ranX <width / 2)
// {
// let ranVx = random(0,-3)
// }
// else
// {
// let ranVx = random(-3,3)
// }
// let ranVy = random(0,3) + 3;
// new meteor.Sprite(ranX,0,13,14);
// meteor.vel.x = ranVx;
// meteor.vel.y = 5;
// }
// }
// function meteorDes(met,tar){
// tar.remove();
// }
// function meteorHPlayer(met,tar){
// hp--;
// }