2017-05-27 58 views
0

我想知道爲什麼我的碰撞只在將我的精靈移動到屏幕原點時才起作用。這是我加載我的地​​圖的方式有問題,還是有一些關於精靈如何工作,我不完全明白的問題?下面是我對tilemap的SFML碰撞檢測只在原點工作?

Tilemap.cpp

#include "Tilemap.h" 
#include "Player.h" 

#include <SFML/Graphics.hpp> 
#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 
using namespace sf; 

//default constructor 
Tilemap::Tilemap() 
{ 
    if (!texture.loadFromFile("map/purpleBlock.png")) 
    { 
     cout << "Error opening file" << endl; 
    } 

    sprite.setTexture(texture); 
} 

//reads tilemap from a text file into an array 
void Tilemap::loadTile(RenderWindow &window, string filename) 
{ 
    string temp; 
    ifstream mapFile; 
    mapFile.open("map/test.map"); 

    if (!mapFile.is_open()) 
    { 
     cout << "Error opening " << filename << endl; 
    } 

    //getline(mapFile, tileSet); 

    //reading height, width, tile height, tile width and storing them into variables 
    getline(mapFile, temp); 
    tileWidth = stoi(temp, nullptr); 
    getline(mapFile, temp); 
    tileHeight = stoi(temp, nullptr); 

    getline(mapFile, temp); 
    width = stoi(temp, nullptr); 
    getline(mapFile, temp); 
    height = stoi(temp, nullptr); 

    data = new int[width*height]; 

    //reading values into array 
    for (int y = 0; y < height; ++y) 
    { 
     for (int x = 0; x < width; ++x) 
     { 
      char temp; 
      mapFile >> data[x + y * width] >> temp; 
     } 
    } 

    mapFile.close(); 
} 

//drawing the map onto the screen 
void Tilemap::drawMap(RenderWindow &window) 
{ 
    for (int y = 0; y < height; ++y) 
    { 
     for (int x = 0; x < width; ++x) 
     { 
      if (!data[x + y * width] == 0) 
      { 
       sprite.setPosition(x * 32, y * 32); 
       sprite.setTextureRect(IntRect(0, 0, tileWidth, tileHeight)); 
       window.draw(sprite); 
      } 
     } 
    } 

} 

//testing collision 
bool Tilemap::tileCollision(RenderWindow &window, RectangleShape &rect) 
{ 
    if (sprite.getGlobalBounds().intersects(rect.getGlobalBounds())) 
    { 
     cout << "Collision" << endl; 
    } 

    return true; 
} 

enter image description here

回答

0

代碼,您只有一個精靈,你改變它的位置繪製它。好的,但是當你測試碰撞是否存在時,你可以用你設置爲精靈的最新位置來測試碰撞。所以,你不應該與你的精靈測試碰撞。如果您仍然可以訪問您的地圖,請改用它。

編輯:

我看到您的帖子Using tiles in SFML and collision detection

順豐::質地的資源,SF ::雪碧只是畫類,這樣你就可以創建很少紋理許多精靈。 (std::vector<std::vector<sf::Sprite>> map