|
|
|
@ -401,13 +401,10 @@ void Crawler::UpdateBullets(float fElapsedTime){ |
|
|
|
|
b->animation.UpdateState(b->internal_animState,fElapsedTime); |
|
|
|
|
if(!b->deactivated){ |
|
|
|
|
float totalDistance=(b->vel*fElapsedTime).mag(); |
|
|
|
|
vf2d moveStep=b->vel*fElapsedTime; |
|
|
|
|
if((b->vel*fElapsedTime).mag()>1){ |
|
|
|
|
moveStep=(b->vel*fElapsedTime).norm(); |
|
|
|
|
} |
|
|
|
|
while(totalDistance>0){ |
|
|
|
|
totalDistance=std::max(0.f,totalDistance-1); |
|
|
|
|
b->pos+=moveStep; |
|
|
|
|
int iterations=std::max(1.f,(b->vel*fElapsedTime).mag()); |
|
|
|
|
int totalIterations=iterations; |
|
|
|
|
vf2d finalBulletPos=b->pos+b->vel*fElapsedTime; |
|
|
|
|
const auto CollisionCheck=[&](){ |
|
|
|
|
if(b->friendly){ |
|
|
|
|
for(Monster&m:MONSTER_LIST){ |
|
|
|
|
if(geom2d::overlaps(geom2d::circle(m.GetPos(),12*m.GetSizeMult()),geom2d::circle(b->pos,b->radius))){ |
|
|
|
@ -415,7 +412,7 @@ void Crawler::UpdateBullets(float fElapsedTime){ |
|
|
|
|
if(!b->hitsMultiple){ |
|
|
|
|
if(b->MonsterHit(m)){ |
|
|
|
|
b->dead=true; |
|
|
|
|
continue; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
b->hitList[&m]=true; |
|
|
|
@ -427,13 +424,26 @@ void Crawler::UpdateBullets(float fElapsedTime){ |
|
|
|
|
if(player->Hurt(b->damage,b->OnUpperLevel(),0)){ |
|
|
|
|
if(b->PlayerHit(player.get())){ |
|
|
|
|
b->dead=true; |
|
|
|
|
continue; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
while(iterations>0){ |
|
|
|
|
iterations--; |
|
|
|
|
b->pos+=(b->vel*fElapsedTime)/float(totalIterations); |
|
|
|
|
if(!CollisionCheck()){ |
|
|
|
|
goto nextBullet; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
b->pos=finalBulletPos; |
|
|
|
|
if(!CollisionCheck()){ |
|
|
|
|
goto nextBullet; |
|
|
|
|
} |
|
|
|
|
}else{ |
|
|
|
|
b->pos+=b->vel*fElapsedTime; |
|
|
|
|
} |
|
|
|
|
if(b->pos.x+b->radius<view.GetWorldTL().x-WINDOW_SIZE.x||b->pos.x-b->radius>view.GetWorldBR().x+WINDOW_SIZE.x||b->pos.y+b->radius<view.GetWorldTL().y-WINDOW_SIZE.y||b->pos.y-b->radius>view.GetWorldBR().y+WINDOW_SIZE.y){ |
|
|
|
@ -445,6 +455,8 @@ void Crawler::UpdateBullets(float fElapsedTime){ |
|
|
|
|
b->dead=true; |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
nextBullet: |
|
|
|
|
int a; |
|
|
|
|
} |
|
|
|
|
outsideBulletLoop: |
|
|
|
|
std::erase_if(BULLET_LIST,[](std::unique_ptr<Bullet>&b){return b->dead;}); |
|
|
|
|