C# 中的动画类型
Animation Type in C#
我一直在学习教程并修改它来制作我自己的游戏。我来到 this 部分,正在致力于实现射弹创建和动画。
在他的教程中,他以 public Animation LaserAnimation;
开头 class,但我似乎没有 "Animation" 类型的名称 space。
所以我决定尝试使用常规 Texture2D 类型来实现它,并想出了以下...
这是项目符号中声明的纹理 class。
public Texture2D BulletTexture;
而在主游戏class中,我将他的两个功能转换为...
protected void FireBullet(GameTime gameTime) {
if(gameTime.TotalGameTime - previousBulletSpawnTime > bulletSpawnTime) {
previousBulletSpawnTime = gameTime.TotalGameTime;
AddBullet();
}
}
protected void AddBullet() {
//Load Bullet Texture
Texture2D bulletAnimation = Content.Load<Texture2D>("Graphics\bullet2");
//Draw Bullet
spriteBatch.Begin();
spriteBatch.Draw(bulletAnimation, player.Position, null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);
spriteBatch.End();
Bullet bullet = new Bullet();
var bulletPosition = player.Position;
bulletPosition.Y += 60;
bulletPosition.X += 44;
bullet.Initialize(bulletAnimation, bulletPosition);
bullets.Add(bullet);
但它似乎不起作用。我的意思是,当我按下 space 栏以使其启动时,没有绘制任何东西。这个转换的哪一部分我错了,或者我错过了一些基本的东西。
编辑:好吧,看来我太急于测试这部分而没有看到我需要添加的最后一部分...
// Draw the lasers.
foreach (var l in laserBeams)
{
l.Draw(spriteBatch);
}
所以我继续这样做了(虽然我将“1”更改为不同的名称,因为我遇到了错误(我不知道他是如何让它工作的))。
现在子弹确实在发射,但不是一次发射一颗,而是连续发射几颗。
我想知道这是否与他在 class 中创建的更新功能有关。因为我把它改成了 Texture2D,所以它不像他的动画类型那样工作。
public void Update(GameTime gameTime)
{
Position.X += laserMoveSpeed;
LaserAnimation.Position = Position;
LaserAnimation.Update(gameTime);
}
这就是他的样子。但在我的身上,我不得不注释掉第 2 行和第 3 行,因为 Texture2D 没有那些函数调用。那些人在做什么,会导致我的子弹 "ghost" 并且在绘制新子弹之前不会消失。
And now the bullets are in fact firing, but instead of coming out one
at a time, it shows several in a row.
如果您查看 Game1
UpdatePlayer()
中的 FireLaser()
调用 class
if (_currentKeyboardState.IsKeyDown(Keys.Space) || _currentGamePadState.Buttons.X == ButtonState.Pressed)
{
FireLaser(gameTime);
}
您会看到在 按下/按下 空格键或游戏手柄的 X 按钮时调用 FireLaser()。由于 MonoGame 的 Update
每秒被调用 60 次,因此它会导致 FireLaser
被调用多次,直到您释放按钮。
如果你想避免它,保存之前的状态并检查它之前没有被按下。
if (_currentKeyboardState.IsKeyDown(Keys.Space) && _previousKeyboardState.IsKeyReleased(Keys.Space))
{
FireLaser(gameTime);
}
_previousKeyboardState = _currentKeyboardState;
FireLaser()
将在每次单击空格键时调用一次
我一直在学习教程并修改它来制作我自己的游戏。我来到 this 部分,正在致力于实现射弹创建和动画。
在他的教程中,他以 public Animation LaserAnimation;
开头 class,但我似乎没有 "Animation" 类型的名称 space。
所以我决定尝试使用常规 Texture2D 类型来实现它,并想出了以下...
这是项目符号中声明的纹理 class。
public Texture2D BulletTexture;
而在主游戏class中,我将他的两个功能转换为...
protected void FireBullet(GameTime gameTime) {
if(gameTime.TotalGameTime - previousBulletSpawnTime > bulletSpawnTime) {
previousBulletSpawnTime = gameTime.TotalGameTime;
AddBullet();
}
}
protected void AddBullet() {
//Load Bullet Texture
Texture2D bulletAnimation = Content.Load<Texture2D>("Graphics\bullet2");
//Draw Bullet
spriteBatch.Begin();
spriteBatch.Draw(bulletAnimation, player.Position, null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);
spriteBatch.End();
Bullet bullet = new Bullet();
var bulletPosition = player.Position;
bulletPosition.Y += 60;
bulletPosition.X += 44;
bullet.Initialize(bulletAnimation, bulletPosition);
bullets.Add(bullet);
但它似乎不起作用。我的意思是,当我按下 space 栏以使其启动时,没有绘制任何东西。这个转换的哪一部分我错了,或者我错过了一些基本的东西。
编辑:好吧,看来我太急于测试这部分而没有看到我需要添加的最后一部分...
// Draw the lasers.
foreach (var l in laserBeams)
{
l.Draw(spriteBatch);
}
所以我继续这样做了(虽然我将“1”更改为不同的名称,因为我遇到了错误(我不知道他是如何让它工作的))。
现在子弹确实在发射,但不是一次发射一颗,而是连续发射几颗。
我想知道这是否与他在 class 中创建的更新功能有关。因为我把它改成了 Texture2D,所以它不像他的动画类型那样工作。
public void Update(GameTime gameTime)
{
Position.X += laserMoveSpeed;
LaserAnimation.Position = Position;
LaserAnimation.Update(gameTime);
}
这就是他的样子。但在我的身上,我不得不注释掉第 2 行和第 3 行,因为 Texture2D 没有那些函数调用。那些人在做什么,会导致我的子弹 "ghost" 并且在绘制新子弹之前不会消失。
And now the bullets are in fact firing, but instead of coming out one at a time, it shows several in a row.
如果您查看 Game1
UpdatePlayer()
中的 FireLaser()
调用 class
if (_currentKeyboardState.IsKeyDown(Keys.Space) || _currentGamePadState.Buttons.X == ButtonState.Pressed)
{
FireLaser(gameTime);
}
您会看到在 按下/按下 空格键或游戏手柄的 X 按钮时调用 FireLaser()。由于 MonoGame 的 Update
每秒被调用 60 次,因此它会导致 FireLaser
被调用多次,直到您释放按钮。
如果你想避免它,保存之前的状态并检查它之前没有被按下。
if (_currentKeyboardState.IsKeyDown(Keys.Space) && _previousKeyboardState.IsKeyReleased(Keys.Space))
{
FireLaser(gameTime);
}
_previousKeyboardState = _currentKeyboardState;
FireLaser()
将在每次单击空格键时调用一次