Я все еще новичок в этом, поэтому заранее приношу свои извинения, если я предоставлю слишком много или недостаточно информации для своей проблемы.
Run Down
Этот вопрос не похож на мошеннический вопрос, связанный с игрой, но для понимания того, что делает моя программа … он должен быть похож на мошенническую игру.
Итак, у меня был класс, который имел двухмерный вектор-член (символами манипулировали, чтобы представить «подземелье»). Все работало без проблем. Я хотел расширить возможности моей программы, поэтому я решил создать новый класс для замены 2D-вектора символов, чтобы символ представлял собой лишь визуальное представление нового класса, а другие переменные можно хранить вместе с этим символом.
Для упрощения я попытался удалить то, что не нужно для этого вопроса. Этот новый класс называется Плитка — который представляет пространство, используемое для уровня подземелья. Плитка имеет:
переменная char с именем displayChar .. по умолчанию равна » изменениям для представления того, что она содержит
(другие переменные ..)
Проблемы / Мои плохие догадки
Я не совсем понимаю некоторые концепции программирования синтаксиса / реализации, поэтому, пожалуйста, не судите.
Я думаю, что мне нужно заполнить его новыми объектами Tile и отправить их в
2D плитка вектор?
Мои другие методы, которые манипулировали значениями char, дают ошибки.
Я думаю, что я должен изменить методы, чтобы взять указатель на Плитка
возражать и использовать setDisplayChar (») способ изменить его
значение?
Мой метод at (int, int), используемый для возврата символа в этом месте
Я плохо изменяю то, как что-то работает, и я обычно заканчиваю вносить беспорядок в свой код. Я выложу код, который имеет отношение к этому. Я был бы очень признателен за любую помощь, которую вы можете предложить. И, пожалуйста, дайте мне знать, если мне нужно добавить больше. (Я постараюсь свести код к минимуму только для связанных методов). Спасибо!
DungeonLevel.h
#include "Tile.h"#include <vector>
#include <random>
class DungeonLevel {
public:
DungeonLevel(int iWidth, int iHeight, std::mt19937 & mt);
~DungeonLevel(void);
void dump();
char at(int x, int y);
int getWidth();
int getHeight();
private:
std::vector<std::vector<Tile>> m_vvTiles; //Tile was char
};
DungeonLevel.cpp
#include <iostream>
#include <random>
#include "DungeonLevel.h"
using namespace std;DungeonLevel::DungeonLevel(int iWidth, int iHeight, std::mt19937 & mt){
// Initialize the blank vector
m_vvTiles.resize(iHeight);
for(auto it = m_vvTiles.begin(); it != m_vvTiles.end(); it++ ){
// Tile tempTile = new;?
(*it).resize(iWidth,' ');
}
// divide the level into 4x2 chunks
int iChunkWidth = iWidth / 4;
int iChunkHeight = iHeight / 2;
// Taking the easy way out, and generating
// a loop of tunnels first to drop rooms on to
for( int x = (iChunkWidth/2); x <= ((3 * iChunkWidth) + (iChunkWidth/2)$
m_vvTiles[iChunkHeight/2][x] = '#';
m_vvTiles[iChunkHeight + (iChunkHeight/2)][x] = '#';
}
for( int y = (iChunkHeight/2); y <= (iChunkHeight + (iChunkHeight/2)); $
m_vvTiles[y][iChunkWidth/2] = '#';
m_vvTiles[y][(3 * iChunkWidth) + (iChunkWidth/2)] = '#';
}
void DungeonLevel::dump(){
for( auto itOuter = m_vvTiles.begin(); itOuter != m_vvTiles.end(); itOu$
for( auto itInner = (*itOuter).begin(); itInner != (*itOuter).e$
cout << *itInner.getDisplayChar(); ///Updated:: CAUSING ERROR//
}
cout << endl;
}
}//SEVERAL IRRELEVANT LINES FOR THIS PROBLEM..
}
char DungeonLevel::at(int x, int y){
return m_vvTiles[y][x].getDisplayChar();
//return m_vvTiles[y][x]; WORKED BEFORE
}
Tile.h
#include "Entity.h"#include <vector>
class Tile : public Entity {
public:
Tile(void);
virtual ~Tile(void);
//void setEntity(Entity * entityToSet); BOTH IRRELEVANT
//Entity * getEntity();
void setDisplayChar(char displayCharToSet);
char getDisplayChar();
//virtual void dumpObjectData(); IRRELEVANT AT THIS TIMEprivate:
char displayChar;
//Entity * theEntity; IRRELEVANT AT THIS TIME
};
Tile.cpp
#include "Tile.h"#include "Entity.h"
using namespace std;
Tile::Tile(void){
displayChar = '.';
//theEntity = NULL;
}Tile::~Tile(void){
}
void Tile::setDisplayChar(char displayCharToSet){
displayChar = displayCharToSet;
}
char Tile::getDisplayChar(){
return displayChar;
}
*Вот моя существующая ошибка: *
Для метода dump () в DungeonLevel.cpp,
Некоторые из твоих вопросов с моими ответами
Я думаю, что мне нужно заполнить его новыми объектами плитки и перенести их в вектор 2D плитки?
Нет, вам нужно изменить его размер и заполнить объектами Tile. Совсем как вы сделали, когда это был массив символов. новое не входит в это.
Я думаю, что я должен изменить методы, чтобы взять указатель на объект Tile и использовать метод setDisplayChar (»), чтобы изменить его значение?
Я бы использовал ссылку.
Я думал, что мог бы изменить это на return m_vvTiles[y][x].getDisplayChar()
но я получаю ошибку.
Это звучит правильно для меня, какую ошибку вы получили?
Все в твоем редизайне звучит хорошо для меня. Хорошая идея сделать резервную копию, прежде чем идти на серьезную реорганизацию, однако.
Других решений пока нет …