home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
NEXT Generation 27
/
NEXT27.iso
/
pc
/
demos
/
emperor
/
dx3.exe
/
SDK
/
SAMPLES
/
IKLOWNS
/
CGINPUT.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1996-08-28
|
5KB
|
185 lines
/*===========================================================================*\
|
| File: cginput.cpp
|
| Description:
|
|-----------------------------------------------------------------------------
|
| Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved.
|
| Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation
|
\*===========================================================================*/
/**************************************************************************
(C) Copyright 1995-1996 Microsoft Corp. All rights reserved.
You have a royalty-free right to use, modify, reproduce and
distribute the Sample Files (and/or any modified version) in
any way you find useful, provided that you agree that
Microsoft has no warranty obligations or liability for any
Sample Application Files which are modified.
we do not recomend you base your game on IKlowns, start with one of
the other simpler sample apps in the GDK
**************************************************************************/
#include <windows.h>
#include <mmsystem.h>
#ifdef __WATCOMC__
#include <mem.h>
#else
#include <memory.h>
#endif
#include "cginput.h"
CGameInput::CGameInput (void)
{
JOYINFO joypos;
memset(&caps, 0, sizeof(JOYCAPS) * 16);
memset(&joyThere, 0, sizeof(int) * 16);
for (int x=0; x<QJoystick(); x++)
{
if (joyGetPos(JOYSTICKID1+x, &joypos) == JOYERR_NOERROR)
{
// there *is* a joystick 'x' installed!
++joyThere[x];
joyGetDevCaps(JOYSTICKID1+x, &(caps[x]), sizeof(JOYCAPS));
}
}
Flush();
UpdateJoystick();
}
CGameInput::~CGameInput(void)
{
}
void CGameInput::Flush(void)
{
// Do things this way because, ahem... SetKeyboardState() doesn't appear
// to work on Win'95...
for (int x=0; x<256; x++)
{
GetKeyboard(x);
}
}
//--------------------------------------------------
int CGameInput::QKeyboard(void)
{
// if there is a keyboard, returns 1 else 0
return(GetKeyboardType(1));
}
int CGameInput::QMouse(void)
{
// if no mouse, 0 else number of buttons on mouse
return(GetSystemMetrics(SM_CMOUSEBUTTONS));
}
int CGameInput::QJoystick(void)
{
// if no joystick(s), returns 0 else number of joysticks attached.
return(joyGetNumDevs());
}
int CGameInput::GetKeyboard(int key)
{
// returns 0 if the key has been depressed, else returns 1 and sets key to code recd.
return (GetAsyncKeyState(key));
}
int CGameInput::QKeyDepressed(int numkeys, int *keyarray)
{
int x;
// tells if keys in keyarray are currently depressed. Returns 0 if not, 1 if all
if (!numkeys || !keyarray)
return(0);
for (x=0; x<numkeys ; x++)
{
// mask off top bit
if ((GetAsyncKeyState(keyarray[x])) == 0)
return(0);
}
return(1);
}
int CGameInput::GetMouse(int& xpos, int&ypos, int& buttons)
{
// returns 0 if no mouse action to report; else, 1 and fills in params
int button1, button2;
POINT pt;
if (!GetCursorPos(&pt))
return(0);
xpos = pt.x;
ypos = pt.y;
buttons = 0;
button1 = GetAsyncKeyState(VK_LBUTTON);
button2 = GetAsyncKeyState(VK_RBUTTON);
if (button1)
buttons |= 1;
if (button2)
buttons |= 2;
return(1);
}
int normalize (int val, int minval, int maxval)
{
// error detection:
if ((maxval-minval) == 0)
{
return(0);
}
// zero-base:
val -= minval;
// normalize to 0..200:
val = (200L * val) / (maxval-minval);
// shift to -100 .. 100:
val -= 100;
return(val);
}
void CGameInput::UpdateJoystick(void)
{
for (int x=0; x<16; x++)
{
if (joyThere[x])
joyGetPos(JOYSTICKID1 + x, &(cached_joyinfo[x]));
}
}
int CGameInput::GetJoystick(int joynum, JOYINFO * joypos)
{
if ((joynum >= 16) || (joynum <= 0) || !joyThere[joynum-1])
return(0);
memcpy(joypos, &(cached_joyinfo[joynum-1]), sizeof(JOYINFO));
// normalize the joypos to -100,0,100 scale....
joypos->wXpos = normalize(joypos->wXpos, caps[joynum-1].wXmin, caps[joynum-1].wXmax);
joypos->wYpos = normalize(joypos->wYpos, caps[joynum-1].wYmin, caps[joynum-1].wYmax);
joypos->wZpos = normalize(joypos->wZpos, caps[joynum-1].wZmin, caps[joynum-1].wZmax);
return(1);
}