我正在制作街头霸王视频游戏,现在我制作了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(战斗机墙碰撞),前进,后退,跳跃,蹲下和打孔,除了跳拳之外,其他一切都正常,
谢谢