Loops XNA格斗游戏风格动画循环问题

Loops XNA格斗游戏风格动画循环问题,loops,xna,Loops,Xna,我已经为此工作了相当长的一段时间,在不同的地方寻找解决方案。我使用了尼克·格雷夫林(Nick Gravelyn)的风格,将动画存储到文本文件中,并简单地增加一个索引来更改帧。我遇到的麻烦是循环动画一次,而且只能循环一次,但由于某种原因,我知道应该工作的方式并没有像我想象的那样工作。我一辈子都不知道为什么,除非它非常具体地说明XNA是如何工作的 这是我的密码: 私有void UpdateAttackKeyboardState当前,KeyboardState上次,游戏时间游戏时间 { 如果当前.Is

我已经为此工作了相当长的一段时间,在不同的地方寻找解决方案。我使用了尼克·格雷夫林(Nick Gravelyn)的风格,将动画存储到文本文件中,并简单地增加一个索引来更改帧。我遇到的麻烦是循环动画一次,而且只能循环一次,但由于某种原因,我知道应该工作的方式并没有像我想象的那样工作。我一辈子都不知道为什么,除非它非常具体地说明XNA是如何工作的

这是我的密码:

私有void UpdateAttackKeyboardState当前,KeyboardState上次,游戏时间游戏时间 { 如果当前.IsKeyDownKeys.S&&last.IsKeyUpKeys.S { 中性耐受踢球时间; } } 私有void neutralStandingKickGameTime游戏时间 { //TimesInclastFrame+=gameTime.ElapsedGameTime.millizes;//帧速率控制 //如果TimesInclastFrame>毫秒SperFrame//帧速率控制 //{ //TimesInclastFrame-=毫秒SperFrame;//帧速率控制 如果mCurrentState!=State.Kicking { mCurrentState=State.Kicking; 位置Y=200; loopOnce25,30;//从第25帧开始,到第30帧结束 } //} } 私有void loopOnceint最小值,int最大值 { 如果currentImageIndex>max | | currentImageIndex 公共无效DrawSpriteBatch spriteBatch { //获取要绘制的当前精灵的名称 字符串spriteName=possibleImages[currentImageIndex]; //使用它来获取源矩形 矩形源=spriteSourceRectangles[spriteName]; //将矩形发送到函数以设置用于边界检查的帧大小 getFrameSizesource; spriteBatch.DrawthePriteSheet,位置,来源,颜色。白色; } 私有void getFrameSizeRectangle框架 { frameSize=frame;//用于边界检查 } 为什么这行不通

新代码加文的建议:

私有void UpdateAttackKeyboardState当前,KeyboardState上次,游戏时间游戏时间 { 常数int min=22; 常数int max=30; TimesInclastFrame+=gameTime.ElapsedGameTime.millizes;//帧速率控制 如果current.iskeydownkies.S&&mCurrentState!=State.Kicking { mCurrentState=State.Kicking; currentImageIndex=min; } 如果mCurrentState==State.Kicking { 如果TimesInclastFrame>毫秒SperFrame//帧速率控制 { TimesInclastFrame-=毫秒SperFrame;//帧速率控制 currentImageIndex++; } } 如果currentImageIndex==最大值 mCurrentState=State.Idle; } 调用UpdateAttack的方法:

public void UpdateGameTime游戏时间,游戏 { KeyboardState aCurrentKeyboardState=Keyboard.GetState; UpdateMovementaCurrentKeyboardState; 更新UMPACURRENTKeyboardState; 更新当前键盘状态、前一键盘状态、游戏时间; UpdateStageBoundsName; MPPreviousKeyboardState=当前键盘状态; }
它将在按住键盘键s时循环动画。但它不会像预期的那样在一次按键中循环所有7帧

据我所知,您发布的代码将只绘制踢腿动画的最后一帧,因为LoopOnce方法中的for循环会围绕所有帧循环,并且只绘制最后一帧。这是因为每次更新都会调用draw方法一次

XNA首先调用update方法,然后调用draw。因此,在更新方法中,将动画的当前帧设置为最大帧,然后进入绘制方法,在该方法中绘制当前帧,此时是最后一帧

为了实现这一点,对于每次要更新的调用,只需将要绘制的帧增加1

我没有XNA在这台计算机上,所以我不能测试它,它可能不会编译没有修复任何语法错误,但给你一个想法,像这样的东西应该这样做

private void UpdateAttack(KeyboardState current, KeyboardState last, GameTime gameTime)
        {
           if (current.IsKeyDown(Keys.S) && last.IsKeyUp(Keys.S))
           {
             mCurrentState =State.Kicking;
             currentImageIndex=25;
           }
           if(mCurrentState ==State.Kicking)
               neutralStandingKick(gameTime);              
        }

   private void neutralStandingKick(GameTime gameTime)
    {
           currentImageIndex++;
            if(currentImageIndex==30) mCurrentStart = State.SomeOtherState;
    } 

删除“一次绘制”方法。您需要将State.SomeOtherState替换为对象未启动时所处的状态。您可能还想用常量交换硬编码的帧编号。要使此动画正常工作,不需要更改绘制方法。希望这有帮助。

什么不起作用?它是不止一次循环还是一次不循环
我很抱歉没有具体说明。问题是,当按下该键时,它不会使用for循环在帧之间循环。相反,它只显示冻结到位的动画的1帧。可能,最后一帧,正如你在下面所说的。让我把这个类中的draw方法很快贴出来。我对问XNA相关的问题有点陌生。X_X;好的,我明白你的意思。真不敢相信我错过了这个。我在想我可以使用for循环来完成踢腿动画的X帧数量。我忘记了每个循环只调用一次update方法,因此for循环中只有一帧被传递到draw方法。谢谢你的帮助,我会找到一个不同的方法来处理这个问题!我试过你说的话,从理论上看似乎是可行的,但由于某些原因,它不会自动起作用。我会把修改过的代码贴上去。它应该在一个按键上循环总共7帧,但它不是。编辑:我可以按住键盘按钮,它将正确循环动画,但不会自动循环。我可以看到两种情况:1-您正在其他地方设置mCurrentState。也许用你的画法?在动画结束之前,将状态设置为非踢的状态。2-或者,问题是UpdateAttack仅在按下kick按钮时才被缩放。你能发布调用UpdateAttack方法的代码吗?是的,让我帮你准备一下。