我是新手,所以不能完全确定我是否正确发布,但在创建游戏时我遇到了一些问题。我的主要目标是创造一个自上而下的射击游戏风格的游戏,使用运动的“玩家”#39;根据鼠标的当前位置旋转,可以按下' w'以一定的速度向它移动。
主要问题是,当游戏加载时,动作正是我想要的方式,但纹理本身并没有移动,只有drawRectangle。
Game1.cs:
player = new Player(Content, @"graphics\Player1", 500, 500, spritePosition);
spritePosition = new Vector2(player.CollisionRectangle.X, player.CollisionRectangle.Y);
protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
Exit();
KeyboardState keyboard = Keyboard.GetState();
MouseState mouse = Mouse.GetState();
IsMouseVisible = true;
distance.X = mouse.X - spritePosition.X;
distance.Y = mouse.Y - spritePosition.Y;
//Works out the rotation depending on how far away mouse is from sprite
rotation = (float)Math.Atan2(distance.Y, distance.X);
// TODO: Add your update logic here
spritePosition = spriteVelocity + spritePosition;
spriteOrigin = new Vector2(player.DrawRectangle.X / 2, player.DrawRectangle.Y / 2);
if (Keyboard.GetState().IsKeyDown(Keys.W))
{
spriteVelocity.X = (float)Math.Cos(rotation) * tangentialVelocity;
spriteVelocity.Y = (float)Math.Sin(rotation) * tangentialVelocity;
}
else if(spriteVelocity != Vector2.Zero)
{
Vector2 i = spriteVelocity;
spriteVelocity = i -= friction * i;
}
这是更新功能的主要动作代码以及新玩家的创建位置。
Player.cs:
class Player
{
Texture2D sprite;
Rectangle drawRectangle;
int health = 100;
public Player(ContentManager contentManager, string spriteName, int x , int y, Vector2 velocity)
{
LoadContent(contentManager, spriteName, x, y, velocity);
}
public Rectangle CollisionRectangle
{
get { return drawRectangle; }
}
public Rectangle DrawRectangle
{
get { return drawRectangle; }
set { drawRectangle = value; }
}
public int Health
{
get { return health; }
set {
health = value;
if (health <= 0)
health = 0;
if (health > 100)
health = 100;
}
}
public Vector2 Velocity
{
get { return Velocity; }
set { Velocity = value; }
}
public void Update(GameTime gameTime, KeyboardState keyboard, MouseState mouse)
{
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(sprite, drawRectangle, Color.White);
}
private void LoadContent(ContentManager contentManager, string spriteName, int x, int y, Vector2 velocity)
{
sprite = contentManager.Load<Texture2D>(spriteName);
drawRectangle = new Rectangle(x - sprite.Width / 2, y - sprite.Height / 2, sprite.Width, sprite.Height);
}
}
我不知道要包含在player.cs的Update函数中的内容,无论是移动代码还是主要的Game1.cs。
希望这是足够的代码让你们能够提供帮助。很抱歉有很多代码,但我只是不确定错误发生在哪里。
提前致谢
答案 0 :(得分:0)
对于旋转,你可能想要使用'另一种'spriteBatch.Draw,因为draw函数可以有比你当前使用的参数更多的参数。
完整绘制功能如下:
SpriteBatch.Draw(Texture2D texture, Vector2 position, Rectangle sourceRectangle, Color color, float rotation, Vector2 origin, float scale, SpriteEffects effects, float layerdepht)
如您所见,现在我们有一个可以使用的旋转参数。 所以你的代码看起来像这样:
spriteBatch.Draw(sprite, drawRectangle, null, Color.White, rotation, Vector2.Zero, 1, SpriteEffects.None, 0);
关于你的代码应该去哪里的问题。学习自己将代码放在它所属的位置是很好的,在这种情况下是播放器。因为当你的程序变得更大时,这样做会非常麻烦。
要在您的玩家类中调用更新功能,您只需在Game1的更新中调用player.Update(游戏时间,键盘,鼠标)。