Kahden pelaajan "Minibiljardi"

Dependencies:   PokittoLib

Files at this revision

API Documentation at this revision

Comitter:
Pokitto
Date:
Wed Oct 10 08:00:57 2018 +0000
Commit message:
Alku

Changed in this revision

GameObject.cpp Show annotated file Show diff for this revision Revisions of this file
GameObject.h Show annotated file Show diff for this revision Revisions of this file
My_settings.h Show annotated file Show diff for this revision Revisions of this file
PokittoLib.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
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