Hello there ladies and gentlemen. So here I am, trying to create my first game (quite new to C#).
So the game is basicly a lite version of flappybird, the player presses "Space" to jump/float to not hit enemies.
Here is the problem: I got 4 enemy classes, the first one works like it should and generates a random PosY value when PosX < -99. But the other classes that should generate a random PosY too (random.next(0,380);) only takes enemy1:s value.
So if enemy1 has the value 183 after the random.next enemy2,3 and 4 also gets that value.
Game1.cs :
public class Game1 : Game { public static System.Timers.Timer timer100; GraphicsDeviceManager graphics; SpriteBatch spriteBatch; Rectangle playerRectangle, enemyRectangle, enemy2Rectangle, enemy3Rectangle, enemy4Rectangle; Vector2 enemyPosition, enemy2Position, enemy3Position, enemy4Position; Player player; Player player2; Wall wall; Enemy enemy; Enemy2 enemy2; Enemy3 enemy3; Enemy4 enemy4; Boss boss; int x = 0; //int[] y; Random random = new Random(); bool gameover = false; public Game1() : base() { player = new Player(); player2 = new Player(); wall = new Wall(300, 100); enemy = new Enemy(); enemy2 = new Enemy2(); enemy3 = new Enemy3(); enemy4 = new Enemy4(); boss = new Boss(0,0); graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; } /// <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() { #region(InitializeEnemyPosyPosx) enemy.posY = 0; enemy2.posY = 70; enemy3.posY = 150; enemy4.posY = 280; //enemy.posY = enemy.randomPosY; //enemy2.Enemy2posY = enemy2.Enemy2randomPosY; //enemy3.Enemy3posY = enemy3.Enemy3randomPosY; //enemy4.Enemy4posY = enemy4.Enemy4randomPosY; enemy.posX = 800; enemy2.posX = 1100; enemy3.posX = 1400; enemy4.posX = 1700; #endregion // TODO: Add your initialization logic here base.Initialize(); } /// <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); Texture2D gameOver = Content.Load<Texture2D>("gameOver.png"); Texture2D temp3 = Content.Load<Texture2D>("Boss.gif"); Texture2D temp2 = Content.Load<Texture2D>("Boss.gif"); Texture2D temp1 = Content.Load<Texture2D>("Boss.gif"); Texture2D temp4 = Content.Load<Texture2D>("Boss.gif"); Texture2D temp5 = Content.Load<Texture2D>("Boss.gif"); Texture2D temp = Content.Load<Texture2D>("dogePlayer.png"); player.loadSprite(temp); enemy.loadSprite(temp2); enemy2.loadSprite(temp1); enemy3.loadSprite(temp4); enemy4.loadSprite(temp5); boss.loadSprite(temp1); wall.loadSprite(gameOver); // 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) { if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) Exit(); enemyPosition = new Vector2(enemy.getX(), enemy.getY()); enemy2Position = new Vector2(enemy2.getX2(), enemy2.getY2()); enemy3Position = new Vector2(enemy3.getX3(), enemy3.getY3()); enemy4Position = new Vector2(enemy4.getX4(), enemy4.getY4()); #region(Player&EnemyRectangles) playerRectangle = new Rectangle(player.getX(),player.getY(),player.getSprite().Width,player.getSprite().Height); enemyRectangle = new Rectangle(enemy.getX(),enemy.getY(),enemy.getSprite().Width,enemy.getSprite().Height); enemy2Rectangle = new Rectangle(enemy2.getX2(), enemy2.getY2(), enemy2.getSprite().Width, enemy2.getSprite().Height); enemy3Rectangle = new Rectangle(enemy3.getX3(), enemy3.getY3(), enemy3.getSprite().Width, enemy3.getSprite().Height); enemy4Rectangle = new Rectangle(enemy4.getX4(), enemy4.getY4(), enemy4.getSprite().Width, enemy4.getSprite().Height); #endregion #region(PlayerIntersectsWithEnemy or Walls) if (playerRectangle.Intersects(enemyRectangle)) { gameover = true; } if (playerRectangle.Intersects(enemy2Rectangle)) { gameover = true; } if (playerRectangle.Intersects(enemy3Rectangle)) { gameover = true; } if (playerRectangle.Intersects(enemy4Rectangle)) { gameover = true; } if (playerRectangle.Y < 0 || playerRectangle.Y > 390) { gameover = true; } #endregion #region(enemyposx) if (enemy.getX() < -99) { enemy.RandPosY(); enemy.posX = 1000; } if (enemy2.getX2() < -99) { enemy2.RandPosY2(); enemy2.posX = 1000; } if (enemy3.getX3() < -99) { enemy3.RandPosY3(); enemy3.posX = 1000; } if (enemy4.getX4() < -99) { enemy4.RandPosY4(); enemy4.posX = 1000; } #endregion // TODO: Add your update logic here player.Update(wall); enemy.update(player); enemy2.update(player); enemy3.update(player); enemy4.update(player); boss.update(player); base.Update(gameTime); } /// <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.BlueViolet); // TODO: Add your drawing code here spriteBatch.Begin(); spriteBatch.Draw(player.getSprite(), playerRectangle, Color.BlueViolet); //new Rectangle(player.getX(), player.getY(), player.getSprite().Width, player.getSprite().Height), Color.BlueViolet); if (gameover) { spriteBatch.Draw(wall.getSprite(), new Rectangle(150, 0, 500, 500), Color.BlueViolet); } //spriteBatch.Draw(wall.getSprite(), new Rectangle(wall.getX(), wall.getY(), wall.getSprite().Height, wall.getSprite().Width), Color.BlueViolet); spriteBatch.Draw(enemy.getSprite(), enemyRectangle, Color.BlueViolet); spriteBatch.Draw(enemy2.getSprite(), enemy2Rectangle, Color.BlueViolet); spriteBatch.Draw(enemy3.getSprite(), enemy3Rectangle, Color.BlueViolet); spriteBatch.Draw(enemy4.getSprite(), enemy4Rectangle, Color.BlueViolet); //Ifall det fuckar ur: new Rectangle(enemy4.getX4(), enemy4.Enemy4randomPosY, enemy4.getSprite().Height, enemy4.getSprite().Width) spriteBatch.End(); base.Draw(gameTime); } }
Enemy.cs (This one works as it should):
public class Enemy { Texture2D sprite; Random randomposY = new Random(); public int posX, posY, speed, randomPosY, oldrandomPosY; public static System.Timers.Timer timer1; public void Initialize() { } public Enemy() { } public Enemy(int x, int y) { posX = x; posY = y; speed = 2; } public void spawnNewEnemy(Texture2D sprite) { this.sprite = sprite; } public void loadSprite(Texture2D sprite) { this.sprite = sprite; Initialize(); } public Texture2D getSprite() { return sprite; } public int getX() { return posX; } public int getY() { return posY; } public void RandPosY() { posY = randomposY.Next(0, 380); } private void AI(Player player) { } public void update(Player player) { AI(player); this.posX -= 1; } public void OnTimedEvent(object source, ElapsedEventArgs e) { } } }
Enemy2.cs (This does not work as it should...):
class Enemy2 { Texture2D sprite; public static System.Timers.Timer timer1; Random Enemy2randomposY = new Random(); public int posX, posY, speed, Enemy2randomPosY, Enemy2oldrandomPosY; public void Initialize() { } public Enemy2() { } public Enemy2(int x, int y) { posX = x; posY = y; speed = 2; } public void spawnNewEnemy(Texture2D sprite) { this.sprite = sprite; } public void loadSprite(Texture2D sprite) { this.sprite = sprite; Initialize(); } public Texture2D getSprite() { return sprite; } public int getX2() { return posX; } public int getY2() { return posY; } public void RandPosY2() { posY = Enemy2randomposY.Next(0, 380); } private void AI(Player player) { } public void update(Player player) { AI(player); this.posX -= 1; } public void OnTimedEvent(object source, ElapsedEventArgs e) { } } }
Hopefully someone can help me, been stuck a looong time now and can't get it to work whatever I try.
Please remember that I'm quite new, so if you think some code are really stupid or unnecessary tell me what is wrong :)