我们正在创建一个有地图的游戏。在这些地图上,玩家可以步行,但是为了知道他们是否可以步行到某个地方,我们有另一个图像,其中的路径是绘画。
玩家可以通过点击地图来移动,如果点击与对撞机图像匹配,角色应该用探路器去点击的点。如果不是,角色不会移动。
例如,下面是一个贴图及其碰撞路径图像:


我怎么知道我是否在Qt中点击了碰撞器(这是一个只有一种颜色和透明度的png )?我正在使用QML和Felgo进行渲染,所以如果已经有一种方法可以用QML实现,那就更好了,但我也可以用C++实现它。
我的第二个问题是如何做一个探路者?我知道这方面的算法,但我应该使用像素移动吗?
我已经看到了QPainterPath类,它可能是我正在寻找的,我如何才能读取图像中具有特定颜色的所有像素并知道它们的坐标?
谢谢
发布于 2020-07-26 07:12:31
QImage::constScanLine,每次读取K个像素。N=图像高度,K= width.如何处理QImage::constScanLine返回的uchar*
您应该调用QImage::format()来确定被uchar*隐藏的像素格式。或者,您可以调用QImage::convertToFormat(QImage::Format_RGB32)并始终将像素数据从uchar*转换为您的自定义结构,如PixelData
#pragma pack(push, 1)
struct PixelData {
uint8_t padding;
uint8_t r;
uint8_t g;
uint8_t b;
};
#pragma pack(pop)根据该文档:https://doc.qt.io/qt-5/qimage.html#Format-enum
这是一个可编译的解决方案,用于将图像加载到RAM中,以便进一步有效地处理其数据:
#include <QImage>
#pragma pack(push, 1)
struct PixelData {
uint8_t padding;
uint8_t r;
uint8_t g;
uint8_t b;
};
#pragma pack(pop)
void loadImage(const char* path, int& w, int& h, PixelData** data) {
Q_ASSERT(data);
QImage initialImage;
initialImage.load(path);
auto image = initialImage.convertToFormat(QImage::Format_RGB32);
w = image.width();
h = image.height();
*data = new PixelData[w * h];
PixelData* outData = *data;
for (int y = 0; y < h; y++) {
auto scanLine = image.constScanLine(y);
memcpy(outData, scanLine, sizeof(PixelData) * w);
outData += w;
}
}
void pathfinder(const PixelData* data, int w, int h) {
// Your algorithm here
}
void cleanupData(PixelData* data) {
delete[] data;
}
int main(int argc, char *argv[])
{
int width, height;
PixelData* data;
loadImage("D:\\image.png", width, height, &data);
pathfinder(data, width, height);
cleanupData(data);
return 0;
}您可以通过调用此函数来访问每个像素
inline const PixelData& getPixel(int x, int y, const PixelData* data, int w) {
return *(data + (w * y) + x);
}..。或者在你的寻路算法中使用这个公式,这样会更有效率。
https://stackoverflow.com/questions/62909736
复制相似问题