Я провожу игру, используя комбинацию С++ в Visual Studios 2010 и Qt 4.7 (оба окна). Игра представляет собой клон линкора и основана на консольном вводе. Я создал свой графический интерфейс так, как я хочу, и на стороне Qt в конструкторе Qt мой графический интерфейс состоит из макета сетки 10x10 с использованием меток для хранения растровых изображений игровых ячеек:
Я тщательно назвал каждую метку, чтобы представить ее положение в массиве 2d (например, карта флота => F_00
=> F[0,0]
=> F[i],[j]
). Я могу вручную выбрать растровое изображение, которое я хотел бы отобразить, используя редактор свойств, но я хотел бы что-то динамичное.
Я использую класс update mapboard, чтобы перерисовывать игровое поле после того, как игрок стреляет, который продолжает храниться в массиве символов. Я хотел бы обновить свои растровые изображения для каждого, используя общую функцию типа getupdatearray. Когда мы проходим по массиву, он будет обновлять растровое изображение, в настоящее время связанное с отдельными метками, чтобы соответствовать их двоюродным братьям из массива. (скажем, F[5][6] = 'X'
для попадания, затем, когда циклы попадут в эту позицию в массиве, он обновит сетку растровых изображений в F_56, чтобы она равнялась hit.png, заменив empty.png.
У меня есть идея, как сделать цикл, который позволит это сделать, но я не уверен, как мне добиться того, чтобы растровое изображение для каждой метки было больше похоже на функцию времени выполнения, а не функцию времени компиляции (статическую). Я читал о QPainter и другом классе Qt, который имеет дело с изображениями, но все еще тяжело справляется с этим.
Вопрос к любому из вас, как мне обновить эти растровые изображения на основе массива 2d?
- структура цикла - я могу понять
- операторы условий - я могу понять
- Специфический синтаксис qt, связанный с метками - новичок, поэтому понятия не имею.
Вот некоторый псевдокод того, что я пытаюсь сделать с помощью 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, в котором я помещаю имя метки, которую хочу изменить, добавляя значения x y, используя:
TR_position.append(QString::number(xvalue));
Когда я пытаюсь вызвать его, используя:
ui->TR_position->setPixmap(QPixmap(":/images/missspace.png"));
... это явно не работает. Есть ли способ ввести регистр или использовать содержимое строки в качестве имени Qlabel?