我有两个类,播放器和控制器。 Controller具有主游戏循环,并包含播放器。它还存储世界地图。 Controller类通过调用Player类的各种方法(例如moveForward())将用户输入传递给播放器。我现在正在实现碰撞检测,为此,我需要一种方法让Player类看到世界地图,但这是在Player类所在的Controller类中。
换句话说:
struct Controller {
int worldMap[16][16][16];
Player p;
...
}
struct Player {
movePlayer() {
#How do I check world map here?
}
}
答案 0 :(得分:1)
为简单起见,我们假设您要做的就是调用一个简单的函数(检查另一个成员的工作方式是否相同,但会导致更复杂的示例):
void move(Player&);
如果手头有物品,则只能访问非static
成员。如果你这样做,那就简单了:
struct Player {
void movePlayer(Controller& controller) {
move(controller.p);
}
};
请注意;
声明之后的struct
,这是必需的。
如果你有static
个成员,他们对整个班级都有效,因此甚至不需要一个对象:
struct Player {
void movePlayer();
};
struct Controller {
static Player p;
};
void Player::movePlayer() {
move(Controller::p);
}
请注意声明的显示顺序:要声明Player
类型的变量,您需要先声明struct Player
。
答案 1 :(得分:1)
由于你可以经常访问控制器,你可以传入指向Player
的指针,并在那里将其分配给成员。
struct Controller {
int worldMap[16][16][16];
Player p;
...
Controller() {
p.setController( this );
}
};
struct Player {
Controller* mController;
movePlayer() {
mController->...
}
setController( Controller* controller ) {
mController = controller;
}
};
如果您需要以较低的间隔访问它,可以将引用传递给函数。
Player::movePlayer( Controller* controller ) {
mController->...
}
答案 2 :(得分:0)
将movePlayer()
需要的数据作为参考参数传递:
void movePlayer(const int (&map)[16][16][16]) { ... }
如果Controller
仅需要访问movePlayer()
,则传递整个worldMap
对象会很糟糕。
或者,您可以在Player
对象本身中存储指向当前地图的指针:
struct Player {
// ...
private:
int* Location;
};