Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 矩形交点_C#_Xna - Fatal编程技术网

C# 矩形交点

C# 矩形交点,c#,xna,C#,Xna,我最近开始开发XNA,在过去有一些(非常有限的)经验,我决定尝试制作一个Pong克隆,看看我能记住多少。我知道的大部分都回到了我的脑海,但我在球拍和球之间的碰撞检测方面遇到了问题。我设置了3个矩形来更新我正在使用的精灵的位置,当球矩形与球棒矩形相交时,我将球的X速度乘以-1。然而,这会产生一种不寻常的效果,球在球棒周围反弹,如所示。我在这里做错了什么 以下是该项目的代码(我知道,很差): 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用M

我最近开始开发XNA,在过去有一些(非常有限的)经验,我决定尝试制作一个Pong克隆,看看我能记住多少。我知道的大部分都回到了我的脑海,但我在球拍和球之间的碰撞检测方面遇到了问题。我设置了3个矩形来更新我正在使用的精灵的位置,当球矩形与球棒矩形相交时,我将球的X速度乘以-1。然而,这会产生一种不寻常的效果,球在球棒周围反弹,如所示。我在这里做错了什么

以下是该项目的代码(我知道,很差):

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用Microsoft.Xna.Framework;
使用Microsoft.Xna.Framework.Audio;
使用Microsoft.Xna.Framework.Content;
使用Microsoft.Xna.Framework.GamerServices;
使用Microsoft.Xna.Framework.Graphics;
使用Microsoft.Xna.Framework.Input;
使用Microsoft.Xna.Framework.Media;
名称空间Pong
{
公共类游戏1:Microsoft.Xna.Framework.Game
{
图形管理器图形;
SpriteBatch SpriteBatch;
System.Random generator=新随机数();
纹理2d球;
纹理2d-bat1;
纹理2d-bat2;
纹理2d中部;
向量2中间位置;
向量2 bat1Pos;
向量2 bat2Pos;
向量2-ballPos;
向量2 ballVelo;
公共游戏1()
{
graphics=新的GraphicsDeviceManager(此);
Content.RootDirectory=“Content”;
}
受保护的覆盖无效初始化()
{
base.Initialize();
}
受保护的覆盖void LoadContent()
{
//创建一个新的SpriteBatch,可用于绘制纹理。
spriteBatch=新spriteBatch(图形设备);
//加载精灵
球=内容物负载(@“精灵/庞巴球”);
bat1=内容加载(@“精灵/庞巴特”);
bat2=内容加载(@“精灵/庞巴特”);
中间=内容加载(@“sprites/pongmiddle”);
//设置默认精灵位置
midPos.X=(Window.ClientBounds.Width/2)-5;
中间位置Y=0;
bat1Pos.X=10;
bat1Pos.Y=(Window.ClientBounds.Height/2)-50;
bat2Pos.X=Window.ClientBounds.Width-20;
bat2Pos.Y=(Window.ClientBounds.Height/2)-50;
ballPos.X=(Window.ClientBounds.Width/2)-5;
ballPos.Y=(Window.ClientBounds.Height/2)-5;
//生成随机球速度
ballVelo.X=发电机。下一个(5,10);
ballVelo.Y=生成器.Next(4,7);
}
受保护的覆盖无效UnloadContent()
{
}
受保护覆盖无效更新(游戏时间游戏时间)
{
//更新矩形值
矩形bat1Rect=新矩形((int)bat1Pos.X,(int)bat1Pos.Y,10100);
矩形bat2Rect=新矩形((int)bat2Pos.X,(int)bat2Pos.Y,10100);
矩形ballRect=新矩形((int)ballPos.X,(int)ballPos.Y,10100);
//移动球
ballPos+=ballVelo;
//允许游戏退出
if(GamePad.GetState(PlayerIndex.One).Buttons.Back==ButtonState.Pressed)
这是Exit();
if(Keyboard.GetState().IsKeyDown(Keys.Escape))
这是Exit();
//蝙蝠1移动和限制
if(Keyboard.GetState().IsKeyDown(Keys.Up))
bat1Pos.Y-=4;
if(Keyboard.GetState().IsKeyDown(Keys.Down))
bat1Pos.Y+=4;
if(bat1Pos.Y=Window.ClientBounds.Height-100)
bat1Pos.Y=Window.ClientBounds.Height-100;
//蝙蝠2移动和限制
if(Keyboard.GetState().IsKeyDown(Keys.W))
bat2Pos.Y-=4;
if(Keyboard.GetState().IsKeyDown(Keys.S))
bat2Pos.Y+=4;
if(bat2Pos.Y=Window.ClientBounds.Height-100)
bat2Pos.Y=Window.ClientBounds.Height-100;
//球的移动限制
if(ballPos.X=Window.ClientBounds.Height-5)
ballVelo.Y*=-1;
//球拍与球的碰撞检测
if(球直相交(bat1Rect))
{
ballVelo.X*=-1;
}
if(ballRect.相交(bat2Rect))
{
ballVelo.X*=-1;
}
更新(游戏时间);
}
受保护覆盖无效绘制(游戏时间游戏时间)
{
图形设备。清晰(颜色。黑色);
spriteBatch.Begin();
spriteBatch.Draw(中间、中间位置、颜色、白色);
spriteBatch.Draw(bat1、bat1Pos、彩色、白色);
spriteBatch.Draw(bat2,bat2Pos,彩色.白色);
spriteBatch.Draw(球、球、颜色、白色);
spriteBatch.End();
基础。抽签(游戏时间);
}
}
}

解决此问题的一种方法是对您的
ballRect.Intersect(barXRect))
if语句进行以下更改:

    if (ballRect.Intersects(bat1Rect))
    {
        ballVelo.X = Math.Abs(ballVelo.X) * -1;
    }

    if (ballRect.Intersects(bat2Rect))
    {
        ballVelo.X = Math.Abs(ballVelo.X);
    }

这样,左栏只会将球传向右侧,右栏只会将球传向左侧。我可能有错误的方向,所以最好是再次检查,但这只意味着将
*-1
移动到另一个bat。

一种方法是对
ballRect.Intersect(barXRect))
if语句进行以下更改:

    if (ballRect.Intersects(bat1Rect))
    {
        ballVelo.X = Math.Abs(ballVelo.X) * -1;
    }

    if (ballRect.Intersects(bat2Rect))
    {
        ballVelo.X = Math.Abs(ballVelo.X);
    }

这样,左栏只会将球传向右侧,右栏只会将球传向左侧。我可能有错误的方式周围的酒吧,所以它可能是最好的双重检查,但这只是意味着移动
*-1
到另一个蝙蝠。

Lyise的解决方案将工作,但它不会攻击问题的实际根源。在更大的游戏中,您将需要一个更健壮的解决方案,因此我将解释高级修复

问题是,当球仍在球棒内时,您正在改变X速度。在下一帧中,最可能的结果是球将移开,但不足以离开球棒,因此检测到新的碰撞。速度再次改变,循环重复,直到球从球棒下方或上方离开球棒

精确解