C++ SetTimer(w3cschool)
我搞了好久
最终也没成功的让SetTimer 回调一个非静态成员函数 只能通过定义一个高级的对象指针,通过普通回掉函数里面执行成员函数:)
不过问题是解决了
那就是 把成员函数 和 要用到的那个成员变量换成静态了(有点拆东墙补西墙了) 不过方法肯定是有的
举个栗子
public:
static bool bulletlock;
static void CALLBACK bulletinterval(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime); //普通回掉函数
Jetbrains全家桶1年46,售后保障稳定 这是给子弹限制速度的函数 就是发射间隔 其中用lock的形式实现的(我不会讲我实现还不完全)
else if (kbd.SpaceIsPressed()&&(Game::bulletlock==true))
{
Game::bulletlock = false;
Bullet *temp = getBuletState();
PlayerBullet.push_back(temp); //这两行就是发射子弹的
SetTimer(hWnd, 1, 2000, bulletinterval);
//把子弹放进去
}
SetTimer原型
UINT_PTR SetTimer( HWND hWnd, // 窗口句柄 UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器 UINT uElapse, // 时间间隔,单位为毫秒 TIMERPROC lpTimerFunc // 回调函数 );
第一个NULL的话 计时器第二个参数无效,这样需要一个UINT_PTR iTimerID = SetTimer(….来保存这个计时器,删除的时候使用KillTimer(NULL,iTimerID)
Callback函数格式
void CALLBACK TimerProc
(
HWND hWnd,
UINT nMsg,
UINT nTimerid,
DWORD dwTime
);
最后别忘记删除SetTimer
KillTimer(HWND hWnd,uIDEvent)
第一个是句柄 第二个是计时器ID,一次性计时器的话,KillTimer可以写在回掉函数中
void Game::bulletinterval(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime)
{
Game::bulletlock = true;
KillTimer(hWnd, 1);
}