gpt4 book ai didi

c++ - SFML 碰撞检测只在原点工作?

转载 作者:行者123 更新时间:2023-11-30 05:12:57 25 4
gpt4 key购买 nike

我想知道为什么我的碰撞只有在我将 Sprite 移动到屏幕原点时才有效。是我加载 map 的方式有问题,还是我不完全理解 Sprite 的工作原理?这是我的 tilemap 代码

瓷砖 map .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

最佳答案

你只有一个 Sprite ,你改变它的位置来绘制它。好的,但是当你测试是否有碰撞时,你测试了你设置给你的 Sprite 的最新位置的碰撞。所以,你不应该测试与你的 Sprite 的碰撞。如果您仍然可以访问您的 map ,请改用它。

编辑:

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

sf::Texture 是资源,sf::Sprite 只是一个用来绘制的类,所以你可以用很少的纹理创建很多 Sprite 。 ( std::vector<std::vector<sf::Sprite>> map )

关于c++ - SFML 碰撞检测只在原点工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44216875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com