Передвижение

Помечено: 

В этой теме 1 ответ, 2 участника, последнее обновление  BunDem 4 года/лет, 4 мес. назад.

Просмотр 2 сообщений - с 1 по 2 (из 2 всего)
  • Автор
    Сообщения
  • #5099

    AnatoliiD
    Участник
    Сообщений:1

    Зарегистрирован:
    27.02.2019

    Репутация:0

    Столкнулся со странной проблемой. аналогов вопроса на форуме не нашел. При передвижении персонажа, если нажать на 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;
    }

    #5161

    BunDem
    Участник
    Сообщений:103

    Зарегистрирован:
    10.05.2015

    Репутация:23

    А если нажать одну клавишу и отпустить, игрок остановится? Просто нет возможности запустить сейчас код, но посмотрев я не вижу условий для включения состояния “stay”, проверяется только нажатие клавиш, а вот их отпускание – нет. Он разве не бежит бесконечно?

Просмотр 2 сообщений - с 1 по 2 (из 2 всего)

Для ответа в этой теме необходимо авторизоваться.