我正在使用 Visual Studio 2010 和 Qt 4.7(两个窗口)中的 c++ 组合进行游戏。该游戏是战舰的克隆,基于控制台输入。我已经创建了我想要的 gui,在 Qt 设计器的 Qt 端,我的 gui 包含一个 10x10 的网格布局,使用标签来保存游戏单元的像素图:
我煞费苦心地命名每个标签来表示它在二维数组中的位置(即车队地图 => F_00
=> F[0,0]
=> F[i],[j]
)。我可以使用属性编辑器手动选择我想显示的像素图,但我想要一些动态的。
我使用更新地图板类在玩家开火后重新绘制游戏板,它继续存储在一个 char 数组上。我想使用通用的 getupdatearray 类型函数为每个更新我的像素图。当我们遍历数组时,它将更新当前与各个标签关联的像素图,以匹配数组中的表兄弟。(比如说F[5][6] = 'X'
命中,然后当循环到达数组中的那个位置时,它会将 F_56 处的像素图网格更新为等于hit.png,替换empty.png。
我有一个想法如何制作可以完成此任务的循环,但不确定如何让每个标签的像素图更符合运行时功能而不是现在的编译时(静态)功能。我读过关于 QPainter 和另一个处理图像的 Qt 类,但仍然很难做到。
对你们任何人的问题,我如何根据二维数组更新这些像素图?
- 循环结构-我可以弄清楚
- 条件语句 - 我可以弄清楚
- qt 处理标签的特定语法 - 新手所以不知道 atm。
这是我试图用 map.h 做的那种事情的一些伪代码:
#include <QtCore>
#include <QtGui>
// WARNING: PSEUDOCODE, DOES NOT COMPILE
// AT A LOSS ON HOW TO SELECT THE CORRECT LABEL
// MAYBE A CHILD CLASS FOR THAT?
class map {
public:
char updateboard(char mapname, char b[][10]){
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
char C = b[i][j];
if (C == 'M'){//miss
Qlabel mapname_[i][j](<img src='images/missspace.png'/>);
mapname_[i][j].show();
}
else if(C == 'X'){//hit
Qlabel mapname_[i][j](<img src='images/hitspace.png'/>);
mapname_[i][j].show();
}
else if(C == ' '){//undiscovered space
Qlabel mapname_[i][j](<img src='image/emptyspace.png'/>);
mapname_[i][j].show();
}
}
}
}
};
然后在我的 mainwindow.cpp 中,我包含 map.h 并说:
// calls class function update board
// takes updated array values and replaces old pixmap with new
map.updateboard(T,b[][10]); // target map update
map.updateboard(F,v[][10]); // fleet map update
提前致谢
更新:
我已经到了可以用按钮交换像素图的地步,但我想创造一些更动态的东西。我想使用一个Qstring,通过使用以下方法附加xy值来放置我想要更改的标签的名称:
TR_position.append(QString::number(xvalue));
当我尝试使用以下方法调用它时:
ui->TR_position->setPixmap(QPixmap(":/images/missspace.png"));
……这显然行不通。有没有办法输入大小写,或者使用字符串的内容作为 Qlabel 名称?