win32中能否使某一计时器中的事件 执行到某一行代码时等待100毫秒再继续执行?

weize_chen 2017-11-24 10:57:15
void CALLBACK Monsterhit (HWND hWnd, UINT uMSG, UINT idEvent, DWORD dwTime)
{
if(currentStage->stageID >= 1)
{
for(int i = 0; i < monsters.size(); i++)
if(monsters[i]->hit)
{
monsters[i]->img = bmp_Monsterhit;
InvalidateRect(hWnd, NULL, FALSE);
//希望在此停顿100毫秒
monsters[i]->img = bmp_Monster;
monsters[i]->hit = false;
}
}
}

有什么办法?
或者我想做一个子弹击中怪兽,怪兽闪烁的效果,除了改变怪兽的图,刷新,再改回去,还有什么办法?
...全文
190 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
smwhotjay 2017-11-25
  • 打赏
  • 举报
回复
状态继续细分。
zgl7903 2017-11-25
  • 打赏
  • 举报
回复
增加一个计时变量就可以

void CALLBACK Monsterhit (HWND hWnd, UINT uMSG, UINT idEvent, DWORD dwTime)
{
  if(currentStage->stageID >= 1)
  {
    BOOL bInvalidFlag = FALSE;
    
    for(int i = 0; i < monsters.size(); i++)
    {
      if(monsters[i]->hit)
      {
        monsters[i]->img = bmp_Monsterhit;
        monsters[i]->dwUpdateTick = GetTickCount() + 100; //开始计时
        bInvalidFlag = TRUE;
        monsters[i]->hit = false;
      }
      else
      {
        if(monsters[i]->dwUpdateTick && GetTickCount() >= monsters[i]->dwUpdateTick) //计时时间到
        {
          monsters[i]->img = bmp_Monster;
          monsters[i]->dwUpdateTick = 0; //清除计时
          bInvalidFlag = TRUE;
        }
      }
    }
    
    if(bInvalidFlag)
    {
      InvalidateRect(hWnd, NULL, FALSE);
    }
  }
}

孤客天涯 2017-11-25
  • 打赏
  • 举报
回复
用定时器的思路本身就不妥,定时器本身由硬件中断产生,一般在定时器中不能有耗时操作,干吗不用线程或线程池来做?
weize_chen 2017-11-25
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
增加一个计时变量就可以

void CALLBACK Monsterhit (HWND hWnd, UINT uMSG, UINT idEvent, DWORD dwTime)
{
  if(currentStage->stageID >= 1)
  {
    BOOL bInvalidFlag = FALSE;
    
    for(int i = 0; i < monsters.size(); i++)
    {
      if(monsters[i]->hit)
      {
        monsters[i]->img = bmp_Monsterhit;
        monsters[i]->dwUpdateTick = GetTickCount() + 100; //开始计时
        bInvalidFlag = TRUE;
        monsters[i]->hit = false;
      }
      else
      {
        if(monsters[i]->dwUpdateTick && GetTickCount() >= monsters[i]->dwUpdateTick) //计时时间到
        {
          monsters[i]->img = bmp_Monster;
          monsters[i]->dwUpdateTick = 0; //清除计时
          bInvalidFlag = TRUE;
        }
      }
    }
    
    if(bInvalidFlag)
    {
      InvalidateRect(hWnd, NULL, FALSE);
    }
  }
}

解决了!谢谢!
叶恭介叶恭介 2017-11-24
  • 打赏
  • 举报
回复
gettickcount获取时间...
文编程系统化教程零基础入门篇学习编程捷径:(不论是正在学习编程的大学生,还是IT人士或者是编程爱好者,在学习编程的过程用正确的学习方法可以达到事半功倍的效果。对于初学者,可以通过下面的方法学习编程,通过对成百上千个实例练习,则很快会成为编程高手。我们专业从事编程十几年,积累了丰富的编程经验,会陆续制作编程视频供大家学习,级、高级编程我们会专门制作高级的系列编程课程,难度逐步加深,想学编程的可以关注我们的系列课程。可以就相关编程问题提问。1、【编程工具分为 免费自由版、专业版、企业版。】首先通过免费自由版熟悉基本操作,通过我们提供的实例视频学习编程,先快速入门。2、基本入门后,再学习我们提供的级编程课程,通过对若干实例的编程练习,基本可以掌握编程思路。3、想继续加深学习的,可以继续学习高级版编程课程,通过对连接数据库等的学习真正开发出实用的商业管理软件或定制开发程序。4、基本掌握了编程思路之后,再学习其他的编程语言或大学里的编程课程则会非常轻松,因为不论是哪个编程语言,最重要的是学习编程思路,而编程思路基本上是相通的。5、学习完PC电脑端编程后,还可以继续学习APP手机软件开发。APP手机软件开发需要有PC电脑上开发基础,操作基本类似。6、编程工具为 搭建之星,这个编程工具的特点:1、安装简单、迅速,纯文界面,构件丰富,设计过程直观、自由;无需掌握电脑语言,所有编程构件化、命令化、可视化。2、交互式开发,只需要四种类型的“命令”,便可以建立各构件之间的联系;象搭积木一样简单,并可快速的搭建出具有专业水平的软件作品。3、微解释执行,命令解释量小,执行速度快。可以和编译后的可执行文件相媲美。4、提供打包工具,使您即刻将自制软件安装到其它机器上运行。5、自动对开发项目进行加密;使您的项目,在未经授权下,别人无法“浏览、修改”项目的构件关系与搭建方法。课程安排:零基础入门篇-11  系统编程零基础入门篇概述2 新建项目保存项目以及开发工具界面3 添加构件并对构件对齐排列4 构件的属性方法事件概述5 简单加减乘除运算实例6 简单倒计实例7 点击打开指定网页编程实例8滚动字幕实例9 闪动标签实例10普通按钮位图按钮实例11光线按钮实例12组合按钮实例13分组框单选框复选框构件14列表框组合框构件15间选择构件16控制面板构件17多页面板构件18进度条构件实例19钟表构件实例20日历构件实例21比较判断构件实例22条件选择构件实例23计数循环构件实例24变量组构件实例25间计算构件实例26公用事件构件实例27字符串加密构件实例28数字格式构件实例29字符串操作构件实例30事件发生器构件实例31混合编程小实例模拟红绿灯程序32总结 

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