Reputation: 65
For some reason my enemy ship and enemy bullet are appearing with a white background even though they are transparent.
Mains cs
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 Example_Space_Game
{
/// <summary>
/// This is the main type for your game
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Random random = new Random();
public int enemyBulletDamage;
//List
List<Asteroid> asteroidList = new List<Asteroid>();
List<Enemy> enemyList = new List<Enemy>();
//Instantiating new player and objects
Player p = new Player();
Starfield sf = new Starfield();
//constructor
public Game1()
{
graphics = new GraphicsDeviceManager(this);
graphics.IsFullScreen = false;
graphics.PreferredBackBufferWidth = 800;
graphics.PreferredBackBufferHeight = 950;
this.Window.Title = " XNA - 2D Space Shooter ";
Content.RootDirectory = "Content";
enemyBulletDamage = 10;
}
//init
protected override void Initialize()
{
base.Initialize();
}
//Load Content
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
p.LoadContent(Content);
sf.LoadContent(Content);
}
//Unload Content
protected override void UnloadContent()
{
}
//Update
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
//Updating enemy's and checking collision of enemyship to playership
foreach (Enemy e in enemyList)
{
//check if enemyship is colliding with player
if(e.boundingBox.Intersects(p.boundingBox))
{
p.health -= 40;
e.isVisible = false;
}
//check enemy bullet collision with player ship
for(int i = 0; i < e.bulletList.Count; i++)
{
if(p.boundingBox.Intersects(e.bulletList[i].boundingBox))
{
p.health -= enemyBulletDamage;
e.bulletList[i].isVisible = false;
}
}
//check player bullet collision to enemy ship
for (int i = 0; i < p.bulletlist.Count; i++)
{
if(p.bulletlist[i].boundingBox.Intersects(e.boundingBox))
{
p.bulletlist[i].isVisible = false;
e.isVisible = false;
}
}
e.Update(gameTime);
}
//for each asteroid in our asteroidList, update it and check for collisions
foreach(Asteroid a in asteroidList)
{
//check to see if any of the asteroids are colliding with our playership, if they are... set invisible to false (remove then from our list)
if(a.boundingBox.Intersects(p.boundingBox))
{
p.health -= 20;
a.isVisible = false;
}
//iterate through our bulletList if any asteroid come in contacts with these bullets, destroyed bullet and asteroid
for (int i = 0; i < p.bulletlist.Count; i++)
{
if(a.boundingBox.Intersects(p.bulletlist[i].boundingBox))
{
a.isVisible = false;
p.bulletlist.ElementAt(i).isVisible = false;
}
}
a.Update(gameTime);
}
p.Update(gameTime);
sf.Update(gameTime);
LoadAsteroids();
LoadEnemies();
base.Update(gameTime);
}
//Draw Content
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
sf.Draw(spriteBatch);
p.Draw(spriteBatch);
foreach(Asteroid a in asteroidList)
{
a.Draw(spriteBatch);
}
foreach(Enemy e in enemyList)
{
e.Draw(spriteBatch);
}
spriteBatch.End();
base.Draw(gameTime);
}
//Load Asteroids
public void LoadAsteroids()
{
// Creating random variables for our x and y axis of our controls
int randY = random.Next(-600, -50);
int randX = random.Next(0, 750);
//if there are less than 5 asteroids on the screen, than create more until there is 5 again
if(asteroidList.Count() < 5)
{
asteroidList.Add(new Asteroid(Content.Load<Texture2D>("asteroid"), new Vector2(randX, randY)));
}
//if any of the enemies in the list were destroyed (or invisible), then remove from the list
for (int i = 0; i < asteroidList.Count; i++)
{
if(!asteroidList[i].isVisible)
{
asteroidList.RemoveAt(i);
i--;
}
}
}
//Load Enemies
public void LoadEnemies()
{
// Creating random variables for our x and y axis of our controls
int randY = random.Next(-600, -50);
int randX = random.Next(0, 750);
//if there are less than 3 enemies on the screen, than create more until there is 3 again
if(enemyList.Count() < 3)
{
enemyList.Add(new Enemy(Content.Load<Texture2D>("enemyship"), new Vector2(randX, randY), Content.Load<Texture2D>("EnemyBullet")));
}
//if any of the enemies in the list were destroyed (or invisible), then remove from the list
for (int i = 0; i < enemyList.Count; i++)
{
if(!enemyList[i].isVisible)
{
enemyList.RemoveAt(i);
i--;
}
}
}
}
}
Enemy cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
namespace Example_Space_Game
{
public class Enemy
{
public Rectangle boundingBox;
public Texture2D texture, bulletTexture;
public Vector2 position;
public int health, speed, bulletDelay, currentDifficultyLevel;
public bool isVisible;
public List<Bullet> bulletList;
//Constructor
public Enemy(Texture2D newTexture, Vector2 newPosition, Texture2D newBulletTexture)
{
bulletList = new List<Bullet>();
texture = newTexture;
bulletTexture = newBulletTexture;
health = 5;
position = newPosition;
currentDifficultyLevel = 1;
bulletDelay = 40;
speed = 5;
isVisible = true;
}
//Update
public void Update(GameTime gameTime)
{
//Update Collision rectangle
boundingBox = new Rectangle((int)position.X, (int)position.Y, texture.Width, texture.Height);
//Update enemy movement
position.Y += speed;
//Move enemy to top of the screen if he fly's off the bottom
if (position.Y >= 950)
position.Y = -75;
EnemyShoot();
UpdateBullets();
}
//Draw
public void Draw(SpriteBatch spriteBatch)
{
//Draw enemy ship
spriteBatch.Draw(texture, position, Color.White);
//Drwa enemy bullets
foreach (Bullet b in bulletList)
{
b.Draw(spriteBatch);
}
}
//Update bullet function
public void UpdateBullets()
{
//for each bullet in out bulletList: update the movement and if the bullet hits the top of the screen remove it from the list
foreach (Bullet b in bulletList)
{
//BoundingBox for every bullet in our bulletList
b.boundingBox = new Rectangle((int)b.position.X, (int)b.position.Y, b.texture.Width, b.texture.Height);
//set movement for bullet
b.position.Y = b.position.Y + b.speed;
//if bullet hits the top of the screen, then make visible false
if (b.position.Y >= 950)
b.isVisible = false;
}
//iterate through bulletList and see if any of the bullets are not visible, if they aren't then remove that bullet from out bullet list
for (int i = 0; i < bulletList.Count; i++)
{
if(!bulletList[i].isVisible)
{
bulletList.RemoveAt(i);
i--;
}
}
}
//enemy shoot function
public void EnemyShoot()
{
//Shoot only if the bulletdelay resets
if (bulletDelay >= 0)
bulletDelay--;
if(bulletDelay <= 0)
{
//create new bullet and position it front and centre of enemy ship
Bullet newBullet = new Bullet(bulletTexture);
newBullet.position = new Vector2(position.X + texture.Width / 2 - newBullet.texture.Width / 2, position.Y + 30);
newBullet.isVisible = true;
if (bulletList.Count() < 20)
bulletList.Add(newBullet);
}
//reset bullet delay
if (bulletDelay == 0)
bulletDelay = 40;
}
}
}
Bullet cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
namespace Example_Space_Game
{
//Main
public class Bullet
{
public Rectangle boundingBox;
public Texture2D texture;
public Vector2 origin;
public Vector2 position;
public bool isVisible;
public float speed;
//Constructor
public Bullet(Texture2D newTexture)
{
speed = 10;
texture = newTexture;
isVisible = false;
}
//Draw
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(texture, position, Color.White);
}
}
}
player cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
namespace Example_Space_Game
{
//main
public class Player
{
public Texture2D texture, bulletTexture, healthTexture;
public Vector2 position, healthbarPosition;
public int speed, health;
public float bulletDelay;
public Rectangle boundingBox, healthRectangle;
public bool IsColliding;
public List<Bullet> bulletlist;
//---Contructor---
public Player()
{
bulletlist = new List<Bullet>();
texture = null;
position = new Vector2(300, 300);
bulletDelay = 1;
speed = 10;
IsColliding = false;
health = 200;
healthbarPosition = new Vector2(50, 50);
}
//---Load Content---
public void LoadContent(ContentManager Content)
{
texture = Content.Load<Texture2D>("ship");
bulletTexture = Content.Load<Texture2D>("playerbullet");
healthTexture = Content.Load<Texture2D>("healthbar");
}
//---Draw---
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(texture, position, Color.White);
spriteBatch.Draw(healthTexture, healthRectangle, Color.White);
foreach (Bullet b in bulletlist)
b.Draw(spriteBatch);
}
//---Update---
public void Update(GameTime gameTime)
{
//Getting Keyboard State
KeyboardState keyState = Keyboard.GetState();
//BoundingBox for player ship
boundingBox = new Rectangle((int)position.X, (int)position.Y, texture.Width, texture.Height);
//Set rectangle for health bar
healthRectangle = new Rectangle((int)healthbarPosition.X,(int)healthbarPosition.Y, health, 25);
//Fire bullets
if(keyState.IsKeyDown(Keys.Space))
{
Shoot();
}
UpdateBullets();
//Ship Controls
if (keyState.IsKeyDown(Keys.W))
position.Y = position.Y - speed;
if (keyState.IsKeyDown(Keys.A))
position.X = position.X - speed;
if (keyState.IsKeyDown(Keys.S))
position.Y = position.Y + speed;
if (keyState.IsKeyDown(Keys.D))
position.X = position.X + speed;
//keep ship in scren bounds
if (position.X <= 0)
position.X = 0;
if (position.X >= 800 - texture.Width)
position.X = 800 - texture.Width;
if (position.Y <= 0)
position.Y = 0;
if (position.Y >= 950 - texture.Height)
position.Y = 950 - texture.Height;
}
//---Shoot Method: used to set starting position of our bullets---
public void Shoot()
{
//shoot only if bullet delay resets
if (bulletDelay >= 0)
bulletDelay--;
//if bullet delay is at 0: create a new bullet at player position, make it visible, then add the bulel to the list
if (bulletDelay <= 0)
{
Bullet newBullet = new Bullet(bulletTexture);
newBullet.position = new Vector2(position.X + 32 - newBullet.texture.Width / 2, position.Y + 30);
//Making bullet visible
newBullet.isVisible = true;
if (bulletlist.Count() < 20)
bulletlist.Add(newBullet);
}
//reset bullet delay
if (bulletDelay == 0)
bulletDelay = 20;
}
//---Update bullet function---
public void UpdateBullets()
{
//for each bullet in out bulletlist: update the movement and if the bullet hits the top of the screen remove it from the list
foreach (Bullet b in bulletlist)
{
//boundbox for our every bullet in our bulletlist
b.boundingBox = new Rectangle((int)b.position.X, (int)b.position.Y, b.texture.Width, b.texture.Height);
//set movement for bullet
b.position.Y = b.position.Y - b.speed;
//if bullet hits the top of the screen, then make visible false
if(b.position.Y<=0)
b.isVisible=false;
}
//Iterate through the bulletlist and see if any of the bullets are not visible, if they aren't remove that bullet from our bulletlist
for (int i = 0; i < bulletlist.Count; i++)
{
if (!bulletlist[i].isVisible)
{
bulletlist.RemoveAt(i);
i--;
}
}
}
}
}
Asteroid cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
namespace Example_Space_Game
{
public class Asteroid
{
public Rectangle boundingBox;
public Texture2D texture;
public Vector2 position;
public Vector2 origin;
public float rotationAngle;
public int speed;
public bool isVisible;
Random random = new Random();
public float randX, randY;
//Constructor
public Asteroid(Texture2D newTexture, Vector2 newPosition)
{
position = newPosition;
texture = newTexture;
speed = 4;
isVisible = true;
randX = random.Next(0, 750);
randY = random.Next(-600, -50);
}
//Load Content
public void LoadContent(ContentManager Content)
{
}
//Update
public void Update(GameTime gameTime)
{
//Set bounding box for collision
boundingBox=new Rectangle((int)position.X,(int)position.Y, 45, 45);
//updating origin for rotation
//origin.X = texture.Width / 2;
//origin.Y = texture.Height / 2;
//Udate Movement
position.Y = position.Y + speed;
if (position.Y>=950)
position.Y=-50;
//Rotate Asteroid
//float elapsed =(float)gameTime.ElapsedGameTime.TotalSeconds;
//rotationAngle += elapsed;
//float circle=MathHelper.Pi * 2;
//rotationAngle=rotationAngle % circle;
}
//Draw
public void Draw(SpriteBatch spriteBatch)
{
if(isVisible)
spriteBatch.Draw(texture, position, Color.White);
}
}
}
starfield cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
namespace Example_Space_Game
{
public class Starfield
{
public Texture2D texture;
public Vector2 bgPos1, bgPos2;
public int speed;
//Constructor
public Starfield()
{
texture=null;
bgPos1=new Vector2(0,0);
bgPos2 = new Vector2(0, -950);
speed=5;
}
//Load Content
public void LoadContent(ContentManager Content)
{
texture = Content.Load<Texture2D>("space");
}
//Draw
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(texture, bgPos1, Color.White);
spriteBatch.Draw(texture, bgPos2, Color.White);
}
//Update
public void Update(GameTime gametime)
{
//Setting speed for background scrolling
bgPos1.Y = bgPos1.Y + speed;
bgPos2.Y = bgPos2.Y + speed;
//Scrolling background (repeating)
if (bgPos1.Y >=950)
{
bgPos1.Y = 0;
bgPos2.Y = -950;
}
}
}
}
Above are all my code, not quite sure how to screenshot my game been played so you can see whats going on as well. But for some reason its just my enemy bullet and ship which are showing with a white background. I've checked them in photoshop they are transparent as are all of the rest of the images.
If anyone could be of any help would be very great ful thank you
Upvotes: 0
Views: 68
Reputation: 26
Instead of using
spriteBatch.Begin();
Try using
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);
AlphaBlend is "A built-in state object with settings for alpha blend that is blending the source and destination data using alpha."
Upvotes: 1