【问题标题】:How to do image collision in C# for Windows Phone 8 using Windows Phone App?如何使用 Windows Phone App 在 C# for Windows Phone 8 中进行图像冲突?
【发布时间】:2013-06-27 01:50:28
【问题描述】:

我有 2 张图片(条形图和 greenBall1)。 bar 可以上下移动取决于用户的反应。同时,greenBall1 在屏幕上移动。如果两个图像相互接触,我想做一个图像碰撞,greenBall1 会改变它的速度。我对 greenBall1 的代码如下。

 private void OnUpdate(object sender, object e)
 {
         Canvas.SetLeft(this.GreenBall1, this.greenBallVelocityX + Canvas.GetLeft(this.GreenBall1));
         Canvas.SetTop(this.GreenBall1, this.greenBallVelocityY + Canvas.GetTop(this.GreenBall1));



        var greenBallPositionX1 = Canvas.GetLeft(this.GreenBall1);
         var greenBallPositionY1 = Canvas.GetTop(this.GreenBall1);



        var maximumGreenBallX = ActualWidth - this.GreenBall1.ActualWidth;
         var maximumGreenBallY = 400 - this.GreenBall1.ActualHeight; //Improvise: Instead of 360, get maximum height of canvas



        if (greenBallPositionX1 > maximumGreenBallX || greenBallPositionX1 < 0)
         {
             this.greenBallVelocityX *= -1;
         }



        if (greenBallPositionY1 > maximumGreenBallY || greenBallPositionY1 < 0)
         {
             this.greenBallVelocityY *= -1;
         }
      }

【问题讨论】:

标签: c# xaml visual-studio-2012 windows-phone-8 windows-phone


【解决方案1】:

我在您的代码中没有看到对 bar 对象的引用。但是碰撞的检测比处理碰撞的物理要容易得多。对于像 Pong 碰撞这样简单的事情有多种思想流派,您选择处理它的方式取决于您想要的游戏玩法。

这是一种检测和处理碰撞的简单方法,只需在处理墙壁碰撞时取消 X 速度:

if(greenBallPositionX1 < leftBar.X || greenBallPositionX1 > rightBar.X)
{
    this.greenBallVelocityX *= -1;
}

请记住,您可能还需要考虑条形或球的宽度,具体取决于坐标相对于图像的位置。例如:

if(greenBallPositionX1 < (leftBar.X + leftBar.Width) || greenBallPositionX1 > rightBar.X)
{
    this.greenBallVelocityX *= -1;
}

此时您可能还希望将球从桨叶移开一步,以避免多次检测到碰撞。

希望这能回答您的问题,但如果您正在寻找对碰撞检测更复杂的反应,那么您可能需要查看以下关于 Pong 类型碰撞here 的讨论。

【讨论】:

  • 我打算让条形图上下移动。但截至目前,我还没有这样做。我可以知道我应该将 X 声明为什么吗?我遇到一个错误,说“System.Windows.Controls”不包含“X”的定义,并且没有扩展方法“X”接受类型的第一个参数。
  • @Gwenda.T 对不起,我使用 X 好像对象 leftBar 具有 X 位置属性。使用您现在拥有代码的方式,如果您愿意,您可以改用相同的模式:“var leftBarPositionX = Canvas.GetLeft(this.LeftBar);”
  • @Gwenda.T 您是否能够调试并设置断点以查看球的位置是否超过了条形位置并设置了速度?与墙壁的碰撞目前有效吗?
  • 我所做的是声明leftBarPositionX。对于 if 语句,我使用了 if(greenBallPositionX1
  • @Gwenda.T 应该是 *= -1。
【解决方案2】:

我认为这可能对您有所帮助....

            Rectangle ballRect = new Rectangle((int)ballposition.X, (int)ballposition.Y, ballsprite.Width, ballsprite.Height);

            Rectangle handRect = new Rectangle((int)paddlePosition.X, (int)paddlePosition.Y, paddleSprite.Width, paddleSprite.Height/2);

            if (ballRect.Intersects(handRect))
            {
                // Increase ball speed
                ballSpeed.Y += 50;

                if (ballSpeed.X < 0)
                    ballSpeed.X -= 50;

                else
                    ballSpeed.X += 50;

                // Send ball back up the screen

                ballSpeed.Y *= -1;
            }

在这种情况下,每当球与手发生碰撞时,它都会增加它的速度并改变它的方向,我认为这就是你正在寻找的想法,因为它也是一个矩形碰撞。

【讨论】:

  • 我不想使用 XNA。你还有什么想法吗?
  • 你为什么不想使用 XNA ?只是询问,因为这将是最好的方法,因为在 XNA 中很容易检测到碰撞..
  • 有人告诉我不要使用它。 XNA 是兼容的,但 Microsoft 不再支持它。
  • XNA 不再受支持,因为它不兼容多分辨率,但您可以使用 monogame,因为它使用 XNA 框架并受支持...这对您来说将是一个不错的选择..
  • 我知道这是一个不错的选择,而且可能是最好的方法。但是我的讲师告诉我不要使用它。
【解决方案3】:

创建一个类,它可以为您提供两个矩形是否会碰撞的值

    public bool Intersects(Rect r1,Rect r2)
    {
      r1.Intersect(r2);

      if(r1.IsEmpty)
      {
        return false;
      }
      else 
      {
        return true;
      }
    }

那么你可以使用

if(Intersects(r1,r2))
{
  MessageBox.Show("Collison Detected");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多