/******************************************************************************
* MAIN.C - Beyaz zemin üzerinde kırmızı kare (D-Pad kontrolü)
* Psy-Q (SN Systems) örnek.
******************************************************************************/
#include <sys/types.h>
#include <libgte.h>
#include <libgpu.h>
#include <libetc.h>
// Ekran boyutu.
#define SCREEN_W 320.
#define SCREEN_H 240.
// Ordering Table boyutu.
#define OT_LENGTH 1
// Ordering Table ve GPU paket alanı.
GsOT ot[OT_LENGTH];
GsOT_TAG ot_tag[1 << OT_LENGTH];
PACKET gpu_packet[16];
// Kırmızı kutunun pozisyonu.
int boxX = 100;
int boxY = 100;
int boxSize = 30;
// Prototipler.
void initGraphics(void);
void drawRedBox(int x, int y, int size);
int main() {
// Grafik başlat.
initGraphics();
// Pad'i başlat.
InitPAD(0, 0, 0, 0);
StartPAD();
ChangeClearPAD(0);
while (1) {
// OT temizle.
ClearOTagR((u_long*)ot[0].ot, 1 << OT_LENGTH);
// Pad okuyalım.
// libetc.h fonksiyonu: Poll ve pad butonlarını al.
PADTYPE p = PadRead(0);
if (!(p & PADLup)) { boxY -= 2; if(boxY < 0) boxY = 0; }
if (!(p & PADLdown)) { boxY += 2; if(boxY > SCREEN_H - boxSize) boxY = SCREEN_H - boxSize; }
if (!(p & PADLleft)) { boxX -= 2; if(boxX < 0) boxX = 0; }
if (!(p & PADLright)){ boxX += 2; if(boxX > SCREEN_W - boxSize) boxX = SCREEN_W - boxSize; }
// Kırmızı kutuyu çiz.
drawRedBox(boxX, boxY, boxSize);
// Ekrana gönder.
DrawSync(0);
VSync(0);
GsSwapDispBuff();
GsSortClear(255, 255, 255); // Arka planı beyaz.
GsDrawOt(&ot[0]);
}
return 0;
}
// ----------------------------------------------------------
// Basit grafik init - 320x240 çözünürlük, double-buffer
// ----------------------------------------------------------
void initGraphics(void) {
ResetGraph(0);
SetDefDrawEnv(&GsDrawEnv, 0, 0, SCREEN_W, SCREEN_H);
SetDefDispEnv(&GsDispEnv, 0, 0, SCREEN_W, SCREEN_H);
// Double buffer.
GsDrawEnv.isbg = 1; // Arka plan temizleme.
GsDrawEnv.r0 = 255; // Beyaz R
GsDrawEnv.g0 = 255; // Beyaz G
GsDrawEnv.b0 = 255; // Beyaz B
PutDrawEnv(&GsDrawEnv);
PutDispEnv(&GsDispEnv);
// OT hazırla.
GsClearOt(0, 0, &ot[0]);
GsSetWorkBase((PACKET*)gpu_packet);
GsClearWorkBase();
GsSetVideoMode(VID_MODE_PAL); // Veya VID_MODE_NTSC.
SetDispMask(1);
}
// ----------------------------------------------------------
// drawRedBox : Kırmızı renkli POLY_F4 çizer.
// ----------------------------------------------------------
void drawRedBox(int x, int y, int size) {
POLY_F4* poly = (POLY_F4*)GsGetWorkBase();
GsSetWorkBase((PACKET*)((u_long)poly + sizeof(POLY_F4)));
setPolyF4(poly);
setXY4(poly,
x, y,
x+size,y,
x, y+size,
x+size,y+size);
setRGB0(poly, 255,0,0); // Kırmızı.
setShadeTex(poly, 0);
AddPrim(&ot[0], poly);
}