/// <summary> /// Creates Power Upp component and adds it to an entity /// </summary> /// <param name="id"></param> public void OnPowerUpPicup(int id) { BallOfSpikesPowerUpComponent temp = ComponentManager.Instance.GetEntityComponent <BallOfSpikesPowerUpComponent>(id); if (temp == null) { ComponentManager test = ComponentManager.Instance; BallOfSpikesPowerUpComponent ball = new BallOfSpikesPowerUpComponent(5); DrawableComponent newDraw = test.GetEntityComponent <DrawableComponent>(id); AnimationComponent anima = test.GetEntityComponent <AnimationComponent>(id); ball.prevTexture = newDraw.texture; newDraw.texture = ball.SpikeTexture; if (anima != null) { ball.anime = anima; ComponentManager.Instance.RemoveComponentFromEntity(id, anima); } test.AddComponentToEntity(id, ball); CollisionRectangleComponent rec = ComponentManager.Instance.GetEntityComponent <CollisionRectangleComponent>(id); PositionComponent pos = ComponentManager.Instance.GetEntityComponent <PositionComponent>(id); rec.CollisionRec = new Rectangle((int)pos.position.X, (int)pos.position.Y, newDraw.texture.Width, newDraw.texture.Height); rec.CollisionRec.X = (int)pos.position.X; rec.CollisionRec.Y = (int)pos.position.Y; rec.CollisionRec.Width = newDraw.texture.Width; rec.CollisionRec.Height = newDraw.texture.Height; } else { temp.lifeTime += 10; } }
/// <summary> /// Updates the collision rectangles of all collision components /// </summary> private void updatecolRec() { List <int> CollisionComp = ComponentManager.Instance.GetAllEntitiesWithComponentType <CollisionComponent>(); if (CollisionComp != null) { foreach (var item in CollisionComp) { CollisionRectangleComponent rec = ComponentManager.Instance.GetEntityComponent <CollisionRectangleComponent>(item); PositionComponent pos = ComponentManager.Instance.GetEntityComponent <PositionComponent>(item); DrawableComponent draw = ComponentManager.Instance.GetEntityComponent <DrawableComponent>(item); AnimationComponent ani = ComponentManager.Instance.GetEntityComponent <AnimationComponent>(item); if (ani != null && draw != null) { rec.CollisionRec = new Rectangle((int)pos.position.X, (int)pos.position.Y, ani.sourceRectangle.Width, ani.sourceRectangle.Height); } if (draw != null && ani == null) { rec.CollisionRec.X = (int)pos.position.X; rec.CollisionRec.Y = (int)pos.position.Y; rec.CollisionRec.Width = draw.texture.Width; rec.CollisionRec.Height = draw.texture.Height; } else { rec.CollisionRec.X = (int)pos.position.X; rec.CollisionRec.Y = (int)pos.position.Y; } } } }
/// <summary> /// Creates an new Player with Controlls /// </summary> /// <param name="pixlePer"> True if pixelPerfect shall be used </param> /// <param name="GamePade"> True if GamePad the player uses a gamepad </param> /// <param name="PadJump"> Key binding to gamePad </param> /// <param name="Jump"> key binding to keybord </param> /// <param name="position"> Player start Position </param> /// <param name="name"> The name off the player</param> /// <param name="dir"> The players starting direction</param> /// <param name="index"> Playerindex For GamePad </param> /// <returns></returns> public int CreatePlayer(bool pixlePer, bool GamePade, Buttons PadJump, Keys Jump, Vector2 position, string name, Direction dir, PlayerIndex index, Color colour) { SpriteEffects flip; GamePadComponent gam; KeyBoardComponent kcb; int id = ComponentManager.Instance.CreateID(); if (dir == Direction.Left) { flip = SpriteEffects.FlipHorizontally; } else { flip = SpriteEffects.None; } if (GamePade == true) { gam = new GamePadComponent(index); gam.gamepadActions.Add(ActionsEnum.Jump, PadJump); ComponentManager.Instance.AddComponentToEntity(id, gam); } else { kcb = new KeyBoardComponent(); kcb.keyBoardActions.Add(ActionsEnum.Jump, Jump); ComponentManager.Instance.AddComponentToEntity(id, kcb); } DirectionComponent dc = new DirectionComponent(dir); DrawableComponent comp = new DrawableComponent(Game.Instance.GetContent <Texture2D>("Pic/kanin1"), flip); PositionComponent pos = new PositionComponent(position); VelocityComponent vel = new VelocityComponent(new Vector2(200F, 0), 50F); JumpComponent jump = new JumpComponent(300F, 200F); CollisionRectangleComponent CRC = new CollisionRectangleComponent(new Rectangle((int)pos.position.X, (int)pos.position.Y, comp.texture.Width, comp.texture.Height)); CollisionComponent CC = new CollisionComponent(pixlePer); PlayerComponent pc = new PlayerComponent(name); DrawableTextComponent dtc = new DrawableTextComponent(name, Color.Black, Game.Instance.GetContent <SpriteFont>("Fonts/TestFont")); HUDComponent hudc = new HUDComponent(Game.Instance.GetContent <Texture2D>("Pic/PowerUp"), new Vector2(pos.position.X, pos.position.Y)); HUDComponent hudc2 = new HUDComponent(Game.Instance.GetContent <Texture2D>("Pic/PowerUp"), Vector2.One); HealthComponent hc = new HealthComponent(3, false); //AnimationComponent ani = new AnimationComponent(100, 114, comp.texture.Width, comp.texture.Height, 0.2); comp.colour = colour; ComponentManager.Instance.AddComponentToEntity(id, vel); ComponentManager.Instance.AddComponentToEntity(id, comp); ComponentManager.Instance.AddComponentToEntity(id, pos); ComponentManager.Instance.AddComponentToEntity(id, CRC); ComponentManager.Instance.AddComponentToEntity(id, CC); ComponentManager.Instance.AddComponentToEntity(id, pc); ComponentManager.Instance.AddComponentToEntity(id, dtc); ComponentManager.Instance.AddComponentToEntity(id, hudc); ComponentManager.Instance.AddComponentToEntity(id, hc); //ComponentManager.Instance.AddComponentToEntity(id, ani); ComponentManager.Instance.AddComponentToEntity(id, dc); ComponentManager.Instance.AddComponentToEntity(id, jump); return(id); }
/// <summary> /// Handles player versus platform collision /// </summary> /// <param name="Player"> Id of the player entity </param> /// <param name="Platform"> Id of the platform entity </param> private void PlayerVsPlatformColl(int Player, int Platform, GameTime gameTime) { PlayerComponent playComp = ComponentManager.Instance.GetEntityComponent <PlayerComponent>(Player); DirectionComponent dc = ComponentManager.Instance.GetEntityComponent <DirectionComponent>(Player); VelocityComponent pvc = ComponentManager.Instance.GetEntityComponent <VelocityComponent>(Player); PositionComponent ppc = ComponentManager.Instance.GetEntityComponent <PositionComponent>(Player); CollisionRectangleComponent pcrc = ComponentManager.Instance.GetEntityComponent <CollisionRectangleComponent>(Player); PlatformComponent pc = ComponentManager.Instance.GetEntityComponent <PlatformComponent>(Platform); HealthComponent hc = ComponentManager.Instance.GetEntityComponent <HealthComponent>(Player); if (!playComp.isFalling) { if (pcrc.CollisionRec.Intersects(pc.TopRec)) // @TODO tänk om gällande pixlePerfect, kanske { //@todo hur fan ska man ta bort n om spelarn hoppar ifrån eller blir nerputtad if (!ComponentManager.Instance.CheckIfEntityHasComponent <TTLComponent>(Player)) { TTLComponent ttl = new TTLComponent(5f); ComponentManager.Instance.AddComponentToEntity(Player, ttl); } else { TTLComponent ttl = ComponentManager.Instance.GetEntityComponent <TTLComponent>(Player); if (ttl.curTime >= ttl.maxTime) { playComp.isFalling = true; //hc.health -= 1; ComponentManager.Instance.RemoveComponentFromEntity(Player, ttl); } } changeDir(dc); if (dc.directio != Direction.Still) { dc.preDir = dc.directio; dc.directio = Direction.Still; } pvc.velocity.Y = 0; pvc.velocity.Y -= 500 * (float)gameTime.ElapsedGameTime.TotalSeconds; } else { if (dc.directio != Direction.Still) { changeDir(dc); dc.preDir = dc.directio; dc.directio = Direction.Still; } pvc.velocity.Y = 0; pvc.velocity.Y += 500 * (float)gameTime.ElapsedGameTime.TotalSeconds; playComp.isFalling = true; ComponentManager.Instance.AddComponentToEntity(Player, new SoundEffectComponent("pfhit")); //hc.health -= 1; } } }
/// <summary> /// Creates a border rectangle /// </summary> /// <param name="pos"></param> /// <param name="width"></param> /// <param name="height"></param> /// <param name="side"></param> /// <returns></returns> public int CreateBorderRecs(Vector2 pos, int width, int height, Wall side) { PositionComponent PC = new PositionComponent(pos); CollisionRectangleComponent CRC = new CollisionRectangleComponent(new Rectangle((int)pos.X, (int)pos.Y, width, height)); CollisionComponent CC = new CollisionComponent(false); WallComponent wc = new WallComponent(side); int id = ComponentManager.Instance.CreateID(); ComponentManager.Instance.AddComponentToEntity(id, PC); ComponentManager.Instance.AddComponentToEntity(id, CRC); ComponentManager.Instance.AddComponentToEntity(id, CC); ComponentManager.Instance.AddComponentToEntity(id, wc); return(id); }
/// <summary> /// /// </summary> /// <param name="dir"></param> /// <param name="position"></param> /// <param name="pixlePer"></param> /// <param name="name"></param> /// <returns></returns> public int CreateAIPlayer(Direction dir, Vector2 position, bool pixlePer, string name, Color colour) { SpriteEffects flip; if (dir == Direction.Left) { flip = SpriteEffects.FlipHorizontally; } else { flip = SpriteEffects.None; } DirectionComponent dc = new DirectionComponent(dir); DrawableComponent comp = new DrawableComponent(Game.Instance.GetContent <Texture2D>("Pic/Helmutsh"), flip); PositionComponent pos = new PositionComponent(position); VelocityComponent vel = new VelocityComponent(new Vector2(200F, 0), 50F); JumpComponent jump = new JumpComponent(300F, 50F); CollisionRectangleComponent CRC = new CollisionRectangleComponent(new Rectangle((int)pos.position.X, (int)pos.position.Y, comp.texture.Width, comp.texture.Height)); CollisionComponent CC = new CollisionComponent(pixlePer); DrawableTextComponent dtc = new DrawableTextComponent(name, Color.Yellow, Game.Instance.GetContent <SpriteFont>("Fonts/NewTestFont")); HUDComponent hudc = new HUDComponent(Game.Instance.GetContent <Texture2D>("Pic/PowerUp"), new Vector2(pos.position.X, pos.position.Y)); HUDComponent hudc2 = new HUDComponent(Game.Instance.GetContent <Texture2D>("Pic/PowerUp"), Vector2.One); HealthComponent hc = new HealthComponent(3, false); AnimationComponent ani = new AnimationComponent(75, 75, comp.texture.Width, comp.texture.Height, 0.2); AIComponent ai = new AIComponent(); PlayerComponent play = new PlayerComponent(name); comp.colour = colour; int id = ComponentManager.Instance.CreateID(); ComponentManager.Instance.AddComponentToEntity(id, vel); ComponentManager.Instance.AddComponentToEntity(id, comp); ComponentManager.Instance.AddComponentToEntity(id, pos); ComponentManager.Instance.AddComponentToEntity(id, CRC); ComponentManager.Instance.AddComponentToEntity(id, CC); ComponentManager.Instance.AddComponentToEntity(id, dtc); ComponentManager.Instance.AddComponentToEntity(id, hudc); ComponentManager.Instance.AddComponentToEntity(id, hc); ComponentManager.Instance.AddComponentToEntity(id, ani); ComponentManager.Instance.AddComponentToEntity(id, dc); ComponentManager.Instance.AddComponentToEntity(id, jump); ComponentManager.Instance.AddComponentToEntity(id, play); ComponentManager.Instance.AddComponentToEntity(id, ai); return(id); }
/// <summary> /// Creates an new PowerUpp /// </summary> /// <param name="position"></param> /// <returns></returns> public int CreateTestPowerUp(Vector2 position) { Random rand = new Random(); PositionComponent Pc = new PositionComponent(position); PowerUppComponent power = new PowerUppComponent(rand.Next(1, 3)); DrawableComponent powerupp = new DrawableComponent(Game.Instance.GetContent <Texture2D>("Pic/Powerupbox"), SpriteEffects.None); CollisionRectangleComponent CRC = new CollisionRectangleComponent(new Rectangle((int)position.X, (int)position.Y, powerupp.texture.Width, powerupp.texture.Height)); CollisionComponent CC = new CollisionComponent(true); int id = ComponentManager.Instance.CreateID(); ComponentManager.Instance.AddComponentToEntity(id, CRC); ComponentManager.Instance.AddComponentToEntity(id, CC); ComponentManager.Instance.AddComponentToEntity(id, Pc); ComponentManager.Instance.AddComponentToEntity(id, power); ComponentManager.Instance.AddComponentToEntity(id, powerupp); return(id); }
/// <summary> /// Creates a platform at the specified position with the specified lenght, width and Texture; /// </summary> /// <param name="pos"></param> /// <param name="texture"></param> /// <param name="width"></param> /// <param name="height"></param> /// <returns> the id of the created platform identity </returns> public int CreatePlatform(Vector2 pos, string texture, int width, int height) { PositionComponent Pc = new PositionComponent(pos); DrawableComponent DC = new DrawableComponent(Game.Instance.GetContent <Texture2D>("Pic/" + texture), SpriteEffects.None); CollisionRectangleComponent CRC = new CollisionRectangleComponent(new Rectangle((int)pos.X, (int)pos.Y, width, height)); CollisionComponent CC = new CollisionComponent(false); PlatformComponent Plc = new PlatformComponent(pos, width, height); Plc.RedoRecs(pos, DC.texture.Width, DC.texture.Height); int id = ComponentManager.Instance.CreateID(); ComponentManager.Instance.AddComponentToEntity(id, CRC); ComponentManager.Instance.AddComponentToEntity(id, CC); ComponentManager.Instance.AddComponentToEntity(id, Pc); ComponentManager.Instance.AddComponentToEntity(id, DC); ComponentManager.Instance.AddComponentToEntity(id, Plc); return(id); }
public int CreateChangeCube(Vector2 position, string texture, int width, int height) { int id = ComponentManager.Instance.CreateID(); ChangeCubeComponent cdc = new ChangeCubeComponent(); PositionComponent pos = new PositionComponent(position); CollisionComponent col = new CollisionComponent(false); CollisionRectangleComponent colRec = new CollisionRectangleComponent(new Rectangle((int)position.X, (int)position.Y, width, height)); DrawableComponent draw = new DrawableComponent(Game.Instance.GetContent <Texture2D>(texture), SpriteEffects.None); AnimationComponent ani = new AnimationComponent(50, 50, draw.texture.Width, draw.texture.Height, 0.08f); ani.oneTime = true; ComponentManager.Instance.AddComponentToEntity(id, cdc); ComponentManager.Instance.AddComponentToEntity(id, pos); ComponentManager.Instance.AddComponentToEntity(id, col); ComponentManager.Instance.AddComponentToEntity(id, colRec); ComponentManager.Instance.AddComponentToEntity(id, draw); ComponentManager.Instance.AddComponentToEntity(id, ani); return(id); }
/// <summary> /// check if two entities has collided with each other /// using bounding rectangle /// </summary> /// <param name="entity1"> Id of entity 1 </param> /// <param name="entity2"> Id of entity 2 </param> /// <returns> /// true if bounding rectangle collision occured /// and false if no collision or physics is not enabled /// </returns> private bool RectangleCollision(int entity1, int entity2) { CollisionRectangleComponent recA = ComponentManager.Instance.GetEntityComponent <CollisionRectangleComponent>(entity1); CollisionRectangleComponent recB = ComponentManager.Instance.GetEntityComponent <CollisionRectangleComponent>(entity2); if (recA == null || recB == null) { return(false); } Rectangle rectangleA = recA.CollisionRec; Rectangle rectangleB = recB.CollisionRec; if (rectangleA.Intersects(rectangleB)) { return(true); } else { return(false); } }
/// <summary> /// Handles Player versus Wall collision /// </summary> /// <param name="Player"> Id of the player entity </param> /// <param name="WallEnt"> Id of the wall entity </param> private void PlayerVsWallColl(int Player, int WallEnt, GameTime gameTime) { PlayerComponent playerComp = ComponentManager.Instance.GetEntityComponent <PlayerComponent>(Player); VelocityComponent pvc = ComponentManager.Instance.GetEntityComponent <VelocityComponent>(Player); DirectionComponent pdc = ComponentManager.Instance.GetEntityComponent <DirectionComponent>(Player); CollisionRectangleComponent crc1 = ComponentManager.Instance.GetEntityComponent <CollisionRectangleComponent>(WallEnt); CollisionRectangleComponent crc2 = ComponentManager.Instance.GetEntityComponent <CollisionRectangleComponent>(Player); PositionComponent pc = ComponentManager.Instance.GetEntityComponent <PositionComponent>(Player); PositionComponent pcwall = ComponentManager.Instance.GetEntityComponent <PositionComponent>(WallEnt); WallComponent wall = ComponentManager.Instance.GetEntityComponent <WallComponent>(WallEnt); if (wall.wall == Wall.LeftWall) { if (crc2.CollisionRec.X + crc2.CollisionRec.Width * 0.5 < crc1.CollisionRec.X) { pc.position.X = Game.Instance.GraphicsDevice.Viewport.Width - 1 - crc2.CollisionRec.Width * 0.5f; } } else if (wall.wall == Wall.RightWall) { if (crc2.CollisionRec.X + crc2.CollisionRec.Width * 0.5 > crc1.CollisionRec.X) { pc.position.X = 1 - crc2.CollisionRec.Width * 0.5f; } } else if (wall.wall == Wall.TopWall && !playerComp.isFalling) { if (pdc.directio != Direction.Still) { changeDir(pdc); pdc.preDir = pdc.directio; pdc.directio = Direction.Still; } pvc.velocity.Y = 0; pvc.velocity.Y += 500 * (float)gameTime.ElapsedGameTime.TotalSeconds; playerComp.isFalling = true; HealthComponent hc = ComponentManager.Instance.GetEntityComponent <HealthComponent>(Player); //hc.health -= 1; } else if (wall.wall == Wall.BottomWall) { //@TODO // only loose life when the player jump on the floor, not when the player falls to the ground // and have some kind of timer unti you can jump away OnFloorComponent fc = ComponentManager.Instance.GetEntityComponent <OnFloorComponent>(Player); playerComp.isFalling = false; if (pdc.directio != Direction.Still) { pvc.velocity.Y = 0; changeDir(pdc); pdc.preDir = pdc.directio; pdc.directio = Direction.Still; } //else if(pdc.directio == Direction.Still) //{ // pvc.velocity.Y = 0; //} pvc.velocity.Y = 0; pvc.velocity.Y -= 500F * (float)gameTime.ElapsedGameTime.TotalSeconds; HealthComponent hc = ComponentManager.Instance.GetEntityComponent <HealthComponent>(Player); if (fc == null) { fc = new OnFloorComponent(); ComponentManager.Instance.AddComponentToEntity(Player, fc); hc.health -= 1; ComponentManager.Instance.AddComponentToEntity(Player, new SoundEffectComponent("splat")); } } }
/// <summary> /// A method for handling player versus player collision /// </summary> /// <param name="ent1"> ID of entity 1 </param> /// <param name="ent2"> ID of entity 2 </param> /// <param name="gt"></param> private void PlayerVsPlayerCollision(int ent1, int ent2, GameTime gt) { PlayerComponent pcp1 = ComponentManager.Instance.GetEntityComponent <PlayerComponent>(ent1); PlayerComponent pcp2 = ComponentManager.Instance.GetEntityComponent <PlayerComponent>(ent2); PositionComponent pos1 = ComponentManager.Instance.GetEntityComponent <PositionComponent>(ent1); PositionComponent pos2 = ComponentManager.Instance.GetEntityComponent <PositionComponent>(ent2); CollisionRectangleComponent crc1 = ComponentManager.Instance.GetEntityComponent <CollisionRectangleComponent>(ent1); CollisionRectangleComponent crc2 = ComponentManager.Instance.GetEntityComponent <CollisionRectangleComponent>(ent2); DirectionComponent dcp1 = ComponentManager.Instance.GetEntityComponent <DirectionComponent>(ent1); DirectionComponent dcp2 = ComponentManager.Instance.GetEntityComponent <DirectionComponent>(ent2); VelocityComponent vcp1 = ComponentManager.Instance.GetEntityComponent <VelocityComponent>(ent1); VelocityComponent vcp2 = ComponentManager.Instance.GetEntityComponent <VelocityComponent>(ent2); BallOfSpikesPowerUpComponent bspc1 = ComponentManager.Instance.GetEntityComponent <BallOfSpikesPowerUpComponent>(ent1); BallOfSpikesPowerUpComponent bspc2 = ComponentManager.Instance.GetEntityComponent <BallOfSpikesPowerUpComponent>(ent2); if (pos1.position.Y + crc1.CollisionRec.Height * 0.5f < pos2.position.Y) { // entity 1 is above entity 2 if (!pcp1.isFalling && !pcp2.isFalling) { if (dcp2.directio != Direction.Still) { changeDir(dcp2); dcp2.preDir = dcp2.directio; dcp2.directio = Direction.Still; } vcp2.velocity.Y = 0; vcp1.velocity.Y = -200f; ComponentManager.Instance.AddComponentToEntity(ent2, new SoundEffectComponent("hit")); ComponentManager.Instance.AddComponentToEntity(ent1, new SoundEffectComponent("grunt")); //if enitity 2 dosent have ballofspikePUPcomponent loose life if (bspc2 == null) { HealthComponent hc2 = ComponentManager.Instance.GetEntityComponent <HealthComponent>(ent2); //hc2.health -= 1; pcp2.isFalling = true; } //else if enitity 1 dosent have ballofspikePUPcomponent loose life else if (bspc1 == null) { HealthComponent hc1 = ComponentManager.Instance.GetEntityComponent <HealthComponent>(ent1); //hc1.health -= 1; pcp1.isFalling = true; } } } else if (pos2.position.Y + crc2.CollisionRec.Height * 0.5f < pos1.position.Y) { // entity 2 is above entity 1 if (!pcp1.isFalling && !pcp2.isFalling) { if (dcp1.directio != Direction.Still) { changeDir(dcp1); dcp1.preDir = dcp1.directio; dcp1.directio = Direction.Still; } vcp1.velocity.Y = 0; vcp2.velocity.Y = -200f; ComponentManager.Instance.AddComponentToEntity(ent1, new SoundEffectComponent("hit")); ComponentManager.Instance.AddComponentToEntity(ent2, new SoundEffectComponent("grunt")); //if enitity 1 dosent have ballofspikePUPcomponent loose life if (bspc1 == null) { HealthComponent hc1 = ComponentManager.Instance.GetEntityComponent <HealthComponent>(ent1); //hc1.health -= 1; pcp1.isFalling = true; } //else if enitity 2 dosent have ballofspikePUPcomponent loose life else if (bspc2 == null) { HealthComponent hc2 = ComponentManager.Instance.GetEntityComponent <HealthComponent>(ent2); //hc2.health -= 1; pcp2.isFalling = true; } } } else // both are on the same "level" { if (!pcp2.isFalling && !pcp1.isFalling) { if (dcp1.directio != Direction.Still) { changeDir(dcp1); dcp1.preDir = dcp1.directio; dcp1.directio = Direction.Still; } vcp1.velocity.Y = 0; if (dcp2.directio != Direction.Still) { changeDir(dcp2); dcp2.preDir = dcp2.directio; dcp2.directio = Direction.Still; } vcp2.velocity.Y = 0; ComponentManager.Instance.AddComponentToEntity(ent2, new SoundEffectComponent("sidehit")); ComponentManager.Instance.AddComponentToEntity(ent1, new SoundEffectComponent("sidehit")); //If enitity 1 dosent have ballofspikePUPcomponent loose life if (bspc1 == null) { HealthComponent hc1 = ComponentManager.Instance.GetEntityComponent <HealthComponent>(ent1); //hc1.health -= 1; pcp1.isFalling = true; } //If enitity 2 dosent have ballofspikePUPcomponent loose life if (bspc2 == null) { HealthComponent hc2 = ComponentManager.Instance.GetEntityComponent <HealthComponent>(ent2); //hc2.health -= 1; pcp2.isFalling = true; } pushAway(ent1, ent2, gt); } } }
/// <summary> /// Checks if two entities has collided with each other /// using pixel perfect /// </summary> /// <param name="entity1"> Id of entity 1 </param> /// <param name="entity2"> Id of entity 2 </param> /// <returns> /// True if pixel perfect collision occurred /// and false if no collision or physics is not enabled /// </returns> private bool PixelPerfectCollision(int entity2, int entity1) { Rectangle Source1; Rectangle Source2; CollisionRectangleComponent recA = ComponentManager.Instance.GetEntityComponent <CollisionRectangleComponent>(entity1); CollisionRectangleComponent recB = ComponentManager.Instance.GetEntityComponent <CollisionRectangleComponent>(entity2); Rectangle rectangleA = recA.CollisionRec; Rectangle rectangleB = recB.CollisionRec; if (!rectangleA.Intersects(rectangleB)) { return(false); } DrawableComponent ent1 = ComponentManager.Instance.GetEntityComponent <DrawableComponent>(entity1); DrawableComponent ent2 = ComponentManager.Instance.GetEntityComponent <DrawableComponent>(entity2); if (ComponentManager.Instance.CheckIfEntityHasComponent <AnimationComponent>(entity1)) { AnimationComponent ani = ComponentManager.Instance.GetEntityComponent <AnimationComponent>(entity1); Source1 = ani.sourceRectangle; } else { Source1 = ent1.texture.Bounds; } if (ComponentManager.Instance.CheckIfEntityHasComponent <AnimationComponent>(entity2)) { AnimationComponent ani = ComponentManager.Instance.GetEntityComponent <AnimationComponent>(entity2); Source2 = ani.sourceRectangle; } else { Source2 = ent2.texture.Bounds; } Color[] dataA = new Color[ent1.texture.Width * ent1.texture.Height]; ent1.texture.GetData(dataA); Color[] dataB = new Color[ent2.texture.Width * ent2.texture.Height]; ent2.texture.GetData(dataB); Color[] realDataA = GetImageData(dataA, ent1.texture.Width, Source1); Color[] realDataB = GetImageData(dataB, ent2.texture.Width, Source2); Rectangle its = Rectangle.Intersect(rectangleA, rectangleB); for (int y = its.Top; y < its.Bottom; y++) { for (int x = its.Left; x < its.Right; x++) { // Get the color of both pixels at this point Color colorA = realDataA[(x - rectangleA.Left) + (y - rectangleA.Top) * rectangleA.Width]; Color colorB = realDataB[(x - rectangleB.Left) + (y - rectangleB.Top) * rectangleB.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); }