SFML动画游戏用精灵

问题描述 投票:0回答:1

我正在制作街头霸王视频游戏,现在我制作了Fighters Collision,Fighter Wall Collision,前进,后退,跳跃,蹲下和打孔,除了Jump Punch动画外,其他所有功能都正常。

战斗机正确跳动,但动画没有改变(我使用的是deltaTime,所以这不是速度问题)。对于打孔动画,除非我一直按住键盘按钮,否则不会显示所有动画。

它应该像这样工作:当我按下“跳跃”按钮时,战斗机会跳跃并显示所有动画,对拳打一样。

当我为每个动作使用一个精灵表时,我创建了animation :: transition,因此每次每次在每个精灵表中的毒药大小时都可以重新计算。(精灵表用于跳跃,另一个精灵用于打孔...等)] >

void Animation::transition(sf::Vector2u imageCount,sf::Texture* texture){

    this->imageCount = imageCount;

    uvRect.width = texture->getSize().x/ float(imageCount.x); 
    uvRect.height = texture->getSize().y/ float(imageCount.y); 

}
void Animation::update(int row, float deltaTime){

    totalTime = totalTime + deltaTime;

    if(totalTime >= switchTime){
        totalTime = totalTime - switchTime;
        currentImage.x++;

        if(currentImage.x >= imageCount.x){ 
            currentImage.x = 0;
            currentImage.y++;
        }

        if(currentImage.y >= imageCount.y){
            currentImage.y = 0;
        }


    }
    uvRect.left = currentImage.x * uvRect.width;
    uvRect.top = currentImage.y * uvRect.height;
}

在controlUpdate中,根据所按的键,我将调用正确的函数(例如moveForward),在此函数中,我将更改纹理并调用Animation :: transition。

void Game::update(Fighter* fighterOne,Fighter* fighterTwo,float deltaTime){

    //COLLISION UPDATE
    this->collisionUpdate(fighterOne,fighterTwo,deltaTime);

    // FIGHTER UPDATE
    fighterOne->update(deltaTime);
    fighterTwo->update(deltaTime);

    // CONTROL UPDATE
    this->controlUpdate(fighterOne,fighterTwo,deltaTime);

    this->pollEvents(fighterOne,fighterTwo,deltaTime);



}

void Game::controlUpdate(Fighter* fighterOne,Fighter* fighterTwo,float deltaTime){

    /*-------------------------------------------------FIGHTER ONE CONTROLS------------------------------------------------*/

    if(fighterOne->getFighterId() == 1) {
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Q) && (fighterOne->getJumpState() == true)) { // MOVING FORWARD
            fighterOne->getFighterMoves()->moveBackward(fighterOne->getSpeed(),fighterOne->getFighterTexture() ,fighterOne->getfighterRect(),fighterOne->getMovementFighter(),fighterOne->getFighterAnimation());
            fighterOne->getFighterState()++;
        }

        if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)&& (fighterOne->getJumpState() == true)) { // MOVING BACKWARD
            fighterOne->getFighterMoves()->moveForward(fighterOne->getSpeed(),fighterOne->getFighterTexture(),fighterOne->getfighterRect(),fighterOne->getMovementFighter(),fighterOne->getFighterAnimation());
            fighterOne->getFighterState()++;
        }

        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Z) && (fighterOne->getJumpState() == true)) { // Jump
            fighterOne->getFighterMoves()->jumpUp(fighterOne->getSpeed(),fighterOne->getFighterTexture(),fighterOne->getfighterRect(),fighterOne->getMovementFighter(),fighterOne->getFighterAnimation());
            fighterOne->getFighterState()++;
            fighterOne->getJumpState() = false;
        }

        if (sf::Keyboard::isKeyPressed(sf::Keyboard::S) && fighterOne->getJumpState()  == true) { // crouch
            fighterOne->getFighterMoves()->crouch(fighterOne->getSpeed(),fighterOne->getFighterTexture(),fighterOne->getfighterRect(),fighterOne->getFighterAnimation(),fighterOne->getHurtBox());
            fighterOne->getFighterState()++;
        }

        /*----------------------------------------------------------------------------ATTACK CASES----------------------------------------------------------------------*/
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::C)) { // crouch
            fighterOne->getFighterMoves()->punch(fighterOne->getSpeed(),fighterOne->getFighterTexture(),fighterOne->getfighterRect(),fighterOne->getFighterAnimation(),fighterOne->getHitBox());
            fighterOne->getFighterState()++;
        }
    }

    /*-------------------------------------------------FIGHTER TWO CONTROLS------------------------------------------------*/
    if(fighterTwo->getFighterId() == 2){
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left) && (fighterTwo->getJumpState() == true)) { // MOVING FORWARD
            fighterTwo->getFighterMoves()->moveBackward(fighterTwo->getSpeed(),fighterTwo->getFighterTexture(),fighterTwo->getfighterRect(),fighterTwo->getMovementFighter(),fighterTwo->getFighterAnimation());
            fighterTwo->getFighterState()++;
        }

        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)&& (fighterTwo->getJumpState() == true)) { // MOVING BACKWARD
            fighterTwo->getFighterMoves()->moveForward(fighterTwo->getSpeed(),fighterTwo->getFighterTexture(),fighterTwo->getfighterRect(),fighterTwo->getMovementFighter(),fighterTwo->getFighterAnimation());
            fighterTwo->getFighterState()++;
        }

        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up) && fighterTwo->getJumpState() == true) { // MOVING BACKWARD
            fighterTwo->getFighterMoves()->jumpUp(fighterTwo->getSpeed(),fighterTwo->getFighterTexture(),fighterTwo->getfighterRect(),fighterTwo->getMovementFighter(),fighterTwo->getFighterAnimation());
            fighterTwo->getFighterState()++;
            fighterTwo->getJumpState()  = false;

        }

        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down) && fighterTwo->getJumpState()  == true) { // crouch
            fighterTwo->getFighterMoves()->crouch(fighterTwo->getSpeed(),fighterTwo->getFighterTexture(),fighterTwo->getfighterRect(),fighterTwo->getFighterAnimation(),fighterTwo->getHurtBox());
            fighterTwo->getFighterState()++;
        }

    }
}

