-1

A ボタンを 1 回押すと、キャラクターが 40 ピクセルの高さでジャンプするようにしたいです。しかし、40f が 40 ピクセルに等しいかどうかはわかりません。私のコードについてどう思いますか? なにが問題ですか?さらに、自分のプログラムがすべてのコンピューターで同じ速度で実行されるようにしたいと考えています。

public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Texture2D image, water;
float Gravity = 5.0F;
float Acceleration = 20.0F;
Vector2 Position = new Vector2(1200,720);
Vector2 Velocity;
float rotation = 0;
SpriteEffects flip;
Vector2 Speed = new Vector2(0, 0);

public Game1()
{
    graphics = new GraphicsDeviceManager(this);
    Content.RootDirectory = "Content";
    graphics.PreferredBackBufferWidth = 1280;
    graphics.PreferredBackBufferHeight = 720;
}

protected override void Initialize()
{
    base.Initialize();
}

protected override void LoadContent()
{   
    spriteBatch = new SpriteBatch(GraphicsDevice);
    image = Content.Load<Texture2D>("cartoondolphin");
    water = Content.Load<Texture2D>("background");
    flip = SpriteEffects.None;
}

protected override void Update(GameTime gameTime)
{
    float VelocityX = 0f;
    float VelocityY = 0f;

    float time = (float)gameTime.ElapsedGameTime.TotalSeconds;
    KeyboardState kbState = Keyboard.GetState();
    if(kbState.IsKeyDown(Keys.Left)) 
    {
        rotation = 0;
        flip = SpriteEffects.None;
        VelocityX += -5f;
    } 

    if(kbState.IsKeyDown(Keys.Right)) 
    {
        rotation = 0;
        flip = SpriteEffects.FlipHorizontally;
        VelocityX += 5f;
    } 

    // jump if the dolphin is under water
    if(Position.Y >= 670)
    {
        if (kbState.IsKeyDown(Keys.A))
        {     
            if (flip == SpriteEffects.None)
            { 
              VelocityY += 40f;
            }
            else
            { 
              VelocityY += 40f;
            }
        }
    } 
    else 
    {
        VelocityY += -10f;
    }

    float deltaY = 0;
    float deltaX = 0;

    deltaY = Gravity * (float)gameTime.ElapsedGameTime.TotalSeconds;

    deltaX += VelocityX * (float)gameTime.ElapsedGameTime.TotalSeconds * Acceleration;
    deltaY += -VelocityY * (float)gameTime.ElapsedGameTime.TotalSeconds * Acceleration;

    Speed = new Vector2(Speed.X + deltaX, Speed.Y + deltaY);

    Position += Speed * (float)gameTime.ElapsedGameTime.TotalSeconds;

    Velocity.X = 0;

    if (Position.Y + image.Height/2 > graphics.PreferredBackBufferHeight)
        Position.Y = graphics.PreferredBackBufferHeight - image.Height/2;

    base.Update(gameTime);
}

protected override void Draw(GameTime gameTime)
{
    GraphicsDevice.Clear(Color.CornflowerBlue);
    spriteBatch.Begin();
    spriteBatch.Draw(water, new Rectangle(0, graphics.PreferredBackBufferHeight -100, graphics.PreferredBackBufferWidth, 100), Color.White);
    spriteBatch.Draw(image, Position, null, Color.White, MathHelper.ToRadians(rotation), new Vector2(image.Width / 2, image.Height / 2), 1, flip, 1);
    spriteBatch.End();           

    base.Draw(gameTime);
}
}
4

1 に答える 1

0

問題は、あなたがgameTime考慮していないことです。高速な CPU を搭載したコンピューターがそのコードを低速な PC の 2 倍の速さで実行すると、速度の値は (低速な PC と比較して) 2 倍速くなります。

次のようなコードがある場合:

VelocityX += 5f;

最後の を追跡しgameTime、フレーム間の差を取得し、それを定数で乗算する必要があります。( 2D スプライトに重力を追加する Xnaから取得したコードの一部)

int updateTime = gt.ElapsedGameTime.TotalMilliseconds - oldgt.ElapsedGameTime.TotalMilliseconds;

float timeScalar = updateTime / AVG_FRAME_TIME;

VelocityX += 5f * timeScalar;
于 2012-12-08T23:09:49.507 に答える