Reputation: 65
For my XNA game, when I my shark hits my sprite, the sprite goes to the edge of the screen and not completely disappears, not matter what I put the distance to when they collide the sprites always goes to the edge of the screen.
Heres my intersection code in my update game method: foreach (Sprite crew1 in crew)
{
if (c.bounds.Intersects(crew1.bounds))
{
//gameState = State.Gameover;
playerScore += 1;
crew1.bounds.X = 1000000;
crew1.bounds.Y = 1000000;
crew1.location.Y = 1000000;
crew1.location.X = 1000000;
break;
}
} break;
Heres my sprite class:
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 PickUpTheCrewGame
{
class Sprite
{
public Vector2 location;
public Vector2 velocity;//this hold the sprite movement
public Texture2D image;
public Rectangle bounds;//inventing the boundaries using rectange variable
public Color col = Color.White;
int maxVel = 600;
public Sprite(Vector2 location, Texture2D image, Color clr)
{
this.location = location;
this.image = image;
this.col = clr;
//----setting the boundaries of the screen to match the window-----
bounds = new Rectangle((int)location.X, (int)location.Y, 64, 64);
}
public Sprite(Vector2 location, Texture2D image)
{
this.location = location;
this.image = image;
//----setting the boundaries of the screen to match the window-----
bounds = new Rectangle((int)location.X, (int)location.Y, 64, 64);
}
public Sprite(Vector2 location,Vector2 vel, Texture2D image, Color clr)
{
this.location = location;
this.velocity = vel;
this.image = image;
this.col = clr;
//----setting the boundaries of the screen to match the window-----
bounds = new Rectangle((int)location.X, (int)location.Y, 64, 64);
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(image, location, col);
}
/// <summary>
/// Update method, anything attributes which need to be
/// assigneed to the sprites are here
/// </summary>
/// <param name="elapsed"></param>
public void Update(float elapsed)
{
//----sets the speed for the players----
location += velocity * elapsed;
//-------initialising the boundaries for the screen-----
bounds.X = (int)location.X;
bounds.Y = (int)location.Y;
//--------Posotive velocity---------
if (velocity.X > maxVel)
velocity.X = maxVel;
if (velocity.Y > maxVel)
velocity.Y = maxVel;
//----Negative velocity-------
if (velocity.X < -maxVel)
velocity.X = -maxVel;
if (velocity.Y < -maxVel)
velocity.Y = -maxVel;
//------adding friction to the AI------
velocity = velocity * 0.9f;
//-------Assigning the boundaries-----
if (bounds.Left < 0)
location.X = 0;
if (bounds.Top < 0)
location.Y = 0;
if (bounds.Right > 1280)
location.X = 1280 - bounds.Width;
if (bounds.Bottom > 720)
location.Y = 720 - bounds.Height;
}
public void Accelerate(Vector2 direction)
{
//-----normalises is to get a unit vector (40 is force), normal is direction
velocity += 20 * Vector2.Normalize(direction);
}
}
}
Heres my whole (main.cs) code:
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;
using System.IO;
using System.Text;
namespace PickUpTheCrewGame
{
/// <summary>
/// This is the main type for your game
/// </summary>
public class PickUpTheCrewGame : Microsoft.Xna.Framework.Game
{
// states for the enums
public enum State
{
Menu,
Playing,
Gameover,
}
//Setting the variables
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
SpriteFont messageFont;
SpriteFont playerScoreFont;
Texture2D backgroundTexture;
Rectangle backgroundRectangle;
Texture2D menuImageTexture;
Rectangle menuImageRectange;
Texture2D gameoverImageTexture;
Rectangle gameoverImageRectangle;
Sprite BlueBall;
Sprite GreenBall;
Sprite OrangeBall;
Sprite PinkBall;
Sprite RedBall;
Sprite c;
Sprite YellowBall;
public Texture2D menuImage;
public Texture2D gameoverImage;
//---player scoresyer
int playerScore = 0;
int highScore = 0;
//Lists
List<sharks> sharks = new List<sharks>();
List<Sprite> crew = new List<Sprite>();
List<int> highscoreList = new List<int>();
//Set First State
State gameState = State.Menu;
HUD hud = new HUD();
/// <summary>
/// Constructor for the PickUpTheCrew Game
/// </summary>
public PickUpTheCrewGame()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
//sreen size
graphics.PreferredBackBufferWidth = 1280;
graphics.PreferredBackBufferHeight = 720;
menuImage = null;
gameoverImage = null;
}
/// <summary>
/// Allows the game to perform any initialization it needs to before starting to run.
/// This is where it can query for any required services and load any non-graphic
/// related content. Calling base.Initialize will enumerate through any components
/// and initialize them as well.
/// </summary>
protected override void Initialize()
{
// TODO: Add your initialization logic here
//enable the mousepointer
//IsMouseVisible = true;
base.Initialize();
}
/// <summary>
/// Highscore method
/// </summary>
/// <returns></returns>
public bool IsHighScore()
{
if (playerScore > hud.highScore)
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// Writing the Save File
/// </summary>
/// <param name="filename"></param>
public void Save(string filename)
{
System.IO.TextWriter textOut = null;
try
{
textOut = new System.IO.StreamWriter(filename);
Save(textOut);
}
catch (Exception e)
{
throw e;
}
finally
{
if (textOut != null) textOut.Close();
}
}
/// <summary>
/// Saving the information into the save file
/// </summary>
/// <param name="textOut"></param>
private void Save(TextWriter textOut)
{
try
{
foreach (Sprite crew1 in crew)
{
textOut.WriteLine(crew1.location.X);
textOut.WriteLine(crew1.location.Y);
}
foreach (sharks enemySprite in sharks)
{
//textOut.WriteLine("Shark");
textOut.WriteLine(enemySprite.location.X);
textOut.WriteLine(enemySprite.location.Y);
}
}
catch
{
}
}
/// <summary>
/// This method loads the file from save document
/// </summary>
/// <param name="filename"></param>
public void Load(string filename)
{
System.IO.TextReader textIn = null;
//try
//{
textIn = new System.IO.StreamReader(filename);
Load(textIn);
//}
//catch (Exception e)
//{
// throw e;
//}
//finally
//{
if (textIn != null) textIn.Close();
//}
}
/// <summary>
/// Load method for the data in the file
/// </summary>
/// <param name="textIn"></param>
private void Load(TextReader textIn)
{
foreach (Sprite crew1 in crew)
{
crew1.location.X = float.Parse(textIn.ReadLine());
crew1.location.Y = float.Parse(textIn.ReadLine());
}
foreach (sharks enemySprite in sharks)
{
enemySprite.location.X = float.Parse(textIn.ReadLine());
enemySprite.location.Y = float.Parse(textIn.ReadLine());
}
//throw new NotImplementedException();
}
/// <summary>
/// LoadContent will be called once per game and is the place to load
/// all of your content.
/// </summary>
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
hud.LoadContent(Content);
//-----LOAD THE MENU BACKGROUND-----
menuImageTexture = Content.Load<Texture2D>("menuImage");
menuImageRectange = new Rectangle(0, 0,
Window.ClientBounds.Width,
Window.ClientBounds.Height);
//------LOAD INGAME BACKGROUND-----
backgroundTexture = Content.Load<Texture2D>("Background");
backgroundRectangle = new Rectangle(
0, 0, // top left hand corner
Window.ClientBounds.Width,
Window.ClientBounds.Height); // size of screen display
//GAMEOVER IMAGE BACKGROUND
gameoverImageTexture = Content.Load<Texture2D>("gameoverImage");
gameoverImageRectangle = new Rectangle(
0, 0,
Window.ClientBounds.Width,
Window.ClientBounds.Height);
//------- Loading in Captains crew-------
c = new Sprite(new Vector2(400, 150), new Vector2(400, 150),
Content.Load<Texture2D>("WhiteBall"), Color.White);
BlueBall = new Sprite(new Vector2(640, 450),
Content.Load<Texture2D>("BlueBall"));
crew.Add(BlueBall);
GreenBall = new Sprite(new Vector2(750, 200),
Content.Load<Texture2D>("GreenBall"));
crew.Add(GreenBall);
OrangeBall = new Sprite(new Vector2(115, 400),
Content.Load<Texture2D>("OrangeBall"));
crew.Add(OrangeBall);
RedBall = new Sprite(new Vector2(500, 600),
Content.Load<Texture2D>("RedBall"));
crew.Add(RedBall);
YellowBall = new Sprite(new Vector2(800, 400),
Content.Load<Texture2D>("YellowBall"));
crew.Add(YellowBall);
PinkBall = new Sprite(new Vector2(25, 175),
Content.Load<Texture2D>("PinkBall"));
crew.Add(PinkBall);
//--------Loading in the Sharks------
sharks s = new sharks(new Vector2(1100, 50),
Content.Load<Texture2D>("BlackBall"));
sharks.Add(s);
s = new sharks(new Vector2(950, 170),
Content.Load<Texture2D>("BlackBall"));
sharks.Add(s);
s = new sharks(new Vector2(300, 350),
Content.Load<Texture2D>("BlackBall"));
sharks.Add(s);
messageFont = Content.Load<SpriteFont>("messageFont");
// TODO: use this.Content to load your game content here
}
/// <summary>
/// UnloadContent will be called once per game and is the place to unload
/// all content.
/// </summary>
protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here
}
/// <summary>
/// Allows the game to run logic such as updating the world,
/// checking for collisions, gathering input, and playing audio.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Update(GameTime gameTime)
{
//----------This gets the time value---------
float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;
//--------------keyboard input---------------
//Exit
if (Keyboard.GetState().IsKeyDown(Keys.Escape))
this.Exit();
//Save
if (Keyboard.GetState().IsKeyDown(Keys.S))
Save("test.txt");
//Load
if (Keyboard.GetState().IsKeyDown(Keys.L))
Load("test.txt");
//Directional Movement
if (Keyboard.GetState().IsKeyDown(Keys.Left))
c.velocity.X = -350;
if (Keyboard.GetState().IsKeyDown(Keys.Right))
c.velocity.X = 350;
if (Keyboard.GetState().IsKeyDown(Keys.Down))
c.velocity.Y = 350;
if (Keyboard.GetState().IsKeyDown(Keys.Up))
c.velocity.Y = -350;
//UPDATING PLAYING STATE
switch (gameState)
{
case State.Playing:
c.Update(elapsed);
foreach (Sprite cr in crew)
{
cr.Update(elapsed);
}
c.col = Color.White;
//----sharks intersects with whiteball----
foreach (sharks s in sharks)
{
if (c.bounds.Intersects(s.bounds))
{
gameState = State.Gameover;
break;
}
}
foreach (sharks s in sharks)
{
s.Update(elapsed, c.location);
}
hud.Update(gameTime);
//----sprites intersect with whiteball----
foreach (Sprite crew1 in crew)
{
if (c.bounds.Intersects(crew1.bounds))
{
//gameState = State.Gameover;
playerScore += 1;
crew1.bounds.X = 1000000;
crew1.bounds.Y = 1000000;
crew1.location.Y = 1000000;
crew1.location.X = 1000000;
break;
}
} break;
//UPDATING MENU STATE
case State.Menu:
{
//Get keyboard state
KeyboardState keyState = Keyboard.GetState();
if (keyState.IsKeyDown(Keys.Enter))
{
gameState = State.Playing;
}
break;
}
//UPDATING GAMEOVER STATE
case State.Gameover:
{
//Get keyboard state
KeyboardState keyState = Keyboard.GetState();
if (keyState.IsKeyDown(Keys.Back))
{
if (IsHighScore())
{
hud.highScore = playerScore;
SavehighScore("highScore.txt");
}
//resetting the everything to clear after gameover
sharks.Clear();
crew.Clear();
playerScore = 0;
//This redraws the sprites positions after gamover and the scren cleared and everything is resetted
c = new Sprite(new Vector2(400, 150), new Vector2(400, 150),
Content.Load<Texture2D>("WhiteBall"), Color.White);
BlueBall = new Sprite(new Vector2(640, 450),
Content.Load<Texture2D>("BlueBall"));
crew.Add(BlueBall);
GreenBall = new Sprite(new Vector2(750, 200),
Content.Load<Texture2D>("GreenBall"));
crew.Add(GreenBall);
OrangeBall = new Sprite(new Vector2(115, 400),
Content.Load<Texture2D>("OrangeBall"));
crew.Add(OrangeBall);
RedBall = new Sprite(new Vector2(500, 600),
Content.Load<Texture2D>("RedBall"));
crew.Add(RedBall);
YellowBall = new Sprite(new Vector2(800, 400),
Content.Load<Texture2D>("YellowBall"));
crew.Add(YellowBall);
PinkBall = new Sprite(new Vector2(25, 175),
Content.Load<Texture2D>("PinkBall"));
crew.Add(PinkBall);
//--------Loading in the Sharks------
sharks s = new sharks(new Vector2(1100, 50),
Content.Load<Texture2D>("BlackBall"));
sharks.Add(s);
s = new sharks(new Vector2(950, 170),
Content.Load<Texture2D>("BlackBall"));
sharks.Add(s);
s = new sharks(new Vector2(300, 350),
Content.Load<Texture2D>("BlackBall"));
sharks.Add(s);
gameState = State.Menu;
}
break;
}
}
base.Update(gameTime);
}
/// <summary>
/// This makes the highscore file
/// </summary>
/// <param name="filename"></param>
private void SavehighScore(string filename)
{
TextWriter textOut = null;
try
{
if (File.Exists(filename))
File.Delete(filename);
textOut = new StreamWriter(filename);
textOut.WriteLine(hud.highScore);
}
catch (Exception e)
{
throw e;
}
finally
{
if (textOut != null) textOut.Close();
}
//throw new NotImplementedException();
}
/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
switch (gameState)
{
//DRAWING PLAYING STATE
case State.Playing:
{
spriteBatch.Draw(backgroundTexture, backgroundRectangle,
Color.White);
c.Draw(spriteBatch);
//FOR EACH CREW DRAW
foreach (Sprite cr in crew)
{
cr.Draw(spriteBatch);
}
//FOREACH SHARK DRAW
foreach (sharks s in sharks)
{
s.Draw(spriteBatch);
}
hud.Draw(spriteBatch);
spriteBatch.DrawString(messageFont, playerScore.ToString(),
new Vector2(200, 0),
Color.White);
//spriteBatch.DrawString(messageFont, highScore.ToString(),
// new Vector2(200, 100), Color.White);
spriteBatch.DrawString(messageFont, " Player Scores - ",
new Vector2(0, 0), Color.White);
break;
//spriteBatch.DrawString(messageFont, " High Score - ",
//new Vector2(200, 200), Color.White);
//break;
}
//DRAWING MENU STATE
case State.Menu:
{
spriteBatch.Draw(menuImageTexture, menuImageRectange, Color.White);
break;
}
//DRAWING GAMEOVER STATE
case State.Gameover:
{
spriteBatch.Draw(gameoverImageTexture, gameoverImageRectangle, Color.White);
spriteBatch.DrawString(messageFont, "Your Final Score was - " + playerScore.ToString(), new Vector2(0, 0), Color.White);
spriteBatch.DrawString(messageFont, "Your High score - " + hud.highScore.ToString(), new Vector2(0, 100), Color.White);
break;
}
}
spriteBatch.End();
base.Draw(gameTime);
}
}
}
I have other codes if you need them as well, I have my Shark class and HUD for scoring.
If anyone could be of any assistance of how to solve this problem or what I could do to solve this, I would be very great full. Thank You
Upvotes: 0
Views: 511
Reputation: 691
I would:
1) Add an Active property to your Sprite class. Don't draw sprites that aren't active
2) In your collision detection, set the Active property on the crew sprite to be false
3) In your game Update, remove the crew sprites from your list that are not Active.
Upvotes: 1