关于vector容器在射击游戏中的运动和消失

冷雨夜刀锋 冷雨夜刀锋 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
void circle_3D() //3D中的循环,不包括渲染
{
switch(it_mode)
{
case 1:
io1.write_debugfile("循环起");
input1.check_io(engine1->TimeElapsed(),1500);
//input1.check_fire(engine1->TickCount());

boat1.set_position(input1.get_mboat_xpos(10*(1+val1.move_speed*0.1)),HOR_LEVEL,POSZ);
boat1.set_flag_position();
my_x=boat1.get_mboat_xpos();

//boat1.be_hurt(engine1->TickCount());
int i;

for(i=0;i<e_boats.size();i++)
{
e_boats.at(i).hurt_it(engine1->TickCount(),boat1.get_mboat_xpos(),HOR_LEVEL);
e_boats.at(i).be_hurt(engine1->TickCount());
}


set_plane_position(engine1->TickCount());
io1.write_debugfile(" 机飞行完 ");
check_plane_behurt(engine1->TickCount());
io1.write_debugfile(" 机被打完 ");

landx.be_hurt(engine1->TickCount());
io1.write_debugfile(" 陆地完 ");

del_unable_plane();
io1.write_debugfile(" 删机2完 ");

set_armo_position(engine1->TickCount());
io1.write_debugfile(" 弹飞完 ");;
//set_hplane_position();
show_bomb();
show_waters();
io1.write_debugfile("循环完\n");
break;
case 2:
gd2.init_logo();
break;
}

}

这是一个游戏的循环部分,里面有几个类:plane飞机类,planes是<plane>的vector
armo类,armos是<armo>的vector,其他的无关。
目的是让弹运动、让飞机运动,运动如下:
void set_armo_position(long tkcount) //用遍历的方法将每个armo放在其时间应该在的位置上
{
vector <Armo2>::iterator del_it;
for(del_it=armos.begin();del_it!=armos.end()&&armos.size()>0;++del_it)
{
del_it->set_now_pos(tkcount);
if(del_it->get_is_enable()==false)
{
del_it->destroy_armo();
armos.erase(del_it);
}
}
}

void set_plane_position(long tkcount) //用遍历的方法将每个plane放在其时间应该在的位置上
{
vector <plane1>::iterator pl_it;
for(pl_it=planes.begin();pl_it!=planes.end()&&planes.size()>0;++pl_it)
{
pl_it->set_now_pos(tkcount);
}
}


void check_plane_behurt(long tkcount) //用遍历的方法检查每个plane是否被炮弹攻击?
{
vector <plane1>::iterator del_it;
for(del_it=planes.begin();del_it!=planes.end()&&planes.size()>0;++del_it)
{
del_it->be_hurt(tkcount);
}
}

飞机的删除是单独列的,当然也可以写到运动中去。
而飞机类中的be_hurt是这样写的:
void be_hurt(long tkcount) //根据传来的炮弹模型的序列来判断是否被击中
{ //击中将显爆炸,并消失炮弹,并将飞机设置为false;
vector<Armo2>::iterator del_it;
for(del_it=armos.begin();del_it!=armos.end()&&armos.size()>0;++del_it)
{
if(status!=2&&del_it->get_team()==0&&(xpos>del_it->get_xpos()-20)&&(xpos<del_it->get_xpos()+20)&&(ypos>del_it->get_ypos()-20)&&(ypos<del_it->get_ypos()+20)) //判断炮弹
{
del_it->set_is_enable(false);
status=2;
d_xpos=xpos; //将当前位置设置给被击中点
d_ypos=ypos;
down_jiao=210+rand()%55; //落下角度
}
}
}

飞机的关于落下部分的运动是这样写的:
void set_now_pos(long tkcount) //获得飞机目前的位置,并不断看我舰的位置是否进入可攻击位置
{ //飞机飞行的思路为,定义一个比起始高度还高的位置,直接升到此位置后,然后以正铉线方式进行飞行,控制正弦的左右拉伸
int xt,yt;
flyed_time=tkcount-b_time;

switch(status)
{
case 0: //向上飞
case 1: //平飞
case 2: //落下
paowu_4(d_xpos,d_ypos,down_jiao,xt,yt,jiao);
xpos=xt;
ypos=yt;
break;
}
set_position(xpos,ypos,POSZ);
set_rotation(jiao);
}
现在的问题是,这个程序经常在运行时产生错误,因为在一个vector中,你不能同时让它计算每个成员的运动轨迹 和 被攻击后的消灭,
消灭的位置应该放在哪里呢?是最后吗?因为实际上消灭是运动所引起的,运动位置到x<0或者y<0既引发类的is_enbale变化,到循环的最后再来判断是否该被消灭呢?还是在运动函数中判断或在被伤害be_hurt中判断呢?由于判断的不明导致有些已经无效的vector成员仍然运行最后导致程序的跳出。
现在我想请教有过使用vector而非链编程这方面经验的人,如何设置弹的运动、无用弹的消灭、飞机运动、无用飞机的消灭这4者在循环中的顺序?


...全文

相关推荐

基于C++开发的射击游戏

用DDraw实现射击游戏说明文档要点一:画图自动切割IDirectDrawSurface7::BltFast()方法中没有自动切割功能,即当画图元素超出窗口以外时不会自动切割,DDraw选择自动忽略不

Web3 Horizon

Unity 3D射击游戏开发全流程:从角色控制到打包避坑指南

游戏开发从入门到实战,引擎选择是第一步。Unity 3D 凭借完善的物理碰撞、射线检测与动画状态机体系,成为个人开发者快速搭建小型3D游戏的首选。在射击类项目中,角色控制器与射线检测是核心交互基础,决定了操作的即时反馈;而对象池、阴影优化等手段则直接影响帧率表现。从靶场射击的MVP闭环到敌人AI状态机,再到移动端与微信小游戏打包,开发者需要在手感、性能与兼容性之间反复权衡。实际开发中,地面Collider缺失、摄像机跟随抖动、License激活失败、脚本编码异常等问题高频出现,掌握一套系统的排查清单能大幅缩

weixin_34037515

加入射击功能和AI的贪吃蛇

- 使用C++时,可能涉及STL(Standard Template Library)中的容器(如vector和list)来存储蛇的坐标、食物位置等数据。

GB_ZERO

c++ stl 制作的贪食蛇游戏

在贪食蛇游戏中,可能会使用vector来存储蛇的身体部分,因为它的随机访问性能较好,可以方便地添加和删除元素。2. **迭代器**:迭代器是访问容器内元素的接口,类似于指针。

xc_pierce

spaceship_cpp:通过编写自定义游戏引擎和类似Galaga的游戏来学习C ++

为了实现这些功能,我们需要熟悉C++的STL(标准模板库),它提供了容器(如vector和list)、算法和迭代器等工具。

王牌对王牌飞行
评论
收藏 已收藏
分享
返回顶部