[英]How can I add colliders for my adventure game in cmd with 2d array defining the map in c++?
我目前正在編寫2d cmd冒險游戲的開始結構。 如果您查看提供的代碼,則將我的圖塊存儲在一個結構中,並且對撞機有一個布爾值。
我最初的想法是在角色周圍有4個“節點”,並且在以下move命令中將有一個if語句,用於檢查節點的位置並查看是否有對撞機塊,以查看是否可以在此處移動。
我被卡住是因為我將圖塊存儲為char“ barrier.type”字符,並且我只想讀取“ barrier.type”而不是當前存儲在其中的char數據“#”。 我想到的唯一方法是將位置設為字符串,然后刪除該位置的最后4個字母並添加對撞機,但是我不知道該怎么做,因為它們是兩種不同的數據類型,除非我能以某種方式獲取char轉換為字符串。 在那種情況下,我認為如果我將其轉換為字符串,它將使“#”成為字符串。
如果某人有一個更好的想法來檢查對撞機或如何使我的原始想法成為現實,那么我當前的播放器和磁貼系統非常靈活,我願意接受各種各樣的細節。
碼:
using namespace std;
void drawArea();
//void getInput();
void resizeWindow();
bool gameRunning = true;
int position[2] = { 8,10 };
//char character = '@';
int aboveNode[2] = { 9,10 };
int belowNode[2] = { 7,10 };
int leftNode[2] = { 8,9 };
int rightNode[2] = { 8,11 };
struct tileType
{
enum class Tile { air, wallside, walltop, wallbottom, barrier, };
Tile x;
char type;
bool collider;
};
//// tiles////
tileType barrier = {
tileType::Tile::barrier,
'#',
true,
};
tileType air = {
tileType::Tile::air,
' ',
false,
};
////player control////
class Player {
public:
char character = '@';
int playerX = position[1];
int playerY = position[0];
void getInput() {
if (GetAsyncKeyState(VK_UP)) {
position [0] -= 1;
aboveNode[0] -= 1;
belowNode[0] -= 1;
leftNode [0] -= 1;
rightNode[0] -= 1;
}
else if (GetAsyncKeyState(VK_DOWN)) {
position [0] += 1;
aboveNode[0] += 1;
belowNode[0] += 1;
leftNode [0] += 1;
rightNode[0] += 1;
}
else if (GetAsyncKeyState(VK_LEFT)) {
position [1] -= 1;
aboveNode[1] -= 1;
belowNode[1] -= 1;
leftNode [1] -= 1;
rightNode[1] -= 1;
}
else if (GetAsyncKeyState(VK_RIGHT)) {
position [1] += 1;
aboveNode[1] += 1;
belowNode[1] += 1;
leftNode [1] += 1;
rightNode[1] += 1;
}
}
private:
void checkNodeA() {
//string mapData = map[aboveNode[0]][aboveNode[1]];
}
void checkNodeB() {
//map[belowNode[0]][belowNode[1]];
}
void checkNodeL() {
//map[leftNode[0]][leftNode[1]];
}
void checkNodeR() {
//map[rightNode[0]][rightNode[1]];
}
};
void setup() {
}
char map[33][34] = { { barrier.type,barrier.type, barrier.type, barrier.type, barrier.type,barrier.type, barrier.type,barrier.type,barrier.type, barrier.type,barrier.type, barrier.type, barrier.type, '#', '#','#', '#','#','#', '#', '#', '#', '#', '#', '#','#', '#','#','#', '#', '#', '#', '#', '#' },
{ '#', '|', '-', '-', '-','-', '|',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', '|', ' ', ' ', ' ',' ', '|',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', '|', '[', ']', ' ',' ', '|',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', '|', '_', '_', '_','_', '|',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', '|', '|',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', '-', '-',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ',' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ',' ',' ', ' ', ' ', ' ', ' ', '#' },
{ '#', '#', '#', '#', '#','#', '#','#','#', '#','#', '#', '#', '#', '#','#', '#','#','#', '#', '#', '#', '#', '#', '#','#', '#','#','#', '#', '#', '#', '#', '#' } };
void drawArea() {
Player player;
for (int y = 0; y < 33; y++) {
for (int x = 0; x < 34; x++) {
if (y == player.playerY && x == player.playerX) {
cout << player.character;
}
else {
cout << map[y][x];
}
}
cout << endl;
}
}
就個人而言,我會嘗試將瓦片封裝在類的后面。 例如(為簡潔起見,細節缺失):
struct Tile
{
enum class Type { air, wallside, walltop, wallbottom, barrier, };
Type type;
bool collider;
};
class GameMap
{
private:
std::map<char, Type> tiles_;
public:
GameMap(std::vector<std::string> myMap)
{
// Probably sanity check that all strings are the same size, and record the length of that string
// Maybe even validate the contents of the strings, so invalid characters throw an error.
tiles_[' '] = Tile { Tile::Type::air, false };
tiles_['#'] = Tile { Tile::Type::barrier, false };
// ...
}
Tile getTile(size_t xPos, size_t yPos)
{
if (xPos >= stringLength || yPos > myMap.size()
throw runtime_error("Out of bounds");
char tileMarker = myMap[yPos][xPos];
auto tile = tiles.find(c);
if (tile != tiles.end())
{
throw runtime_error("Invalid tile marker");
}
return *tile;
}
};
// ...
std::vector<std::string> rawMapData = {
"###############################",
"# [ ] ",
"# [ _ ] ",
"# etc... ",
};
GameMap gameMap = GameMap(rawMapData);
Tile tile = gameMap.getTile(3, 5);
if (tile.collider)
{
// ...
}
這樣,您無需在角色移動時嘗試跟蹤其周圍的狀態,只需根據需要查詢它。 即。 如果角色試圖向左移動,您可以說:
if (! gameMap.getTile(playerX - 1, playerY).collider)
{
// Move the character
}
編輯:我看到您仍然希望每個圖塊都有一個實例,您可以執行與上述類似的操作,但是要稍作更改:
class GameMap
{
private:
std::vector<std::vector<Tile>> tiles_;
public:
GameMap(std::vector<std::string> myMap)
{
std::map<char, Tile> tileTypes;
tileTypes[' '] = Tile { Tile::Type::air, false };
tileTypes['#'] = Tile { Tile::Type::barrier, false };
// ...
for (const auto& row : myMap)
{
std::vector<Tile> tileRow;
for (char c : row)
{
auto tile = tileTypes.find(c);
if (tile != tileTypes.end())
{
throw runtime_error("Invalid tile marker");
}
tileRow.emplace_back(tile);
}
tiles_.emplace_back(std::move(tileRow));
}
}
Tile getTile(int x, int y)
{
// return tile. Return reference if it might change
}
我也不會使用map
作為變量名,特別是當您using namespace std;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.