C ++ - блоки не перемещаются, и мой массив не работает - PullRequest
0 голосов
/ 20 июня 2020

Я впервые пытаюсь создать игру, используя C ++ в SFML.
Хочу: 6 блоков падают сверху вниз случайным образом.
Результат: 1 блок остается наверху.
Как я должен исправить в этом коде?

#include <SFML/Graphics.hpp>
#include <vector>
#include <time.h>
using namespace sf;
using namespace std;

struct Position{
    int x;
    int y;
};

int main()
{
    srand(time(NULL));

    RenderWindow window(VideoMode(600, 480), "AVOID BLOCKS");
    window.setFramerateLimit(60);

    Texture t1, t2;
    t1.loadFromFile("images/block.png");
    t2.loadFromFile("images/cha2.png");

    Sprite block(t1), cha2(t2);
    Position blockPos;
    blockPos.y = 0 + t1.getSize().y;
    cha2.setPosition(300, 400);

    float blockSpeed = 4;

    const int size = 6;
    vector<Sprite> blocks(6);
    int n = 0;
    auto bsize = t1.getSize();
    for (int i = 0; i < 6; i++) {
        blocks[n].setTexture(t1);
        blocks[n].setPosition(rand()%10*bsize.x, 0);
        n++;
    }

    while (window.isOpen())
    {
        Event e;
        while (window.pollEvent(e)) {
            if (e.type == Event::Closed)
                window.close();
        }

        auto cha2_pos = cha2.getPosition();

        if (Keyboard::isKeyPressed(Keyboard::Left)) {
            if (cha2.getPosition().x < 0)
                continue;
            cha2.move(-5.0, 0.0);
        }
        if (Keyboard::isKeyPressed(Keyboard::Right)) {
            if (cha2.getPosition().x > 600)
                continue;
            cha2.move(5.0, 0.0);
        }

        if (blockPos.y >= 480) {
            blockPos.y = 0 + t1.getSize().y;
            blockSpeed = blockSpeed + 0.2;
        }
        else
            blockPos.y += blockSpeed;

        for (int i = 0; i < blocks.size(); i++) {
            if (FloatRect(cha2_pos.x + 3, cha2_pos.y + 3, 10, 10).
                intersects(blocks[i].getGlobalBounds())) { 
                window.close();
            }
        }

        window.clear();
        window.draw(block);
        window.draw(cha2);
        window.display();
    }
    return 0;

}

Персонаж внизу движется хорошо.
Понятия не имею, почему блок не двигается, а есть только один.
Думаю, что-то не так в начале части "const int размер ».

1 Ответ

0 голосов
/ 26 июня 2020

У вашей программы две основные проблемы. Прежде всего, вы не draw все блоки в vector, а draw только конкретный блок, который вы создали. Вот почему вы видите на экране только один блок, а не все созданные вами блоки. Решение для этого:

for(auto& blk : blocks)
   window.draw(blk);

Вторая проблема влияет на движение блоков. Вы создали struct Position, но никогда не связывались с блоками. Таким образом, после того, как вы увеличите blockPos.y, вы должны переместить блоки на этот новый blockPos.y. Явно:

for(auto& blk : blocks)
   blk.setPosition(blockPos.x, blockPos.y);

Таким образом, у вас будет проблема, заключающаяся в том, что каждый блок будет находиться в одной позиции с другими, потому что переменная blockPos является общей для всех блоков. A Хорошая идея - создать класс Block, чтобы у какого блока была собственная позиция и движение. Вот пример того, что я говорю:

class Block {
private:
    Sprite block;
    Position blockPos;
public:
    Block(Texture& texture, int x, int y)
    {
        block.setTexture(texture);
        blockPos.y = y;
        blockPos.x = x; // save this value because you will need it
                        // every time you move the block
    }
    void setBlockPosition(float y)
    {
        blockPos.y = y;
    }
    Vector2<float> getBlockPosition()
    {
        return Vector2f(blockPos.x, blockPos.y);
    }
    void blockMovement(int y)
    {
        blockPos.y += y;
        block.setPosition(blockPos.x, blockPos.y);
    }
    Sprite getSprite()
    {
        return block;
    }
    void Draw(RenderWindow& window)
    {
        window.draw(block);
    }
};

После этого я объявляю вектор с новыми объектами Dynami c:

vector<Block*> blocks(6);
for(unsigned int i = 0; i < blocks.size(); i++)
{
    blocks[i] = new Block(t1, rand()%10*t1.getSize().x ,0 - t1.getSize().y);
}

Я меняю if операторы также:

for(unsigned int i = 0; i < blocks.size(); i++) //check for which block in the vector
{
    if (blocks[i]->getBlockPosition().y >= 480) {
        blocks[i]->setBlockPosition(0 - 200);
        blockSpeed = blockSpeed + 0.2;
    }
    else {
        blocks[i]->blockMovement(blockSpeed);
    }
}

for (unsigned int i = 0; i < blocks.size(); i++) {
    if (FloatRect(cha2_pos.x + 3, cha2_pos.y + 3, 10, 10)
         .intersects(blocks[i]->getSprite().getGlobalBounds())) {
                window.close();
    }
}

Не забудьте в конце удалить объекты, потому что они были размещены динамически:

for(unsigned int i = 0; i < blocks.size(); i++)
    delete blocks[i];
return 0;
...