XNA - Gravitationsproblem mit Player

  • C#

    XNA - Gravitationsproblem mit Player

    Ich hab mich seit kurzem an XNA rangewagt und folgendes Problem:

    Mein Player fliegt einfach durch den Blockboden.

    Ich habe dazu zwei Klassen erstellt:
    Player.cs
    Block.cs
    Sowie die Game Klasse: Game1.cs

    Wie funktioniert es das er auf den Boden bleibt? Was ist mein Fehler?

    Game1.cs:
    Spoiler anzeigen

    Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using Microsoft.Xna.Framework;
    5. using Microsoft.Xna.Framework.Audio;
    6. using Microsoft.Xna.Framework.Content;
    7. using Microsoft.Xna.Framework.GamerServices;
    8. using Microsoft.Xna.Framework.Graphics;
    9. using Microsoft.Xna.Framework.Input;
    10. using Microsoft.Xna.Framework.Media;
    11. namespace _2DGame
    12. {
    13. public class Game1 : Microsoft.Xna.Framework.Game
    14. {
    15. GraphicsDeviceManager graphics;
    16. SpriteBatch spriteBatch;
    17. Player Char;
    18. Block BlockStone;
    19. public Game1()
    20. {
    21. graphics = new GraphicsDeviceManager(this);
    22. Content.RootDirectory = "Content";
    23. }
    24. protected override void Initialize()
    25. {
    26. base.Initialize();
    27. }
    28. protected override void LoadContent()
    29. {
    30. spriteBatch = new SpriteBatch(GraphicsDevice);
    31. Char = new Player(new Vector2(100, 100));
    32. Char.LoadContent(Content);
    33. BlockStone = new Block(new Vector2(100, 148+32));
    34. BlockStone.LoadContent(Content,"BlockSandstone");
    35. }
    36. protected override void UnloadContent()
    37. {
    38. }
    39. protected override void Update(GameTime gameTime)
    40. {
    41. // Allows the game to exit
    42. if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
    43. this.Exit();
    44. Char.Update(gameTime);
    45. base.Update(gameTime);
    46. }
    47. protected override void Draw(GameTime gameTime)
    48. {
    49. GraphicsDevice.Clear(Color.CornflowerBlue);
    50. spriteBatch.Begin();
    51. Char.Draw(spriteBatch);
    52. BlockStone.Draw(spriteBatch);
    53. spriteBatch.End();
    54. base.Draw(gameTime);
    55. }
    56. }
    57. }


    Player.cs:
    Spoiler anzeigen

    Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using Microsoft.Xna.Framework;
    6. using Microsoft.Xna.Framework.Graphics;
    7. using Microsoft.Xna.Framework.Input;
    8. using Microsoft.Xna.Framework.Content;
    9. namespace _2DGame
    10. {
    11. class Player
    12. {
    13. Texture2D Sprite; // Sprite das gedrawt wird
    14. Texture2D SpriteRight; // Sprite Richtung Links
    15. Texture2D SpriteLeft; // Sprite Richtung Rechts
    16. Vector2 Position; // Position des Players
    17. Color SpriteColor; // Farbe des Sprite
    18. float MoveSpeed = 0.2f; // Laufgeschwindigkeit
    19. float Gravity = 0.2f; // Gravitation
    20. bool IsJumping = false; // Springen
    21. bool IsFalling = false; // Fallen
    22. public Player(Vector2 StartPosition)
    23. {
    24. Position = StartPosition;
    25. SpriteColor = Color.White;
    26. }
    27. public void LoadContent(ContentManager Content)
    28. {
    29. SpriteRight = Content.Load<Texture2D>("CharPlayerRight");
    30. SpriteLeft = Content.Load<Texture2D>("CharPlayerLeft");
    31. Sprite = SpriteRight;
    32. }
    33. public void Update(GameTime gameTime)
    34. {
    35. KeyboardState oState = Keyboard.GetState();
    36. float VergangeneZeit = (float)gameTime.ElapsedGameTime.TotalMilliseconds;
    37. //Springen:
    38. if (oState.IsKeyDown(Keys.Up) && IsFalling == false)
    39. IsJumping = true;
    40. //Links gehen:
    41. if (oState.IsKeyDown(Keys.Left))
    42. {
    43. Position += new Vector2(-MoveSpeed, 0) * VergangeneZeit;
    44. Sprite = SpriteLeft;
    45. }
    46. //Rechts gehen:
    47. if (oState.IsKeyDown(Keys.Right))
    48. {
    49. Position += new Vector2(MoveSpeed, 0) * VergangeneZeit;
    50. Sprite = SpriteRight;
    51. }
    52. //Befindet sich ein Block unter dem Player?:
    53. if (Position.Y + Sprite.Height <= Block.Y && ( Position.X + Sprite.Width <= Block.X+Block.Width && Position.X + Sprite.Width >= Block.X ) )
    54. {
    55. IsFalling = false;
    56. }
    57. else
    58. {
    59. IsFalling = true;
    60. }
    61. //Abfragen wenn er runterspringen soll:
    62. if (IsFalling == true)
    63. Position += new Vector2(0, +Gravity) * VergangeneZeit;
    64. else
    65. Position += new Vector2(Position.X, 0) * VergangeneZeit;
    66. }
    67. public void Draw(SpriteBatch spriteBatch)
    68. {
    69. spriteBatch.Draw(Sprite, Position, SpriteColor);
    70. }
    71. }
    72. }


    Block.cs:
    Spoiler anzeigen

    Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using Microsoft.Xna.Framework;
    6. using Microsoft.Xna.Framework.Graphics;
    7. using Microsoft.Xna.Framework.Input;
    8. using Microsoft.Xna.Framework.Content;
    9. namespace _2DGame
    10. {
    11. class Block
    12. {
    13. Texture2D Sprite;
    14. Vector2 Position;
    15. Color SpriteColor;
    16. public static float X;
    17. public static float Y;
    18. public static float Width;
    19. public Block(Vector2 StartPosition)
    20. {
    21. Position = StartPosition;
    22. SpriteColor = Color.White;
    23. }
    24. public void LoadContent(ContentManager Content, string Name)
    25. {
    26. Sprite = Content.Load<Texture2D>(Name);
    27. }
    28. public void Draw(SpriteBatch spriteBatch)
    29. {
    30. spriteBatch.Draw(Sprite, Position, SpriteColor);
    31. }
    32. public void Update(GameTime gameTime)
    33. {
    34. X = Position.X;
    35. Y = Position.Y;
    36. Width = Sprite.Width;
    37. }
    38. }
    39. }


    Wäre euch echt dankbar wenn jemand eine lösung für mein Problem hätte.

    MFG: Mar96K

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mar96k“ ()