Kahden pelaajan "Minibiljardi"
Dependencies: PokittoLib
Revision 0:89d0cb201659, committed 2018-10-10
- Comitter:
- Pokitto
- Date:
- Wed Oct 10 08:00:57 2018 +0000
- Commit message:
- Alku
Changed in this revision
diff -r 000000000000 -r 89d0cb201659 GameObject.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GameObject.cpp Wed Oct 10 08:00:57 2018 +0000 @@ -0,0 +1,135 @@ +#include "Pokitto.h" +#include "GameObject.h" + +Pokitto::Display gobj_d; +int flipper = 0; + + +GameObject::GameObject() { + x = random(-20,20); + y = random(-15,15); + vx = 0;//random(-100,100)/100.0f; + vy = 0;//random(-100,100)/100.0f; + width = 5; + height = 5; + if (flipper) color = 7; //random(3,12); + else color = 4; + flipper = 1 - flipper; + if (color == 5) color = 2; + orig_color = color; + bounce = 0.9f; + acceleration = 0.15f; + friction = 0.98f; + mass = 1.0f; + centerX = 55+x; + centerY = 44+y; + movable=true; + visible=true; + active=true; +} + +void GameObject::draw() { + if (!visible) return; + gobj_d.setColor(color); + gobj_d.fillRect(55-width/2+x,44-height/2+y,width,height); + centerX = 55+x; + centerY = 44+y; +} + +void GameObject::move() { + if (!active) return; + if (!movable) return; + x += vx; + y += vy; + centerX = 55+x; + centerY = 44+y; + vx *= friction; + vy *= friction; + if (abs(vx*10) < 1 && abs(vy*10) <1) vx = vy = 0; // practically stopped +} + +bool GameObject::isMoving() { + if (vx == 0 && vy == 0) return false; + return true; +} + +void GameObject::remove() { + active=false; + visible=false; + vx = 0; + vy = 0; +} + +void GameObject::moveX(float n) { + x += n; + centerX = 55+x; +} + +void GameObject::moveY(float n) { + y += n; + centerY = 44+y; +} + +void GameObject::accelerateX(float a) { + vx += a*acceleration; +} + +void GameObject::accelerateY(float a) { + vy += a*acceleration; +} + +void GameObject::bounceY() { + vy = -vy * bounce; +} + +void GameObject::bounceX() { + vx = -vx * bounce; +} + +void GameObject::bounceY(float bouncefactor) { + vy = -vy * (bounce*bouncefactor); +} + +void GameObject::bounceX(float bouncefactor) { + vx = -vx * (bounce*bouncefactor); +} + +bool GameObject::checkCollision(GameObject& other) { + if (active == false || other.active == false) return false; + other.color = 2; + if ((x + width/2 >= other.x - other.width/2) && (x - width/2 < other.x + other.width/2) && (y + height/2 >= other.y - other.height/2) && (y - height/2 < other.y + other.height/2)) return true; + other.color = other.orig_color; + return false; +} + +void GameObject::doCollision(GameObject& other) { + if (active == false || other.active == false) return; + if (!other.movable) { + //movable vs. immovable collision + if (x - width/2 < other.x - other.width/2 || x + width/2 > other.x + other.width/2) { + // collision in vertical wall + bounceX(); + } else { + // collision in horizontal wall + bounceY(); + } + } else { + // movable vs. movable + //vx = ((mass-other.mass)/sum_mass)*vx + ((other.mass*2)/sum_mass)*other.vx; + //other.vx = ((mass*2)/sum_mass)*vx + ((other.mass-mass)/sum_mass)*other.vx; + //vy = ((mass-other.mass)/sum_mass)*vy + ((other.mass*2)/sum_mass)*other.vy; + //other.vy = ((mass*2)/sum_mass)*vy + ((other.mass-mass)/sum_mass)*other.vy; + float tvx, tvy; + tvx = vx; tvy = vy; + vx = other.vx*bounce; vy = other.vy*bounce; + other.vx = tvx*bounce; other.vy = tvy*bounce; + } + // move the object out of each other to avoid more collisions + int i=0; + while (checkCollision(other) && ++i < 10) {move(); if (other.movable) other.move();} +} + +void GameObject::setColor(int c) { + color = c; + orig_color = c; +} \ No newline at end of file
diff -r 000000000000 -r 89d0cb201659 GameObject.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GameObject.h Wed Oct 10 08:00:57 2018 +0000 @@ -0,0 +1,53 @@ +#ifndef GAMEOBJECT_H +#define GAMEOBJECT_H + + +class GameObject { + +public: + float x; // paikka pelikentällä + float y; + float centerX; // paikka ruudulla + float centerY; + float vx; + float vy; + float acceleration; + float friction; + float width; + float height; + float bounce; + float mass; + + int color; + int orig_color; + bool visible; + bool movable; + bool active; + + void setColor(int); + bool isMoving(); + + virtual void draw(); + virtual void move(); + virtual void remove(); + + void accelerateX(float); + void accelerateY(float); + + void moveX(float); + void moveY(float); + + void bounceX(float); + void bounceY(float); + + void bounceX(); + void bounceY(); + + virtual bool checkCollision(GameObject&); + virtual void doCollision(GameObject&); + + GameObject(); + +}; + +#endif \ No newline at end of file
diff -r 000000000000 -r 89d0cb201659 My_settings.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/My_settings.h Wed Oct 10 08:00:57 2018 +0000 @@ -0,0 +1,16 @@ +/* This is an example of how to set your own project settings + +To use + +1. make a copy of this file by pressing right mouse button on top of this file +in the mbed online compiler, then choose "Clone" + +2. See that the copy is in the root of the project (where your main cpp files are), not inside the PokittoLib folder +Drag & drop to move if needed + +3. rename the clone to "My_settings.h" + +*/ + +#define PROJ_HIRES 0 +#define PROJ_ENABLE_SOUND 0 \ No newline at end of file
diff -r 000000000000 -r 89d0cb201659 PokittoLib.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PokittoLib.lib Wed Oct 10 08:00:57 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/Pokitto/code/PokittoLib/#123aefc978a7
diff -r 000000000000 -r 89d0cb201659 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Oct 10 08:00:57 2018 +0000 @@ -0,0 +1,216 @@ +#include "Pokitto.h" // Lisää Pokitto-kirjasto +#include "GameObject.h" // Lisää GameObject -oliot + +Pokitto::Core mygame; // Luo Pokitto -peliolio (siis pelimoottori) + +#define MAX_PALLOT 7 // pallojen maksimimäärä + +GameObject pallot[MAX_PALLOT]; // Taulukko (array) palloja, eli monta palloa +GameObject pelaaja; // Pelaaja-objekti (tähtäystä varten) +GameObject laidat[4]; // Pöydän neljä laitaa +GameObject taskut[4]; // Pöydän kulmataskut + +enum PeliTilanne { Aloitus, Tahtays, Lyonti, Voitto }; // Pelin eri tilat + +/** Pelin käyttämät globaalit (eli joka paikasta käytettävät) muuttujat **/ +PeliTilanne pt = Aloitus; +int pallotmukana = 7; // montako palloa on alussa mukana pelissä, saa olla korkeintaan sama kuin MAX_PALLOT +int pelaaja1pisteet = 0; +int pelaaja2pisteet = 0; +int pelivuoro = 1; //kumman pelaajan vuoro + +// apufunktio, joka asettelee pelipallot alkupaikoilleen +void aloitusPallot(){ + pallot[0].x = -30; pallot[0].y = 0; pallot[0].active = true; pallot[0].visible = true; pallot[0].setColor(1); + pallot[1].x = 10; pallot[1].y = 0; pallot[1].active = true; pallot[1].visible = true; pallot[1].setColor(7); + pallot[2].x = 10; pallot[2].y = 10; pallot[2].active = true; pallot[2].visible = true; pallot[2].setColor(4); + pallot[3].x = 10; pallot[3].y = -10; pallot[3].active = true; pallot[3].visible = true; pallot[3].setColor(4); + pallot[4].x = 20; pallot[4].y = -10; pallot[4].active = true; pallot[4].visible = true; pallot[4].setColor(7); + pallot[5].x = 20; pallot[5].y = 0; pallot[5].active = true; pallot[5].visible = true; pallot[5].setColor(4); + pallot[6].x = 20; pallot[6].y = 10; pallot[6].active = true; pallot[6].visible = true; pallot[6].setColor(7); +} + +/** MAIN on kohta josta KAIKKI C++ ohjelmat alkavat suorittamaan koodia **/ + +int main () { + mygame.begin(); // Käynnistä Pokitton moottori (näyttö, näppäimet, jne) + mygame.display.setFont(fontTiny); // Pikkuruinen fontti käyttöön + mygame.display.bgcolor = 13; // Taustaväri tummanvihreäksi + mygame.display.invisiblecolor = 13; // Tekstin taustaväri pois (eli läpinäkyväksi) + + /** OHJELMALOOPPI ... pyörii koko ohjelman elämän ajan, + eli niin kauan, kun mygame.isRunning() antaa vastaukseksi tosi (true) **/ + + while (mygame.isRunning()) { + + // Piirrä pöydän reunat + for (int i=0; i<4; i++) laidat[i].draw(); + // Piirrä pöydän taskut + for (int i=0; i<4; i++) taskut[i].draw(); + // Laske pallojen törmäykset pöydän laitojen kanssa + for (int i=0; i<pallotmukana; i++) { + for (int j=0; j<4; j++) { + if (pallot[i].checkCollision(laidat[j]) && pt != Aloitus) { + pallot[i].doCollision(laidat[j]); + } + } + } + + // laske pallojen törmäykset toisten pallojen kanssa + for (int i=0; i<pallotmukana; i++) { + for (int j=0; j<pallotmukana; j++) { + if (i != j) { //älä katso pallon törmäystä itsensä kanssa !!! + if (pallot[i].checkCollision(pallot[j]) && pt != Aloitus) { + pallot[i].doCollision(pallot[j]); + } + } + } + } + + // laske pallojen törmäykset taskujen kanssa + for (int i=0; i<pallotmukana; i++) { + for (int j=0; j<4; j++) { + if (pallot[i].checkCollision(taskut[j]) && pt != Aloitus) { + // Pallo meni pussiin! + pallot[i].remove(); // poista pallo kentältä + if (pallot[i].color == 7) pelaaja1pisteet++; // punaisista palloista 1 piste pelaaja ykköselle + if (pallot[i].color == 4) pelaaja2pisteet++; // keltaisista palloista 1 piste pelaaja kakkoselle + if (pallot[i].color == 1) { + // valkoinen pallo meni taskuun, vuorossa oleva pelaaja hävisi + if (pelivuoro==1) { pelaaja1pisteet=0; pelaaja2pisteet = (pallotmukana-1)/2; } //pelaaja 2 voitti + else { pelaaja1pisteet = (pallotmukana-1)/2; pelaaja2pisteet = 0;} //pelaaja 1 voitti + } + if (pelaaja1pisteet == (pallotmukana-1)/2 || pelaaja2pisteet == (pallotmukana-1)/2) pt = Voitto; + } + } + } + + /** UPDATE looppi, jossa päivitetään näyttö pelitilanteen mukaan **/ + if (mygame.update()) { + int pallotseis = 0; // tämän avulla lasketaan moniko pallo on vielä liikkeessä + // Piirrä pallot + for (int i=0; i<pallotmukana; i++) pallot[i].draw(); + // Palautetaan tekstiä varten valkoinen väri + mygame.display.color = 1; + switch (pt) { + case Aloitus: + /** case Aloitus ... Tässä pelitilassa asetetaan alkuarvot pelille **/ + mygame.display.print(16,8,"Minibiljardi"); + mygame.display.print(16,16,"Paina A"); + + // Nollataan pelitilanne + pelaaja1pisteet = 0; + pelaaja2pisteet = 0; + pelivuoro = 1; + + // Laitetaan pelipallot aloituspaikoilleen + aloitusPallot(); + + /** Pöytä **/ + // Pöydän yläreuna paikalleen + laidat[0].x = 0; laidat[0].y = -49; laidat[0].width = 110; laidat[0].height=20; + laidat[0].setColor(5); + // Pöydän alareuna paikalleen + laidat[1].x = 0; laidat[1].y = 49; laidat[1].width = 110; laidat[1].height=20; + laidat[1].setColor(5); + // Pöydän vasen reuna paikalleen + laidat[2].x = -59; laidat[2].y = 0; laidat[2].width = 20; laidat[2].height=88; + laidat[2].setColor(5); + // Pöydän oikea reuna paikalleen + laidat[3].x = 59; laidat[3].y = 0; laidat[3].width = 20; laidat[3].height=88; + laidat[3].setColor(5); + // Kaikki pöydän reunat muutetaan kiinteiksi + laidat[0].movable = laidat[1].movable = laidat[2].movable = laidat[3].movable = false; + + /** Taskut **/ + // Vasen ylätasku paikalleen + taskut[0].x = -59; taskut[0].y = -49; taskut[0].width = 30; taskut[0].height=30; + taskut[0].setColor(0); + // Oikea ylätasku paikalleen + taskut[1].x = 59; taskut[1].y = -49; taskut[1].width = 30; taskut[1].height=30; + taskut[1].setColor(0); + // Oikea alatasku paikalleen + taskut[2].x = 59; taskut[2].y = 49; taskut[2].width = 30; taskut[2].height=30; + taskut[2].setColor(0); + // Vasen alatasku paikalleen + taskut[3].x = -59; taskut[3].y = 49; taskut[3].width = 30; taskut[3].height=30; + taskut[3].setColor(0); + // Kaikki taskut muutetaan kiinteiksi + laidat[0].movable = taskut[1].movable = taskut[2].movable = taskut[3].movable = false; + + // Jos on painettu A, siirrytään peliin! + if (mygame.buttons.released(BTN_A)) { + pelaaja.x = pallot[0].x; pelaaja.y = pallot[0].y; + pt = Tahtays; + } + break; + case Tahtays: + /** case Tähtäys ... Tässä pelitilassa asetetaan suunta ja voima valkoiselle pallolle **/ + if (pelivuoro == 1) { + mygame.display.color = 7; // punainen väri + mygame.display.print(16,8,"Pelaaja 1 vuoro"); + } else { + mygame.display.color = 4; // keltainen väri + mygame.display.print(16,8,"Pelaaja 2 vuoro"); + } + + // piirrä tähtäysviiva pelaajan ja pallon välille + mygame.display.setColor(1); // väri 1 = valkoinen + mygame.display.drawLine(pelaaja.centerX,pelaaja.centerY,pallot[0].centerX,pallot[0].centerY); + // tsekkaa näppäinpainallukset + if (mygame.buttons.rightBtn()) pelaaja.moveX(1); + if (mygame.buttons.leftBtn()) pelaaja.moveX(-1); + if (mygame.buttons.upBtn()) pelaaja.moveY(-1); + if (mygame.buttons.downBtn()) pelaaja.moveY(1); + // jos painetaan A, lyönti lähtee + if (mygame.buttons.released(BTN_A)) { + // kopautetaan vauhtia valkoiselle nollapallolle (pelaaja) + pallot[0].vx = (pelaaja.x - pallot[0].x) * pallot[0].acceleration; // lyönnin X voimakkuus + pallot[0].vy = (pelaaja.y - pallot[0].y) * pallot[0].acceleration; // lyönnin Y voimakkuus + pt = Lyonti; // siirry seuraavaan pelitilaan + } + break; + case Lyonti: + // jos kaikki pallot ovat pysähtynyt, siirry taas tähtäämään + for (int i=0; i < pallotmukana; i++) { + //jos pallo ei enää liiku tai on jo poistettu + if (pallot[i].isMoving() == false || pallot[i].active == false) { + pallotseis++; //lasketaan pysähtyneet yhteen + } + } + if (pallotseis == pallotmukana) { + // kaikki pallot ovat seis tai jo pussitettu, aloita taas tähtääminen + pelaaja.x = pallot[0].x; pelaaja.y = pallot[0].y; + if (pelivuoro == 1) pelivuoro = 2; + else pelivuoro = 1; // vaihdetaan pelivuoroa + pt = Tahtays; + } + break; + case Voitto: + /** case Voitto ... pelaaja 1 tai 2 voitti **/ + if (pelaaja1pisteet > pelaaja2pisteet) { + mygame.display.color = 7; // punainen väri + mygame.display.print(16,8,"Pelaaja 1 VOITTI!"); + } else { + mygame.display.color = 4; // keltainen väri + mygame.display.print(16,8,"Pelaaja 2 VOITTI!"); + } + mygame.display.color = 1; // valkoinen väri + mygame.display.print(16,16,"Paina A"); + // jos painetaan A, peli alkaa alusta + if (mygame.buttons.released(BTN_A)) { + pt = Aloitus; + } + break; + + } + } + // Kappaleiden liikkeet lasketaan koko ajan (tarkempi) + // siirrä palloa lasketun liikken mukaan + for (int i = 0; i< pallotmukana; i++) pallot[i].move(); + // päivitetään pelaajan paikka (tähtäysviivaa varten) + pelaaja.move(); + // piirretään valkoinen pallo aina (tulee "vauhtijuova") + pallot[0].draw(); + } +} \ No newline at end of file