c# - Picturebox.bounds.intersectswith 不起作用
问题描述
我正在编写一个看起来像 BattleCity 的游戏。我只使用 Picturebox 就让我的坦克能够发射导弹。但是,当我在敌方坦克上测试它时,它仍然无法正常工作,但仍然会相互通过。我怎样才能解决这个问题?
public void MissileCollision()
{
foreach (var EnemyTank in EnemyTankArray)
{
foreach(var Missile in missilesArray)
{
if (EnemyTank.Bounds.IntersectsWith(Missile.Bounds))
{
EnemyTank.Location = new Point(EnemyTank.Location.X + Position);
}
}
}
}
这段代码解释了当我击中敌人坦克时,它会回到顶部,其位置是在 X 坐标上随机生成的。
这实际上是完整的代码。
Boolean moveLeft = false;
Boolean moveRight = false;
List<PictureBox> missilesArray = new List<PictureBox>();
List<PictureBox> EnemyTankArray = new List<PictureBox>();
Boolean shoots = true;
Random rand = new Random();
int Position = 0;
public Game()
{
InitializeComponent();
}
public void enemyTank()
{
var EnemyTank = new PictureBox();
this.Controls.Add(EnemyTank);
EnemyTank.Width = 24;
EnemyTank.Height = 31;
Position = rand.Next(0, 286);
EnemyTank.Location = new Point(EnemyTank.Location.X + Position);
EnemyTank.BackgroundImage = Properties.Resources.EnemyTank_DOWN_v_1;
EnemyTank.BackgroundImageLayout = ImageLayout.Stretch;
EnemyTankArray.Add(EnemyTank);
EnemyTank.BringToFront();
}
public void createMissile()
{
var Missile = new PictureBox();
this.Controls.Add(Missile);
Missile.Width = 10;
Missile.Height = 10;
Missile.Top = MainTank.Top + MainTank.Height / 2 - Missile.Height / 2;
Missile.Left = MainTank.Left + MainTank.Width / 2 - Missile.Width / 2;
Missile.BackColor = Color.Black;
missilesArray.Add(Missile);
Missile.BringToFront();
}
public void MissileCollision()
{
foreach (var EnemyTank in EnemyTankArray)
{
foreach(var Missile in missilesArray)
{
if (EnemyTank.Bounds.IntersectsWith(Missile.Bounds))
{
EnemyTank.Location = new Point(EnemyTank.Location.X + Position);
}
}
}
}
private void MoveMainTank(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Space)
{
if (shoots == true)
{
createMissile();
}
}
if(e.KeyData == Keys.Left)
{
moveLeft = true;
}
if(e.KeyData == Keys.Right)
{
moveRight = true;
}
}
private void MoveSide(object sender, EventArgs e)
{
if(moveLeft == true)
{
shoots = false;
MainTank.Left -= 10;
MainTank.BackgroundImage = Properties.Resources.Tank_LEFT_v_1;
}
if (moveRight == true)
{
shoots = false;
MainTank.Left += 10;
MainTank.BackgroundImage = Properties.Resources.Tank_RIGHT_v_2;
}
}
private void StopMainTank(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Left)
{
shoots = true;
moveLeft = false;
MainTank.BackgroundImage = Properties.Resources.Tank_TOP_v_1;
}
if (e.KeyData == Keys.Right)
{
shoots = true;
moveRight = false;
MainTank.BackgroundImage = Properties.Resources.Tank_TOP_v_1;
}
}
private void Game_Load(object sender, EventArgs e)
{
enemyTank();
MainTankMoveLeftRight.Start();
shoot.Start();
MoveEnemyTank.Start();
MissileCollision();
}
private void ShootMissile(object sender, EventArgs e)
{
foreach(var Missile in missilesArray)
{
Missile.Top -= 10;
}
}
private void EnemyTankForward(object sender, EventArgs e)
{
foreach(var EnemyTank in EnemyTankArray)
{
EnemyTank.Top += 10;
}
}
}
}
因为foreach
我实际上是通过延迟产生更多的 EnemyTank,所以我稍后会处理这个问题,我想重点关注的是,当我这样编码时它没有做任何事情,请帮我解决这个问题。
解决方案
唯一的答案是我添加了一些计时器,MissileCollision
然后使用表单加载使其工作
推荐阅读
- android - 从文件管理器中选择多个文本文件
- swift - 视图无法正确适应键盘
- ios - 删除行后表视图具有旧索引 Swift
- swift - 如何将一个标签(mainStoryBoard)的数据传递给另一个标签(第二个故事板)
- javascript - Bootstrap轮播进度条手机问题
- ruby - 如何在 Ruby 中使用带引号的可打印编码正确解码字符串
- javascript - screen.height & screen.width 没有返回正确的值
- html - VueJS SPA 无法在 Microsoft Edge 上正确加载
- linux - 将文件从 Windows 传输到 Linux 而不使用 3rd 方软件并且仅使用 Shell.Application
- swift - 如何将 JSON 中的值添加到模型中,在下面的代码中