SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › как убрать зависимость анимации от движения мыши на экране
В этой теме 4 ответа, 4 участника, последнее обновление Mihalo15z 8 года/лет, 1 месяц назад.
-
АвторСообщения
-
не понимаю, что не так сделала
пока мышкой по окну вожу, анимация происходит…как только перестаю..анимация замираети еще если enemy.update писать внутри цикла while (window.pollEvent(event)) анимация сильно тормозит
а если вне его, то быстро происходитC++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155#ifndef ENEMY_H#define ENEMY_H#include <SFML/Graphics.hpp>using namespace sf;class Enemy{public:float dx,dy;FloatRect rect;Sprite sprite;float currentFrame;bool life;String name;void set(String name,Texture &image, int x, int y);void update(float time);void destroy();};#endif#include <SFML/Graphics.hpp>#include "Enemy.h"#include <iostream>using namespace sf;float offsetX=0, offsetY=0;void Enemy::set(String name,Texture &image, int x, int y){sprite.setTexture(image);if(name == "fly1"){rect = FloatRect(x, y, 240, 140);dx=0.1;}if(name == "fly1inv"){rect = FloatRect(x, y, 140, 240);dx=0.05;}currentFrame = 0;life=true;}void Enemy::update(float time){rect.left += dx * time;currentFrame += time * 0.005;if (currentFrame > 3) currentFrame -= 3;sprite.setTextureRect(IntRect(250*int(currentFrame), 0, 240, 140));sprite.setPosition(rect.left, rect.top);}void Enemy::destroy(){sprite.setColor(Color::Red);rect.top += dy*0.05;//sprite.setPosition(rect.left, rect.top);//if (sprite.getGlobalBounds().top <0)// this->~Enemy();}#include <SFML/Graphics.hpp>#include "Enemy.h"#include <iostream>using namespace sf;int main(){RenderWindow window(VideoMode::getDesktopMode(), "Kill Monster"/*,Style::Fullscreen*/);View view;Texture Background;Background.loadFromFile("background.jpg");Sprite Back;Back.setTexture(Background);Back.setScale(1.00f, 1.00f);float m1 = Background.getSize().x;float m2 = Background.getSize().y;Texture monstr;monstr.loadFromFile("fly1.png");Enemy enemydrag;enemydrag.set("fly1",monstr,200,200);Clock clock;while (window.isOpen()){float time = clock.getElapsedTime().asMicroseconds();clock.restart();time = time/800;Event event;while (window.pollEvent(event)){if (event.type == Event::Closed)window.close();Vector2i pixelPos = Mouse::getPosition(window);Vector2f pos = window.mapPixelToCoords(pixelPos);if (event.type == Event::MouseButtonPressed){if (event.key.code == Mouse::Left){if (enemydrag.sprite.getGlobalBounds().contains(pos.x, pos.y))//и при этом координата курсора попадает в спрайт{enemydrag.life = false;std::cout<<"kill ";enemydrag.destroy();//Scroll+=25;std::cout<<Scroll;}//else { Scroll-=3;}}}if(enemydrag.sprite.getPosition().x > m1)enemydrag.destroy();enemydrag.update(time);window.setView(view);window.clear();window.draw(Back);window.draw(enemydrag.sprite);window.display();Vector2i localPosition = Mouse::getPosition(window);Vector2i GlobPosition = Mouse::getPosition();sf::Vector2f worldPos = window.mapPixelToCoords(pixelPos);if (localPosition.x < 3 && worldPos.x >0) { view.move(-25.2*time, 0); }//если пришли курсором в левый край экрана,то двигаем камеру влевоif (localPosition.x > window.getSize().x-3 && worldPos.x < m1) { view.move(25.2*time, 0); }//правый край-вправо};}return 0;}Вложения:
You must be logged in to view attached files.у меня в игре вообще нет персонажа
это будет что-то вроде тира
что я делаю не так?(Попробуй enemydrag.update(time); и все что ниже (похожие строки внизу теснятся) – выпилить из этого цикла пул эвент. т.е занести за скобку } но оставить в цикле “пока открыто окно”
Была та же проблема, решение – вынести из цикла event.
Вместо event.type == Event::MouseButtonPressed
за циклом используй Mouse::isButtonPressed(Mouse::Left)если не использовать if((event.type == sf::Event::MouseButtonPressed) && ( Mouse::isButtonPressed(Mouse::Left)))? в только Mouse::isButtonPressed(Mouse::Left), то нажатие будет сквозное, не важно какое окно будет в таргете. ( Для примера можно закрыть область нажатия консолью и кликнуть по консоли).
Что за процессор? Скок ядер? Не используя режима “Sleep” вы загружаете одно ядро до предела возможностей( относительно загруженности от других приложений), что возможно и является причиной подтормаживания.(как решение использовать лимит кадров в секунду) Плюс происходит отслеживание всех событий ( движения, нажатия и тд.) Можно глянуть в справку для SFML :
” bool sf::Window::pollEvent ( Event & event )
Pop the event on top of the event queue, if any, and return it. … ”
А это не так мало времени и переменная time может оказаться не корректной вне цикла пула.
Не знаю почему предложено было использовать time для синхронизации, но так выходит обогреватель.А перестает работать анимация при отсутствии движений мыши , потому что нету никаких событий. window.pollEvent(event) = false !!!!
Все что не использует event надо выносить в основной цикл. -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.