Root/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 | using System; using Axios.Engine.Interfaces; using FarseerPhysics.SamplesFramework; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using System.Diagnostics; namespace Axios.Engine { public class DrawableAxiosGameObject : AxiosGameObject, IDrawableAxiosGameObject { protected int _draworder; protected Texture2D Texture; protected bool _visible = true ; //public Vector2 Position = new Vector2(); //set this to a property and adjust if adjustunits is true public bool Visible { get { return _visible; } set { this ._visible = value; } } public Vector2 _position = Vector2.Zero; public Vector2 Position { get { //Debugger.Break(); return ConvertUnits.ToDisplayUnits(_position); } set { _position = value; } } public Vector2 RealPosition { get { return _position; } private set { } } public Vector2 Origin = new Vector2(); protected bool _adjustunits = true ; protected bool _relativetocamera = true ; protected float _rotation; public float Rotation { get { return _rotation; } set { _rotation = value; } } public bool AdjustUnits //if value changed - change position depending on adjusting the units { get { return _adjustunits; } set { _adjustunits = value; } } public bool RelativeToCamera { get { return _relativetocamera; } set { _relativetocamera = value; } } public int Width { get { return this .Texture.Width; } private set { } } public int Height { get { return this .Texture.Height; } private set { } } public override void LoadContent(AxiosGameScreen gameScreen) { base .LoadContent(gameScreen); } public virtual void Draw(AxiosGameScreen gameScreen, GameTime gameTime) { //System.Diagnostics.Debugger.Break(); //Vector2 test = ConvertUnits.ToDisplayUnits(_position); if (_visible) { if (_relativetocamera) gameScreen.ScreenManager.SpriteBatch.Begin(0, null , null , null , null , null , gameScreen.Camera.View); else gameScreen.ScreenManager.SpriteBatch.Begin(); if (_adjustunits) gameScreen.ScreenManager.SpriteBatch.Draw(Texture, ConvertUnits.ToDisplayUnits(_position), null , Color.White, _rotation, Origin, _scale, SpriteEffects.None, 0); else gameScreen.ScreenManager.SpriteBatch.Draw(Texture, _position, null , Color.White, _rotation, Origin, _scale, SpriteEffects.None, 0); gameScreen.ScreenManager.SpriteBatch.End(); } } public int DrawOrder { get { return this ._draworder; } set { this ._draworder = value; } } //Copied/adapted from http://create.msdn.com/en-US/education/catalog/tutorial/collision_2d_perpixel /// <summary> /// This method is a very simple collision detection based on textures. /// While Farseer (Box2D) is an excellent physics engine - it doesn't know, or care, about the textures. /// This method does a AABB test and if that is true - it tests the individual pixels in the textures. /// </summary> /// <param name="obj">Object to test against</param> /// <returns>true if the object is colliding, false if it isn't</returns> public bool CollidesWith(DrawableAxiosGameObject obj) { Rectangle thisobj = new Rectangle(( int ) this .Position.X, ( int ) this .Position.Y, this .Texture.Width, this .Texture.Height); Rectangle otherobj = new Rectangle(( int )obj.Position.X, ( int )obj.Position.Y, obj.Texture.Width, obj.Texture.Height); if (thisobj.Intersects(otherobj)) { int top = Math.Max(thisobj.Top, otherobj.Top); int bottom = Math.Min(thisobj.Bottom, otherobj.Bottom); int left = Math.Max(thisobj.Left, otherobj.Left); int right = Math.Min(thisobj.Right, otherobj.Right); Color[] thisobjcolor = new Color[ this .Texture.Width * this .Texture.Height]; Color[] otherobjcolor = new Color[obj.Texture.Width * obj.Texture.Height]; Texture.GetData(thisobjcolor); obj.Texture.GetData(otherobjcolor); // Check every point within the intersection bounds for ( int y = top; y < bottom; y++) { for ( int x = left; x < right; x++) { // Get the color of both pixels at this point Color colorA = thisobjcolor[(x - thisobj.Left) + (y - thisobj.Top) * thisobj.Width]; Color colorB = otherobjcolor[(x - otherobj.Left) + (y - otherobj.Top) * otherobj.Width]; // If both pixels are not completely transparent, if (colorA.A != 0 && colorB.A != 0) { // then an intersection has been found return true ; } } } } return false ; } //Copied/adapted from http://create.msdn.com/en-US/education/catalog/tutorial/collision_2d_perpixel /// <summary> /// This method is a very simple collision detection based on textures. /// While Farseer (Box2D) is an excellent physics engine - it doesn't know, or care, about the textures. /// This method does a AABB test and if that is true - it tests the individual pixels in the textures. /// </summary> /// <param name="obj">Object to test against</param> /// <returns>true if the object is colliding, false if it isn't</returns> public bool CollidesWith(Vector2 pos, Rectangle rect) { Rectangle thisobj = new Rectangle(( int ) this .Position.X, ( int ) this .Position.Y, this .Texture.Width, this .Texture.Height); Rectangle otherobj = new Rectangle(( int )pos.X, ( int )pos.Y, rect.Width, rect.Height); Texture2D obj = new Texture2D(Texture.GraphicsDevice, rect.Width, rect.Height); Color[] arr = new Color[rect.Width * rect.Height]; for ( int i = 0; i < rect.Width * rect.Height; ++i) arr[i] = Color.Black; obj.SetData(arr); if (thisobj.Intersects(otherobj)) { int top = Math.Max(thisobj.Top, otherobj.Top); int bottom = Math.Min(thisobj.Bottom, otherobj.Bottom); int left = Math.Max(thisobj.Left, otherobj.Left); int right = Math.Min(thisobj.Right, otherobj.Right); Color[] thisobjcolor = new Color[ this .Texture.Width * this .Texture.Height]; Color[] otherobjcolor = new Color[obj.Width * obj.Height]; Texture.GetData(thisobjcolor); obj.GetData(otherobjcolor); // Check every point within the intersection bounds for ( int y = top; y < bottom; y++) { for ( int x = left; x < right; x++) { // Get the color of both pixels at this point Color colorA = thisobjcolor[(x - thisobj.Left) + (y - thisobj.Top) * thisobj.Width]; Color colorB = otherobjcolor[(x - otherobj.Left) + (y - otherobj.Top) * otherobj.Width]; // If both pixels are not completely transparent, if (colorA.A != 0 && colorB.A != 0) { // then an intersection has been found return true ; } } } } return false ; } } } |
Source at commit fa778c206e78 created 12 years 7 months ago. By Nathan Adams, * - Adding visible flag to DrawableAxiosGameObject |
---|