spritemanager.cs

来自「Beginning C# Game Programming 的源代码」· CS 代码 · 共 79 行

CS
79
字号
using System;
using System.Collections;
using System.Drawing;
using Microsoft.DirectX;
using D3D = Microsoft.DirectX.Direct3D;

namespace SpaceDonuts {
	/// <summary>
	/// Handles management (life/death/updating) of sprites, also handles simple collision detection
	/// </summary>
	public class SpriteManager {
		private ArrayList sprites;

		public delegate void HandleCollision(BasicSprite sprite1, BasicSprite sprite2);
		public event HandleCollision OnCollisionDetected;
	
		Rectangle world = new Rectangle(0,0,640,480);
		private bool bounceSprites = true;

		public SpriteManager() {
			sprites = new ArrayList();
		}

		public void Clear() {
			sprites = new ArrayList();
		}

		public void AddSprite(BasicSprite TargetSprite) {
			sprites.Add(TargetSprite);
		}

		public void Update(float DeltaTime) {
			for (int i = 0; i < sprites.Count; i++) {
				BasicSprite sprite = (BasicSprite)sprites[i];
				sprite.Update(DeltaTime);
				if (sprite.DurationOver) 
					sprites.RemoveAt(i);
				else
					if (bounceSprites) sprite.BoundaryCheck(world);
			}
		}

		public void Draw(D3D.Device device) {
			using (D3D.Sprite d3dSprite = new D3D.Sprite(device)) {
				d3dSprite.Begin(D3D.SpriteFlags.AlphaBlend);
				foreach (BasicSprite sprite in sprites) {
					sprite.Draw(d3dSprite);
				}
				d3dSprite.End();
			}
		}

		public void CollisionTest() {
			//iterate through first half of sprites for complete collision coverage
			for (int i = 0; i < sprites.Count ; i++) {
				BasicSprite sprite1 = (BasicSprite)sprites[i];
				if (sprite1.CanCollide && sprite1.Visible) {
					int sprite1Height = sprite1.CollisionyExtent;
					int sprite1Width = sprite1.CollisionxExtent;
					for (int j = 0; j < sprites.Count; j++) {
						BasicSprite sprite2 = (BasicSprite)sprites[j];
						if (sprite2.Visible && !sprite2.CanCollide) { //don't check two collidable sprites
							int sprite2Height = sprite2.CollisionyExtent;
							int sprite2Width = sprite2.CollisionxExtent;
							//Simple AABB Collision Check
							float deltaX = Math.Abs(sprite1.PositionX-sprite2.PositionX);
							float deltaY = Math.Abs(sprite1.PositionY-sprite2.PositionY);
							if ((deltaX <= (sprite2Width + sprite1Width) && 
								(deltaY <= (sprite2Height + sprite1Height) ) )) {
								OnCollisionDetected(sprite1, sprite2); //invoke delegate
							}
						}
					}
				}
			}
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?