int main(int argc, char **argv) { // Create the game window and initalise the VIDEO subsystem GameWindow gwd; gwd.InitVideo(); gwd.SetBackground((GXColor){ 0, 30, 0, 255 }); // Initialise Wiimote WPAD_Init(); // Enable SD card stuff fatInitDefault(); // Create a rectangle representing the net and set its properties Quad net; net.SetPosition(320-2, 0); net.SetWidth(4); net.SetHeight(480); net.SetFillColor((GXColor){ 0, 255, 0, 255 }); // Create the two score boxes (x position, y position, width) ScoreBox firstScoreBox(35, 10, 250); ScoreBox secondScoreBox(355, 10, 250); // Create and spawn the first player Player firstPlayer; firstPlayer.spawn(0, 100); // Create and spawn the second player Player secondPlayer; secondPlayer.spawn(510, 610); // Create and spawn the ball (-3 seems like a good initial speed!) Ball theBall; theBall.spawn(-3); // Player 2 A.I. is turned on by default bool AImode = true; // This is the game's run loop. It is executed several times per second. while(1) { // Look for new Wii controllers WPAD_ScanPads(); // Handle controller events // Quit the game (break out of the runloop) if HOME is pressed if(WPAD_ButtonsDown(WPAD_CHAN_0)&WPAD_BUTTON_HOME) break; // Player 1 Controls if(WPAD_ButtonsHeld(WPAD_CHAN_0)&WPAD_BUTTON_DOWN) firstPlayer.pushDown(); if(WPAD_ButtonsHeld(WPAD_CHAN_0)&WPAD_BUTTON_UP) firstPlayer.pushUp(); if(WPAD_ButtonsHeld(WPAD_CHAN_0)&WPAD_BUTTON_LEFT) firstPlayer.pushLeft(); if(WPAD_ButtonsHeld(WPAD_CHAN_0)&WPAD_BUTTON_RIGHT) firstPlayer.pushRight(); // Player 2 Controls if(WPAD_ButtonsDown(WPAD_CHAN_1)&WPAD_BUTTON_PLUS) AImode = !AImode; // If AI is enabled, control Player 2 using the following code. if ( AImode ) { // Player 2 AI if (theBall.getYcoord()+10 < secondPlayer.getYcoord()+32) secondPlayer.pushUp(); else if (theBall.getYcoord()+10 > secondPlayer.getYcoord()+32) secondPlayer.pushDown(); } // If AI is disabled, let the Wii remote control Player 2. else { if(WPAD_ButtonsHeld(WPAD_CHAN_1)&WPAD_BUTTON_DOWN) secondPlayer.pushDown(); if(WPAD_ButtonsHeld(WPAD_CHAN_1)&WPAD_BUTTON_UP) secondPlayer.pushUp(); if(WPAD_ButtonsHeld(WPAD_CHAN_1)&WPAD_BUTTON_LEFT) secondPlayer.pushLeft(); if(WPAD_ButtonsHeld(WPAD_CHAN_1)&WPAD_BUTTON_RIGHT) secondPlayer.pushRight(); } // Handle all the game objects net.Draw(); // Draw the net firstScoreBox.Draw(); // Draw the first score box secondScoreBox.Draw(); // Draw the second score box // Draw the ball, then react if it bounced off the side of the screen. switch (theBall.Draw()) { // If the ball hit the left side of the screen... case -1: // Player 1 has failed if (secondScoreBox.incrementScore() == false) return 0; theBall.spawn(-3); // Reset ball going left firstPlayer.spawn(0, 100); break; // If the ball hit the right side of the screen... case +1: // Player 2 has failed if (firstScoreBox.incrementScore() == false) return 0; theBall.spawn(3); // Reset ball going rightward secondPlayer.spawn(510, 610); break; // If neither of the above cases happened... default: // Nobody failed! :) break; } firstPlayer.Draw(); // Draw Player 1 secondPlayer.Draw(); // Draw Player 2 // Tell the ball where each player is, so that it can react // to them if they are touching. theBall.deflectFromPlayer(&firstPlayer); theBall.deflectFromPlayer(&secondPlayer); // Draw the buffer to the screen and reset it. gwd.Flush(); // Increase our count of how many frames have been drawn. g_ticks++; } // The program has finished, so we return to the loader. return 0; }
int main(int argc, char **argv){ fatInitDefault();//Initialize the front SD for loading images // Create the game window and initalise the VIDEO subsystem gwd.InitVideo(); WPAD_Init(); //Initialize the Wiimote MP3Player_Init(); //Initialze the MP3 Player WPAD_SetDataFormat(WPAD_CHAN_0, WPAD_FMT_BTNS_ACC_IR);//Allows us to use the Wiimote pointer WPAD_SetPowerButtonCallback(doPadPowerOff);//Set up power button iball->LoadImage("/apps/Wiibreaker/data/ball.png"); ibrick->LoadImage("/apps/Wiibreaker/data/brick.png"); ibrick2->LoadImage("/apps/Wiibreaker/data/black.png"); ibrick3->LoadImage("/apps/Wiibreaker/data/blue.png"); ibrick4->LoadImage("/apps/Wiibreaker/data/gray.png"); ibrick5->LoadImage("/apps/Wiibreaker/data/green.png"); ibrick6->LoadImage("/apps/Wiibreaker/data/orange.png"); ibrick7->LoadImage("/apps/Wiibreaker/data/red.png"); ipaddle->LoadImage("/apps/Wiibreaker/data/paddle.png"); background1->LoadImage("/apps/Wiibreaker/data/background1.png"); background2->LoadImage("/apps/Wiibreaker/data/background2.png"); background3->LoadImage("/apps/Wiibreaker/data/background3.png"); pointer->LoadImage("/apps/Wiibreaker/data/pointer.png"); shutdown = false; for(int i = 0; i < 30; i++){ brick[i] = new Sprite(); } ball->SetImage(iball); paddle->SetImage(ipaddle); Pointer->SetImage(pointer); LoadHighscores(); while(true){ firsthit = false; rows = 0; reset = 1; Menu(); score = 0; lives = 3; helpescape = 0; if(quit == 1) break; ballx = 320 - (ball->GetWidth()/2); bally = 300; holdball = 0; balldir = rand() % 2 + 1; if(controlscheme == 0 || controlscheme == 2) paddle->SetRotation(0); if(controlscheme == 0 || controlscheme == 2) paddlex = 320 - (paddle->GetWidth()/2); if(controlscheme == 0 || controlscheme == 2) paddley = 400; if(controlscheme == 1) paddle->SetPosition(0, 0); wait = 0; if(mode == 3) leveleditor(); for(;;) { WPAD_ScanPads(); Background->Draw(); if(reset == 1 && wait == 0){ bricksetup(); resetb(); } for(int i = 0; i < 30; i++){ if(alive[i] == true){ brick[i]->SetPosition(brickx[i], bricky[i]); brick[i]->Draw(); } } updateball(); ball->SetPosition(ballx, bally); ball->Draw(); //Get Controller Input if(controlscheme == 0){ WPAD_Expansion(WPAD_CHAN_0, &exp); exp.type = WPAD_EXP_NUNCHUK; //Get rid of controller interference WPADData* data = WPAD_Data(WPAD_CHAN_0); switch (data->exp.type) { case WPAD_EXP_NUNCHUK: if(WPAD_ButtonsHeld(WPAD_CHAN_0)&WPAD_NUNCHUK_BUTTON_C) paddlex -= 8; if(WPAD_ButtonsHeld(WPAD_CHAN_0)&WPAD_NUNCHUK_BUTTON_Z) paddlex += 8; break; case WPAD_EXP_CLASSIC: if(WPAD_ButtonsHeld(WPAD_CHAN_0)&WPAD_CLASSIC_BUTTON_LEFT) paddlex -= 8; if(WPAD_ButtonsHeld(WPAD_CHAN_0)&WPAD_CLASSIC_BUTTON_RIGHT) paddlex += 8; break; } if((WPAD_ButtonsHeld(WPAD_CHAN_0)&WPAD_BUTTON_LEFT)||(WPAD_ButtonsHeld(WPAD_CHAN_0)&WPAD_BUTTON_UP) || ((exp.nunchuk.js.ang>=270-45 && exp.nunchuk.js.ang<=270+45) && exp.nunchuk.js.mag>=0.9)) paddlex -= 8; if((WPAD_ButtonsHeld(WPAD_CHAN_0)&WPAD_BUTTON_RIGHT)||(WPAD_ButtonsHeld(WPAD_CHAN_0)&WPAD_BUTTON_DOWN) || ((exp.nunchuk.js.ang>=90-45 && exp.nunchuk.js.ang<=90+45) && exp.nunchuk.js.mag>=0.9)) paddlex += 8; if(paddlex < 0) paddlex = 0; if(paddlex + paddle->GetWidth() > 640) paddlex = 640 - paddle->GetWidth(); paddle->SetPosition(paddlex, paddley); } if(controlscheme == 1){ // Infrared calculation - The X and Y of the wiimote sprite ir_t ir; // The struct for infrared WPAD_IR(WPAD_CHAN_0, &ir); // Let's get our infrared data // Give our sprite the positions and the angle. paddle->SetPosition(ir.sx-WSP_POINTER_CORRECTION_X, ir.sy-WSP_POINTER_CORRECTION_Y); // We use these constants to translate the position correctly to the screen paddle->Move(-((f32)paddle->GetWidth()/2), -((f32)paddle->GetHeight()/2)); // And these to make our image appear at the center of this position. paddle->SetRotation(ir.angle/2); // Set angle/2 to translate correctly } if(controlscheme == 2){ if(wait == 0){ WPAD_Expansion(WPAD_BALANCE_BOARD, &exp2);//Get data from the attached expansion (the balance board in this case) exp2.type = WPAD_EXP_WIIBOARD; x = exp2.wb.x; //Left Movements if(x < -4)//-4 paddlex -= 4; if(x < -8)//-7 paddlex -= 5; if(x < -13)//-9 paddlex -= 6; if(x < -15)//-11 paddlex -= 7; if(x < -18)//-13 paddlex -= 8; //Right Movements if(x > 4) paddlex += 4; if(x > 8) paddlex += 5; if(x > 13) paddlex += 6; if(x > 15) paddlex += 7; if(x > 18) paddlex += 8; if(paddlex < 0) paddlex = 0; if(paddlex + paddle->GetWidth() > 640) paddlex = 640 - paddle->GetWidth(); } paddle->SetPosition(paddlex, paddley); } if((WPAD_ButtonsDown(WPAD_CHAN_0)&WPAD_BUTTON_PLUS) || (WPAD_ButtonsDown(WPAD_CHAN_0)&WPAD_CLASSIC_BUTTON_PLUS)) pausegame(); paddle->Draw(); if((WPAD_ButtonsDown(WPAD_CHAN_0)&WPAD_BUTTON_HOME) || (WPAD_ButtonsDown(WPAD_CHAN_0)&WPAD_CLASSIC_BUTTON_HOME)) break; if(shutdown == true) SYS_ResetSystem( SYS_POWEROFF, 0, 0 ); if(rumblecounter == 7){ WPAD_Rumble(WPAD_CHAN_0, 0); rumblecounter = 0; } if(rumblecounter != 0) rumblecounter++; if(controlscheme == 2) wait++; if(wait > 1) wait = 0; gwd.Flush(); checkforreset(); if(lives <= 0) break; if(holdball < 15) holdball++; if(sound && !MP3Player_IsPlaying()){ MP3Player_Stop(); if(sound == 1){ MP3Player_PlayBuffer(Peter_de_Man___Lightwaves_d090128_mp3, Peter_de_Man___Lightwaves_d090128_mp3_size, NULL); } if(sound == 2){ MP3Player_PlayBuffer(Peter_de_Man___Cyborgs_Trip_d090128_mp3, Peter_de_Man___Cyborgs_Trip_d090128_mp3_size, NULL); } } } WPAD_Rumble(WPAD_CHAN_0, 0); switch(mode){ case 1: switch(controlscheme){ case 0: if(score > scores[0]) scores[0] = score; break; case 1: if(score > scores[1]) scores[1] = score; break; case 2: if(score > scores[2]) scores[2] = score; break; } break; case 2: switch(controlscheme){ case 0: if(score > scores[3]) scores[3] = score; break; case 1: if(score > scores[4]) scores[4] = score; break; case 2: if(score > scores[5]) scores[5] = score; break; } break; } SaveHighscores(); } return 0; }