如何使用C ++ SFML中的数据/文本文件为Breakout游戏创建积木布局?

问题描述

我正在使用SFML库在C ++中创建经典的突破游戏。到目前为止,我已经实现了可移动的球拍和球。

目前,我的目标是创建砖块布局。到目前为止,我已经有了它,以便显示单个砖块。但是,我想这样做,以便可以使用字母(例如,使用字母'B')在文本文件中绘制砖块布局,读取该文本文件的砖块布局并在游戏中绘制该布局。

我不确定如何执行此操作,因此任何帮助都会很棒!

到目前为止,这是我的代码(请注意,由于我认为此问题不需要它,因此我不包括Paddle和Ball):

GameObject.h

#pragma once
#include <SFML/Graphics.hpp>

class GameObject
{
protected:
    sf::Vector2f position;
    float speed;
    sf::RenderWindow& m_window;

public:
    GameObject(float startX,float startY,sf::RenderWindow& window);
    virtual ~GameObject() {};
    virtual void Draw() = 0;
    virtual void Update() = 0;
}; 

GameObject.cpp

#include "GameObject.h"

GameObject::GameObject(float startX,sf::RenderWindow& window)
    : position{ startX,startY },speed{ 0.5f },m_window{ window }
{
}

Brick.h

#pragma once
#include "GameObject.h"

class Brick : public GameObject
{
private:
    sf::RectangleShape brickShape;
    static constexpr int shapeWidth = 50;
    static constexpr int shapeHeight = 20;
    int color;
    int strength;

public:
    Brick(float startX,sf::RenderWindow& window);
    sf::FloatRect getPosition();
    sf::RectangleShape getShape();
    int getStrength();
    void setStrength(int strengthValue);
    void Draw() override;
    void Update() override;
};

Brick.cpp

#include "Brick.h"

Brick::Brick(float startX,sf::RenderWindow& window)
    : GameObject{ startX,startY,window }
{
    brickShape.setSize(sf::Vector2f(shapeWidth,shapeHeight));
    brickShape.setPosition(position);
    
    color = (rand() % 2) + 1;
    if (color == 1)
    {
        brickShape.setFillColor(sf::Color::Yellow);
        strength = 1;
    }
    else
    {
        brickShape.setFillColor(sf::Color(255,165,0));
        strength = 2;
    }
}

sf::FloatRect Brick::getPosition()
{
    return brickShape.getGlobalBounds();
}

sf::RectangleShape Brick::getShape()
{
    return brickShape;
}

int Brick::getStrength()
{
    return strength;
}

void Brick::setStrength(int strengthValue)
{
    strength = strengthValue;
}

void Brick::Draw()
{
    m_window.draw(brickShape);
}

void Brick::Update()
{

}

Game.h

#pragma once
#include <SFML/Graphics.hpp>

#include "Paddle.h"
#include "Ball.h"
#include "Brick.h"

#include <algorithm>
#include <fstream>
#include <iostream>

class Game
{
private:
    sf::RenderWindow& m_window;
    std::unique_ptr<Paddle> player;
    std::unique_ptr<Ball> ball;
    std::unique_ptr<Brick> brick;
    std::vector<std::unique_ptr<Brick>>bricks;

    int bricksCountX;
    int bricksCountY;

public:
    const unsigned int m_windowWidth;
    const unsigned int m_windowHeight;

public:
    Game(sf::RenderWindow& window,const unsigned int& windowWidth,const unsigned int& windowHeight);
    float RandomFloat(float a,float b);
    void ReadFile();
    void HandleCollision();
    void Handleinput();
    void Draw();
    void Update();
    void Run();
};

Game.cpp

#include "Game.h"

Game::Game(sf::RenderWindow& window,const unsigned int& windowHeight)
    : m_window{ window },m_windowWidth{ windowWidth },m_windowHeight{ windowHeight }
{
    player = std::make_unique<Paddle>(m_windowWidth/2,m_windowHeight - 70,m_window);
    ball = std::make_unique<Ball>(m_windowWidth / 2,m_windowHeight / 2,m_window);

    ReadFile();

    for (int i = 0; i < bricksCountX; i++)
        for (int j = 0; j < bricksCountY; j++)
            bricks.emplace_back(std::make_unique<Brick>((i + 1.5) * ((long long)brick->getShape().getSize().x + 3) + 22,(j + 5) * (brick->getShape().getSize().y + 3),m_window));
}

float Game::RandomFloat(float a,float b)
{
    return ((b - a) * ((float)rand() / RAND_MAX)) + a;
}

void Game::ReadFile()
{
    // Create a text string,which is used to output the text file
    std::string bricksText;
    int numOfLines = 0;

    // Read from the text file
    std::ifstream MyReadFile("Bricks Layout.txt");

    // Use a while loop together with the getline() function to read the file line by line
    while (std::getline(MyReadFile,bricksText))
    {
        ++numOfLines;

        // Output the text from the file
        

        bricksCountX = bricksText.length();

        std::cout << bricksCountX;
    }

    bricksCountY = numOfLines;

    // Close the file
    MyReadFile.close();
}

void Game::HandleCollision()
{
    if (ball->getShape().getPosition().x - ball->geTradius() < 0.0f)
    {
        ball->reboundLeft();
    }
    else if (ball->getShape().getPosition().x + ball->geTradius() > m_windowWidth)
    {
        ball->reboundRight();
    }
    else if (ball->getShape().getPosition().y - ball->geTradius() < 0.0f)
    {
        ball->reboundTop();
    }
    else if (ball->getShape().getPosition().y + ball->geTradius() > m_windowHeight)
    {
        ball->ballAngle = ball->ballAngle * -1;
    }
    else if (ball->getPosition().intersects(player->getPosition()))
    {
        ball->reboundPaddle(*player);
    }
    for (unsigned int i = 0; i < bricks.size(); i++)
    {
        if (ball->getPosition().intersects(bricks[i]->getPosition()))
        {
            if (bricks[i]->getStrength() == 1)
            {
                ball->reboundBrick(*bricks[i]);
                bricks.erase(std::remove(bricks.begin(),bricks.end(),bricks[i]),bricks.end());
            }
            else
            {
                ball->reboundBrick(*bricks[i]);
                bricks[i]->setStrength(1);
            }
        }
    }
}

void Game::Handleinput()
{
    player->Handleinput();
}

void Game::Draw()
{
    player->Draw();
    ball->Draw();
    for (unsigned int i = 0; i < bricks.size(); i++)
    {
        bricks[i]->Draw();
    }
}

void Game::Update()
{
    player->Update();
    ball->Update();
    brick->Update();
}

void Game::Run()
{
    //Game Loop
    while (m_window.isopen())
    {
        sf::Event event;
        while (m_window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed || sf::Keyboard::isKeypressed(sf::Keyboard::Escape))
                m_window.close();
        }

        m_window.clear();

        Draw();
        Handleinput();
        HandleCollision();
        Update();

        m_window.display();
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)