c# - 使用图片框 C# windows 窗体创建 Snake 游戏
问题描述
我正在以窗口形式创建经典的蛇游戏,但使用图片框而不是椭圆,因此我对蛇的运动以及图片区域的专用方式有很多用途。
我用它作为游戏的基础 https://www.youtube.com/watch?v=enOSmmHQcso
添加正文时出现问题(其他部分)
如果我使用此代码,移动是完美的,但图片框重叠 //((Body)lstSnake[i]).SetBounds(lstSnake[i - 1].Location.X, lstSnake[i - 1].Location.Y, lstSnake[i - 1].Width, lstSnake[i - 1].Height); //(Body)lstSnake[i]).SetImage();
如果我运行图片框下方的开关是完美的,但运动却搞砸了。
如果有人可以给我一些帮助,那就太棒了。
private void MoveSnake()
{
for (int i = lstSnake.Count - 1; i >= 0; i--)
{
if (i == 0)
{
switch (Settings.direction)
{
case Direction.Right:
((Head)lstSnake[i]).SetX(lstSnake[i].Location.X + Settings.Move);
((Head)lstSnake[i]).SetImage();
break;
case Direction.Left:
((Head)lstSnake[i]).SetX(lstSnake[i].Location.X - Settings.Move);
((Head)lstSnake[i]).SetImage();
break;
case Direction.Up:
((Head)lstSnake[i]).SetY(lstSnake[i].Location.Y - Settings.Move);
((Head)lstSnake[i]).SetImage();
break;
case Direction.Down:
((Head)lstSnake[i]).SetY(lstSnake[i].Location.Y + Settings.Move);
((Head)lstSnake[i]).SetImage();
break;
}
else
{
switch (Settings.direction)
{
case Direction.Right:
((Body)lstSnake[i]).SetBounds(lstSnake[i - 1].Location.X - (lstSnake[i - 1].Width / 2), lstSnake[i - 1].Location.Y, lstSnake[i - 1].Width, lstSnake[i - 1].Height);
((Body)lstSnake[i]).SetImage();
break;
case Direction.Left:
((Body)lstSnake[i]).SetBounds(lstSnake[i - 1].Location.X + (lstSnake[i - 1].Width / 2), lstSnake[i - 1].Location.Y, lstSnake[i - 1].Width, lstSnake[i - 1].Height);
((Body)lstSnake[i]).SetImage();
break;
case Direction.Up:
((Body)lstSnake[i]).SetBounds(lstSnake[i - 1].Location.X, lstSnake[i - 1].Location.Y + (lstSnake[i - 1].Height / 2), lstSnake[i - 1].Width, lstSnake[i - 1].Height);
((Body)lstSnake[i]).SetImage();
break;
case Direction.Down:
((Body)lstSnake[i]).SetBounds(lstSnake[i - 1].Location.X, lstSnake[i - 1].Location.Y - (lstSnake[i - 1].Height / 2), lstSnake[i - 1].Width, lstSnake[i - 1].Height);
((Body)lstSnake[i]).SetImage();
break;
}
}
}
}
}
解决方案
private void MoveSnake()
{
for (int i = lstSnake.Count - 1; i >= 0; i--)
{
if (i == 0)
{
switch (Settings.direction)
{
case Direction.Right:
((Head)lstSnake[i]).SetX(lstSnake[i].Location.X + lstSnake[i].Width);
((Head)lstSnake[i]).SetImage();
break;
case Direction.Left:
((Head)lstSnake[i]).SetX(lstSnake[i].Location.X - lstSnake[i].Width);
((Head)lstSnake[i]).SetImage();
break;
case Direction.Up:
((Head)lstSnake[i]).SetY(lstSnake[i].Location.Y - lstSnake[i].Height );
((Head)lstSnake[i]).SetImage();
break;
case Direction.Down:
((Head)lstSnake[i]).SetY(lstSnake[i].Location.Y + lstSnake[i].Height);
((Head)lstSnake[i]).SetImage();
break;
}
else
{
((Body)lstSnake[i]).SetBounds(lstSnake[i - 1].Location.X, lstSnake[i - 1].Location.Y, lstSnake[i - 1].Width, lstSnake[i - 1].Height);
((Body)lstSnake[i]).SetImage();
}
}
}
推荐阅读
- r - 如何创建函数以使用正则表达式替换数据框中的列名?
- sql - SQL交错多个有序表
- java - 尝试处理减号键时的自定义 JTextField 错误
- c# - 具有相同基类的泛型列表
- python - 如何在 python 中修复此错误:[<_io.TextIOWrapper name='states.txt' mode='r' encoding='ANSI_X3.4-1968'>]
- matlab - 如何使用 MATLAB 的 imextendedmin 和 skimage.morphology.extrema.h_minima
- android-studio - Android Studio & Big Sur 模拟器在启动 HVF 错误时崩溃?
- r - 如何将ggplot2应用于数据框中的每一行
- .net - .NET 中是否有*低*精度的 TimeSpan?
- directx-11 - 如何在directx 11中更新对象的颜色