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
Alles anzeigen
Player.cs:
Spoiler anzeigen
Alles anzeigen
Block.cs:
Spoiler anzeigen
Alles anzeigen
Wäre euch echt dankbar wenn jemand eine lösung für mein Problem hätte.
MFG: Mar96K
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:
Quellcode
- 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 _2DGame
- {
- public class Game1 : Microsoft.Xna.Framework.Game
- {
- GraphicsDeviceManager graphics;
- SpriteBatch spriteBatch;
- Player Char;
- Block BlockStone;
- public Game1()
- {
- graphics = new GraphicsDeviceManager(this);
- Content.RootDirectory = "Content";
- }
- protected override void Initialize()
- {
- base.Initialize();
- }
- protected override void LoadContent()
- {
- spriteBatch = new SpriteBatch(GraphicsDevice);
- Char = new Player(new Vector2(100, 100));
- Char.LoadContent(Content);
- BlockStone = new Block(new Vector2(100, 148+32));
- BlockStone.LoadContent(Content,"BlockSandstone");
- }
- protected override void UnloadContent()
- {
- }
- protected override void Update(GameTime gameTime)
- {
- // Allows the game to exit
- if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
- this.Exit();
- Char.Update(gameTime);
- base.Update(gameTime);
- }
- protected override void Draw(GameTime gameTime)
- {
- GraphicsDevice.Clear(Color.CornflowerBlue);
- spriteBatch.Begin();
- Char.Draw(spriteBatch);
- BlockStone.Draw(spriteBatch);
- spriteBatch.End();
- base.Draw(gameTime);
- }
- }
- }
Player.cs:
Quellcode
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using Microsoft.Xna.Framework;
- using Microsoft.Xna.Framework.Graphics;
- using Microsoft.Xna.Framework.Input;
- using Microsoft.Xna.Framework.Content;
- namespace _2DGame
- {
- class Player
- {
- Texture2D Sprite; // Sprite das gedrawt wird
- Texture2D SpriteRight; // Sprite Richtung Links
- Texture2D SpriteLeft; // Sprite Richtung Rechts
- Vector2 Position; // Position des Players
- Color SpriteColor; // Farbe des Sprite
- float MoveSpeed = 0.2f; // Laufgeschwindigkeit
- float Gravity = 0.2f; // Gravitation
- bool IsJumping = false; // Springen
- bool IsFalling = false; // Fallen
- public Player(Vector2 StartPosition)
- {
- Position = StartPosition;
- SpriteColor = Color.White;
- }
- public void LoadContent(ContentManager Content)
- {
- SpriteRight = Content.Load<Texture2D>("CharPlayerRight");
- SpriteLeft = Content.Load<Texture2D>("CharPlayerLeft");
- Sprite = SpriteRight;
- }
- public void Update(GameTime gameTime)
- {
- KeyboardState oState = Keyboard.GetState();
- float VergangeneZeit = (float)gameTime.ElapsedGameTime.TotalMilliseconds;
- //Springen:
- if (oState.IsKeyDown(Keys.Up) && IsFalling == false)
- IsJumping = true;
- //Links gehen:
- if (oState.IsKeyDown(Keys.Left))
- {
- Position += new Vector2(-MoveSpeed, 0) * VergangeneZeit;
- Sprite = SpriteLeft;
- }
- //Rechts gehen:
- if (oState.IsKeyDown(Keys.Right))
- {
- Position += new Vector2(MoveSpeed, 0) * VergangeneZeit;
- Sprite = SpriteRight;
- }
- //Befindet sich ein Block unter dem Player?:
- if (Position.Y + Sprite.Height <= Block.Y && ( Position.X + Sprite.Width <= Block.X+Block.Width && Position.X + Sprite.Width >= Block.X ) )
- {
- IsFalling = false;
- }
- else
- {
- IsFalling = true;
- }
- //Abfragen wenn er runterspringen soll:
- if (IsFalling == true)
- Position += new Vector2(0, +Gravity) * VergangeneZeit;
- else
- Position += new Vector2(Position.X, 0) * VergangeneZeit;
- }
- public void Draw(SpriteBatch spriteBatch)
- {
- spriteBatch.Draw(Sprite, Position, SpriteColor);
- }
- }
- }
Block.cs:
Quellcode
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using Microsoft.Xna.Framework;
- using Microsoft.Xna.Framework.Graphics;
- using Microsoft.Xna.Framework.Input;
- using Microsoft.Xna.Framework.Content;
- namespace _2DGame
- {
- class Block
- {
- Texture2D Sprite;
- Vector2 Position;
- Color SpriteColor;
- public static float X;
- public static float Y;
- public static float Width;
- public Block(Vector2 StartPosition)
- {
- Position = StartPosition;
- SpriteColor = Color.White;
- }
- public void LoadContent(ContentManager Content, string Name)
- {
- Sprite = Content.Load<Texture2D>(Name);
- }
- public void Draw(SpriteBatch spriteBatch)
- {
- spriteBatch.Draw(Sprite, Position, SpriteColor);
- }
- public void Update(GameTime gameTime)
- {
- X = Position.X;
- Y = Position.Y;
- Width = Sprite.Width;
- }
- }
- }
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 ()