// compute velocity & position (cube included) and draw dot (exploded or not) void Cube::animate(Cube* cubes, const float dts) { static const float deadzone = 2.0f; static const float accelScale = 0.6f; static const float damping = 0.995f; if (lifeCounter <= 0) return; for (uint8_t d=0; d<dot_n; d++) { // if dot neither hidden nor exploded, animate it: if (not (vid.sprites[d].isHidden() || dots[d].exp)) { Float2 accel = id.accel().xy(); if (accel.len2() > deadzone * deadzone) dots[d].vel += accel * accelScale; dots[d].vel *= damping; Float2 step = dots[d].vel * dts; Float2 candidate = dots[d].pos + step; // Does this dot want to leave the cube ? Side mySide = (candidate.y < minPos.y) ? TOP : // 0 (candidate.x < minPos.x) ? LEFT : // 1 (candidate.y > maxPos.y) ? BOTTOM : // 2 (candidate.x > maxPos.x) ? RIGHT : // 3 NO_SIDE; // -1 bool stayHere = true; // default CubeID hisID; // neighbor CubeID Side hisSide = NO_SIDE; // his side number that touches mySide if (mySide != NO_SIDE) { // avoids cubeAt(NO_SIDE) error Neighborhood myNbh(id); hisID = myNbh.cubeAt(mySide); if (hisID.isDefined()) { // ...same with sideOf(NO_SIDE) Neighborhood hisNbh(hisID); hisSide = hisNbh.sideOf(id); stayHere = cubes[hisID].isFull(); } } if (stayHere) { // will this dot stay? if (mySide==TOP || mySide==BOTTOM) // bounce vertically? dots[d].vel.y = -dots[d].vel.y; if (mySide==LEFT || mySide==RIGHT) // ...horizontally? dots[d].vel.x = -dots[d].vel.x; dots[d].pos += dots[d].vel * dts; // finish calculation vid.sprites[d].setImage(DotIMG); // draw the dot vid.sprites[d].move(dots[d].pos); } else { // move to neighbor dots[d].pos += step; // finish calculation moveDot(d, cubes[hisID], mySide, hisSide); } } } collisionCheck(); displayDamages(); }
void dotHitRacket(char screen[HEIGHT][WIDTH], Dot *d, Racket *r, Racket ** list) { /* [+3] | -> UPRIGHT (deltaHeight +=3 && deltaWidth = 2) UPLEFT <- | [+2] | -> UPRIGHT (deltaHeight +=2 && deltaWidth = 1) UPLEFT <- | [+1] | -> UPRIGHT (deltaHeight +=1 && deltaWidth = 1) UPLEFT <- | [0] | -> RIGHT (deltaHeight = 0 && deltaWidth = 1) LEFT <- | [-1] | -> DOWNRIGHT (deltaHeight +=1 && deltaWidth = 1) DOWNLEFT <- | [-2] | -> DOWNRIGHT (deltaHeight +=2 && deltaWidth = 1) DOWNLEFT <- | [-3] | -> DOWNRIGHT (deltaHeight +=3 && deltaWidth = 2) DOWNLEFT <- | */ int hitPosition = r->centerH - d->height; Direction dir; r->side == LEFT_SIDE ? d->width += 1 : d->width -= 1; switch (hitPosition) { case 0: d->deltaHeight = 0; d->deltaWidth = 1; r->side == LEFT_SIDE ? d->direction = RIGHT : d->direction = LEFT; r->side == LEFT_SIDE ? moveDot(screen, RIGHT, d, list) : moveDot(screen, LEFT, d, list); break; case 1: d->deltaHeight += 1; d->deltaWidth = 1; r->side == LEFT_SIDE ? d->direction = UPRIGHT : d->direction = UPLEFT; r->side == LEFT_SIDE ? moveDot(screen, UPRIGHT, d, list) : moveDot(screen, UPLEFT, d, list); break; case 2: d->deltaHeight += 2; d->deltaWidth = 1; r->side == LEFT_SIDE ? d->direction = UPRIGHT : d->direction = UPLEFT; r->side == LEFT_SIDE ? moveDot(screen, UPRIGHT, d, list) : moveDot(screen, UPLEFT, d, list); break; case 3: d->deltaHeight += 3; d->deltaWidth = 2; r->side == LEFT_SIDE ? d->direction = UPRIGHT : d->direction = UPLEFT; r->side == LEFT_SIDE ? moveDot(screen, UPRIGHT, d, list) : moveDot(screen, UPLEFT, d, list); break; case -1: d->deltaHeight += 1; d->deltaWidth = 1; r->side == LEFT_SIDE ? d->direction = DOWNRIGHT : d->direction = DOWNLEFT; r->side == LEFT_SIDE ? moveDot(screen, DOWNRIGHT, d, list) : moveDot(screen, DOWNLEFT, d, list); break; case -2: d->deltaHeight += 2; d->deltaWidth = 1; r->side == LEFT_SIDE ? d->direction = DOWNRIGHT : d->direction = DOWNLEFT; r->side == LEFT_SIDE ? moveDot(screen, DOWNRIGHT, d, list) : moveDot(screen, DOWNLEFT, d, list); break; case -3: d->deltaHeight += 3; d->deltaWidth = 2; r->side == LEFT_SIDE ? d->direction = DOWNRIGHT : d->direction = DOWNLEFT; r->side == LEFT_SIDE ? moveDot(screen, DOWNRIGHT, d, list) : moveDot(screen, DOWNLEFT, d, list); break; } }
void moveDot(char screen[HEIGHT][WIDTH], Direction dotDirection, Dot * d, Racket ** list) { if (screen[d->height][d->width] == RACKET_BRUSH) { screen[d->height][d->width] = RACKET_BRUSH; return; } screen[d->height][d->width] = SPACE; bool hitWall = false; switch (dotDirection) { case UP: d->height -= d->deltaHeight; break; case DOWN: d->height += d->deltaHeight; break; case RIGHT: d->width += d->deltaWidth; break; case LEFT: d->width -= d->deltaWidth; break; case UPLEFT: moveDot(screen, UP, d, list); moveDot(screen, LEFT, d, list); break; case UPRIGHT: moveDot(screen, UP, d, list); moveDot(screen, RIGHT, d, list); break; case DOWNLEFT: moveDot(screen, DOWN, d, list); moveDot(screen, LEFT, d, list); break; case DOWNRIGHT: moveDot(screen, DOWN, d, list); moveDot(screen, RIGHT, d, list); break; } /* Bounding Box */ if (d->height <= 0) { d->height = 1; hitWall = true; } if (d->height >= HEIGHT - 1) { d->height = HEIGHT - 2; hitWall = true; } if(d->width < 0) { gameScore(list[1]); printScore(list[0]->score, list[1]->score); initializeDot(screen, d, UPLEFT); }else if (d->width >= WIDTH) { gameScore(list[0]); printScore(list[0]->score, list[1]->score); initializeDot(screen, d, UPRIGHT); } if (hitWall) { dotHitWall(screen, d); } screen[d->height][d->width] = DOT; }
int main(){ /* Initialize scene and its objects */ Racket r1 = Racket(); Racket r2 = Racket(); Racket * List [2] = { &r1,&r2 }; boolean difficulty = false; r2.isplayer = gameMenu(&difficulty); r2.difficulty = difficulty; Dot ball = Dot(); char screen[HEIGHT][WIDTH]; initializeRacket(screen, &r1, LEFT_SIDE); initializeRacket(screen, &r2, RIGHT_SIDE); seed(); //initializes dot randomly int dotRand = rand() % 3; switch (dotRand) { case 0: initializeDot(screen, &ball, DOWNLEFT); break; case 1: initializeDot(screen, &ball, UPLEFT); break; case 2: initializeDot(screen, &ball, LEFT); break; default: initializeDot(screen, &ball, UPLEFT); break; } while (true) // Main loop { initialize(screen); drawRacket(screen, &r1); drawRacket(screen, &r2); moveDot(screen, ball.direction, &ball, List); if (screen[ball.height][ball.width] == RACKET_BRUSH) { if (ball.width < (WIDTH/2)) { dotHitRacket(screen,&ball, &r1, List); } else { dotHitRacket(screen,&ball, &r2, List); } } if (_kbhit()) { /* _kbhit is used to know if user pressed a button (keyboard) */ char pressedKey = _getch(); if (pressedKey == 'w' || pressedKey == 'W'){ moveRacket(screen, &r1,UP); } if (pressedKey == 's' || pressedKey == 'S') { moveRacket(screen, &r1, DOWN); } //Check if the user choose pvp or pvc if (r2.isplayer) { //Choose multiplayer if (pressedKey == 'i' || pressedKey == 'I') { moveRacket(screen, &r2, UP); } if (pressedKey == 'k' || pressedKey == 'K') { moveRacket(screen, &r2, DOWN); } } } if (!r2.isplayer) { moveCPU(screen, &r2,ball.direction,ball.height); } for (int i = 0; i < 2; i++) { if (List[i]->score >= 10) { system("cls"); printf("Player %d Venceu!\n", i+1); _getch(); return 0; } } draw(screen); sleep(); } return 0; }