如何檢測與我的地圖的碰撞?我想檢測與我的地圖和我的車相撞。掃描顏色。如何檢測與顏色的碰撞?
在我的底圖上:軌道是灰色的,草地是白色的,牆壁是黃色的。
在我的上圖:軌道更現實,這是他們看到的。
我試過http://www.xnadevelopment.com/tutorials/theroadnottaken/theroadnottaken.shtml但是當我遇到碰撞時,代碼將無法工作。很多這些在XNA 4.0中不起作用,但它正是我可以使用的。
//This method checks to see if the Sprite is going to move into an area that does
//not contain all Gray pixels. If the move amount would cause a movement into a non-gray
//pixel, then a collision has occurred.
private bool CollisionOccurred(int aMove)
{
//Calculate the Position of the Car and create the collision Texture. This texture will contain
//all of the pixels that are directly underneath the sprite currently on the Track image.
float aXPosition = (float)(-mCarWidth/2 + mCarPosition.X + aMove * Math.Cos(mCarRotation));
float aYPosition = (float)(-mCarHeight/2 + mCarPosition.Y + aMove * Math.Sin(mCarRotation));
Texture2D aCollisionCheck = CreateCollisionTexture(aXPosition, aYPosition);
//Use GetData to fill in an array with all of the Colors of the Pixels in the area of the Collision Texture
int aPixels = mCarWidth * mCarHeight;
Color[] myColors = new Color[aPixels];
aCollisionCheck.GetData<Color>(0, new Rectangle((int)(aCollisionCheck.Width/2 - mCarWidth/2), (int)(aCollisionCheck.Height/2 - mCarHeight/2), mCarWidth, mCarHeight), myColors, 0, aPixels);
//Cycle through all of the colors in the Array and see if any of them
//are not Gray. If one of them isn't Gray, then the Car is heading off the road
//and a Collision has occurred
bool aCollision = false;
foreach (Color aColor in myColors)
{
//If one of the pixels in that area is not Gray, then the sprite is moving
//off the allowed movement area
if (aColor != Color.Gray)
{
aCollision = true;
break;
}
}
return aCollision;
}
第2部分
//Create the Collision Texture that contains the rotated Track image for determing
//the pixels beneath the Car srite.
private Texture2D CreateCollisionTexture(float theXPosition, float theYPosition)
{
//Grab a square of the Track image that is around the Car
graphics.GraphicsDevice.SetRenderTarget(0, mTrackRender);
graphics.GraphicsDevice.Clear(ClearOptions.Target, Color.Red, 0, 0);
mSpriteBatch.Begin();
mSpriteBatch.Draw(mTrack, new Rectangle(0, 0, mCarWidth + 100, mCarHeight + 100),
new Rectangle((int)(theXPosition - 50),
(int)(theYPosition - 50), mCarWidth + 100, mCarHeight + 100), Color.White);
mSpriteBatch.End();
graphics.GraphicsDevice.ResolveRenderTarget(0);
graphics.GraphicsDevice.SetRenderTarget(0, null);
Texture2D aPicture = mTrackRender.GetTexture();
//Rotate the snapshot of the area Around the car sprite and return that
graphics.GraphicsDevice.SetRenderTarget(0, mTrackRenderRotated);
graphics.GraphicsDevice.Clear(ClearOptions.Target, Color.Red, 0, 0);
mSpriteBatch.Begin();
mSpriteBatch.Draw(aPicture, new Rectangle((int)(aPicture.Width/2), (int)(aPicture.Height/2),
aPicture.Width, aPicture.Height), new Rectangle(0, 0, aPicture.Width, aPicture.Width),
Color.White, -mCarRotation, new Vector2((int)(aPicture.Width/2), (int)(aPicture.Height/2)), SpriteEffects.None, 0);
mSpriteBatch.End();
graphics.GraphicsDevice.ResolveRenderTarget(0);
graphics.GraphicsDevice.SetRenderTarget(0, null);
return mTrackRenderRotated.GetTexture();
}
你看過任何的MS遊戲教程嗎?碰撞通常是通過在對象周圍放置一個矩形並查看它是否與另一個對象(它周圍也有一個矩形)相交來完成的。 – gleng
您正在尋找'每像素碰撞檢測'。 – user1306322
不使用像素衝突,它是FPS和CPU殺手。使用矩形,圓形,多邊形碰撞。 –