Fix bullet collision and movement code yet again... On slower frame rates bullets were speeding up.
This commit is contained in:
parent
064d717e27
commit
0d6b6584d5
@ -401,13 +401,10 @@ void Crawler::UpdateBullets(float fElapsedTime){
|
|||||||
b->animation.UpdateState(b->internal_animState,fElapsedTime);
|
b->animation.UpdateState(b->internal_animState,fElapsedTime);
|
||||||
if(!b->deactivated){
|
if(!b->deactivated){
|
||||||
float totalDistance=(b->vel*fElapsedTime).mag();
|
float totalDistance=(b->vel*fElapsedTime).mag();
|
||||||
vf2d moveStep=b->vel*fElapsedTime;
|
int iterations=std::max(1.f,(b->vel*fElapsedTime).mag());
|
||||||
if((b->vel*fElapsedTime).mag()>1){
|
int totalIterations=iterations;
|
||||||
moveStep=(b->vel*fElapsedTime).norm();
|
vf2d finalBulletPos=b->pos+b->vel*fElapsedTime;
|
||||||
}
|
const auto CollisionCheck=[&](){
|
||||||
while(totalDistance>0){
|
|
||||||
totalDistance=std::max(0.f,totalDistance-1);
|
|
||||||
b->pos+=moveStep;
|
|
||||||
if(b->friendly){
|
if(b->friendly){
|
||||||
for(Monster&m:MONSTER_LIST){
|
for(Monster&m:MONSTER_LIST){
|
||||||
if(geom2d::overlaps(geom2d::circle(m.GetPos(),12*m.GetSizeMult()),geom2d::circle(b->pos,b->radius))){
|
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->hitsMultiple){
|
||||||
if(b->MonsterHit(m)){
|
if(b->MonsterHit(m)){
|
||||||
b->dead=true;
|
b->dead=true;
|
||||||
continue;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b->hitList[&m]=true;
|
b->hitList[&m]=true;
|
||||||
@ -427,11 +424,24 @@ void Crawler::UpdateBullets(float fElapsedTime){
|
|||||||
if(player->Hurt(b->damage,b->OnUpperLevel(),0)){
|
if(player->Hurt(b->damage,b->OnUpperLevel(),0)){
|
||||||
if(b->PlayerHit(player.get())){
|
if(b->PlayerHit(player.get())){
|
||||||
b->dead=true;
|
b->dead=true;
|
||||||
continue;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
while(iterations>0){
|
||||||
|
iterations--;
|
||||||
|
b->pos+=(b->vel*fElapsedTime)/float(totalIterations);
|
||||||
|
if(!CollisionCheck()){
|
||||||
|
goto nextBullet;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
b->pos=finalBulletPos;
|
||||||
|
if(!CollisionCheck()){
|
||||||
|
goto nextBullet;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
b->pos+=b->vel*fElapsedTime;
|
b->pos+=b->vel*fElapsedTime;
|
||||||
@ -445,6 +455,8 @@ void Crawler::UpdateBullets(float fElapsedTime){
|
|||||||
b->dead=true;
|
b->dead=true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
nextBullet:
|
||||||
|
int a;
|
||||||
}
|
}
|
||||||
outsideBulletLoop:
|
outsideBulletLoop:
|
||||||
std::erase_if(BULLET_LIST,[](std::unique_ptr<Bullet>&b){return b->dead;});
|
std::erase_if(BULLET_LIST,[](std::unique_ptr<Bullet>&b){return b->dead;});
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#define VERSION_MAJOR 0
|
#define VERSION_MAJOR 0
|
||||||
#define VERSION_MINOR 2
|
#define VERSION_MINOR 2
|
||||||
#define VERSION_PATCH 0
|
#define VERSION_PATCH 0
|
||||||
#define VERSION_BUILD 1349
|
#define VERSION_BUILD 1362
|
||||||
|
|
||||||
#define stringify(a) stringify_(a)
|
#define stringify(a) stringify_(a)
|
||||||
#define stringify_(a) #a
|
#define stringify_(a) #a
|
||||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user