1

私はタイル マッピングを使用しており、マップ クラスを配置して、スプライトの配列を使用してマップを描画しています。スプライトの位置を設定し、その周りに境界ボックス配列を作成してから、スプライトを描画します。

次に、プレイヤーの境界ボックスを取得し、それをスプライトの各境界ボックスと比較する衝突クラスがあります。platformboundingBox という配列があります。これにより、各スプライトの各バウンディング ボックスが配列に格納されます。ただし、値を比較すると、プラットフォームの境界ボックスにはどの場所にも値がないように見えますが、各スプライトの値が境界ボックス配列に入ることが確認されています。

これが私のマップクラスです。描画マップと衝突関数を参照してください。誰かが助けてくれれば、本当に感謝しています。

#include "Map.h"
#include "Block.h"
#include <sstream>
using namespace std;
Map::Map()
{
    //map ctor;
}

Map::~Map()
{
    // map dtor
}



void Map::Initialise(const char *filename)
{

    if(!BlockImage.LoadFromFile("Images/block.png"))
        cout<<endl<<"failed to load block image"<<endl;
    if(!GemImage.LoadFromFile("Images/Gem.png"))
        cout<<endl<<"failed to load Gem Image"<<endl;
    if(!leftBlockImage.LoadFromFile("Images/blockLeft.png"))
        cout<<endl<<"failed to load left block Image"<<endl;
    if(!rightBlockImage.LoadFromFile("Images/blockRight.png"))
        cout<<endl<<"failed to load right block Image"<<endl;
    std::ifstream openfile(filename);
    std::vector <int>  tempvector;
    std::string line;

    while(std::getline(openfile, line))

    {

        for(int i =0; i < line.length(); i++)
        {
            if(line[i] != ' ') // if the value is not a space
            {
                char value = line[i];
                tempvector.push_back(value - '0');
            }

        }
            mapVector.push_back(tempvector); // push back the value of the temp vector into the map vector
            tempvector.clear(); // clear the temp vector readt for the next value
    }



}

    void Map::DrawMap(sf::RenderWindow &Window)
            {
                Player playermap;

                    for(i = 0; i < mapVector.size(); i++)
                {
                    for(j = 0; j < mapVector[i].size(); j++)
                    {
                          if(mapVector[i][j] == 1)
                         {
                            sprite[j].SetImage(BlockImage);
                            sprite[j].SetPosition(j * BLOCKSIZE, i * BLOCKSIZE);
                            platformBoundingBox[j].Bottom = sprite[j].GetPosition().y;
                            platformBoundingBox[j].Left = sprite[j].GetPosition().x - 5;
                            platformBoundingBox[j].Right = sprite[j].GetPosition().x;
                            Window.Draw(sprite[j]);

                         }
                          else if(mapVector[i][j] == 2)
                          {
                              sprite[j].SetImage(GemImage);
                              sprite[j].SetPosition(j * BLOCKSIZE, i * BLOCKSIZE);
                              platformBoundingBox[j].Top = sprite[j].GetPosition().y - 5;
                              platformBoundingBox[j].Bottom = sprite[j].GetPosition().y;
                              platformBoundingBox[j].Left = sprite[j].GetPosition().x - 5;
                              platformBoundingBox[j].Right = sprite[j].GetPosition().x;
                              Window.Draw(sprite[j]);
                          }
                          else if(mapVector[i][j] == 3)
                          {
                              sprite[j].SetImage(leftBlockImage);
                              sprite[j].SetPosition(j * BLOCKSIZE, i * BLOCKSIZE);
                              platformBoundingBox[j].Top = sprite[i].GetPosition().y - 5;
                              platformBoundingBox[j].Bottom = sprite[i].GetPosition().y;
                              platformBoundingBox[j].Left = sprite[i].GetPosition().x - 5;
                              platformBoundingBox[j].Right = sprite[i].GetPosition().x;
                              Window.Draw(sprite[j]);
                          }
                          else if(mapVector[i][j] == 4)
                          {
                              sprite[j].SetImage(rightBlockImage);
                              sprite[j].SetPosition(j * BLOCKSIZE, i * BLOCKSIZE);
                              platformBoundingBox[j].Top = sprite[i].GetPosition().y - 5;
                              platformBoundingBox[j].Bottom = sprite[i].GetPosition().y;
                              platformBoundingBox[j].Left = sprite[i].GetPosition().x - 5;
                              platformBoundingBox[j].Right = sprite[i].GetPosition().x;
                              Window.Draw(sprite[j]);
                          }
                    }
                }
            }

    void Map::collisions(float x, float y)
    {
        Player playermap;
        this->x = x;
        this->y = y;                
        playerboundingbox.Top = y - 5;
        playerboundingbox.Bottom = y ;
        playerboundingbox.Left = x - 5;
        playerboundingbox.Right = x;
        for(i = 0; i < 100; i++)
        {
            if(playerboundingbox.Intersects(platformBoundingBox[i]))
                cout << " praise the lord";     
        }


    }
4

1 に答える 1

0

SFML 1.6 はバグが多いので、SFML 2 に切り替えてください。

以下を配置するhandlerという名前のクラスを作成するとします。

handler::handler()
    // window initialization
    Map Map; // here initialize the Map class
    /* why don't use Map::Map( ctor) for initialization? */
    // player initialization
    // run the program as long as the window is open
    while (window.isOpen())
    {
        // check all the window's events that were triggered since the last iteration of the loop
        sf::Event event;
        while (window.pollEvent(event))
        {
            // "close requested" event: we close the window
            if (event.type == sf::Event::Closed)
            window.close();
        }
        window.clear();
        //draw player
        Map.DrawMap(); // also need to improve the drawing for less lag
        window.display();

        update(Map &Map, Player &Player);
        // every time to use & because without the compiler will create another object
    }
}   

update(Map &Map, Player &Player)
{
    // verify if exists some interacts
    if (intersects(Map &Map, Player &Player))
    {
        //verify from where and put to the correct position
        /* e.g: if we have a collide with a down tile map will say something like this:
        Player.setPosition(Player.getPosition().x, (Player.getGlobalBounds().top+Player.getGlobalBounds().height)-(Map.getGlobalBounds().top-(Player.getGlobalBounds().top+Player.getGlobalBounds().height)); */
    }
}

intersects(Map &Map, Player &Player)
{
    sf::FloatRect fPlayer = Player.getGlobalBounds();
    for (int i=0; i<Map.NrOfYourTiles; ++i)
    {
        sf::FloatRect fMap = YourTile.getGlobalBounds();
        if (fPlayer.intersects(fMap))
            return 1;
    }
    return 0;
}

これがお役に立てば幸いです (コードは SFML 2.0 です)。作成者 sfml-dev.org のフォーラムで、さらに多くのヘルプを見つけることができます。

于 2013-04-13T14:04:15.243 に答える