为贪吃蛇之类的游戏添加多个控件
add Multiple controls for a Game like Snake
为了学习,当然为了好玩,我正在建造一个模仿蛇的模型,唯一的区别应该是地图上会出现很多敌人或物体,而不是无尽的链条,游戏应该变得更多和比较难。
代码片段应该显示我如何创建我的控件,但我有一个问题,只有最后创建的控件实际上被我的“IntersectsWith”捕获,所有之前创建的控件,以及第一个一个,对我来说不再是任何对手,我的球员只是通过他们。
执行此操作的最佳方法是什么,以便可以在一个定义下找到所有创建的对象,这样我就不必编写数百个 IntersectsWith If 语句。
我想学习如何动态创建控件并动态地直接访问它们,我的玩家可以在其中通过碰撞与它们交互。
我真的以为我可以用一个随机字符生成器来解决这个问题,不同的控件名称可以解决这个问题,但是唉-事实并非如此^^
Random rnd = new Random();
PictureBox Enemy = new PictureBox();
private async void timer1_Tick(object sender, EventArgs e)
{
if (Person.Bounds.IntersectsWith(Food.Bounds))
{
int ascii_index2 = rnd.Next(97, 123);
char char1 = Convert.ToChar(ascii_index2);
char char2 = Convert.ToChar(ascii_index2);
string myletter = Convert.ToString(char1) + Convert.ToString(char2);
Enemy = new PictureBox
{
Location = new Point(rnd.Next(20, playground.Right - 20), rnd.Next(20, playground.Bottom - 20)),
Name = "Enemy" + myletter,
Size = new Size(24,24),
BackColor = Color.Red,
};
this.Controls.Add(Enemy);
Enemy.BringToFront();
Food.Location = new Point(rnd.Next(20, playground.Right - 20), rnd.Next(20, playground.Bottom - 20));
score++;
lbScore.Text = "Score: " + score.ToString();
}
if(Person.Bounds.IntersectsWith(Enemy.Bounds))
{
timer1.Stop();
}
if (Person.Left <= playground.Left && !changed)
{
Person.Location = new Point(playground.Right, Person.Location.Y);
changed = true;
}
else
if (Person.Right >= playground.Right && !changed)
{
Person.Location = new Point(playground.Left, Person.Location.Y);
changed = true;
}
else
if (Person.Top <= playground.Top && !changed)
{
Person.Location = new Point(Person.Location.X, playground.Bottom);
changed = true;
}
else
if (Person.Bottom >= playground.Bottom && !changed)
{
Person.Location = new Point(Person.Location.X, playground.Top);
changed = true;
}
这是我的图片:Player = BlackDot,Food = GreenDot,Enemy = RedDot
它会按照您点击的方向自动移动,如果您按住 Key 可以移动得更快。
移动键:W,A,S,D
假设 Person
是您的玩家,而不是 enemy
类型 PictureBox
字段,而是 enemies
类型 List<PictureBox>
字段。然后,您将每个新敌人 PictureBox
添加到该列表,然后您可以这样做:
if (enemies.Any(enemy => person.Bounds.IntersectsWith(enemy.Bounds))
您需要创建一个列表并将所有创建的敌人存储在其中。
首先你需要创建一个列表:
List<PictureBox> enemyList = new List<PictureBox>();
创建新敌人后将其添加到您的列表
Enemy = new PictureBox{};
enemieList.add(Enemy);
因为这样您就可以检查此列表中的每个 PictureBox 以及它是否与您的播放器相交。
foreach(PictureBox p in enemyList)
{
if(Person.Bounds.IntersectsWith(p.Bounds))
{
timer1.Stop();
}
}
这将是我对您问题的快速解决方案。
为了学习,当然为了好玩,我正在建造一个模仿蛇的模型,唯一的区别应该是地图上会出现很多敌人或物体,而不是无尽的链条,游戏应该变得更多和比较难。
代码片段应该显示我如何创建我的控件,但我有一个问题,只有最后创建的控件实际上被我的“IntersectsWith”捕获,所有之前创建的控件,以及第一个一个,对我来说不再是任何对手,我的球员只是通过他们。
执行此操作的最佳方法是什么,以便可以在一个定义下找到所有创建的对象,这样我就不必编写数百个 IntersectsWith If 语句。
我想学习如何动态创建控件并动态地直接访问它们,我的玩家可以在其中通过碰撞与它们交互。
我真的以为我可以用一个随机字符生成器来解决这个问题,不同的控件名称可以解决这个问题,但是唉-事实并非如此^^
Random rnd = new Random();
PictureBox Enemy = new PictureBox();
private async void timer1_Tick(object sender, EventArgs e)
{
if (Person.Bounds.IntersectsWith(Food.Bounds))
{
int ascii_index2 = rnd.Next(97, 123);
char char1 = Convert.ToChar(ascii_index2);
char char2 = Convert.ToChar(ascii_index2);
string myletter = Convert.ToString(char1) + Convert.ToString(char2);
Enemy = new PictureBox
{
Location = new Point(rnd.Next(20, playground.Right - 20), rnd.Next(20, playground.Bottom - 20)),
Name = "Enemy" + myletter,
Size = new Size(24,24),
BackColor = Color.Red,
};
this.Controls.Add(Enemy);
Enemy.BringToFront();
Food.Location = new Point(rnd.Next(20, playground.Right - 20), rnd.Next(20, playground.Bottom - 20));
score++;
lbScore.Text = "Score: " + score.ToString();
}
if(Person.Bounds.IntersectsWith(Enemy.Bounds))
{
timer1.Stop();
}
if (Person.Left <= playground.Left && !changed)
{
Person.Location = new Point(playground.Right, Person.Location.Y);
changed = true;
}
else
if (Person.Right >= playground.Right && !changed)
{
Person.Location = new Point(playground.Left, Person.Location.Y);
changed = true;
}
else
if (Person.Top <= playground.Top && !changed)
{
Person.Location = new Point(Person.Location.X, playground.Bottom);
changed = true;
}
else
if (Person.Bottom >= playground.Bottom && !changed)
{
Person.Location = new Point(Person.Location.X, playground.Top);
changed = true;
}
这是我的图片:Player = BlackDot,Food = GreenDot,Enemy = RedDot 它会按照您点击的方向自动移动,如果您按住 Key 可以移动得更快。 移动键:W,A,S,D
假设 Person
是您的玩家,而不是 enemy
类型 PictureBox
字段,而是 enemies
类型 List<PictureBox>
字段。然后,您将每个新敌人 PictureBox
添加到该列表,然后您可以这样做:
if (enemies.Any(enemy => person.Bounds.IntersectsWith(enemy.Bounds))
您需要创建一个列表并将所有创建的敌人存储在其中。
首先你需要创建一个列表:
List<PictureBox> enemyList = new List<PictureBox>();
创建新敌人后将其添加到您的列表
Enemy = new PictureBox{};
enemieList.add(Enemy);
因为这样您就可以检查此列表中的每个 PictureBox 以及它是否与您的播放器相交。
foreach(PictureBox p in enemyList)
{
if(Person.Bounds.IntersectsWith(p.Bounds))
{
timer1.Stop();
}
}
这将是我对您问题的快速解决方案。