Mini Pool game for two players
Dependencies: PokittoLib
This is a small, fully documented Mini Pool game for 2 players intended as a programming tutorial
GameObject.cpp@0:1850dcae680f, 2018-10-12 (annotated)
- Committer:
- Pokitto
- Date:
- Fri Oct 12 17:09:04 2018 +0000
- Revision:
- 0:1850dcae680f
initial
Who changed what in which revision?
User | Revision | Line number | New 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 | } |