【问题标题】:how to make sprite change with speed如何使精灵随速度变化
【发布时间】:2016-02-13 13:41:07
【问题描述】:

好的,所以我是编码新手,我对 c# 有非常基本的了解,但我正在制作一个砖块破坏游戏/砖块破坏者。但是,我有这个问题,我需要在 10.0f 的速度后让球精灵从我的基本白球变为我的另一个精灵。根据我在教程中看到的内容,我想出了这段代码

if (ballSpeed > 10f)
    {
      ballImage = Content.Load<Texture2D>("fireball");
     }

我不知道这是否更接近,但有什么想法吗?

编辑:当我放球时 ball = new Ball(Content);它提出了一个错误,它希望我将其更改为 (content:);

edit2:感谢到目前为止所有试图提供帮助的人,但这是行不通的 snooks 方法,除了结尾(阅读上面的编辑)

其他人的方法是左右抛出异常。还有什么想法

【问题讨论】:

  • 所以我有这些类:Ball.cs、Brick.cs 和 Paddle.cs 以及 ball 类我应该将代码添加到 ball.cs 还是 game2.cs?

标签: c# xna monogame


【解决方案1】:

您仍然需要在 LoadContent() 或 Ball 构造函数中加载图像。因为您希望游戏在可能使用精灵之前将其保存在内存中。

所以在 Ball.cs 构造函数中,您将加载精灵。

public Ball(ContentManager Content)
{
    textureBall = Content.Load<Texture2D>("fireball"); 
    ...
}

您现在可以选择在 game2.cs 中执行您的逻辑,或者您可以在 ball.cs 中创建一个单独的 Draw 方法,您可以在您的主要 Draw 方法(位于 game2.cs 中)中调用该方法,该方法会给你一些更好的cohesion。虽然在小项目中你并不需要,但最好从一开始就学习好习惯。

这就是 ball.cs 中新方法的外观。

 public void Draw(GameTime gameTime, SpriteBatch spriteBatch)
    {
        ...
        if (ballSpeed > 10.0f)
        {
            spriteBatch.Begin();
            spriteBatch.Draw(fireball, ballPosition, null, Color.White);
            spriteBatch.End();
        }
        ...
    }   

现在,如果您还没有,请在 game2.cs 中声明球类游戏对象

Ball ball = new Ball(Content);

现在您可以在主 game2.cs 类的 Draw 循环中调用 ball.Draw(gameTime, spriteBatch)。围绕球的任何逻辑都将位于 Ball.cs 中

我唯一不清楚的是:“10 帧的速度。”我认为您的意思是 10.0 浮点数,因为以帧为单位测量速度将是完全不同的故事。最好找到一个适合您要求的速度浮点值,并以这种方式给球一个位置。

【讨论】:

  • 好吧,我以为 F 代表框架:P
  • 让我知道这是否有效,如果它解决了您的问题,您可以将我的答案标记为解决方案。这将帮助将来遇到类似问题的其他人。
  • 所以有一个问题,textureBall var 是什么,因为我没有看到它被使用或者说是火球?
  • 这是我的项目代码drive.google.com/…
  • 你好@Snookik 我去放球时遇到问题 ball = new Ball(Content);它提出了一个错误,它希望我将其更改为 (content:);
【解决方案2】:

在 Draw() 或 Update() 期间加载内容可能会有很大问题。最佳做法是先加载两个纹理,然后在运行时决定要绘制哪一个

在 LoadContent() 中加载两个纹理

protected override void LoadContent()
{
    //...
    texture = Content.Load<Texture2D>("whiteball");
    fireTexture = Content.Load<Texture2D>("fireball");
    //...
}

在 Draw() 中根据球的速度绘制不同的纹理

protected override void Draw(GameTime gameTime)
{
    spriteBatch.Begin();
    // Draw things before ball ...
    if (ballSpeed > 10f)
    {
        spriteBatch.Draw(fireTexture, ballPosition, null, Color.White);
    }
    else
    {
        spriteBatch.Draw(texture, ballPosition, null, Color.White);
    }
    // Draw the other things...
    spriteBatch.End();
}

在您的情况下,您应该更改 Ball 的构造函数并传入对两个纹理的引用,例如

public Ball(Texture2D white, Texture2D fire, Rectangle screenBounds)
{
    // ...
    this.texture = white;
    this.fireTexture = fire;
    // ...
}

当然你需要添加一个字段来存储引用

Texture2D fireTexture;

【讨论】:

  • 好的,我会试试你的方法。但是你能解释一下当我声明 Ball ball = new Ball(Content); 时不断抛出的异常吗?它要我把它改成 Ball ball = new Ball(Content:);
  • ^^^^^ 抱歉,我在评论后总是忘记名字
  • 好的,感谢您的帮助,但它只是左右抛出异常
  • @ShannessyBrown 如果资产加载到游戏的 LoadContent() 中,您真的不需要将内容管理器传递给类。
猜你喜欢
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 2012-01-03
  • 1970-01-01
  • 2013-08-13
相关资源
最近更新 更多