Difference between revisions of "Developer tips"
(rem unofficial libogc build - "junior" developers who can't compile themselves from the official devkitpro svn should stick with the official compile!) |
|||
Line 110: | Line 110: | ||
} | } | ||
</source> | </source> | ||
+ | |||
+ | === Add Widescreen support === | ||
+ | |||
+ | More informations [http://cashman.hostarea.org/tips-coders.php?lang=en here]. | ||
== Note on Projection Matrices == | == Note on Projection Matrices == |
Revision as of 17:50, 24 January 2009
General Programming Tips
- Keep your code commented throughout; it helps others help you.
- Any unused code should be deleted out of the program, unless it is a program for teaching people.
- If someone does the same thing in a more efficient way (i.e. faster and/or in less code), accept it and learn from it.
- It is a good idea to release your app open source so others can learn from your code.
- To keep things tidy, make your application store files in the data folder on the root of the SD card (fat0:\data\XXXXX, where XXXXX is the name of your app).
Code Snippets
Video Auto-Detect Routine
The libogc included in DevkitPPC r15 does this for you with one function call. Here is the video detect code from the DevKitPro Wii example.
#include <gccore.h>
static GXRModeObj *rmode = NULL;
// ...
rmode = VIDEO_GetPreferredMode(NULL);
if( CONF_GetAspectRatio() )
{
rmode->viWidth = 678;
rmode->viXOrigin = (VI_MAX_WIDTH_PAL - 678)/2;
}
VIDEO_Configure(rmode);
Please see also: Display Issues
Exit to Loader
It's a good idea to add some way to return to the loader, otherwise you have to reboot your Wii to exit.
// Just call the exit() function to go back to the loader
// Returning from main also works, since that calls exit for you
#include <stdlib.h>
// ...
exit(0);
How to use the Wiimote
A separate article is available: How to use the Wiimote.
Reboot Wii
Use:
#include <gccore.h>
// ...
SYS_ResetSystem(SYS_RESTART,0,0);
Or use SYS_RETURNTOMENU for a "soft" return to the system menu, SYS_POWEROFF to shut down the wii (automatically to the appropriate Idle or Standby mode, depending on the WC24 setting), or SYS_POWEROFF_STANDBY or _IDLE to specify the mode and override the system setting.
How to use the callback function for Power and Reset
This is just a way of doing this stuff, feel free to change the code.
u8 HWButton = 0;
/**
* Callback for the reset button on the Wii.
*/
void WiiResetPressed()
{
HWButton = SYS_RETURNTOMENU;
}
/**
* Callback for the power button on the Wii.
*/
void WiiPowerPressed()
{
HWButton = SYS_POWEROFF_STANDBY;
}
/**
* Callback for the power button on the Wiimote.
* @param[in] chan The Wiimote that pressed the button
*/
void WiimotePowerPressed(s32 chan)
{
HWButton = SYS_POWEROFF_STANDBY;
}
/**
* Entry point.
* @param[in] argc The number of arguments invoked with the program
* @param[in] argv The array containing the arguments
* @return 0 on clean exit, an error code otherwise
*/
int main(int argc, char **argv)
{
// Initialization
SYS_SetResetCallback(WiiResetPressed);
SYS_SetPowerCallback(WiiPowerPressed);
WPAD_SetPowerButtonCallback(WiimotePowerPressed);
while(1)
{
// Do Stuff Here
if(HWButton)
break;
}
if(HWButton)
{
SYS_ResetSystem(HWButton, 0, 0);
}
return 0;
}
Add Widescreen support
More informations here.
Note on Projection Matrices
There are a lot of tutorials and projects out there that are using standard 'Mtx' variables for projection matrices. Although this works in many cases (because the variables declared right after the matrix don't mind being corrupted once or twice), this is not correct, and is a crash waiting to happen. These matrices should be declared as 'Mtx44' objects instead. Note the prototypes for the projection matrix functions (see "ogc/gu.h"):
void guFrustum(Mtx44 mt,f32 t,f32 b,f32 l,f32 r,f32 n,f32 f);
void guPerspective(Mtx44 mt,f32 fovy,f32 aspect,f32 n,f32 f);
void guOrtho(Mtx44 mt,f32 t,f32 b,f32 l,f32 r,f32 n,f32 f);