У вашей программы две основные проблемы. Прежде всего, вы не 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;