COMPONENTS AND SUPPLIES
APPS AND ONLINE SERVICES
ABOUT THIS PROJECT
This is a retro game, which consists three push buttons (UP, DOWN, FIRE), where you are in a spaceship and you have to destroy the monster. Remember that the monster also has the power to destroy your spaceship, and the game will be faster according to time!
PLEASE WATCH THIS VIDEO TILL END
BEST OF LUCK & SAVE YOUR GALAXY!
CODE
CODE
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSans9pt7b.h>
//#include <Fonts/FreeSans12pt7b.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
const int c = 261;
const int d = 294;
const int e = 329;
const int f = 349;
const int g = 391;
const int gS = 415;
const int a = 440;
const int aS = 455;
const int b = 466;
const int cH = 523;
const int cSH = 554;
const int dH = 587;
const int dSH = 622;
const int eH = 659;
const int fH = 698;
const int fSH = 740;
const int gH = 784;
const int gSH = 830;
const int aH = 880;
const unsigned char PROGMEM dioda16 [] = {
0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x3F, 0xF0, 0x3C, 0x00, 0x3C, 0x00, 0xFF, 0x00, 0x7F, 0xFF,
0x7F, 0xFF, 0xFF, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x1F, 0xF0, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00
};
const unsigned char PROGMEM storm [] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x00, 0x0C,
0x00, 0x00, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00,
0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x60, 0x00, 0x00,
0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x40,
0x00, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x01, 0x00,
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xD7, 0xFF, 0xFF,
0xE1, 0x00, 0x01, 0xBF, 0xFC, 0x1F, 0xFA, 0x80, 0x01, 0xBF, 0xF1, 0xCF, 0xFA, 0x80, 0x01, 0x3F,
0xC2, 0x37, 0xF7, 0x80, 0x01, 0xEF, 0x9C, 0x01, 0xE7, 0xC0, 0x01, 0xE0, 0x70, 0x06, 0x06, 0x80,
0x01, 0xE0, 0xC0, 0x03, 0x06, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xF8, 0x00, 0x00,
0x1D, 0xC0, 0x03, 0x70, 0x00, 0x80, 0x0C, 0x60, 0x05, 0xB0, 0x07, 0xF0, 0x08, 0x90, 0x09, 0x10,
0x1F, 0xF8, 0x09, 0xD0, 0x0B, 0x90, 0x1F, 0x7C, 0x03, 0xF0, 0x0F, 0xC0, 0xFC, 0x0F, 0x07, 0x90,
0x0D, 0x43, 0xC0, 0x03, 0x07, 0x90, 0x05, 0x64, 0x00, 0x00, 0xCF, 0x10, 0x07, 0xFC, 0x00, 0x00,
0x26, 0x10, 0x01, 0x80, 0x00, 0x00, 0x10, 0x20, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x40, 0x01, 0x80,
0x07, 0xF0, 0x01, 0x80, 0x00, 0x80, 0x07, 0xC8, 0x00, 0x80, 0x00, 0x80, 0x0B, 0xE8, 0x00, 0x80,
0x00, 0x87, 0x97, 0xE9, 0xE0, 0x80, 0x00, 0x87, 0xDF, 0xEF, 0xA0, 0x80, 0x00, 0x4B, 0xFF, 0xFF,
0xA0, 0x80, 0x00, 0x6B, 0xDF, 0xFB, 0xA3, 0x00, 0x00, 0x24, 0x97, 0xE8, 0x24, 0x00, 0x00, 0x1E,
0x1F, 0xC0, 0x2C, 0x00, 0x00, 0x07, 0xF8, 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00
};
void setup() {
pinMode(12, INPUT_PULLUP); //UP BUTTON
pinMode(11, INPUT_PULLUP); //DOWN BUTTON
pinMode(3, INPUT_PULLUP); //TRIGGER BUTTON
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
display.clearDisplay();
display.setTextSize(0);
display.drawBitmap(6, 11, storm, 48, 48, 1);
display.setFont(&FreeSans9pt7b);
display.setTextColor(WHITE);
display.setCursor(65, 14);
display.println("xWing");
display.setFont();
display.setCursor(65, 17);
display.setTextSize(0);
display.println("vs");
display.setCursor(0, 0);
float voltaza = readVcc() / 1000;
display.println(voltaza);;
display.setFont(&FreeSans9pt7b);
display.setCursor(65, 39);
display.println("Death");
display.setFont();
display.setCursor(65, 42);
display.println("star ");
display.setTextSize(0);
display.setCursor(65, 55);
display.println("by Danko");
display.setCursor(65, 20);
display.display();
display.setFont();
beep(a, 500);
beep(a, 500);
beep(a, 500);
beep(f, 350);
beep(cH, 150);
beep(a, 500);
beep(f, 350);
beep(cH, 150);
beep(a, 650);
delay(500);
delay(500);
}
int metx = 0;
int mety = 0;
int postoji = 0;
int nep = 8;
int smjer = 0;
int go = 0;
int rx = 95;
int ry = 0;
int rx2 = 95;
int ry2 = 0;
int rx3 = 95;
int ry3 = 0;
int bodovi = 0;
int brzina = 3; //speed of bullet
int bkugle = 1;
int najmanja = 600;
int najveca = 1200;
int promjer = 10;
int rx4 = 95;
int ry4 = 0;
int zivoti = 5;
int poc = 0;
int ispaljeno = 0;
int nivo = 1;
int centar = 95;
unsigned long pocetno = 0;
unsigned long odabrano = 0;
unsigned long trenutno = 0;
unsigned long nivovrije = 0;
int poz = 30;
void loop() {
if (go == 0) {
display.clearDisplay();
display.drawPixel(50, 30, 1);
display.drawPixel(30, 17, 1);
display.drawPixel(60, 18, 1);
display.drawPixel(55, 16, 1);
display.drawPixel(25, 43, 1);
display.drawPixel(100, 43, 1);
display.drawPixel(117, 52, 1);
display.drawPixel(14, 49, 1);
display.drawPixel(24, 24, 1);
display.drawPixel(78, 36, 1);
display.drawPixel(80, 57, 1);
display.drawPixel(107, 11, 1);
display.drawPixel(150, 11, 1);
display.drawPixel(5, 5, 1);
display.drawPixel(8, 7, 1);
display.drawPixel(70, 12, 1);
display.drawPixel(10, 56, 1);
display.drawPixel(70, 25, 1);
if (poc == 0) {
pocetno = millis();
odabrano = random(400, 1200);
poc = 1;
}
trenutno = millis();
//nivoi
if ((trenutno - nivovrije) > 50000)
{
nivovrije = trenutno;
nivo = nivo + 1;
brzina = brzina + 1; //brizna neprijateljevog metka
if ( nivo % 2 == 0 )
{
bkugle = bkugle + 1;
promjer = promjer - 1;
}
najmanja = najmanja - 50;
najveca = najveca - 50;
}
if ((odabrano + pocetno) < trenutno)
{
poc = 0;
ispaljeno = ispaljeno + 1;
if (ispaljeno == 1)
{ rx = 95;
ry = nep;
}
if (ispaljeno == 2) {
rx2 = 95;
ry2 = nep;
}
if (ispaljeno == 3)
{
rx3 = 95;
ry3 = nep;
}
if (ispaljeno == 4) {
rx4 = 95;
ry4 = nep;
}
}
if (ispaljeno > 0)
{
display.drawCircle(rx, ry, 2, 1);
rx = rx - brzina;
}
if (ispaljeno > 1)
{
display.drawCircle(rx2, ry2, 1, 1);
rx2 = rx2 - brzina;
}
if (ispaljeno > 2)
{
display.drawCircle(rx3, ry3, 4, 1);
rx3 = rx3 - brzina;
}
if (ispaljeno > 3)
{
display.drawCircle(rx4, ry4, 2, 1);
rx4 = rx4 - brzina;
}
if (digitalRead(12) == 0 && poz >= 2) {
poz = poz - 2;
}
if (digitalRead(11) == 0 && poz <= 46) {
poz = poz + 2;
}
if (digitalRead(3) == 0 && postoji == 0)
{
postoji = 1;
metx = 6;
mety = poz + 8;
tone(9, 1200, 20);
}
if (postoji == 1)
{
metx = metx + 8 ;
display.drawLine(metx, mety, metx + 4, mety, 1);
}
display.drawBitmap(4, poz, dioda16, 16, 16, 1);
display.fillCircle(centar, nep, promjer, 1);
display.fillCircle(centar + 2, nep + 3, promjer / 3, 0);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(33, 57);
display.println("score:");
display.setCursor(68, 57);
display.println(bodovi);
display.setCursor(33, 0);
display.println("lives:");
display.setCursor(68, 0);
display.println(zivoti);
display.setCursor(110, 0);
display.println("L:");
display.setCursor(122, 0);
display.println(nivo);
display.setCursor(108, 57);
display.println(trenutno / 1000);
display.display();
if (metx > 128)postoji = 0;
if (smjer == 0) {
nep = nep + bkugle;
}
else
{
nep = nep - bkugle;
}
if (nep >= (64 - promjer))
smjer = 1;
if (nep <= promjer)
smjer = 0;
if (mety >= nep - promjer && mety <= nep + promjer)
if (metx > (centar - promjer) && metx < (centar + promjer))
{
metx = -20;
tone(9, 500, 20);
bodovi = bodovi + 1;
postoji = 0;
}
int pozicija = poz + 8;
if (ry >= pozicija - 8 && ry <= pozicija + 8)
if (rx < 12 && rx > 4)
{
rx = 95;
ry = -50;
tone(9, 100, 100);
zivoti = zivoti - 1;
}
if (ry2 >= pozicija - 8 && ry2 <= pozicija + 8)
if (rx2 < 12 && rx2 > 4)
{
rx2 = -50;
ry2 = -50;
tone(9, 100, 100);
zivoti = zivoti - 1;
}
if (ry3 >= pozicija - 8 && ry3 <= pozicija + 8)
if (rx3 < 12 && rx3 > 4)
{
rx3 = -50;
ry3 = -50;
tone(9, 100, 100);
zivoti = zivoti - 1;
}
if (ry4 >= pozicija - 8 && ry4 <= pozicija + 8)
if (rx4 < 12 && rx4 > 4)
{
rx4 = 200;
ry4 = -50;
ispaljeno = 0;
tone(9, 100, 100);
zivoti = zivoti - 1;
}
if (rx4 < 1) {
ispaljeno = 0;
rx4 = 200;
}
if (zivoti == 0)
go = 1;
}
if (go == 1)
{
if (zivoti == 0) {
tone(9, 200, 300);
delay(300);
tone(9, 250, 200);
delay(200);
tone(9, 300, 300);
delay(300);
zivoti = 5;
}
display.clearDisplay();
display.setFont();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(7, 10);
display.println("GAME OVER!");
display.setTextSize(1);
display.setCursor(7, 30);
display.println("score:");
display.setCursor(44, 30);
display.println(bodovi);
display.setCursor(7, 40);
display.println("level:");
display.setCursor(44, 40);
display.println(nivo);
display.setCursor(7, 50);
display.println("time(s):");
display.setCursor(60, 50);
display.println(trenutno / 1000);
display.display();
if (digitalRead(3) == 0)
{
tone(9, 280, 300);
delay(300);
tone(9, 250, 200);
delay(200);
tone(9, 370, 300);
delay(300);
ponovo();
}
}
}
void ponovo()
{
metx = 0;
mety = 0;
postoji = 0;
nep = 8;
smjer = 0;
go = 0;
rx = 95;
ry = 0;
rx2 = 95;
ry2 = 0;
rx3 = 95;
ry3 = 0;
bodovi = 0;
brzina = 3; //brizna neprijateljevog metka
bkugle = 1;
najmanja = 600;
najveca = 1200;
promjer = 12;
rx4 = 95;
ry4 = 0;
zivoti = 5;
poc = 0;
ispaljeno = 0;
nivo = 1;
pocetno = 0;
odabrano = 0;
trenutno = 0;
nivovrije = 0;
}
long readVcc() {
// Read 1.1V reference against AVcc
// set the reference to Vcc and the measurement to the internal 1.1V reference
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
ADMUX = _BV(MUX5) | _BV(MUX0);
#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
ADMUX = _BV(MUX3) | _BV(MUX2);
#else
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#endif
delay(2); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Start conversion
while (bit_is_set(ADCSRA, ADSC)); // measuring
uint8_t low = ADCL; // must read ADCL first - it then locks ADCH
uint8_t high = ADCH; // unlocks both
long result = (high << 8) | low;
result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
return result; // Vcc in millivolts
}
void beep(int note, int duration)
{
//Play tone on buzzerPin
tone(9, note, duration);
delay(duration);
noTone(9);
delay(50);
}
Comments
Post a Comment