Approximately ten years ago, a solider has fallen: they took down Flappy Bird. A game which combines simplicity and effectiveness. For my Midterm Project, I have decided to make my own version of it called Flappy Falcon. For this, I needed the code, some pictures and sounds.
The idea behind it is that I wanted to create the NYUAD version of the game, which would have the iconic colors of the University and our mascott.
Code: The code was pretty easy to make because we have already learnt everything that I had to do for it in class. I had to make adjustments along the way, as for some reason the pipes were the hardest thing to code because I faced some issues with them along the way:
– the falcon wouldn’t pass the pipes;
-the moment the falcon would touch the pipes even so slightly it would be game over ;
Pictures: In regards to the media, I came across another problem: the falcon wouldn’t upload and it was showing me an error. After some minutes of thinking of a solution, I got it to work.
Sounds: For the sounds I have uploaded a bird background noise, which signifies the falcon, but another classmate of mine interpreted it as the bird sounds that we hear everyday on campus (thanks sm).
//by Stefania Petre for Introduction Into Interactive Media
backgroundImage = loadImage("background.png");
flappySound = loadSound("sound.mp3");
birdImage = loadImage("bird.png");
startButton = createButton("Start");
startButton.position(width / 2.2, height / 1.9);
startButton.mousePressed(startGame);
function updateAndShowPipes() {
for (let i = pipes.length - 1; i >= 0; i--) {
if (pipes[i].hits(bird)) {
if (pipes[i].passes(bird)) {
if (pipes[i].offscreen()) {
if (frameCount % 100 === 0) {
text(score, width / 2, 50);
function showStartScreen() {
image(backgroundImage, 0, 0, width, height);
textAlign(CENTER, CENTER);
text("Flappy Falcon", width / 2, height / 3);
text("Press Start to Experience Nostalgia!", width / 2, height / 2.2);
if (key === " " && gameStarted) {
image(birdImage, this.x, this.y, this.size, this.size); // Draw the bird image
this.velocity += this.gravity;
this.y = constrain(this.y, 0, height);
this.velocity += this.lift;
this.spacing = 200; // Increased gap between pipes
this.top = random(height - this.spacing);
this.bottom = height - (this.top + this.spacing);
fill(0); // Set color to black
rect(this.x, 0, this.w, this.top);
rect(this.x, height - this.bottom, this.w, this.bottom);
bird.x + bird.size / 2 > this.x &&
bird.x - bird.size / 2 < this.x + this.w &&
(bird.y - bird.size / 2 < this.top ||
bird.y + bird.size / 2 > height - this.bottom)
if (this.x < bird.x && !this.passed) {
//Flappy Falcon Game
//by Stefania Petre for Introduction Into Interactive Media
let bird;
let pipes = [];
let gameStarted = false;
let score = 0;
let startButton;
let backgroundImage;
let flappySound;
let birdImage;
function preload() {
backgroundImage = loadImage("background.png");
flappySound = loadSound("sound.mp3");
birdImage = loadImage("bird.png");
}
function setup() {
createCanvas(400, 600);
bird = new Bird();
startButton = createButton("Start");
startButton.position(width / 2.2, height / 1.9);
startButton.mousePressed(startGame);
}
function draw() {
if (gameStarted) {
playGame();
} else {
showStartScreen();
}
}
function playGame() {
background(94, 38, 163);
bird.update();
bird.show();
updateAndShowPipes();
showScore();
}
function updateAndShowPipes() {
for (let i = pipes.length - 1; i >= 0; i--) {
pipes[i].update();
pipes[i].show();
if (pipes[i].hits(bird)) {
gameOver();
}
if (pipes[i].passes(bird)) {
score++;
}
if (pipes[i].offscreen()) {
pipes.splice(i, 1);
}
}
if (frameCount % 100 === 0) {
pipes.push(new Pipe());
}
}
function showScore() {
textSize(32);
fill(255);
text(score, width / 2, 50);
}
function showStartScreen() {
image(backgroundImage, 0, 0, width, height);
textSize(32);
fill(255);
textAlign(CENTER, CENTER);
text("Flappy Falcon", width / 2, height / 3);
textSize(16);
text("Press Start to Experience Nostalgia!", width / 2, height / 2.2);
score = 0;
}
function keyPressed() {
if (key === " " && gameStarted) {
bird.jump();
}
}
function startGame() {
gameStarted = true;
pipes = [];
startButton.hide();
flappySound.play();
}
function gameOver() {
gameStarted = false;
startButton.show();
}
class Bird {
constructor() {
this.y = height / 2;
this.x = 64;
this.gravity = 0.6;
this.lift = -15;
this.velocity = 0;
this.size = 50;
}
show() {
image(birdImage, this.x, this.y, this.size, this.size); // Draw the bird image
}
update() {
this.velocity += this.gravity;
this.velocity *= 0.9;
this.y += this.velocity;
this.y = constrain(this.y, 0, height);
}
jump() {
this.velocity += this.lift;
}
}
class Pipe {
constructor() {
this.spacing = 200; // Increased gap between pipes
this.top = random(height - this.spacing);
this.bottom = height - (this.top + this.spacing);
this.x = width;
this.w = 40;
this.speed = 2;
this.passed = false;
}
show() {
fill(0); // Set color to black
rect(this.x, 0, this.w, this.top);
rect(this.x, height - this.bottom, this.w, this.bottom);
}
update() {
this.x -= this.speed;
}
offscreen() {
return this.x < -this.w;
}
hits(bird) {
return (
bird.x + bird.size / 2 > this.x &&
bird.x - bird.size / 2 < this.x + this.w &&
(bird.y - bird.size / 2 < this.top ||
bird.y + bird.size / 2 > height - this.bottom)
);
}
passes(bird) {
if (this.x < bird.x && !this.passed) {
this.passed = true;
return true;
}
return false;
}
}
//Flappy Falcon Game
//by Stefania Petre for Introduction Into Interactive Media
let bird;
let pipes = [];
let gameStarted = false;
let score = 0;
let startButton;
let backgroundImage;
let flappySound;
let birdImage;
function preload() {
backgroundImage = loadImage("background.png");
flappySound = loadSound("sound.mp3");
birdImage = loadImage("bird.png");
}
function setup() {
createCanvas(400, 600);
bird = new Bird();
startButton = createButton("Start");
startButton.position(width / 2.2, height / 1.9);
startButton.mousePressed(startGame);
}
function draw() {
if (gameStarted) {
playGame();
} else {
showStartScreen();
}
}
function playGame() {
background(94, 38, 163);
bird.update();
bird.show();
updateAndShowPipes();
showScore();
}
function updateAndShowPipes() {
for (let i = pipes.length - 1; i >= 0; i--) {
pipes[i].update();
pipes[i].show();
if (pipes[i].hits(bird)) {
gameOver();
}
if (pipes[i].passes(bird)) {
score++;
}
if (pipes[i].offscreen()) {
pipes.splice(i, 1);
}
}
if (frameCount % 100 === 0) {
pipes.push(new Pipe());
}
}
function showScore() {
textSize(32);
fill(255);
text(score, width / 2, 50);
}
function showStartScreen() {
image(backgroundImage, 0, 0, width, height);
textSize(32);
fill(255);
textAlign(CENTER, CENTER);
text("Flappy Falcon", width / 2, height / 3);
textSize(16);
text("Press Start to Experience Nostalgia!", width / 2, height / 2.2);
score = 0;
}
function keyPressed() {
if (key === " " && gameStarted) {
bird.jump();
}
}
function startGame() {
gameStarted = true;
pipes = [];
startButton.hide();
flappySound.play();
}
function gameOver() {
gameStarted = false;
startButton.show();
}
class Bird {
constructor() {
this.y = height / 2;
this.x = 64;
this.gravity = 0.6;
this.lift = -15;
this.velocity = 0;
this.size = 50;
}
show() {
image(birdImage, this.x, this.y, this.size, this.size); // Draw the bird image
}
update() {
this.velocity += this.gravity;
this.velocity *= 0.9;
this.y += this.velocity;
this.y = constrain(this.y, 0, height);
}
jump() {
this.velocity += this.lift;
}
}
class Pipe {
constructor() {
this.spacing = 200; // Increased gap between pipes
this.top = random(height - this.spacing);
this.bottom = height - (this.top + this.spacing);
this.x = width;
this.w = 40;
this.speed = 2;
this.passed = false;
}
show() {
fill(0); // Set color to black
rect(this.x, 0, this.w, this.top);
rect(this.x, height - this.bottom, this.w, this.bottom);
}
update() {
this.x -= this.speed;
}
offscreen() {
return this.x < -this.w;
}
hits(bird) {
return (
bird.x + bird.size / 2 > this.x &&
bird.x - bird.size / 2 < this.x + this.w &&
(bird.y - bird.size / 2 < this.top ||
bird.y + bird.size / 2 > height - this.bottom)
);
}
passes(bird) {
if (this.x < bird.x && !this.passed) {
this.passed = true;
return true;
}
return false;
}
}
Overall, I completed every single requirement for the game which I would say I am happy about!