求大佬,关于游戏编程显示

0

最近写了一个游戏,刚开始写的时候没有想过这个问题,问题大概是:主函数中,先判定地图中的怪物的自主移动和自主攻击,然后判定键盘和鼠标的按键来实现人物的移动,最后无论有没有键鼠按键 都执行一次刷新界面函数(也就是把人和怪物都显示出来),通过无线循环主函数实现了人物的移动和怪物的移动,但是后面要添加人物攻击怪物的动作的时候发现没有办法添加动作(也就是陆续显示多个动作图片达到动画的目的)。

攻击函数大概是这样:主函数中如果判定到键盘输入“J”键就调用攻击函数,攻击函数中显示人物动作,如果不用多线程的话,这个函数的调用过程中因为怪物的自主移动和自主攻击都在主函数中运行,攻击函数未结束之前都无法实现主函数的调用,也就是说在执行人物攻击动作的时候其他一切都会是静止的。

如果以子线程形式调用攻击函数,因为主函数有刷新界面的功能,每次刷新界面都会把之前的动作给覆盖掉,攻击的动作就没办法正常显示。

现在的思路是:人和怪物等物体都以对象的形式在多线程中运行,主函数就只循环执行刷新显示界面的功能,不过还没修改过来也不知道行不行。

有没有更好的办法实现呢...求助大佬

ava
Y

2020-2-26

0

通常来说,主循环是这样子的:

while(true)
{
	// 获取控制

	// 计算游戏元素

	// 绘制游戏元素

	// 延时(例如实现 60fps)
}

注意,在这个结构中,每次循环的时间不能超过 1/60 秒。

于是遇到了你的第一个问题:人物攻击的过程含有很多张图片,不是瞬间完成,超过了 1/60 秒。如果你用循环将人物攻击的过程逐个显示出来,整个主循环就卡了,导致其它任何游戏元素都得不到处理。下面我说一种思路(不是唯一)。

先详细分解一下“人物攻击”的序列:

获取控制(按攻击键 J)
计算游戏元素(人物状态为未攻击,不做是否击中的判断)
绘制游戏元素(显示人物准备攻击的图片1)
延时 1/60 秒

获取控制(无)
计算游戏元素(人物状态为未攻击,不做是否击中的判断)
绘制游戏元素(显示人物准备攻击的图片2)
延时 1/60 秒

获取控制(无)
计算游戏元素(人物状态为攻击,判断是否击中对方)
绘制游戏元素(显示人物攻击图片1)
延时 1/60 秒

获取控制(无)
计算游戏元素(人物状态为攻击,判断是否击中对方)
绘制游戏元素(显示人物攻击图片2)
延时 1/60 秒

获取控制(无)
计算游戏元素(人物状态为待命)
绘制游戏元素(显示人物待命图片)
延时 1/60 秒

有了这个序列,应该知道该怎么写了吧,比如你可以用一个变量记录当前攻击的序列,为 0 表示不攻击,为 1 表示开始攻击,主循环执行一次,变量++,变量为 5 时,攻击结束,同时置变量为 0。

ava
慢羊羊

2020-2-26

技术讨论社区