Files
UoL/CM2030 Graphics Programming/Topic 3/3.4.1/sketch.js
2021-06-08 21:23:21 -05:00

245 lines
5.7 KiB
JavaScript

var spaceship;
var asteroids;
var atmosphereLoc;
var atmosphereSize;
var earthLoc;
var earthSize;
var starLocs = [];
var playing;
var sizeL;
var sizeS;
var myCount;
var maxLives;
//////////////////////////////////////////////////
function setup() {
createCanvas(1200, 800);
maxLives = 4;
spaceship = new Spaceship(maxLives);
asteroids = new AsteroidSystem();
//location and size of earth and its atmosphere
atmosphereLoc = new createVector(width / 2, height * 2.9);
atmosphereSize = new createVector(width * 3, width * 3);
earthLoc = new createVector(width / 2, height * 3.1);
earthSize = new createVector(width * 3, width * 3);
playing = true;
//graphical variables
sizeL = 50;
sizeS = 30;
myCount = 0;
}
//////////////////////////////////////////////////
function draw() {
background(0);
sky();
spaceship.run();
asteroids.run(myCount/1000); // To increase the asteroid spawning rate
drawEarth();
checkCollisions(spaceship, asteroids); // function that checks collision between various elements
drawGUI();
myCount += 1;
}
//////////////////////////////////////////////////
// GUI
function drawGUI()
{
// draw score
fill(0, 255, 0);
textAlign(LEFT);
textSize(sizeS);
text("Score: " + spaceship.score, 20, sizeS);
// draw player lives
fill(0, 255, 0);
for (let i = 0; i < spaceship.lives; i++) {
let locationX = width - spaceship.size - i * spaceship.size * 1.2;
let locationY = sizeS;
triangle(
locationX - spaceship.size/2, locationY + spaceship.size/2,
locationX + spaceship.size/2, locationY + spaceship.size/2,
locationX, locationY - spaceship.size/2
);
}
if(!playing)
{
fill(255);
textSize(80);
textAlign(CENTER);
if(spaceship.lives > 0)
{
textSize(sizeL);
text("You lost a life!", width / 2, height / 2);
textSize(sizeS);
text("press SPACE to continue", width / 2, height / 2 + sizeL);
}
else
{
textSize(sizeL);
text("GAME OVER", width / 2, height / 2);
textSize(sizeS);
text("press SPACE to restart", width / 2, height / 2 + sizeL);
}
}
}
//////////////////////////////////////////////////
//draws earth and atmosphere
function drawEarth() {
noStroke();
//draw atmosphere
fill(0, 0, 255, 50);
ellipse(atmosphereLoc.x, atmosphereLoc.y, atmosphereSize.x, atmosphereSize.y);
//draw earth
fill(100, 255);
ellipse(earthLoc.x, earthLoc.y, earthSize.x, earthSize.y);
}
//////////////////////////////////////////////////
//checks collisions between all types of bodies
function checkCollisions(spaceship, asteroids) {
//spaceship-2-asteroid collisions
//YOUR CODE HERE (2-3 lines approx)
for (let i = 0; i < asteroids.locations.length; i++) {
if (
isInside(
spaceship.location,
spaceship.size / 2,
asteroids.locations[i],
asteroids.diams[i] / 2
)
)
gameOver();
}
//asteroid-2-earth collisions
//YOUR CODE HERE (2-3 lines approx)
for (let i = 0; i < asteroids.locations.length; i++) {
if (
isInside(
earthLoc,
earthSize.y / 2,
asteroids.locations[i],
asteroids.diams[i] / 2
)
)
gameOver();
}
//spaceship-2-earth
//YOUR CODE HERE (1-2 lines approx)
if (
isInside(earthLoc, earthSize.y / 2, spaceship.location, spaceship.size / 2)
)
gameOver();
//spaceship-2-atmosphere
//YOUR CODE HERE (1-2 lines approx)
if (
isInside(
atmosphereLoc,
atmosphereSize.y / 2,
spaceship.location,
spaceship.size / 2
)
)
spaceship.setNearEarth();
//bullet collisions
//YOUR CODE HERE (3-4 lines approx)
for (let i = 0; i < spaceship.bulletSys.bullets.length; i++) {
for (let j = 0; j < asteroids.locations.length; j++) {
if (
isInside(
spaceship.bulletSys.bullets[i],
spaceship.bulletSys.diam,
asteroids.locations[j],
asteroids.diams[j] / 2
)
) {
asteroids.destroy(j);
spaceship.score += 10;
}
}
}
}
//////////////////////////////////////////////////
//helper function checking if there's collision between object A and object B
function isInside(locA, sizeA, locB, sizeB) {
// YOUR CODE HERE (3-5 lines approx)
if (dist(locA.x, locA.y, locB.x, locB.y) > sizeA + sizeB) return false;
return true;
}
//////////////////////////////////////////////////
function keyPressed() {
if(keyIsPressed && keyCode === 32) //spacebar
{
if(playing) //mid game, should shoot a bullet
{
spaceship.fire();
}
else //game stopped
{
if(spaceship.lives > 0) //has or more lives
{
continueGame();
}
else //no more lives left
{
restartGame();
}
}
}
//console.log(spaceship.bulletSys.bullets.length);
}
//////////////////////////////////////////////////
// function that ends the game by stopping the loops and displaying "Game Over"
function gameOver() {
spaceship.die();
playing = false;
myCount = 0;
noLoop();
}
function continueGame()
{
asteroids.locations = [];
asteroids.velocities = [];
asteroids.accelerations = [];
asteroids.diams = [];
spaceship.respawn();
playing = true;
loop();
}
function restartGame()
{
continueGame();
spaceship.lives = maxLives;
spaceship.score = 0;
}
//////////////////////////////////////////////////
// function that creates a star lit sky
function sky() {
push();
while (starLocs.length < 300) {
starLocs.push(new createVector(random(width), random(height)));
}
fill(255);
for (var i = 0; i < starLocs.length; i++) {
rect(starLocs[i].x, starLocs[i].y, 2, 2);
}
if (random(1) < 0.3) starLocs.splice(int(random(starLocs.length)), 1);
pop();
}