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

冷雨夜刀锋 2008-03-10 04:40:26
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者在循环中的顺序?


...全文
44 回复 打赏 收藏 转发到动态 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
相关推荐

19,444

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告