我是C#的新手,我想制作一个简单的 2D RPG (角色扮演游戏)角色,它可以通过简单的步行动画来移动使用'W''A'''''D'关键字。为此,我使用 Picture Box 来保存角色图像和 2个定时器工具,一个用于通过更改图片来管理'行走'动画每100毫秒,另一个计时器用于每1毫秒移动该图片盒位置。
在'Form_KeyDown'事件中,每当用户按下其中一个移动关键字并设置这两个定时器启用时,我会设置这两个定时器 Enabled = True 'Form_KeyUp'事件中的
这是第一个通过更改每个节拍上的图片来控制动画的计时器代码:
private void timerchangepic_Tick(object sender, EventArgs e)
{
//movementPhase will determine the picture to be displayed, added by 1
//every tick means character image change every tick
movementPhase++;
if (movementPhase > 4) movementPhase = 1;
//determining which image is currently displayed
if (charDirection == Direction.Front)
{
if (movementPhase == 1)
pbcharacter.BackgroundImage = Image.FromFile("Icon\\front.png");
else if (movementPhase == 2)
pbcharacter.BackgroundImage = Image.FromFile("Icon\\front2.png");
else if (movementPhase == 3)
pbcharacter.BackgroundImage = Image.FromFile("Icon\\front3.png");
else if (movementPhase == 4)
pbcharacter.BackgroundImage = Image.FromFile("Icon\\front4.png");
}
//and goes the same for another 3 directions (left, right, and back)
}
这是第二个定时器代码,用于移动每个刻度上字符的位置:
private void timermovement_Tick(object sender, EventArgs e)
{
if (charDirection == Direction.Front)
{
pbcharacter.Location = new Point(pbcharacter.Location.X, pbcharacter.Location.Y + 5);
}
//and goes the same for another 3 directions (left, right, and back)
}
我的问题是:当我按住其中一个移动击键时,角色无法移动。在第一秒它工作正常,但几秒钟(2-3秒)后,按住'S'笔划使角色停止,移动一点,再次停止,移动一点点,一遍又一遍。此外,动画只工作了一圈,图片从'前面'变为' front2 '直到' front4 ',但不是从' front4 '返回' front '。总之,角色的动画只运行了1个班次,然后它变成了一个静态图像,当我按住“S”按钮时,它会移动一点,停止,再次移动,然后再次停止。
我的代码出了什么问题?有没有更好的方法来实现动画的2D角色任务?
答案 0 :(得分:1)
我建议你使用更具体的东西来构建你的应用程序:XNA,MonoGame或Unity3D。但是如果你使用winforms我会给你几个建议:
1)缓存图像而不是每次从文件加载它们
2)原因定时器事件间隔不是很准确从上次事件计算ElapsedTime。并将+5更改为依赖于ElapsedTime的内容
3)而是使用多个计时器组织游戏循环来处理你的事件
4)在表单上使用Double Buffer。
答案 1 :(得分:0)
使用Windows窗体构建游戏可能难以置信,而且效率极低。如果你要使用XNA,这并不难以学习,你可以创造一个更好,更强大的游戏。
如果你使用WinForms我会认为你是一个初学者,所以我不会打扰单位或单声道,因为它们要复杂得多。如果你仍然拒绝这个,我建议你:
希望得到帮助。
答案 2 :(得分:0)
我认为如果你必须使用Windows窗体制作游戏,那么你需要 至少使用游戏循环处理您的更新而不是表单计时器和 如果你周围的东西需要某种时钟来 帮助您的游戏在任何CPU上以相同的速度运行