【发布时间】:2013-09-04 15:28:47
【问题描述】:
我正在尝试构建超级马里奥兄弟第一关的克隆,但我在让我的班级互相“交流”时遇到了一些麻烦。到目前为止,我有两个控制器类(键盘、游戏手柄)和两个动画精灵类(RunMarioSprite、DeadMarioSprite)。我想要做的是根据用户的键盘/游戏板输入在屏幕上显示的这两个精灵之间切换。如果按下 F 键,马里奥应该会显示为向右运行。如果按下 D 键,马里奥应该上下移动。
通过我的控制器类更改在屏幕上绘制的动画精灵类的正确方法是什么?
键盘类
public class KeyboardController : IController
{
KeyboardState keyboard = Keyboard.GetState();
private IAnimatedSprite marioSprite;
Texture2D texture;
public void Update()
{
if (keyboard.IsKeyDown(Keys.Q))
{
// QUIT GAME
}
if (keyboard.IsKeyDown(Keys.F))
{
// MARIO RUN RIGHT
}
if (keyboard.IsKeyDown(Keys.D))
{
// DEAD MARIO UP DOWN
}
}
}
动画精灵类的示例
public class RunMarioSprite : IAnimatedSprite
{
public Texture2D Texture { get; set; }
private int currentFrame = 0;
private int totalFrames = 4;
public int frameShift = 30;
public RunMarioSprite(Texture2D texture)
{
currentFrame = 0;
this.Texture = texture;
}
public void Update()
{
currentFrame++;
if (currentFrame == totalFrames)
currentFrame = 0;
}
public void Draw(SpriteBatch spriteBatch)
{
Rectangle sourceRectangle2 = new Rectangle((240 +(currentFrame*frameShift)), 0, 30, 30);
Rectangle destinationRectangle2 = new Rectangle(100, 100, 30, 30);
spriteBatch.Begin();
spriteBatch.Draw(Texture, destinationRectangle2, sourceRectangle2, Color.White);
spriteBatch.End();
}
}
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// TODO: Add your update logic here
foreach (IController Controller in ControllerList)
{
Controller.Update();
}
marioSprite.Update();
base.Update(gameTime);
}
/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
// TODO: Add your drawing code here
marioSprite.Draw(this.spriteBatch);
base.Draw(gameTime);
}
主要(更新和绘制)
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// TODO: Add your update logic here
foreach (IController Controller in ControllerList)
{
Controller.Update();
}
marioSprite.Update();
base.Update(gameTime);
}
/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
// TODO: Add your drawing code here
marioSprite.Draw(this.spriteBatch);
base.Draw(gameTime);
}
如果问题格式不正确,我深表歉意。感谢您的帮助!
【问题讨论】:
-
你有什么问题?如何根据你得到的输入画出左右奔跑的马里奥?
-
@pinckerman 我希望我的键盘类根据用户的输入选择适当的动画精灵类。也就是说,如果用户按下“F”键,我希望我的 RunMarioSprite 类执行它的绘图。如果用户要按“D”键,我希望我的 DeadMarioSprite 执行它的绘图。实际的绘图方法运行正常。只需要我的 KeyboardController 类来“控制”一切,但我不确定如何引用该原始类中的特定类。谢谢!
-
如果 RunMarioSprite 和 DeadMarioSprite 之间的区别只是要绘制的纹理,你只需要改变它,但如果它们有不同的行为,你必须改变 marioSprite 的实例。这样,您的游戏将绘制正确的实例。
-
注意:在 Main(Update/Draw) 中,marioSprite 是 IAnimatedSprite 类型(所有动画精灵类的接口)。 内容加载如下: 'spriteSheet = Content.Load
("MarioSpriteSheet"); marioSprite = new DeadMarioSprite(spriteSheet);' -
@pinckerman 我想这是我最初的问题。如何从我的 KeyboardController 类中更改 marioSprite 的实例?