解释//敌机遍历和击毁 和 主机碰撞和击毁 auto it = es.begin(); while (it != es.end()) { //敌机和主机碰撞,HP清零,游戏结束 if (RectDuangRect(hero.GetRect(), (*it)->GetRect())) { (*it)->Show(); RECT a = hero.GetRect(); RECT b = (*it)->GetRect(); putimg(NULL, a.left - 25, a.top - 25, &bombimg); putimg(NULL, b.left, b.top, &bombimg); HP = 0; is_play = false; if (!t) break; else { delete(*it); it = es.erase(it); } } if (it == es.end()) break;
时间: 2024-04-12 13:33:01 浏览: 56
这段代码是一个游戏中处理敌机和主机碰撞的逻辑。首先,通过迭代器遍历敌机的列表(es),判断敌机和主机是否发生碰撞。如果发生碰撞,则执行以下操作:
1. 显示敌机和主机的爆炸效果。
2. 将主机的生命值(HP)设为0,表示主机被击毁。
3. 设置游戏状态为结束(is_play = false)。
4. 如果存在计时器(t)且计时器不为0,则删除敌机对象并从敌机列表中移除该敌机。
5. 更新迭代器(it)指向下一个敌机。
最后,如果迭代器(it)指向敌机列表的末尾,则跳出循环。
相关问题
解释//敌机被主机子弹击毁 auto bit = bs.begin(); while (bit != bs.end()) { if (RectDuangRect((*bit)->GetRect(), (*it)->GetRect())) { RECT a = (*it)->GetRect(); putimg(NULL, a.left, a.top, &bombimg); delete(*it); it = es.erase(it); delete(*bit); bs.erase(bit); kill++; break; } else bit++; } if (it == es.end()) break; //敌机显示 if (!(*it)->Show()) { delete(*it); it = es.erase(it); } else it++; }
这段代码是处理敌机被主机子弹击毁的逻辑。首先,通过迭代器遍历主机子弹的列表(bs),检查每个子弹是否与当前敌机发生碰撞。如果发生碰撞,则执行以下操作:
1. 显示敌机的爆炸效果。
2. 删除敌机对象并从敌机列表中移除该敌机。
3. 删除子弹对象并从子弹列表中移除该子弹。
4. 增加击杀计数(kill)。
5. 跳出循环。
如果迭代器(it)指向敌机列表的末尾,则跳出循环。然后判断当前敌机是否需要继续显示,如果不需要显示,则执行以下操作:
1. 删除敌机对象并从敌机列表中移除该敌机。
2. 更新迭代器(it)指向下一个敌机。
最后,如果迭代器(it)指向敌机列表的末尾,则跳出循环。
指针是如何运用的 auto ebits = ebs.begin(); while (ebits != ebs.end()) { //敌机子弹和主机碰撞模拟,HP-- if (RectDuangRect((*ebits)->GetRect(), hero.GetRect())) { delete(*ebits); ebits = ebs.erase(ebits); HP--; if (HP == 0) is_play = false; RECT a = hero.GetRect(); putimg(NULL, a.left, a.top, &sbombimg); break; }
在上述代码中,指针的运用如下:
1. 首先,使用`auto`关键字声明了一个名为`ebits`的变量,并将其初始化为`ebs`容器的起始迭代器。
2. 使用`while`循环遍历`ebs`容器中的元素,直到`ebits`迭代器等于`ebs.end()`,即到达容器的末尾。
3. 在循环中,通过解引用指针迭代器`(*ebits)`获取指向敌机子弹对象的指针,并调用其成员函数`GetRect()`获取敌机子弹的矩形区域。
4. 利用函数`RectDuangRect()`判断敌机子弹的矩形区域与主机的矩形区域是否相交,如果相交则进行碰撞模拟。
5. 如果发生碰撞,首先删除敌机子弹对象,通过`delete`关键字释放内存。
6. 调用容器的`erase()`函数删除指向该敌机子弹对象的迭代器,并返回指向下一个元素的迭代器。
7. 主机的HP减少1,如果HP减少到0,将`is_play`标志设置为`false`,表示游戏结束。
8. 获取主机的矩形区域,并使用函数`putimg()`在该区域绘制爆炸效果。
9. 使用`break`语句退出循环,只处理第一个碰撞的敌机子弹。
阅读全文