我最近一直在玩一夫一妻制,我遇到了一个问题。
我已经加载了一个玩家精灵,我已经让移动工作,但我想做的是当我按右/左时改变精灵。我想让玩家船根据按键向左/向右倾斜。
这是我当前的代码,正如你所看到的,我试图用if语句达到预期的效果,但是我没有成功。
class Player
{
public Texture2D PlayerTexture; //Animation representing the layer
public Texture2D moveLeft;
public Texture2D moveRight;
public Vector2 Position; //Position of the Player relative to the upper left side of the screen
public bool Active; //State of the player
public int Health; //Amount of hit points the player has
public int Width { get { return PlayerTexture.Width; } } //Get width of the player ship
public int Height { get { return PlayerTexture.Height; } } //Get height of the player ship
//Keyboard states used to determine key presses
KeyboardState currentKeyboardState;
KeyboardState previousKeyboardState;
//Mouse states used to track Mouse button press
MouseState currentMouseState;
MouseState previousMouseState;
float playerMoveSpeed;
//Player moving left or right
bool movingLeft;
bool movingRight;
public void Initialize(Texture2D texture, Vector2 position)
{
PlayerTexture = texture;
Position = position; //Set the starting position of the player around the middle of the screen and to the back
Active = true; //Set the player to be active
Health = 100; //Set the player health
//Set a constant player move speed
playerMoveSpeed = 8.0f;
}
public void PmovingLeft(Texture2D pmoveleft, Vector2 position)
{
moveLeft = pmoveleft;
Position = position;
}
public void PmovingRight(Texture2D pmoveright, Vector2 position)
{
moveRight = pmoveright;
Position = position;
}
public void Update()
{
//Save the previous state of the keyboard so we can determine single key presses
previousKeyboardState = currentKeyboardState;
//Read the current state of the keyboard and store it
currentKeyboardState = Keyboard.GetState();
}
public void UpdatePlayer(GameTime gameTime)
{
//Keyboard controls
if (currentKeyboardState.IsKeyDown(Keys.Left))
{
Position.X -= playerMoveSpeed;
movingLeft = true;
}
else { movingLeft = false; }
if (currentKeyboardState.IsKeyDown(Keys.Right))
{
Position.X += playerMoveSpeed;
movingRight = true;
}
else { movingRight = false; }
if (currentKeyboardState.IsKeyDown(Keys.Up))
{
Position.Y -= playerMoveSpeed;
}
if (currentKeyboardState.IsKeyDown(Keys.Down))
{
Position.Y += playerMoveSpeed;
}
//Make sure that the player does not go out of bounds
Position.X = MathHelper.Clamp(Position.X, 0, Game1.screenWidth - Width);
Position.Y = MathHelper.Clamp(Position.Y, 0, Game1.screenHeight - Height);
}
public void Draw(SpriteBatch spriteBatch)
{
if (movingLeft)
{
spriteBatch.Draw(moveLeft, Position, null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);
}
else { spriteBatch.Draw(PlayerTexture, Position, null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f); }
if (movingRight)
{
spriteBatch.Draw(moveRight, Position, null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);
}
else { spriteBatch.Draw(PlayerTexture, Position, null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f); }
}
}
这段代码的作用是左右移动玩家,但玩家精灵没有正确改变。如果有人能帮我解决这个问题,那就太好了。提前感谢!
Game1.cs(主游戏类)可根据要求提供
我将创建一个Enum,而不是处理所有这些bool。
你可以有一个带有不同状态的Enum SpriteState然后用一个变量来保存currentSpriteState
Enum SpriteState
{
Left,
Right,
Straight
}
SpriteState currentSpriteState = SpriteState.Straight;
一个改变状态的例子
//generic condition and state change
if (condition)
{
currentSpriteState = SpriteState.Left;
}
else if(condition)
{
currentSpriteState = SpriteState.Right;
}
else currentSpriteState = SpriteState.Straight;
然后在Draw()中基于currentSpriteState
设置一个开关 switch(currentSpriteState)
{
case SpriteState.Left:
spriteBatch.Draw(moveLeft, Position, null, Color.White, 0f,
Vector2.Zero, 1f, SpriteEffects.None, 0f);
break;
case SpriteState.Right:
spriteBatch.Draw(moveRight, Position, null, Color.White, 0f,
Vector2.Zero, 1f, SpriteEffects.None, 0f);
break;
case SpriteState.Straight:
spriteBatch.Draw(PlayerTexture, Position, null, Color.White, 0f,
Vector2.Zero, 1f, SpriteEffects.None, 0f);
break;
}
Bools在技术上是可行的,但是这样更清晰,更容易阅读,可能正好解决您的问题。