GameCube Project Source Code
I've only include the main cpp file here as it shows most of the processes used. There are many other support files that make up the various libraries of the SDK.
/*
By Chris Hill and Arik Andrews
*/
#include demo.h
#include dolphin.h
#include g2d.h
#include stddef.h
#include stdio.h
#include "GCSprite.h"
#include "GCControl.h"
#include "Sound.h"
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define HEAP_ID 0
#define SOUND_MUSIC 0
bool IsHeapInitialized = FALSE;
static void CreateHeap();
static inline void* operator new(size_t blocksize);
static inline void* operator new[](size_t blocksize);
static inline void operator delete(void* block);
static inline void operator delete(void* block);
TEXPalettePtr tpl;
GCControl controls;
void init(void)
{
//initialize G2D
DEMOInit(NULL);
G2DInitWorld(SCREEN_WIDTH, SCREEN_HEIGHT);
G2DSetViewport( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT );
//set the default camera
G2DPosOri poCam;
poCam.rPosX = SCREEN_WIDTH/2;
poCam.rPosY = SCREEN_HEIGHT/2;
poCam.rOriX = 0.0;
poCam.rOriY = -1.0;
G2DSetCamera(&poCam);
}
int main ()
{
CreateHeap();
char *filename = "images1.tpl";
TEXGetPalette(&tpl, filename);
GCTexture Back(tpl);
GCTexture zcar1(tpl);
GCTexture zcar2(tpl);
GCTexture zcar3(tpl);
GCTexture zcar4(tpl);
GCTexture ball(tpl);
GCTexture rgoal(tpl);
GCTexture lgoal(tpl);
init();
Back.load(0);
zcar1.load(1);
zcar2.load(2);
zcar3.load(3);
zcar4.load(4);
ball.load(5);
rgoal.load(6);
lgoal.load(7);
char *filename1 = "images2.tpl";
TEXGetPalette(&tpl, filename1);
GCTexture text(tpl);
GCTexture rscore(tpl);
GCTexture bscore(tpl);
GCTexture pinb(tpl);
GCTexture redwin(tpl);
GCTexture bluewin(tpl);
text.load(0);
redwin.load(1);
bluewin.load(2);
rscore.load(3);
bscore.load(4);
pinb.load(5);
GCSprite water;
water.setImage(&Back);
water.setXY(SCREEN_WIDTH/2, SCREEN_HEIGHT/2);
water.setWidth(640);
water.setHeight(480);
water.loadtexture("images1.tpl", 0, 0, 0);
OSReport("Water loaded\n");
GCSprite car1;
car1.setImage(&zcar1);
car1.setXY(SCREEN_WIDTH/4, SCREEN_HEIGHT/4);
car1.setWidth(35);
car1.setHeight(49);
car1.Rotate(1.58);
car1.loadtexture("images1.tpl", 0, 0, 1);
OSReport("player 1 car loaded\n");
GCSprite car2;
car2.setImage(&zcar2);
car2.setXY(SCREEN_WIDTH/4, SCREEN_HEIGHT/1.4);
car2.setWidth(35);
car2.setHeight(49);
car2.Rotate(1.58);
car2.loadtexture("images1.tpl", 0, 0, 2);
OSReport("player 2 car loaded\n");
GCSprite car3;
car3.setImage(&zcar3);
car3.setXY(SCREEN_WIDTH/1.4, SCREEN_HEIGHT/4);
car3.setWidth(35);
car3.setHeight(49);
car3.Rotate(4.72);
car3.loadtexture("images1.tpl", 0, 0, 3);
OSReport("player 3 car loaded\n");
GCSprite car4;
car4.setImage(&zcar4);
car4.setXY(SCREEN_WIDTH/1.4, SCREEN_HEIGHT/1.4);
car4.setWidth(35);
car4.setHeight(49);
car4.Rotate(4.72);
car4.loadtexture("images1.tpl", 0, 0, 4);
OSReport("player 4 car loaded\n");
GCSprite bball;
bball.setImage(&ball);
bball.setXY(SCREEN_WIDTH/2, SCREEN_HEIGHT/2);
bball.setWidth(47);
bball.setHeight(47);
bball.loadtexture("images1.tpl", 0, 0, 5);
OSReport("ball loaded\n");
bball.animRate = 10;
bball.totalFrames = 14;
bball.columns = 15;
bball.setAnimRate(8);
GCSprite goalleft;
goalleft.setImage(&lgoal);
goalleft.setXY(SCREEN_WIDTH/50, SCREEN_HEIGHT/2);
goalleft.setWidth(10);
goalleft.setHeight(70);
goalleft.loadtexture("images1.tpl", 0, 0, 7);
OSReport("left goal loaded\n");
GCSprite goalright;
goalright.setImage(&rgoal);
goalright.setXY(SCREEN_WIDTH/1.02, SCREEN_HEIGHT/2);
goalright.setWidth(10);
goalright.setHeight(70);
goalright.loadtexture("images1.tpl", 0, 0, 6);
OSReport("right goal loaded\n");
GCSprite toppin;
toppin.setImage(&pinb);
toppin.setXY(SCREEN_WIDTH/2, SCREEN_HEIGHT/12);
toppin.setWidth(48);
toppin.setHeight(48);
toppin.loadtexture("images2.tpl", 0, 0, 5);
GCSprite botpin;
botpin.setImage(&pinb);
botpin.setXY(SCREEN_WIDTH/2, SCREEN_HEIGHT/1.15);
botpin.setWidth(48);
botpin.setHeight(48);
botpin.loadtexture("images2.tpl", 0, 0, 5);
GCSprite stext;
stext.setImage(&text);
stext.setXY(SCREEN_WIDTH/3.2, SCREEN_HEIGHT/25); //MOVE THIS
stext.setWidth(18);
stext.setHeight(19);
stext.loadtexture("images2.tpl", 0, 0, 0);
stext.setCurrentFrame(0);
stext.animRate = 10;
stext.totalFrames = 9;
stext.columns = 10;
stext.setAnimRate(8);
GCSprite stext2;
stext2.setImage(&text);
stext2.setXY(SCREEN_WIDTH/1.07, SCREEN_HEIGHT/24);
stext2.setWidth(18);
stext2.setHeight(19);
stext2.loadtexture("images2.tpl", 0, 0, 0);
stext2.setCurrentFrame(0);
stext2.animRate = 10;
stext2.totalFrames = 9;
stext2.columns = 10;
stext2.setAnimRate(8);
GCSprite bluescore;
bluescore.setImage(&bscore);
bluescore.setXY(SCREEN_WIDTH/1.28, SCREEN_HEIGHT/24);
bluescore.setWidth(190);
bluescore.setHeight(18);
bluescore.loadtexture("images2.tpl", 0, 0, 4);
bluescore.setCurrentFrame(0);
OSReport("left goal loaded\n");
GCSprite redscore;
redscore.setImage(&rscore);
redscore.setXY(SCREEN_WIDTH/6, SCREEN_HEIGHT/25);
redscore.setWidth(190);
redscore.setHeight(17);
redscore.loadtexture("images2.tpl", 0, 0, 3);
redscore.setCurrentFrame(0);
OSReport("left goal loaded\n");
GCSprite redwins;
redwins.setImage(&redwin);
redwins.setXY(SCREEN_WIDTH/2, SCREEN_HEIGHT/2);
redwins.setWidth(600);
redwins.setHeight(36);
redwins.loadtexture("images2.tpl", 0, 0, 1);
redwins.setCurrentFrame(0);
OSReport("left goal loaded\n");
GCSprite bluewins;
bluewins.setImage(&bluewin);
bluewins.setXY(SCREEN_WIDTH/2, SCREEN_HEIGHT/2);
bluewins.setWidth(600);
bluewins.setHeight(36);
bluewins.loadtexture("images2.tpl", 0, 0, 2);
bluewins.setCurrentFrame(0);
OSReport("left goal loaded\n");
controls.SetSampleRate(5);
initAudio();
loadSoundTable("bounce");
loadSoundTable("applause");
playSample(&sounds, SOUND_MUSIC);
int team1score = 0;
int team2score = 0;
//main loop
while(1)
{
PADRead(Pads);
if (car1.collision(car2))
{
//Saving the current speed of the cars
float tempCar1X = car1.getVelX();
float tempCar1Y = car1.getVelY();
float tempCar2X = car2.getVelX();
float tempCar2Y = car2.getVelY();
//Upon collision, the velocity of each car is swapped
car1.setVelX(tempCar2X);
car1.setVelY(tempCar2Y);
car2.setVelX(tempCar1X);
car2.setVelY(tempCar1Y);
}
if (car1.collision(car3))
{
//Saving the current speed of the cars
float tempCar1X = car1.getVelX();
float tempCar1Y = car1.getVelY();
float tempCar3X = car3.getVelX();
float tempCar3Y = car3.getVelY();
//Upon collision, the velocity of each car is swapped
car1.setVelX(tempCar3X);
car1.setVelY(tempCar3Y);
car3.setVelX(tempCar1X);
car3.setVelY(tempCar1Y);
}
if (car1.collision(car4))
{
//Saving the current speed of the cars
float tempCar1X = car1.getVelX();
float tempCar1Y = car1.getVelY();
float tempCar4X = car4.getVelX();
float tempCar4Y = car4.getVelY();
//Upon collision, the velocity of each car is swapped
car1.setVelX(tempCar4X);
car1.setVelY(tempCar4Y);
car4.setVelX(tempCar1X);
car4.setVelY(tempCar1Y);
}
if (car2.collision(car3))
{
//Saving the current speed of the cars
float tempCar2X = car2.getVelX();
float tempCar2Y = car2.getVelY();
float tempCar3X = car3.getVelX();
float tempCar3Y = car3.getVelY();
//Upon collision, the velocity of each car is swapped
car2.setVelX(tempCar3X);
car2.setVelY(tempCar3Y);
car3.setVelX(tempCar2X);
car3.setVelY(tempCar2Y);
}
if (car2.collision(car4))
{
//Saving the current speed of the cars
float tempCar2X = car2.getVelX();
float tempCar2Y = car2.getVelY();
float tempCar4X = car4.getVelX();
float tempCar4Y = car4.getVelY();
//Upon collision, the velocity of each car is swapped
car2.setVelX(tempCar4X);
car2.setVelY(tempCar4Y);
car4.setVelX(tempCar2X);
car4.setVelY(tempCar2Y);
}
if (car3.collision(car4))
{
//Saving the current speed of the cars
float tempCar3X = car3.getVelX();
float tempCar3Y = car3.getVelY();
float tempCar4X = car4.getVelX();
float tempCar4Y = car4.getVelY();
//Upon collision, the velocity of each car is swapped
car3.setVelX(tempCar4X);
car3.setVelY(tempCar4Y);
car4.setVelX(tempCar3X);
car4.setVelY(tempCar3Y);
}
//Car vs ball collision
if (car1.collision(bball))
{
bball.setVelX(car1.getVelX() * 1.5);
bball.setVelY(car1.getVelY() * 1.5);
}
if (car2.collision(bball))
{
bball.setVelX(car2.getVelX() * 1.5);
bball.setVelY(car2.getVelY() * 1.5);
}
if (car3.collision(bball))
{
bball.setVelX(car3.getVelX() * 1.5);
bball.setVelY(car3.getVelY() * 1.5);
}
if (car4.collision(bball))
{
bball.setVelX(car4.getVelX() * 1.5);
bball.setVelY(car4.getVelY() * 1.5);
}
if(car1.collision(toppin))
{
car1.setVelX(car1.getVelX() * -2);
car1.setVelY(car1.getVelY() * -2);
}
if(car1.collision(botpin))
{
car1.setVelX(car1.getVelX() * -2);
car1.setVelY(car1.getVelY() * -2);
}
if(car2.collision(toppin))
{
car2.setVelX(car2.getVelX() * -2);
car2.setVelY(car2.getVelY() * -2);
}
if(car2.collision(botpin))
{
car2.setVelX(car2.getVelX() * -2);
car2.setVelY(car2.getVelY() * -2);
}
if(car3.collision(toppin))
{
car3.setVelX(car3.getVelX() * -2);
car3.setVelY(car3.getVelY() * -2);
}
if(car3.collision(botpin))
{
car3.setVelX(car3.getVelX() * -2);
car3.setVelY(car3.getVelY() * -2);
}
if(car4.collision(toppin))
{
car4.setVelX(car4.getVelX() * -2);
car4.setVelY(car4.getVelY() * -2);
}
if(car4.collision(botpin))
{
car4.setVelX(car4.getVelX() * -2);
car4.setVelY(car4.getVelY() * -2);
}
if (bball.collision(toppin))
{
bball.setVelX(bball.getVelX() * -1);
bball.setVelY(bball.getVelY() * -1);
}
if (bball.collision(botpin))
{
bball.setVelX(bball.getVelX() * -1);
bball.setVelY(bball.getVelY() * -1);
}
//If team 1 scores
if (bball.collision(goalleft))
{
//reset ball to start
bball.setXY(SCREEN_WIDTH/2, SCREEN_HEIGHT/2);
bball.setVelX(0);
bball.setVelY(0);
car1.setXY(SCREEN_WIDTH/4, SCREEN_HEIGHT/4);
car1.setVelX(0);
car1.setVelY(0);
car2.setXY(SCREEN_WIDTH/4, SCREEN_HEIGHT/1.4);
car2.setVelX(0);
car2.setVelY(0);
car3.setXY(SCREEN_WIDTH/1.4, SCREEN_HEIGHT/4);
car3.setVelX(0);
car3.setVelY(0);
car4.setXY(SCREEN_WIDTH/1.4, SCREEN_HEIGHT/1.4);
car4.setVelX(0);
car4.setVelY(0);
//add score
team2score += 1;
//display score on screen
if (team2score < 10)
{
stext2.setCurrentFrame(team2score);
}
}
//If team 2 scores
if (bball.collision(goalright))
{
//reset ball to start
bball.setXY(SCREEN_WIDTH/2, SCREEN_HEIGHT/2);
bball.setVelX(0);
bball.setVelY(0);
car1.setXY(SCREEN_WIDTH/4, SCREEN_HEIGHT/4);
car1.setVelX(0);
car1.setVelY(0);
car2.setXY(SCREEN_WIDTH/4, SCREEN_HEIGHT/1.4);
car2.setVelX(0);
car2.setVelY(0);
car3.setXY(SCREEN_WIDTH/1.4, SCREEN_HEIGHT/4);
car3.setVelX(0);
car3.setVelY(0);
car4.setXY(SCREEN_WIDTH/1.4, SCREEN_HEIGHT/1.4);
car4.setVelX(0);
car4.setVelY(0);
//add score
team1score += 1;
//display score on screen
if (team1score < 10)
{
stext.setCurrentFrame(team1score);
}
}
//Code to move with arrow keys
if (controls.getButtonA(0))
{
car1.go();
}
if (controls.getButtonA(1))
{
car2.go();
}
if (controls.getButtonA(2))
{
car3.go();
}
if (controls.getButtonA(3))
{
car4.go();
}
if (controls.getButtonB(0))
{
car1.reverse();
}
if (controls.getButtonB(1))
{
car2.reverse();
}
if (controls.getButtonB(2))
{
car3.reverse();
}
if (controls.getButtonB(3))
{
car3.reverse();
}
if (controls.getButtonLeft(0))
{
car1.Rotate(-.05);
}
if (controls.getButtonRight(0))
{
car1.Rotate(.05);
}
if (controls.getButtonLeft(1))
{
car2.Rotate(-.05);
}
if (controls.getButtonRight(1))
{
car2.Rotate(.05);
}
if (controls.getButtonLeft(2))
{
car3.Rotate(-.05);
}
if (controls.getButtonRight(2))
{
car3.Rotate(.05);
}
if (controls.getButtonLeft(3))
{
car4.Rotate(-.05);
}
if (controls.getButtonRight(3))
{
car4.Rotate(.05);
}
//start render
DEMOBeforeRender();
water.draw();
if (team1score >= 10)
{
redwins.draw();
}
if (team2score >= 10)
{
bluewins.draw();
}
if (controls.getButtonStart(0) && (team1score >= 10 || team2score >= 10))
{
team1score = 0;
team2score = 0;
stext.setCurrentFrame(0);
stext2.setCurrentFrame(0);
bball.setXY(SCREEN_WIDTH/2, SCREEN_HEIGHT/2);
bball.setVelX(0);
bball.setVelY(0);
car1.setXY(SCREEN_WIDTH/4, SCREEN_HEIGHT/4);
car1.setVelX(0);
car1.setVelY(0);
car2.setXY(SCREEN_WIDTH/4, SCREEN_HEIGHT/1.4);
car2.setVelX(0);
car2.setVelY(0);
car3.setXY(SCREEN_WIDTH/1.4, SCREEN_HEIGHT/4);
car3.setVelX(0);
car3.setVelY(0);
car4.setXY(SCREEN_WIDTH/1.4, SCREEN_HEIGHT/1.4);
car4.setVelX(0);
car4.setVelY(0);
}
car1.updatePosition();
car2.updatePosition();
car3.updatePosition();
car4.updatePosition();
bball.updatePosition();
goalleft.updatePosition();
stext.updatePosition();
stext2.updatePosition();
toppin.updatePosition();
bball.updateAnimation();
car1.rebound(0,0,640,480);
car2.rebound(0,0,640,480);
car3.rebound(0,0,640,480);
car4.rebound(0,0,640,480);
bball.rebound(-10,-10,650,490);
car1.draw();
car2.draw();
car3.draw();
car4.draw();
bball.draw();
stext.draw();
stext2.draw();
bluescore.draw();
redscore.draw();
goalright.draw();
goalleft.draw();
toppin.draw();
botpin.draw();
//stop render
DEMODoneRender();
}
// stopSample(&sounds);
// killAudio();
return 1;
}
static void CreateHeap()
{
if(IsHeapInitialized) return;
void* arenaLo = OSGetArenaLo();
void* arenaHi = OSGetArenaHi();
//only invoke once
arenaLo = OSInitAlloc(arenaLo, arenaHi, 1);
OSSetArenaLo(arenaLo);
//Ensure boundaries are 32B aligned
arenaLo = (void*)OSRoundUp32B(arenaLo);
arenaHi = (void*)OSRoundDown32B(arenaHi);
OSSetCurrentHeap(OSCreateHeap(arenaLo,arenaHi));
OSReport(" heap = %u to %ul\n",arenaLo,arenaHi);
IsHeapInitialized = TRUE;
}
static inline void* operator new (size_t blocksize)
{
if(!IsHeapInitialized)
{
CreateHeap();
}
return OSAllocFromHeap(HEAP_ID, blocksize);
}
static inline void* operator new[] (size_t blocksize)
{
if(!IsHeapInitialized)
{
CreateHeap();
}
return OSAllocFromHeap(HEAP_ID, blocksize);
}
static inline void operator delete(void* block)
{
OSFreeToHeap(HEAP_ID, block);
}
static inline void operator delete[](void* block)
{
OSFreeToHeap(HEAP_ID, block);
}