public bool PixelCollition(Pengo pengo) { int top = Math.Max(hitbox.Top, pengo.hitbox.Top); int bottom = Math.Min(hitbox.Bottom, pengo.hitbox.Bottom); int left = Math.Max(hitbox.Left, pengo.hitbox.Left); int right = Math.Min(hitbox.Right, pengo.hitbox.Right); for (int y = top; y < bottom; y++) { for (int x = left; x < right; x++) { Color colorA = texData[texture.Width * (y - hitbox.Y) + x - hitbox.X]; int index = pengo.texture.Width * (y - pengo.hitbox.Y + pengo.srcRect.Y) + x - pengo.hitbox.X + pengo.srcRect.X; Color colorB = pengo.texData[index]; if (colorA.A + colorB.A > 256) { return true; } } } return false; }
private void ObjectFactory(char objectChar, char option, int row, int col, int tileSize, Point startPos) { Vector2 pos = new Vector2(tileSize * col + startPos.X, tileSize * row + startPos.Y); switch (objectChar) { case 'F': FloorTile ft = new FloorTile(iceTile, pos); floortile.Add(ft); spriteBatchObjects.Add(ft); break; case 'S': pengoRespawnPos = pos; pengo = new Pengo(penguin, pos); spriteBatchObjects.Add(pengo); break; case 'W': WaterTile wt = new WaterTile(waterTile, pos); watertile.Add(wt); spriteBatchObjects.Add(wt); break; case 'T': Trap trp = new Trap(spike, pos); trap.Add(trp); spriteBatchObjects.Add(trp); break; case 'E': enemy = new Enemy(snowball, pos); spriteBatchObjects.Add(enemy); break; case 'L': Ladder ldr = new Ladder(ladderTile, pos); ladder.Add(ldr); spriteBatchObjects.Add(ldr); break; case 'M': OptionCollisionTile mt = new OptionCollisionTile(waterTile, pos, option, handleOptionDelegate); menuTiles.Add(mt); spriteBatchObjects.Add(mt); break; case 'B': int optionValue = option == '0' ? 0 : 1; backgrounds.EnableBackground(option * Convert.ToInt32(Math.Pow(2, col))); break; } }