//------------[ this is part of the windowing code ]---------------------------------------[
char keys[256]={0};
char keysNew[256];
static LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
switch(uMsg){
...
case WM_KEYDOWN:
{
keys[wParam&255] = TRUE;
keysNew[wParam&255]= TRUE;
if(wParam==VK_ESCAPE)GameShouldExit=true;
return 0;
}
case WM_KEYUP:
{
keys[wParam&255] = FALSE;
return 0;
}
...
}
void xEnd(){
SwapBuffers(hDC);
//------[ message-pump ]------------------------[
for(int i=0;i<256;i++)keysNew[i]=0;
MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
if(msg.message==WM_QUIT)GameShouldExit=true;
else{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
//---------------------------------------------/
}
//-----------------------------------------------------------------------------------------/
#define U8 unsigned char
typedef struct{
U8 TRIANGLE,CIRCLE,CROSS,SQUARE,L2,R2,L1,R1,SELECT,START,L3,R3,LEFT,RIGHT,UP,DOWN;
}BUTTONS;
typedef struct{
int x,y;
}SPOINT; // signed point
typedef struct{
SPOINT LStick;
SPOINT RStick;
union{
U8 buttons[16];
BUTTONS Cur;
};
union{
U8 newbuttons[16];
BUTTONS New;
};
//enum{
// TRIANGLE,CIRCLE,CROSS,SQUARE,L2,R2,L1,R1,SELECT,START,L3,R3,LEFT,RIGHT,UP,DOWN
//};
}JOYSTICK;
JOYSTICK Joy1={0};
void UpdateJoystick(){
JOYSTICK j;
JOYINFOEX t;
int i;
t.dwSize=sizeof(t);
t.dwFlags=JOY_RETURNALL;
memclear(&j,sizeof(j));
if(JOYERR_NOERROR==joyGetPosEx(JOYSTICKID1,&t)){
j.LStick.x = (t.dwXpos - 32768);
j.LStick.y = (t.dwYpos - 32768);
j.RStick.x = (t.dwRpos - 32768);
j.RStick.y = (t.dwZpos - 32768);
for(i=0;i<16;i++){
j.buttons[i]= (t.dwButtons>>i)&1;
}
j.LStick.x/=256;
j.LStick.y/=256;
j.RStick.x/=256;
j.RStick.y/=256;
#define fixup(what) if(what>33)what-=33; else if(what<-33)what+=33; else what=0;
fixup(j.LStick.x);
fixup(j.LStick.y);
fixup(j.RStick.x);
fixup(j.RStick.y);
#undef fixup
if(t.dwPOV==27000)j.Cur.LEFT =1;
if(t.dwPOV==9000 )j.Cur.RIGHT=1;
if(t.dwPOV==0 )j.Cur.UP =1;
if(t.dwPOV==18000)j.Cur.DOWN =1;
}
//---------[ process keyboard ]-------------------[
if(keys['A'])j.LStick.x= -128;
if(keys['D'])j.LStick.x= 128;
if(keys['W'])j.LStick.y= -128;
if(keys['S'])j.LStick.y= 128;
if(keys[VK_LEFT ])j.RStick.x= -128;
if(keys[VK_RIGHT])j.RStick.x= 128;
if(keys[VK_UP ])j.RStick.y= -128;
if(keys[VK_DOWN ])j.RStick.y= 128;
if(keys['I'])j.Cur.TRIANGLE=1;
if(keys['L'])j.Cur.CIRCLE=1;
if(keys['K'])j.Cur.CROSS=1;
if(keys['J'])j.Cur.SQUARE=1;
if(keys[192])j.Cur.SELECT=1; // '~'
if(keys['1'])j.Cur.START=1;
if(keys[VK_RETURN])j.Cur.START=1;
if(keys['U'])j.Cur.L1=1;
if(keys['Y'])j.Cur.L2=1;
if(keys['O'])j.Cur.R1=1;
if(keys['P'])j.Cur.R2=1;
if(keys['N'])j.Cur.L3=1;
if(keys['M'])j.Cur.R3=1;
if(keys['T'])j.Cur.UP=1;
if(keys['G'])j.Cur.DOWN=1;
if(keys['F'])j.Cur.LEFT=1;
if(keys['H'])j.Cur.RIGHT=1;
//------------------------------------------------/
for(i=0;i<16;i++){
U8 b1,b2;
b1 = Joy1.buttons[i];
b2 = j.buttons[i];
j.newbuttons[i] = (b1^b2)&b2;
j.buttons[i]=b2;
}
memcpy(&Joy1,&j,sizeof(j));
}
// this is example use of the gamepad:
void TranslateJoystick(){
vec2 LStick = vec2(Joy1.LStick.x,Joy1.LStick.y);
vec2 RStick = vec2(Joy1.RStick.x,Joy1.RStick.y);
if(keys[VK_SHIFT]){LStick*=20;} // accelerate movement on holding SHIFT
if(keys[VK_CONTROL]){LStick*=1.0/20.0;RStick*=1.0/20.0;}//decelerate movement on holding CONTROL
CAMERA.MoveByGamepad(LStick.x,LStick.y,RStick.x,RStick.y);
if(Joy1.New.R1){ // change camera type
switch(CAMERA.type){
case XCAMERA::USE_LOOKAT: CAMERA.type=XCAMERA::USE_ROTATION;break;
case XCAMERA::USE_ROTATION: CAMERA.type=XCAMERA::USE_LOOKAT;break;
}
}
extern int FPS_Count_Average;
if(Joy1.Cur.TRIANGLE)CAMERA.pos.y+= 1.0*(60.0/FPS_Count_Average);
if(Joy1.Cur.CROSS )CAMERA.pos.y-= 1.0*(60.0/FPS_Count_Average);
if(Joy1.New.R2) CAMERA.Reset();
if(Joy1.New.CIRCLE) GameShouldExit=true;
if(Joy1.Cur.LEFT)light0_Pos.x-=1; else if(Joy1.Cur.RIGHT)light0_Pos.x+=1;
if(Joy1.Cur.UP )light0_Pos.z-=1; else if(Joy1.Cur.DOWN )light0_Pos.z+=1;
if(keysNew[VK_F5]){ // reload shaders
SHADER::FreeManager();
SHADER::InitManager();
}
if(Joy1.Cur.SELECT && Joy1.New.START){
static int interval=0;
interval++; if(interval>2)interval=0;
wglSwapIntervalEXT(interval);
//print(interval);
}
}