如何拿汇编搓一个小游戏

本文介绍了如何使用32位汇编语言和win32标准库创建一个简单的游戏窗口。通过WinMain和ProcWinMain处理窗口消息,重点讨论了游戏逻辑,包括人物和平台的控制,以及通过定时器更新游戏状态。游戏人物根据左右按键移动,平台固定上升,人物在平台之上跟随上升。使用WM_PAINT消息重绘游戏界面,并通过双缓冲解决闪烁问题。文章还提到了利用位图模拟按钮及事件触发,并给出了源码参考。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

话不多说,先上图——
菜单
在这里插入图片描述

在这里插入图片描述
下面开始盘逻辑

一、语言、库

32位汇编,仅使用win32标准库

二、运行逻辑

首先我们要知道win32里一个简单窗体运行的逻辑

  • 对于WinMain:
    1. 获得当前窗口句柄(GetModuleHandle
    2. 注册窗口类(会指定消息循环函数ProcWinMain
    3. 建立并显示窗口(CreateWindowEx
    4. 消息循环(GetMessage、TranslateMessage、DispatchMessage
  • 对于ProcWinMain:(参数 hWnd,uMsg,wParam,lParam)
    1. uMsg传递窗口消息,常见的有WM_PAINT、WM_CREATE、WM_TIMER,WM_KEYDOWN…表示各种窗口状态
    2. 对于类似有按键消息时,具体按键信息由wParam传递
    3. 在循环过程中,我们就可以在不同的情况下加入自己的操作,同时也在特定时刻给窗口发送特定消息

特别关注的是:当窗口消息为WM_PAINT时,就能够重画窗口界面,这是我们游戏实现的基础

然后,我们再来盘一盘游戏的逻辑

  • 游戏里有哪些物体
    1. 游戏人物(位置)
    2. 平台(位置)

核心就这两样,其他的都是花里胡哨的

  • 控制逻辑
    1. 左右按钮按下,人物左右移动
    2. 平台固定上升
    3. 人物在不接触平台是固定下降;在平台之上则随着平台上升

整合一下
由于消息循环的默认刷新率很快,然而我们的游戏刷新频率不用那么高,所以需要设置一个定时器( SetTimer),并且初始化游戏内的物体,定时器的作用就是每隔固定时间(自己定义)就给窗口发送一个WM_TIMER消息,所以,我们就可以在WM_CREATE时设置定时器,然后接收到WM_TIMER时,游戏状态就更新一帧,更新完后再调用 InvalidateRect,给窗体发送WM_PAINT消息,重绘窗体

其中游戏状态就更新的内容包括(按先后顺序):

  1. 平台均向上移一个单位
  2. 判断人物状态,如果在平台上,则跟随平台向上;否则向下移一个单位

重绘窗体时需要绘制:
3. 平台
4. 人物

以上说的是最基本的实现逻辑,最后再给游戏加亿点点细节
ps:为了方便,用贴图完成所有效果(包括按钮,包括记分牌等等等),其实就是懒
在这里插入图片描述
具体实现参考源码吧
ps:

  1. 为了避免闪烁问题,可以使用双缓冲绘图
  2. 记得释放句柄,清除缓冲区
  3. 位图冒充按钮时,就是根据鼠标点击位置触发事件(参数同样利用wParam传递

指路源码
项目

想起了再写

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值