SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › Передвижение
Помечено: Передвижение
В этой теме 1 ответ, 2 участника, последнее обновление BunDem 3 года/лет, 11 мес. назад.
-
АвторСообщения
-
Столкнулся со странной проблемой. аналогов вопроса на форуме не нашел. При передвижении персонажа, если нажать на 2-е клавиши одновременно, то при отжатии клавиш персонаж продолжает двигаться в одном из направлений. проблема вогнала меня в полный тупик
#include <SFML/Graphics.hpp>
#include <iostream>using namespace sf;
///////////////////////////////////Класс всех существ///////////////////////////////////
class Entity{
public:
float x, y;
float dx, dy, speed = 0;
int w, h, health;
bool life, isMove;
Texture texture;
Sprite sprite;
String name;
Entity(Image &image, float X, float Y, int W, int H, String Name){
x = X; y = Y; w = W; h = H, name = Name;
life = true; isMove = false;
texture.loadFromImage(image);
sprite.setTexture(texture);
sprite.setOrigin(w / 2, h / 2);
}
};///////////////////////////////////Класс игрока который наследуется от класа всех существ///////////////////////////////////
class Player :public Entity {
public:
enum {left, right, up, down, stay} state;
int gold, experience, lvl, talants;
Player(Image &image, float X, float Y, int W, int H, String name) :Entity(image, X, Y, W, H, name) {
gold = 0; experience = 0; lvl = 1; talants = 0; state = stay;
if (name == “Player1″) {
sprite.setTextureRect(IntRect(0, 0, w, h));
}
}void control() {
if (Keyboard::isKeyPressed) {
if (Keyboard::isKeyPressed(Keyboard::A)) {
state = left;
speed = 0.5;
}
if (Keyboard::isKeyPressed(Keyboard::D)) {
state = right;
speed = 0.5;
}
if (Keyboard::isKeyPressed(Keyboard::W)) {
state = up;
speed = 0.5;
}
if (Keyboard::isKeyPressed(Keyboard::S)) {
state = down;
speed = 0.5;
}
}
}void update(float time) {
control();
switch (state)
{
case left:dx = -speed;
break;
case right:dx = speed;
break;
case up:dy = -speed;
break;
case down:dy = speed;
break;
case stay:dx = 0; dy = 0;
break;
}
x += dx * time;
y += dy * time;sprite.setPosition(x + w / 2, y + h / 2);
if (health <= 0) { life = false; }
if (!isMove) { speed = 0; }
}};
int main()
{
sf::RenderWindow window(VideoMode(1280, 720), “theGame”);Image HeroImage;
HeroImage.loadFromFile(“images/hero.png”);Player p(HeroImage, 0, 0, 32, 32,”Player1″);
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();
}p.update(time);
window.clear();
window.draw(p.sprite);
window.display();
}
return 0;
}А если нажать одну клавишу и отпустить, игрок остановится? Просто нет возможности запустить сейчас код, но посмотрев я не вижу условий для включения состояния “stay”, проверяется только нажатие клавиш, а вот их отпускание – нет. Он разве не бежит бесконечно?
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.