SRL Archive - C/C++ Help and Tutorials

[C#/XNA] How do i preform a jump?


JPHamlett

2011-09-19 23:37:24

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 MarioGame
{
/// <summary>
/// This is the main type for your game
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
//spriteFont spriteFont = new SpriteFont();
Texture2D marioPic;
Vector2 spritePosition = new Vector2(100, 123);
KeyboardState oldKey = Keyboard.GetState();
private GameTime gameTime = new GameTime();

public Game1()
{
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()
{
// 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);
marioPic = Content.Load<Texture2D>("Mario");
// 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
}

void updateJump(GameTime gametime)
{
float startPos = spritePosition.Y + 5;
float endPos = spritePosition.Y;
while (startPos - spritePosition.Y != 0){
spritePosition.Y -= 1;
base.Update(gametime);
}
while (endPos - spritePosition.Y != 0)
{
spritePosition.Y += 1;
base.Update(gametime);
}

}





/// <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)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
KeyboardState newKeys = Keyboard.GetState();
if (newKeys.IsKeyDown(Keys.Right))
{
spritePosition.X += 1;
}
if (newKeys.IsKeyDown(Keys.Left))
{
spritePosition.X -= 1;
}
if (newKeys.IsKeyDown(Keys.Up))
{
updateJump(gameTime);

}


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.Black);

spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);
spriteBatch.Draw(marioPic, spritePosition, Color.White);
// spriteBatch.DrawString(spriteFont, "Mario!", new Vector2(10, 10), Color.White);

spriteBatch.End();

base.Draw(gameTime);
}
}
}


Ok so here's the code, how do I go about making my mario character to jump?

Capricorn

2011-09-20 00:16:04

When you press the up key, have the character move on the Y axis.

If you've already implemented gravity you won't have to worry about anything else.

(didn't read the code by the way, just saying)

JPHamlett

2011-09-20 07:55:40

From: Capricorn
When you press the up key, have the character move on the Y axis.

If you've already implemented gravity you won't have to worry about anything else.

(didn't read the code by the way, just saying)


How would I implement gravity?

sf411

2011-09-20 08:38:00

LINK

Check the link, you should really get active on those forums mainly because a lot of the people there know more about this stuff than I.

masterBB

2011-09-20 11:32:30

Try this:

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 MarioGame
{
/// <summary>
/// This is the main type for your game
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
//spriteFont spriteFont = new SpriteFont();
Texture2D marioPic;
Vector2 spritePosition = new Vector2(100, 123);
KeyboardState oldKey = Keyboard.GetState();
private GameTime gameTime = new GameTime();
private float YSpeed = 0; //I would try a float, you could change it if it doesn't work !Pixel per second!

public Game1()
{
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()
{
// 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);
marioPic = Content.Load<Texture2D>("Mario");
// 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)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
KeyboardState newKeys = Keyboard.GetState();
if (newKeys.IsKeyDown(Keys.Right))
{
spritePosition.X += 1;
}
if (newKeys.IsKeyDown(Keys.Left))
{
spritePosition.X -= 1;
}
if (newKeys.IsKeyDown(Keys.Up))
{
YSpeed -= 50; //You want to adjust this to taste
}

//gravity magic, not natural ;) you might want to adjust the number 0.3 and place it in a constant
YSpeed += 12;

if(CollisionWithFloor)
{
YSpeed = 0;
}

spritePosition.Y += YSpeed * gameTime.elapsedGameTime / 1000;



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.Black);

spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);
spriteBatch.Draw(marioPic, spritePosition, Color.White);
// spriteBatch.DrawString(spriteFont, "Mario!", new Vector2(10, 10), Color.White);

spriteBatch.End();

base.Draw(gameTime);
}
}
}

edit: forgot to mention. I haven't programmed in this language before so it may contain some bugs. Would like to hear a reply ;)

E: fix

JPHamlett

2011-09-21 11:28:22

Got it!



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 Gravity
{
/// <summary>
/// This is the main type for your game
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Texture2D marioPic, woodPic;
SpriteFont verdanaFont;
Vector2 spritePos;
KeyboardState oldKey = Keyboard.GetState();
Monster testMonster = new Monster(0, 480,1);

public Game1()
{
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()
{
// 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);
marioPic = Content.Load<Texture2D>("Mario");
woodPic = Content.Load<Texture2D>("Wood");
verdanaFont = Content.Load<SpriteFont>("Veridica");
spritePos = new Vector2(10, (graphics.GraphicsDevice.Viewport.Height - marioPic.Height));
// 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
}

bool isOnBottom()
{
return ((spritePos.Y + marioPic.Height) >= graphics.GraphicsDevice.Viewport.Height);
}

/// <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)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
KeyboardState newKey = Keyboard.GetState();
if (newKey.IsKeyDown(Keys.Up))
{
if (isOnBottom())
for (int i = 0; i < 50; i++)
{
spritePos.Y -= 1;
base.Update(gameTime);
}
}
if (!isOnBottom())
{
spritePos.Y += 4;
}
if (newKey.IsKeyDown(Keys.Right))
{
spritePos.X += 1;
}
if (newKey.IsKeyDown(Keys.Left))
{
spritePos.X -= 1;
}

updateMoster(testMonster);

base.Update(gameTime);
}

void updateMoster(Monster monster)
{
monster.updateMonster();
}
/// <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(SpriteSortMode.BackToFront, BlendState.AlphaBlend);
spriteBatch.Draw(marioPic, spritePos, Color.White);
spriteBatch.Draw(marioPic, testMonster.getPos(), Color.White);
spriteBatch.DrawString(verdanaFont, Convert.ToString(isOnBottom()), new Vector2(10, 10), Color.White);
spriteBatch.DrawString(verdanaFont, "Sprite Pos " + testMonster.getPos().X + " , " + (testMonster.getPos().Y - marioPic.Height), new
Vector2(100, 100), Color.Black);
spriteBatch.DrawString(verdanaFont, "Sprite Pos " + testMonster.getPos().X + " , " + (testMonster.getPos().Y + marioPic.Height), new
Vector2(200, 200), Color.Black);
spriteBatch.End();

base.Draw(gameTime);
}
}
}