我的问题是我无法更改类成员的变量值,我已经尝试了所有想到的方法
因此,这里涉及以下代码:
const assert = require('assert');
const mongoose = require('mongoose');
mongoose.set('debug', true);
const GITHUB_ISSUE = `init`;
const connectionString = `mongodb://localhost:27017/${ GITHUB_ISSUE }`;
const { Schema } = mongoose;
run().then(() => console.log('done')).catch(error => console.error(error.stack));
async function run() {
await mongoose.connect(connectionString);
await mongoose.connection.dropDatabase();
const schema = new mongoose.Schema({
name: String
});
schema.post('init', () => { throw new Error('Oops!'); });
const M = mongoose.model('Test', schema);
await M.create({ name: 'foo' });
await M.findOne(); // Throws "Oops!"
}
所以问题是我的播放器类中有一个Collision的类成员,并且正在从我的播放器访问Collision对象,并检查它是否与另一个对象发生碰撞,如果是,它将返回true,并且还应该设置内部标记的碰撞方向,但是从“ isColliding()”函数返回后,尚未设置碰撞对象的标记
我不太了解这里可能是什么问题,我尝试调试它并尝试逐步进行。我的观察是,实际上它确实在函数调用期间设置了标志,但是一旦返回,信息就会丢失
任何帮助将不胜感激!
编辑:这是getCollisionObject()函数:
if(player.getCollisionObject().isColliding(platform1))
{
if(player.getCollisionObject().up)
std::cout << "Colliding from top\n";
if(player.getCollisionObject().down)
std::cout << "Colliding from bottom\n";
if(player.getCollisionObject().left)
std::cout << "Colliding from left\n";
if(player.getCollisionObject().right)
std::cout << "Colliding from right\n";
}
bool Collision::isColliding(const Entity &other)
{
resetCollisionDirection();
sf::Vector2f otherCenterPosition = other.getCenterPosition();
sf::Vector2f otherSize = other.getSize();
float deltaX = m_CenterPosition.x - otherCenterPosition.x; // abs(deltaX) - (thisX + otherX)
float deltaY = m_CenterPosition.y - otherCenterPosition.y;
float resultX = abs(deltaX) - (m_Size.x / 2 + otherSize.x / 2);
float resultY = abs(deltaY) - (m_Size.y / 2 + otherSize.y / 2);
if(resultX < 0 && resultY < 0)
{
if(m_CenterPosition.x < otherCenterPosition.x)
left = true;
if(m_CenterPosition.x > otherCenterPosition.x)
right = true;
if(m_CenterPosition.y < otherCenterPosition.y)
up = true;
if(m_CenterPosition.y > otherCenterPosition.y)
down = true;
return true;
}
return false;
}
class Collision
{
public:
Collision(const Entity &entity);
void reset(const Entity &entity);
bool isColliding(const Entity &other);
bool up, down, left, right;
private:
void resetCollisionDirection();
private:
sf::Vector2f m_CenterPosition, m_Size;
};
编辑:发现上面函数返回一个副本的问题(抱歉,我是个白痴)将其更改为
Collision Player::getCollisionObject()
{
return m_CollisionBody;
}
答案 0 :(得分:1)
有问题。 getCollisionObject()
按值返回。更改为
Collision &Player::getCollisionObject()