Elements used in the Balls and Things games for the RETRO.
Dependents: RETRO_BallsAndPaddle RETRO_BallAndHoles
Ball.cpp@8:19dd2a538cbe, 2015-03-02 (annotated)
- Committer:
- maxint
- Date:
- Mon Mar 02 09:58:53 2015 +0000
- Revision:
- 8:19dd2a538cbe
- Parent:
- 7:4fa3edaa1201
more clean-up
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
maxint | 0:3d0db4e183ee | 1 | #include "Ball.h" |
maxint | 0:3d0db4e183ee | 2 | |
maxint | 0:3d0db4e183ee | 3 | Ball::Ball() : vSpeed() |
maxint | 0:3d0db4e183ee | 4 | { // constructor |
maxint | 0:3d0db4e183ee | 5 | } |
maxint | 0:3d0db4e183ee | 6 | |
maxint | 0:3d0db4e183ee | 7 | Ball::Ball(LCD_ST7735* pDisp) : vSpeed() |
maxint | 0:3d0db4e183ee | 8 | { // constructor |
maxint | 0:3d0db4e183ee | 9 | this->pDisp=pDisp; |
maxint | 0:3d0db4e183ee | 10 | this->fActive=false; |
maxint | 0:3d0db4e183ee | 11 | } |
maxint | 0:3d0db4e183ee | 12 | |
maxint | 0:3d0db4e183ee | 13 | uint16_t Ball::dimmedColor(uint16_t uColor) |
maxint | 0:3d0db4e183ee | 14 | { |
maxint | 0:3d0db4e183ee | 15 | uint16_t r, g, b; |
maxint | 0:3d0db4e183ee | 16 | |
maxint | 0:3d0db4e183ee | 17 | r=(uColor >> 11) <<3; |
maxint | 0:3d0db4e183ee | 18 | g=((uColor >> 5) & 0x3F) <<2; |
maxint | 0:3d0db4e183ee | 19 | b=(uColor & 0x1F) << 3; |
maxint | 0:3d0db4e183ee | 20 | r=r*2/3; |
maxint | 0:3d0db4e183ee | 21 | g=g*2/3; |
maxint | 0:3d0db4e183ee | 22 | b=b*2/3; |
maxint | 0:3d0db4e183ee | 23 | |
maxint | 0:3d0db4e183ee | 24 | return(Color565::fromRGB((uint16_t)r,(uint16_t)g,(uint16_t)b)); |
maxint | 0:3d0db4e183ee | 25 | } |
maxint | 0:3d0db4e183ee | 26 | |
maxint | 0:3d0db4e183ee | 27 | void Ball::initialize(int nX, int nY, int nR, uint16_t uColor) |
maxint | 0:3d0db4e183ee | 28 | { |
maxint | 0:3d0db4e183ee | 29 | this->pos.set(nX, nY); |
maxint | 0:3d0db4e183ee | 30 | this->nRadius=nR; |
maxint | 0:3d0db4e183ee | 31 | this->uColor=uColor; |
maxint | 0:3d0db4e183ee | 32 | this->uColorHigh=uColor; |
maxint | 0:3d0db4e183ee | 33 | this->uColorMid=dimmedColor(uColorHigh); |
maxint | 0:3d0db4e183ee | 34 | this->uColorLow=dimmedColor(uColorMid); |
maxint | 0:3d0db4e183ee | 35 | |
maxint | 0:3d0db4e183ee | 36 | } |
maxint | 0:3d0db4e183ee | 37 | |
maxint | 0:3d0db4e183ee | 38 | void Ball::setSpeed(int X, int Y) |
maxint | 0:3d0db4e183ee | 39 | { |
maxint | 0:3d0db4e183ee | 40 | this->vSpeed.set(X, Y); |
maxint | 0:3d0db4e183ee | 41 | } |
maxint | 0:3d0db4e183ee | 42 | |
maxint | 0:3d0db4e183ee | 43 | void Ball::changeSpeed(bool fUp) |
maxint | 0:3d0db4e183ee | 44 | { |
maxint | 0:3d0db4e183ee | 45 | if(fUp) |
maxint | 0:3d0db4e183ee | 46 | { |
maxint | 0:3d0db4e183ee | 47 | if(this->vSpeed.getSize()<=4.0) this->vSpeed.add(1.0); |
maxint | 0:3d0db4e183ee | 48 | } |
maxint | 0:3d0db4e183ee | 49 | else |
maxint | 0:3d0db4e183ee | 50 | { |
maxint | 0:3d0db4e183ee | 51 | if(this->vSpeed.getSize()>=1.0) |
maxint | 0:3d0db4e183ee | 52 | this->vSpeed.add(-1.0); |
maxint | 0:3d0db4e183ee | 53 | else // TODO: added code below to allow zero speed pause of ball |
maxint | 0:3d0db4e183ee | 54 | this->vSpeed.set(0,0); |
maxint | 0:3d0db4e183ee | 55 | } |
maxint | 0:3d0db4e183ee | 56 | } |
maxint | 0:3d0db4e183ee | 57 | |
maxint | 0:3d0db4e183ee | 58 | void Ball::unmove() |
maxint | 0:3d0db4e183ee | 59 | { // move back to previous position |
maxint | 0:3d0db4e183ee | 60 | pos.set(pos.getPrev()); |
maxint | 0:3d0db4e183ee | 61 | } |
maxint | 0:3d0db4e183ee | 62 | |
maxint | 0:3d0db4e183ee | 63 | void Ball::update() |
maxint | 0:3d0db4e183ee | 64 | { |
maxint | 0:3d0db4e183ee | 65 | this->pos.move(this->vSpeed); |
maxint | 0:3d0db4e183ee | 66 | } |
maxint | 0:3d0db4e183ee | 67 | |
maxint | 0:3d0db4e183ee | 68 | Circle Ball::getBoundingCircle() |
maxint | 0:3d0db4e183ee | 69 | { |
maxint | 0:3d0db4e183ee | 70 | return(Circle(this->pos.getX(), this->pos.getY(), this->nRadius)); |
maxint | 0:3d0db4e183ee | 71 | } |
maxint | 0:3d0db4e183ee | 72 | |
maxint | 0:3d0db4e183ee | 73 | bool Ball::collides(Rectangle r) |
maxint | 0:3d0db4e183ee | 74 | { |
maxint | 0:3d0db4e183ee | 75 | Circle cBall=this->getBoundingCircle(); |
maxint | 0:3d0db4e183ee | 76 | Rectangle rBall=cBall.getBoundingRectangle(); |
maxint | 0:3d0db4e183ee | 77 | |
maxint | 0:3d0db4e183ee | 78 | /* |
maxint | 0:3d0db4e183ee | 79 | char szBuffer[256]; |
maxint | 0:3d0db4e183ee | 80 | sprintf(szBuffer, "c:%d,%d ", cBall.getX(), cBall.getY()); |
maxint | 0:3d0db4e183ee | 81 | this->pDisp->drawString(font_oem, 0, 0, szBuffer); |
maxint | 0:3d0db4e183ee | 82 | */ |
maxint | 0:3d0db4e183ee | 83 | return(rBall.collides(r)); |
maxint | 0:3d0db4e183ee | 84 | } |
maxint | 0:3d0db4e183ee | 85 | |
maxint | 5:065f19e08dcb | 86 | bool Ball::collides(Circle cObject) |
maxint | 5:065f19e08dcb | 87 | { |
maxint | 5:065f19e08dcb | 88 | Circle cBall=this->getBoundingCircle(); |
maxint | 5:065f19e08dcb | 89 | Rectangle rBall=cBall.getBoundingRectangle(); |
maxint | 5:065f19e08dcb | 90 | Rectangle rObject=cObject.getBoundingRectangle(); |
maxint | 5:065f19e08dcb | 91 | |
maxint | 5:065f19e08dcb | 92 | return(rBall.collides(rObject)); |
maxint | 5:065f19e08dcb | 93 | } |
maxint | 5:065f19e08dcb | 94 | |
maxint | 5:065f19e08dcb | 95 | |
maxint | 3:441dc90d10ce | 96 | bool Ball::collides(Line ln) |
maxint | 3:441dc90d10ce | 97 | { |
maxint | 3:441dc90d10ce | 98 | Circle cBall=this->getBoundingCircle(); |
maxint | 3:441dc90d10ce | 99 | return(cBall.collides(ln)); |
maxint | 3:441dc90d10ce | 100 | } |
maxint | 3:441dc90d10ce | 101 | |
maxint | 0:3d0db4e183ee | 102 | void Ball::Bounce(Vector vBounce) |
maxint | 0:3d0db4e183ee | 103 | { // change the direction in a certain direction |
maxint | 0:3d0db4e183ee | 104 | this->unmove(); // undo move to pre-bouncing position to avoid drawing on colliding position |
maxint | 0:3d0db4e183ee | 105 | |
maxint | 0:3d0db4e183ee | 106 | this->vSpeed.multiply(vBounce); |
maxint | 0:3d0db4e183ee | 107 | |
maxint | 0:3d0db4e183ee | 108 | // check speed w/max |
maxint | 0:3d0db4e183ee | 109 | if(this->vSpeed.y>5.0) this->vSpeed.y=5; |
maxint | 2:74bc9b16fb88 | 110 | if(this->vSpeed.x>5.0) this->vSpeed.x=5; |
maxint | 2:74bc9b16fb88 | 111 | if(this->vSpeed.y<-5.0) this->vSpeed.y=-5; |
maxint | 2:74bc9b16fb88 | 112 | if(this->vSpeed.x<-5.0) this->vSpeed.x=-5; |
maxint | 2:74bc9b16fb88 | 113 | } |
maxint | 2:74bc9b16fb88 | 114 | |
maxint | 2:74bc9b16fb88 | 115 | void Ball::BounceAgainst(Vector vBounce) |
maxint | 2:74bc9b16fb88 | 116 | { // change the direction in a certain direction |
maxint | 2:74bc9b16fb88 | 117 | this->unmove(); // undo move to pre-bouncing position to avoid drawing on colliding position |
maxint | 2:74bc9b16fb88 | 118 | |
maxint | 2:74bc9b16fb88 | 119 | //this->vSpeed.multiply(vBounce); |
maxint | 2:74bc9b16fb88 | 120 | this->vSpeed.bounce(vBounce); |
maxint | 2:74bc9b16fb88 | 121 | |
maxint | 2:74bc9b16fb88 | 122 | // check speed w/max |
maxint | 2:74bc9b16fb88 | 123 | if(this->vSpeed.y>5.0) this->vSpeed.y=5; |
maxint | 2:74bc9b16fb88 | 124 | if(this->vSpeed.x>5.0) this->vSpeed.x=5; |
maxint | 2:74bc9b16fb88 | 125 | if(this->vSpeed.y<-5.0) this->vSpeed.y=-5; |
maxint | 2:74bc9b16fb88 | 126 | if(this->vSpeed.x<-5.0) this->vSpeed.x=-5; |
maxint | 2:74bc9b16fb88 | 127 | |
maxint | 7:4fa3edaa1201 | 128 | // if(abs(vSpeed.x)>abs(vSpeed.y)) |
maxint | 7:4fa3edaa1201 | 129 | // vSpeed.x=vSpeed.x/abs(vSpeed.x) * abs(vSpeed.y); |
maxint | 0:3d0db4e183ee | 130 | } |
maxint | 0:3d0db4e183ee | 131 | |
maxint | 0:3d0db4e183ee | 132 | |
maxint | 0:3d0db4e183ee | 133 | |
maxint | 0:3d0db4e183ee | 134 | void Ball::clear() |
maxint | 0:3d0db4e183ee | 135 | { |
maxint | 0:3d0db4e183ee | 136 | Point p=pos.getCur(); |
maxint | 0:3d0db4e183ee | 137 | this->pDisp->fillCircle(p.getX(),p.getY(), this->nRadius, Color565::Black, Color565::Black); |
maxint | 0:3d0db4e183ee | 138 | } |
maxint | 0:3d0db4e183ee | 139 | |
maxint | 0:3d0db4e183ee | 140 | void Ball::clearPrev() |
maxint | 0:3d0db4e183ee | 141 | { |
maxint | 0:3d0db4e183ee | 142 | Point p=pos.getPrev(); |
maxint | 0:3d0db4e183ee | 143 | this->pDisp->fillCircle(p.getX(),p.getY(), this->nRadius, Color565::Black, Color565::Black); |
maxint | 0:3d0db4e183ee | 144 | } |
maxint | 0:3d0db4e183ee | 145 | |
maxint | 0:3d0db4e183ee | 146 | |
maxint | 0:3d0db4e183ee | 147 | void Ball::draw() |
maxint | 0:3d0db4e183ee | 148 | { // render the object on the screen, based on its current position |
maxint | 0:3d0db4e183ee | 149 | Point p=pos.getCur(); |
maxint | 0:3d0db4e183ee | 150 | if(this->nRadius>3) |
maxint | 0:3d0db4e183ee | 151 | { |
maxint | 0:3d0db4e183ee | 152 | this->pDisp->fillCircle(p.getX(), p.getY(), this->nRadius, this->uColorLow, this->uColorLow); |
maxint | 0:3d0db4e183ee | 153 | this->pDisp->fillCircle(p.getX()-this->nRadius/3, p.getY()-this->nRadius/3, this->nRadius/2, this->uColorMid, this->uColorMid); |
maxint | 0:3d0db4e183ee | 154 | this->pDisp->setPixel(p.getX()-this->nRadius/2, p.getY()-this->nRadius/2, this->uColorHigh); |
maxint | 0:3d0db4e183ee | 155 | } |
maxint | 0:3d0db4e183ee | 156 | else |
maxint | 0:3d0db4e183ee | 157 | this->pDisp->fillCircle(p.getX(), p.getY(), this->nRadius, this->uColorMid, this->uColorMid); |
maxint | 0:3d0db4e183ee | 158 | } |
maxint | 0:3d0db4e183ee | 159 | |
maxint | 0:3d0db4e183ee | 160 | void Ball::redraw() |
maxint | 0:3d0db4e183ee | 161 | { // redraw the ball if its position has changed |
maxint | 0:3d0db4e183ee | 162 | if(pos.hasChanged()) |
maxint | 0:3d0db4e183ee | 163 | { |
maxint | 0:3d0db4e183ee | 164 | clearPrev(); |
maxint | 0:3d0db4e183ee | 165 | draw(); |
maxint | 0:3d0db4e183ee | 166 | } |
maxint | 0:3d0db4e183ee | 167 | } |