Exemple #1
0
// 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();
}
Exemple #2
0
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;
	}
}
Exemple #3
0
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;
}
Exemple #4
0
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;
}