void Game::pollEvents(Fighter* fighterOne,Fighter* fighterTwo,float deltaTime){

        while(this->window->pollEvent(this->event)){
            switch (this->event.type){
                case
                    sf::Event::Closed:
                    this->window->close();
                    break;

                case
                    sf::Event::KeyPressed:
                    if(this->event.key.code == sf::Keyboard::Escape){
                        this->window->close();
                    }
                    break;
            }
        }
}


void Fighter::update(float deltaTime){

    //fighterVelocity->x = 0.0f; // To stop directly when we release the button
    /*----------------------------------------------FIGHTER ONE-------------------------------------------------------------------------------------------------------------------*/
    this->animation->update(row,deltaTime ); 
    this->fighter->setTextureRect(this->animation->uvRect); 

    fighterState = 0;
    if(id == 1) { 

        /*----------------------------------------------IF NO CONTROL---------------------------------------------*/
        if (fighterState == 0) { 
            fighterTexture->loadFromFile("/home/spyro/Desktop/ProjetC++/FighterImages/KEN/Move/spriteNORMALSTATE.png");
            this->fighter->setTexture(fighterTexture);
            this->animation->transition(sf::Vector2u(10, 1), fighterTexture);
            hurtbox->getBox()->setSize(sf::Vector2f(100.0f,200.0f));
            hurtbox->getBox()->setOrigin(hurtbox->getBox()->getGlobalBounds().width/2,hurtbox->getBox()->getGlobalBounds().height/2);
            hurtbox->getBox()->setPosition(this->fighter->getPosition().x,this->fighter->getPosition().y);
        }
    }

    /*----------------------------------------------FIGHTER TWO--------------------------------------------------------------------------------------------------------------------*/
    else if(id == 2) {
        /*----------------------------------------------IF NO CONTROL---------------------------------------------*/
        if(fighterState == 0){ 
            fighterTexture->loadFromFile("/home/spyro/Desktop/ProjetC++/FighterImages/KEN/Move/spriteNORMALSTATE.png");
            this->fighter->setTexture(fighterTexture);
            this->fighter->setScale(-1.f,1.f); // Inversing Texture direction
            this->animation->transition(sf::Vector2u(10,1),fighterTexture);

            hurtbox->getBox()->setSize(sf::Vector2f(100.0f,200.0f));
            hurtbox->getBox()->setOrigin(hurtbox->getBox()->getGlobalBounds().width/2,hurtbox->getBox()->getGlobalBounds().height/2);
            hurtbox->getBox()->setPosition(this->fighter->getPosition().x,this->fighter->getPosition().y);
        }
    }

    //FIGHTER ANIMATION

    this->fighter->move(this->fighterVelocity->x*deltaTime,this->fighterVelocity->y*deltaTime);

    /*--------------------------------------------BOXES UPDATES-----------------------------------------------------------------------------------------------------------------------*/
    this->collisionBox->getBox()->move(this->fighterVelocity->x*deltaTime,this->fighterVelocity->y*deltaTime); 
    this->hurtbox->getBox()->move(this->fighterVelocity->x*deltaTime,this->fighterVelocity->y*deltaTime);
    fighterVelocity->x = 0.0f;// To stop directly when we release the button
}

我已经坚持了好几天,但无法解决这个问题。请问有人可以帮助我吗?

谢谢。

我正在制作街头霸王视频游戏,目前我已经制作了Fighters Collision(战斗机碰撞),Fighter Wall Collision(战斗机墙碰撞),前进,后退,跳跃,蹲下和打孔,除了跳拳之外,其他一切都正常,

animation sfml 2d-games
1个回答
0
投票
我已经坚持了很长时间:(,所以有人可以帮我吗?

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.