夢がかなったXNA(7)-衝突検出
11066 ワード
[索引ページ] [ソースのダウンロード]
夢がかなったXNA(7)-衝突検出
作者:webabcd紹介XNA: 衝突検出は、AABB(Axis Aligned Bounding Box)によって衝突検出アルゴリズム を実現する.は、Rectangleクラスによる衝突検出アルゴリズム を実現する.
例1、AABBアルゴリズムのDemo(キーボードNキーでこのDemoをロードする)Component/Collision/AABB.cs
夢がかなったXNA(7)-衝突検出
作者:webabcd紹介XNA: 衝突検出
例1、AABBアルゴリズムのDemo(キーボードNキーでこのDemoをロードする)Component/Collision/AABB.cs
/*
* AABB - Axis Aligned Bounding Box
* (Axis Aligned), , (2D) (3D) ( )
*
* Demo AABB
*/
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
namespace XNA.Component.Collision
{
public class AABB : Microsoft.Xna.Framework.DrawableGameComponent
{
//
SpriteBatch _spriteBatch;
//
Texture2D _sprite;
// ( )
Vector2 _systemSpritePosition = new Vector2(600, 300);
// ( ), : /
int _systemSpriteSpeed = 6;
// ( )
Vector2 _userSpritePosition = Vector2.Zero;
// ( ), : /
int _userSpriteSpeed = 6;
//
bool _collided = false;
public AABB(Game game)
: base(game)
{
}
public override void Initialize()
{
base.Initialize();
}
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(Game.GraphicsDevice);
_sprite = Game.Content.Load<Texture2D>("Image/Son");
}
public override void Update(GameTime gameTime)
{
// ,
if (!CheckCollision())
{
calcSystemSpritePosition();
calcUserSpritePosition();
}
else
{
_collided = true;
}
base.Update(gameTime);
}
/// <summary>
/// ( AABB )
/// </summary>
/// <returns> </returns>
private bool CheckCollision()
{
/*
* , (2D) (3D)
* AABB Max Min ,
*/
Vector2 systemSpriteMin = new Vector2(_systemSpritePosition.X, _systemSpritePosition.Y);
Vector2 systemSpriteMax = new Vector2(_systemSpritePosition.X + _sprite.Width, _systemSpritePosition.Y + _sprite.Height);
Vector2 userSpriteMin = new Vector2(_userSpritePosition.X, _userSpritePosition.Y);
Vector2 userSpriteMax = new Vector2(_userSpritePosition.X + _sprite.Width, _userSpritePosition.Y + _sprite.Height);
if (systemSpriteMin.X <= userSpriteMax.X && systemSpriteMin.Y <= userSpriteMax.Y && systemSpriteMax.X >= userSpriteMin.X && systemSpriteMax.Y >= userSpriteMin.Y)
return true;
return false;
}
//
private void calcUserSpritePosition()
{
KeyboardState keyboardState = Keyboard.GetState();
if (keyboardState.IsKeyDown(Keys.Left) && _userSpritePosition.X >= 0)
_userSpritePosition.X -= _userSpriteSpeed;
if (keyboardState.IsKeyDown(Keys.Right) && _userSpritePosition.X <= Game.Window.ClientBounds.Width - _sprite.Width)
_userSpritePosition.X += _userSpriteSpeed;
if (keyboardState.IsKeyDown(Keys.Up) && _userSpritePosition.Y >= 0)
_userSpritePosition.Y -= _userSpriteSpeed;
if (keyboardState.IsKeyDown(Keys.Down) && _userSpritePosition.Y <= Game.Window.ClientBounds.Height - _sprite.Height)
_userSpritePosition.Y += _userSpriteSpeed;
}
//
private void calcSystemSpritePosition()
{
// Y
_systemSpritePosition.Y += _systemSpriteSpeed;
if (_systemSpritePosition.Y > Game.Window.ClientBounds.Height - _sprite.Height || _systemSpritePosition.Y < 0)
_systemSpriteSpeed *= -1;
}
public override void Draw(GameTime gameTime)
{
if (_collided)
Game.GraphicsDevice.Clear(Color.IndianRed);
else
Game.GraphicsDevice.Clear(Color.CornflowerBlue);
//
_spriteBatch.Begin();
_spriteBatch.Draw(_sprite, _systemSpritePosition, Color.Red); //
_spriteBatch.Draw(_sprite, _userSpritePosition, Color.White); //
_spriteBatch.End();
base.Update(gameTime);
}
}
}
2、通過する Rectangleが衝突を検出したDemo(キーボードOキーでこのDemoをロードする)Component/Collision/RectangleCollision.cs /*
* Demo Rectangle
*/
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
namespace XNA.Component.Collision
{
public class RectangleCollision : Microsoft.Xna.Framework.DrawableGameComponent
{
//
SpriteBatch _spriteBatch;
//
Texture2D _sprite;
// ( )
Vector2 _systemSpritePosition = new Vector2(600, 300);
// ( ), : /
int _systemSpriteSpeed = 6;
// ( )
Vector2 _userSpritePosition = Vector2.Zero;
// ( ), : /
int _userSpriteSpeed = 6;
//
bool _collided = false;
public RectangleCollision(Game game)
: base(game)
{
}
public override void Initialize()
{
base.Initialize();
}
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(Game.GraphicsDevice);
_sprite = Game.Content.Load<Texture2D>("Image/Son");
}
public override void Update(GameTime gameTime)
{
// ,
if (!CheckCollision())
{
calcSystemSpritePosition();
calcUserSpritePosition();
}
else
{
_collided = true;
}
base.Update(gameTime);
}
/// <summary>
/// ( Rectangle )
/// </summary>
/// <returns> </returns>
private bool CheckCollision()
{
Rectangle systemSpriteRect = new Rectangle((int)_systemSpritePosition.X, (int)_systemSpritePosition.Y, _sprite.Width, _sprite.Height);
Rectangle userSpriteRect = new Rectangle((int)_userSpritePosition.X, (int)_userSpritePosition.Y, _sprite.Width, _sprite.Height);
if (systemSpriteRect.Intersects(userSpriteRect))
return true;
return false;
}
//
private void calcUserSpritePosition()
{
KeyboardState keyboardState = Keyboard.GetState();
if (keyboardState.IsKeyDown(Keys.Left) && _userSpritePosition.X >= 0)
_userSpritePosition.X -= _userSpriteSpeed;
if (keyboardState.IsKeyDown(Keys.Right) && _userSpritePosition.X <= Game.Window.ClientBounds.Width - _sprite.Width)
_userSpritePosition.X += _userSpriteSpeed;
if (keyboardState.IsKeyDown(Keys.Up) && _userSpritePosition.Y >= 0)
_userSpritePosition.Y -= _userSpriteSpeed;
if (keyboardState.IsKeyDown(Keys.Down) && _userSpritePosition.Y <= Game.Window.ClientBounds.Height - _sprite.Height)
_userSpritePosition.Y += _userSpriteSpeed;
}
//
private void calcSystemSpritePosition()
{
// Y
_systemSpritePosition.Y += _systemSpriteSpeed;
if (_systemSpritePosition.Y > Game.Window.ClientBounds.Height - _sprite.Height || _systemSpritePosition.Y < 0)
_systemSpriteSpeed *= -1;
}
public override void Draw(GameTime gameTime)
{
if (_collided)
Game.GraphicsDevice.Clear(Color.IndianRed);
else
Game.GraphicsDevice.Clear(Color.CornflowerBlue);
//
_spriteBatch.Begin();
_spriteBatch.Draw(_sprite, _systemSpritePosition, Color.Red); //
_spriteBatch.Draw(_sprite, _userSpritePosition, Color.White); //
_spriteBatch.End();
base.Update(gameTime);
}
}
}
OK [ソースのダウンロード]