我正在使用适用于Windows 8的DirectXTK库在C ++中编写一个Breakout游戏,而且我在向量内部的Ball和Brick对象之间的碰撞检测方面遇到了一些麻烦。 Ball类负责与桨和砖的碰撞检测。它有一个Update方法,它引用了Paddle对象和Brick对象的声明。现在与Paddle的碰撞工作得很好,因为在主游戏类中声明了Paddle,但我不知道如何引用存储在向量中的对象。顺便说一句,如果我删除" Brick&砖"从Ball :: Update方法声明中,按预期绘制了5行砖。
球更新课
void Ball::Update(float timeDelta, Rect windowBounds, Paddle& paddle, Brick& brick)
{
//Respond to collision with the Paddle
if ( paddle.IntersectsWith(this->boundingBox))
{
this->velocity.y = this->velocity.y * -1;
}
// Respond to collision with the brick
if (brick.IntersectsWith(this->boundingBox))
{
this->velocity.y = this->velocity.y * -1;
brick.Hit();
this->score+= 10;
}
}
这是Brick对象在Game类中初始化的方式,bricksRow是向量
//Next, create this many Brick objects and store them in a std::vector
for (int j = 0; j < bricksNumberOfRows; j+=32)
{
for ( int i = 0; i < numberOfBricks ; i++)
{
//Add a Brick object to the back of the vector
this->bricksRow.push_back(Brick());
//Get a local reference to this newly added Brick object
Brick& brick = this->bricksRow.back();
//Call the initialise method on the newly added Brick object
brick.Initialize(L"Assets/Brick.png"
, this->d3dDevice
, this->d3dDeviceContext
, Vector2((float)(i * this->brickWidth), bricksStartingPosition + j));
}
}
这里的ball.Update方法在Game类中被调用
this->ball.Update(timeDelta, this->windowBounds, this->paddle, ******* );
星星在哪里,我应该参考一个砖块&amp;向量中的对象,但我不知道如何。
感谢您提前回复。
答案 0 :(得分:0)
您可能希望检测到桨叶与向量中每个砖块对象的碰撞,因此您可以枚举并调用 Update(),如下所示:
vector<Brick>::iterator ci;
for(ci = bricksRow.begin(); ci! = bricksRow.end(); ci++)
{
this->ball.Update(timeDelta, this->windowBounds, this->paddle, *ci);
}
如果您知道要检测碰撞的砖块对象的索引(让它说它存储在变量 index 中),您可以调用如下:
this->ball.Update(timeDelta, this->windowBounds, this->paddle, bricksRow[index]);
更新:迭代器应该是迭代器而不是const_iterator,所以代替
vector<Brick>::const_iterator ci;
应该是
vector<Brick>::iterator ci;
更好的是,因为你没有修改 void Ball :: Update(float timeDelta,Rect windowBounds,Paddle&amp; paddle,Brick&amp; brick)中的对象 brick ,如果你可以改成它 void Ball :: Update(float timeDelta,Rect windowBounds,Paddle&amp; paddle,const Brick&amp; brick),然后你可以保留
vector<Brick>::const_iterator ci;
差异的解释可能值得一个单独的问题。以上内容可能会帮助您解决目前遇到的问题。