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);
}