Mini Pool game for two players

Dependencies:   PokittoLib

/media/uploads/Pokitto/minipool.bin.1.gif

This is a small, fully documented Mini Pool game for 2 players intended as a programming tutorial

Committer:
Pokitto
Date:
Fri Oct 12 17:09:04 2018 +0000
Revision:
0:1850dcae680f
initial

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pokitto 0:1850dcae680f 1 #include "Pokitto.h"
Pokitto 0:1850dcae680f 2 #include "GameObject.h"
Pokitto 0:1850dcae680f 3
Pokitto 0:1850dcae680f 4 Pokitto::Display gobj_d;
Pokitto 0:1850dcae680f 5 int flipper = 0;
Pokitto 0:1850dcae680f 6
Pokitto 0:1850dcae680f 7
Pokitto 0:1850dcae680f 8 GameObject::GameObject() {
Pokitto 0:1850dcae680f 9 x = random(-20,20);
Pokitto 0:1850dcae680f 10 y = random(-15,15);
Pokitto 0:1850dcae680f 11 vx = 0;//random(-100,100)/100.0f;
Pokitto 0:1850dcae680f 12 vy = 0;//random(-100,100)/100.0f;
Pokitto 0:1850dcae680f 13 width = 5;
Pokitto 0:1850dcae680f 14 height = 5;
Pokitto 0:1850dcae680f 15 if (flipper) color = 7; //random(3,12);
Pokitto 0:1850dcae680f 16 else color = 4;
Pokitto 0:1850dcae680f 17 flipper = 1 - flipper;
Pokitto 0:1850dcae680f 18 if (color == 5) color = 2;
Pokitto 0:1850dcae680f 19 orig_color = color;
Pokitto 0:1850dcae680f 20 bounce = 0.9f;
Pokitto 0:1850dcae680f 21 acceleration = 0.15f;
Pokitto 0:1850dcae680f 22 friction = 0.98f;
Pokitto 0:1850dcae680f 23 mass = 1.0f;
Pokitto 0:1850dcae680f 24 centerX = 55+x;
Pokitto 0:1850dcae680f 25 centerY = 44+y;
Pokitto 0:1850dcae680f 26 movable=true;
Pokitto 0:1850dcae680f 27 visible=true;
Pokitto 0:1850dcae680f 28 active=true;
Pokitto 0:1850dcae680f 29 }
Pokitto 0:1850dcae680f 30
Pokitto 0:1850dcae680f 31 void GameObject::draw() {
Pokitto 0:1850dcae680f 32 if (!visible) return;
Pokitto 0:1850dcae680f 33 gobj_d.setColor(color);
Pokitto 0:1850dcae680f 34 gobj_d.fillRect(55-width/2+x,44-height/2+y,width,height);
Pokitto 0:1850dcae680f 35 centerX = 55+x;
Pokitto 0:1850dcae680f 36 centerY = 44+y;
Pokitto 0:1850dcae680f 37 }
Pokitto 0:1850dcae680f 38
Pokitto 0:1850dcae680f 39 void GameObject::move() {
Pokitto 0:1850dcae680f 40 if (!active) return;
Pokitto 0:1850dcae680f 41 if (!movable) return;
Pokitto 0:1850dcae680f 42 x += vx;
Pokitto 0:1850dcae680f 43 y += vy;
Pokitto 0:1850dcae680f 44 centerX = 55+x;
Pokitto 0:1850dcae680f 45 centerY = 44+y;
Pokitto 0:1850dcae680f 46 vx *= friction;
Pokitto 0:1850dcae680f 47 vy *= friction;
Pokitto 0:1850dcae680f 48 if (abs(vx*10) < 1 && abs(vy*10) <1) vx = vy = 0; // practically stopped
Pokitto 0:1850dcae680f 49 }
Pokitto 0:1850dcae680f 50
Pokitto 0:1850dcae680f 51 bool GameObject::isMoving() {
Pokitto 0:1850dcae680f 52 if (vx == 0 && vy == 0) return false;
Pokitto 0:1850dcae680f 53 return true;
Pokitto 0:1850dcae680f 54 }
Pokitto 0:1850dcae680f 55
Pokitto 0:1850dcae680f 56 void GameObject::remove() {
Pokitto 0:1850dcae680f 57 active=false;
Pokitto 0:1850dcae680f 58 visible=false;
Pokitto 0:1850dcae680f 59 vx = 0;
Pokitto 0:1850dcae680f 60 vy = 0;
Pokitto 0:1850dcae680f 61 }
Pokitto 0:1850dcae680f 62
Pokitto 0:1850dcae680f 63 void GameObject::moveX(float n) {
Pokitto 0:1850dcae680f 64 x += n;
Pokitto 0:1850dcae680f 65 centerX = 55+x;
Pokitto 0:1850dcae680f 66 }
Pokitto 0:1850dcae680f 67
Pokitto 0:1850dcae680f 68 void GameObject::moveY(float n) {
Pokitto 0:1850dcae680f 69 y += n;
Pokitto 0:1850dcae680f 70 centerY = 44+y;
Pokitto 0:1850dcae680f 71 }
Pokitto 0:1850dcae680f 72
Pokitto 0:1850dcae680f 73 void GameObject::accelerateX(float a) {
Pokitto 0:1850dcae680f 74 vx += a*acceleration;
Pokitto 0:1850dcae680f 75 }
Pokitto 0:1850dcae680f 76
Pokitto 0:1850dcae680f 77 void GameObject::accelerateY(float a) {
Pokitto 0:1850dcae680f 78 vy += a*acceleration;
Pokitto 0:1850dcae680f 79 }
Pokitto 0:1850dcae680f 80
Pokitto 0:1850dcae680f 81 void GameObject::bounceY() {
Pokitto 0:1850dcae680f 82 vy = -vy * bounce;
Pokitto 0:1850dcae680f 83 }
Pokitto 0:1850dcae680f 84
Pokitto 0:1850dcae680f 85 void GameObject::bounceX() {
Pokitto 0:1850dcae680f 86 vx = -vx * bounce;
Pokitto 0:1850dcae680f 87 }
Pokitto 0:1850dcae680f 88
Pokitto 0:1850dcae680f 89 void GameObject::bounceY(float bouncefactor) {
Pokitto 0:1850dcae680f 90 vy = -vy * (bounce*bouncefactor);
Pokitto 0:1850dcae680f 91 }
Pokitto 0:1850dcae680f 92
Pokitto 0:1850dcae680f 93 void GameObject::bounceX(float bouncefactor) {
Pokitto 0:1850dcae680f 94 vx = -vx * (bounce*bouncefactor);
Pokitto 0:1850dcae680f 95 }
Pokitto 0:1850dcae680f 96
Pokitto 0:1850dcae680f 97 bool GameObject::checkCollision(GameObject& other) {
Pokitto 0:1850dcae680f 98 if (active == false || other.active == false) return false;
Pokitto 0:1850dcae680f 99 other.color = 2;
Pokitto 0:1850dcae680f 100 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;
Pokitto 0:1850dcae680f 101 other.color = other.orig_color;
Pokitto 0:1850dcae680f 102 return false;
Pokitto 0:1850dcae680f 103 }
Pokitto 0:1850dcae680f 104
Pokitto 0:1850dcae680f 105 void GameObject::doCollision(GameObject& other) {
Pokitto 0:1850dcae680f 106 if (active == false || other.active == false) return;
Pokitto 0:1850dcae680f 107 if (!other.movable) {
Pokitto 0:1850dcae680f 108 //movable vs. immovable collision
Pokitto 0:1850dcae680f 109 if (x - width/2 < other.x - other.width/2 || x + width/2 > other.x + other.width/2) {
Pokitto 0:1850dcae680f 110 // collision in vertical wall
Pokitto 0:1850dcae680f 111 bounceX();
Pokitto 0:1850dcae680f 112 } else {
Pokitto 0:1850dcae680f 113 // collision in horizontal wall
Pokitto 0:1850dcae680f 114 bounceY();
Pokitto 0:1850dcae680f 115 }
Pokitto 0:1850dcae680f 116 } else {
Pokitto 0:1850dcae680f 117 // movable vs. movable
Pokitto 0:1850dcae680f 118 //vx = ((mass-other.mass)/sum_mass)*vx + ((other.mass*2)/sum_mass)*other.vx;
Pokitto 0:1850dcae680f 119 //other.vx = ((mass*2)/sum_mass)*vx + ((other.mass-mass)/sum_mass)*other.vx;
Pokitto 0:1850dcae680f 120 //vy = ((mass-other.mass)/sum_mass)*vy + ((other.mass*2)/sum_mass)*other.vy;
Pokitto 0:1850dcae680f 121 //other.vy = ((mass*2)/sum_mass)*vy + ((other.mass-mass)/sum_mass)*other.vy;
Pokitto 0:1850dcae680f 122 float tvx, tvy;
Pokitto 0:1850dcae680f 123 tvx = vx; tvy = vy;
Pokitto 0:1850dcae680f 124 vx = other.vx*bounce; vy = other.vy*bounce;
Pokitto 0:1850dcae680f 125 other.vx = tvx*bounce; other.vy = tvy*bounce;
Pokitto 0:1850dcae680f 126 }
Pokitto 0:1850dcae680f 127 // move the object out of each other to avoid more collisions
Pokitto 0:1850dcae680f 128 int i=0;
Pokitto 0:1850dcae680f 129 while (checkCollision(other) && ++i < 10) {move(); if (other.movable) other.move();}
Pokitto 0:1850dcae680f 130 }
Pokitto 0:1850dcae680f 131
Pokitto 0:1850dcae680f 132 void GameObject::setColor(int c) {
Pokitto 0:1850dcae680f 133 color = c;
Pokitto 0:1850dcae680f 134 orig_color = c;
Pokitto 0:1850dcae680f 135 }