#include "engine.h" #include "Debris.h" #include "RandExplosion.h" //================================================================================================// /********************************************************************** ** return a velocity that will make a bullet travel towards a target ** ***********************************************************************/ //================================================================================================// Vec2 FireAtTarget(Vec2 curPos, Vec2 tarPos, float speed) { Vec2 vel; vel = Normalize(tarPos-curPos)*speed; if(!gpEngine->bPauseScrolling) vel.x += SCROLL_SPEED + gpEngine->fMapSpeed; return vel; } bool FireAtDistantTarget(Vec2 curPos, Vec2 tarPos, float speed, Vec2 &out) { if(Distance(curPos,tarPos)<250) return false; if(curPos.xScroll) return false; if(curPos.y<0) return false; if(curPos.y>480) return false; out = Normalize(tarPos-curPos)*speed; if(!gpEngine->bPauseScrolling) out.x += SCROLL_SPEED + gpEngine->fMapSpeed; return true; } bool CollidedWithMap(Bullet b) { int x,y;//,mx,my; /* x = (int)((float)((b.Pos.x-b.sphere.r)/32.0f)); mx = (int)((float)((b.Pos.x+b.sphere.r)/32.0f)); y = (int)((float)((b.Pos.y-b.sphere.r)/32.0f)); my = (int)((float)((b.Pos.y+b.sphere.r)/32.0f)); if(x<0)x=0; if(y<0)y=0; */ x=(int)((float)(b.sphere.p.x/32.0f)); y=(int)((float)(b.sphere.p.y/32.0f)); // Box box; // for(x; xmTilesLayer1[x][y].ID>=0 && gpEngine->mTilesLayer1[x][y].ID<512) { // box= Box(32,32,Vec2((float)(x*32)+16, (float)(y*32)+16)); // if(Collision::SphereBoxOverlap(b.sphere,box)) return true; } } } return false; } //================================================================================================// /***************************** ** basic player bullet type ** ******************************/ //================================================================================================// void Render_PlayerBullet(Bullet& b, const float interp) { UTIL_GL::SetBlend(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glColor4f(1,1,1,1); Vec2 p = UTIL_Misc::Interpolate(b.Pos,b.oPos,interp); RenderSprite(gpEngine->sprBulletSet1,1,p.x,p.y,24,24); /* glDisable(GL_TEXTURE_2D); glColor4f(1,1,0,1); GeoDraw2D::DrawSphere(b.sphere, 5);*/ } void Collide_PlayerBullet(Bullet& b) { if(!b.IsActive) return; gpEngine->SpawnSpriteEffect(1,b.sphere.p,Vec2(32,32),gpEngine->sprBulletHit3,0.25f,false,NULL,true); b.IsActive = false; SND_LASER3; } //================================================================================================// /***************************** ** Force player bullet type ** ******************************/ //================================================================================================// void Spawn_ForceBullet(Bullet& b, Vec2 pos, Vec2 vel) { b.IsActive = true; b.Vel = vel; switch((int)b.frame) { case 1: pos.y+=28; b.fLife = 3 *gpEngine->fGameDifficulty; b.sphere = Sphere(7,pos+Vec2(16,8)); break; case 2: pos.y+=20; b.fLife = 7 *gpEngine->fGameDifficulty; b.sphere = Sphere(12,pos+Vec2(24,12)); break; case 3: pos.y+=16; b.fLife = 14 *gpEngine->fGameDifficulty; b.sphere = Sphere(16,pos+Vec2(32,16)); break; case 4: pos.y+=8; b.fLife = 30 *gpEngine->fGameDifficulty; b.sphere = Sphere(25,pos+Vec2(48,24)); break; case 5: pos.y+=28; b.fLife = 3 *gpEngine->fGameDifficulty; b.sphere = Sphere(7,pos+Vec2(16,8)); break; } b.oPos = b.Pos = pos; } void Update_ForceBullet(Bullet& b) { b.oPos = b.Pos; b.Pos += b.Vel; if(b.Pos.xScroll || b.Pos.x>gpEngine->Scroll+640 || b.Pos.y<0 || b.Pos.y>480 || b.fLife<=0) b.IsActive = false; if(CollidedWithMap(b)) { b.fLife = 0; b.pCollide(b); b.IsActive = false; } b.sphere.p += (b.Pos-b.oPos); } void Render_ForceBullet(Bullet& b, const float interp) { UTIL_GL::SetBlend(GL_SRC_ALPHA,GL_ONE); glColor4f(1,1,1,1); Vec2 p = UTIL_Misc::Interpolate(b.Pos,b.oPos,interp); switch((int)b.frame) { case 1: RenderSprite(gpEngine->sprBulletForce,0,p.x,p.y,32,16); break; case 2: RenderSprite(gpEngine->sprBulletForce,0,p.x,p.y,48,24); break; case 3: RenderSprite(gpEngine->sprBulletForce,0,p.x,p.y,64,32); break; case 4: RenderSprite(gpEngine->sprBulletForce,0,p.x,p.y,96,48); break; case 5: RenderRotatedSprite(gpEngine->sprBulletSet1,3,p.x,p.y,16,8,b.rot); break; } /* glDisable(GL_TEXTURE_2D); glColor4f(1,1,0,1); GeoDraw2D::DrawSphere(b.sphere, 10);*/ } void Collide_ForceBullet(Bullet& b) { if(!b.IsActive) return; if(b.fLife<=0) { if(b.frame<5) gpEngine->SpawnExplosion(gpEngine->sprBlueExplosion,b.sphere.p,50*b.frame,0.75f,0,true); else gpEngine->SpawnSpriteEffect(1,b.sphere.p,Vec2(32,32),gpEngine->sprBulletHit,0.5f,false,NULL,true); SND_LASER3; } } //================================================================================================// /****************** ** Plasma bullet ** *******************/ //================================================================================================// void Spawn_PlasmaBullet(Bullet& b, Vec2 pos, Vec2 vel) { b.IsActive = true; b.oPos = b.Pos = pos; b.Vel = vel; b.frame = 0; b.fLife = 0.75f *gpEngine->fGameDifficulty; b.sphere = Sphere(8,pos); } void Update_PlasmaBullet(Bullet& b) { b.oPos = b.Pos; b.Pos += b.Vel; if(b.Pos.xScroll-100 || b.Pos.x>gpEngine->Scroll+640 || b.Pos.y<0 || b.Pos.y>480 || b.fLife<=0) b.IsActive = false; if(CollidedWithMap(b)) { b.pCollide(b); } b.frame<2? b.frame+=0.5f: b.frame=0; b.sphere.p += (b.Pos-b.oPos); } void Render_PlasmaBullet(Bullet& b, const float interp) { UTIL_GL::SetBlend(GL_ONE,GL_ONE); Vec2 p = UTIL_Misc::Interpolate(b.Pos,b.oPos,interp); Vec2 o = p-b.Pos; Vec2 r = (b.oPos+o)-p; for(int n=0;n<5;n++) { float s = (float)(n/5.0f); // glColor4f(0,1,0,1); glColor4f(0,1*s,0,1*s); // RenderRotatedSprite(gpEngine->sprGlowBullets,0,p.x,p.y,15,15,b.rot); RenderRotatedSprite(gpEngine->sprGlowBullets,0,p.x-r.x*(s*2),p.y-r.y*(s*2),15,15,b.rot); } /* glDisable(GL_TEXTURE_2D); glColor4f(1,1,0,1); GeoDraw2D::DrawSphere(b.sphere, 5);//*/ } void Collide_PlasmaBullet(Bullet& b) { if(!b.IsActive) return; gpEngine->SpawnSpriteEffect(1,b.sphere.p,Vec2(32,32),gpEngine->sprBulletHit2,0.25f,false,NULL,true); b.IsActive = false; SND_LASER3; } //================================================================================================// /****************** ** Pulse bullet ** *******************/ //================================================================================================// void Spawn_PulseBullet(Bullet& b, Vec2 pos, Vec2 vel) { b.IsActive = true; b.oPos = b.Pos = pos; b.Vel = vel; b.frame = 0; b.fLife = 2.75f *gpEngine->fGameDifficulty; b.sphere = Sphere(8,pos); } void Update_PulseBullet(Bullet& b) { b.oPos = b.Pos; b.Pos += b.Vel; if(b.Pos.xScroll-100 || b.Pos.x>gpEngine->Scroll+640 || b.Pos.y<0 || b.Pos.y>480 || b.fLife<=0) b.IsActive = false; if(CollidedWithMap(b)) { b.pCollide(b); } b.frame<2? b.frame+=0.5f: b.frame=0; b.sphere.p += (b.Pos-b.oPos); } void Render_PulseBullet(Bullet& b, const float interp) { UTIL_GL::SetBlend(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); Vec2 p = UTIL_Misc::Interpolate(b.Pos,b.oPos,interp); glColor4f(1,1,1,1); RenderRotatedSprite(gpEngine->sprBulletSet1,4,p.x,p.y,15,15,b.rot); /* glDisable(GL_TEXTURE_2D); glColor4f(1,1,0,1); GeoDraw2D::DrawSphere(b.sphere, 5);//*/ } void Collide_PulseBullet(Bullet& b) { if(!b.IsActive) return; gpEngine->SpawnSpriteEffect(1,b.sphere.p,Vec2(32,32),gpEngine->sprBulletHit,0.25f,false,NULL,true); b.IsActive = false; SND_LASER3; } //================================================================================================// /****************** ** Cluster bullet ** *******************/ //================================================================================================// void Update_ClusterBullet(Bullet& b) { b.oPos = b.Pos; b.user1+=0.097f; b.Pos += b.Vel; b.Pos.y += b.user1; Line ray(b.oPos,b.Pos); Line ray2(b.Pos,Vec2(b.Pos.x , b.Pos.y+100)); // b.user2? if(ray.r.x<0) b.rot = RAD2DEG(ray.Angle(ray2))-90; else b.rot = -(RAD2DEG(ray.Angle(ray2))+90); b.rot = UTIL_Misc::Wrap(b.rot,360); if(b.Pos.xScroll-100 || b.Pos.x>gpEngine->Scroll+640 || b.Pos.y>480 || b.fLife<=0) b.IsActive = false; if(CollidedWithMap(b)) { Collide_ClusterBullet(b); } b.sphere.p += (b.Pos-b.oPos); b.frame<7?b.frame+=0.75f:b.frame=0; } void Render_ClusterBullet(Bullet& b, const float interp) { UTIL_GL::SetBlend(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glColor4f(1,1,1,1); Vec2 p = UTIL_Misc::Interpolate(b.Pos,b.oPos,interp); RenderRotatedSprite(gpEngine->sprCluster,(int)b.frame,p.x+8,p.y+8,-16,16,b.rot); /* glDisable(GL_TEXTURE_2D); glColor4f(1,1,0,1); GeoDraw2D::DrawSphere(b.sphere, 15);//*/ } void Collide_ClusterBullet(Bullet& b) { if(!b.IsActive) return; b.IsActive = false; gpEngine->SpawnExplosion(gpEngine->sprExplosionSmall,b.Pos+Vec2(50,0),70,0.75f, (float)(rand()%360),false); gpEngine->SpawnExplosion(gpEngine->sprExplosionSmall,b.Pos+Vec2(-50,0),70,0.75f, (float)(rand()%360),false); gpEngine->SpawnExplosion(gpEngine->sprExplosionSmall,b.Pos+Vec2(0,50),70,0.75f, (float)(rand()%360),false); gpEngine->SpawnExplosion(gpEngine->sprExplosionSmall,b.Pos+Vec2(0,-50),70,0.75f, (float)(rand()%360),false); gpEngine->SpawnExplosion(gpEngine->sprExplosionSmall,b.Pos+Vec2(35,35),70,0.75f, (float)(rand()%360),false); gpEngine->SpawnExplosion(gpEngine->sprExplosionSmall,b.Pos+Vec2(-35,35),70,0.75f, (float)(rand()%360),false); gpEngine->SpawnExplosion(gpEngine->sprExplosionSmall,b.Pos+Vec2(35,-35),70,0.75f, (float)(rand()%360),false); gpEngine->SpawnExplosion(gpEngine->sprExplosionSmall,b.Pos+Vec2(-35,-35),70,0.75f, (float)(rand()%360),false); gpEngine->SpawnExplosion(gpEngine->sprImplosion,b.Pos,230,0.95f, (float)(rand()%360),true); SND_LARGEEXPLODE; Bullet bl; bl.pSpawn = Spawn_LifeBullet; bl.pUpdate = Update_LifeBullet; bl.pRender = Render_LifeBullet; bl.pCollide = Collide_LifeBullet; (*bl.pSpawn)(bl,b.Pos,Vec2(0,0)); gpEngine->SpawnBullet(bl,true); } //================================================================================================// /******************* ** homing missile ** ********************/ //================================================================================================// void PickTarget(Bullet& b) { list::iterator i; float heuristic=19999; float d; Vec2 u,r; UTIL_Misc::MakeVectors(b.rot,u,r); for(i = gpEngine->mGameEnts.begin(); i!=gpEngine->mGameEnts.end(); i++) { if(dynamic_cast((*i)) || dynamic_cast((*i)) || dynamic_cast((*i)))//dont target debris continue; d = Distance(b.sphere.p,(*i)->mSphere.p); d += 1 + (1.0f-Dot(r, Normalize(b.sphere.p - (*i)->mSphere.p)))*400; if(dmTopGameEnts.begin(); i!=gpEngine->mTopGameEnts.end(); i++) { if(dynamic_cast((*i)))//dont target breakable scenery continue; d = Distance(b.sphere.p,(*i)->mSphere.p); d += 1 + (1.0f-Dot(r, Normalize(b.sphere.p - (*i)->mSphere.p)))*400; if(d((*i))) continue; heuristic = d; b.pTarget = (*i); } } } void Spawn_HomingMissile(Bullet& b, Vec2 pos, Vec2 vel) { b.IsActive = true; b.oPos = b.Pos = pos; b.Vel = vel; b.frame = 0; b.fLife = 3; b.sphere = Sphere(5,pos+Vec2(14,8)); b.user1 = 0;//denots just spawned b.user2 = 0; b.rot = -90; b.pTarget = NULL; } void Update_HomingMissile(Bullet& b) { if(!b.IsActive) return; if(b.user1==0) { b.user2++; if(b.user2>20) { b.user1=1; b.user2=0; } b.Vel*=0.9f; } else { Vec2 u,r; UTIL_Misc::MakeVectors(b.rot,u,r); b.Vel = r * 5; if(b.pTarget == NULL || !b.pTarget->IsActive) PickTarget(b); else { Vec2 toTarget; toTarget = Normalize(b.sphere.p-b.pTarget->mSphere.p); if(Dot(u,toTarget)<0) b.rot -= (1.0f - Dot(r,toTarget))*2.5f; else b.rot += (1.0f - Dot(r,toTarget))*2.5f; } b.user2++; if(b.user2>3) { b.user2 = 0; gpEngine->SpawnExplosion(gpEngine->sprSmokePuff,b.sphere.p,50,0.45f, (float)(rand()%360),true); } } b.oPos = b.Pos; b.Pos += b.Vel; if(b.Pos.xScroll-100 || b.Pos.x>gpEngine->Scroll+640 || b.Pos.y<-100 || b.Pos.y>580 || b.fLife<=0) b.IsActive = false; if(CollidedWithMap(b)) { b.pCollide(b); } b.frame<15? b.frame+=0.5f: b.frame-=15; b.sphere.p += (b.Pos-b.oPos); } void Render_HomingMissile(Bullet& b, const float interp) { UTIL_GL::SetBlend(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glColor4f(1,1,1,1); Vec2 p = UTIL_Misc::Interpolate(b.Pos,b.oPos,interp); RenderRotatedSprite(gpEngine->sprHomingMissile,(int)b.frame,p.x+8,p.y+8,16,16,b.rot); /* glDisable(GL_TEXTURE_2D); glColor4f(1,1,0,1); GeoDraw2D::DrawSphere(b.sphere, 15);//*/ } void Collide_HomingMissile(Bullet& b) { b.IsActive = false; gpEngine->SpawnExplosion(gpEngine->sprExplosionSmall,b.Pos+Vec2(0,0),130,0.75f, (float)(rand()%360),false); SND_MEDEXPLODE; } //================================================================================================// /****************** ** life bullet ** *******************/ //================================================================================================// void Spawn_LifeBullet(Bullet& b, Vec2 pos, Vec2 vel) { b.IsActive = true; b.oPos = b.Pos = pos; b.Vel = vel; b.frame = 0; b.fLife = 3;//was 15 b.sphere = Sphere(65,pos); } void Update_LifeBullet(Bullet& b) { if(!b.IsActive) return; if(b.fLife<=0) b.IsActive = false; b.fLife -= 1.0f; } void Render_LifeBullet(Bullet& b, const float interp) { /* glDisable(GL_TEXTURE_2D); glColor4f(1,1,0,1); GeoDraw2D::DrawSphere(b.sphere, 15);//*/ } void Collide_LifeBullet(Bullet& b) { } //================================================================================================// /********************** ** basic bullet type ** ***********************/ //================================================================================================// void Spawn_BasicBullet(Bullet& b, Vec2 pos, Vec2 vel) { b.IsActive = true; b.oPos = b.Pos = pos; b.Vel = vel; b.frame = 0; b.fLife = 1 *gpEngine->fGameDifficulty; b.sphere = Sphere(5,pos+Vec2(14,14)); } void Update_BasicBullet(Bullet& b) { if(!b.IsActive) return; b.oPos = b.Pos; b.Pos += b.Vel; if(b.Pos.xScroll-100 || b.Pos.x>gpEngine->Scroll+640 || b.Pos.y<0 || b.Pos.y>480 || b.fLife<=0) b.IsActive = false; if(CollidedWithMap(b)) { b.pCollide(b); } b.frame<2? b.frame+=0.5f: b.frame=0; b.sphere.p += (b.Pos-b.oPos); } void Render_BasicBullet(Bullet& b, const float interp) { UTIL_GL::SetBlend(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); switch((int)b.frame) { case 0: glColor4f(1,0,0,1); break; case 1: glColor4f(1,1,0,1); break; case 2: glColor4f(0.5f,0,0.5f,1); break; } Vec2 p = UTIL_Misc::Interpolate(b.Pos,b.oPos,interp); RenderSprite(gpEngine->sprBulletSet1,0,p.x,p.y,24,24); /* glDisable(GL_TEXTURE_2D); glColor4f(1,1,0,1); GeoDraw2D::DrawSphere(b.sphere, 5);*/ } void Collide_BasicBullet(Bullet& b) { if(!b.IsActive) return; gpEngine->SpawnSpriteEffect(1,b.sphere.p,Vec2(32,32),gpEngine->sprBulletHit,0.5f,false,NULL,true); b.IsActive = false; } //================================================================================================// /************************ ** Gravity bullet type ** *************************/ //================================================================================================// void Spawn_GravityBullet(Bullet& b, Vec2 pos, Vec2 vel) { b.IsActive = true; b.oPos = b.Pos = pos; b.Vel = vel; b.frame = 0; b.fLife = 5; b.sphere = Sphere(7,pos+Vec2(8,8)); b.user1 =0; } void Update_GravityBullet(Bullet& b) { b.oPos = b.Pos; b.user1+=0.097f; b.Pos += b.Vel; b.Pos.y += b.user1; Line ray(b.oPos,b.Pos); Line ray2(b.Pos,Vec2(b.Pos.x , b.Pos.y+100)); b.user2? b.rot = RAD2DEG(ray.Angle(ray2))-90: b.rot = -(RAD2DEG(ray.Angle(ray2))+90); b.rot = UTIL_Misc::Wrap(b.rot,360); if(b.Pos.xScroll-100 || b.Pos.x>gpEngine->Scroll+640 || b.Pos.y>480 || b.fLife<=0) b.IsActive = false; if(CollidedWithMap(b)) { b.IsActive = false; gpEngine->SpawnExplosion(gpEngine->sprExplosionSmall,b.Pos+Vec2(0,0),130,0.75f, (float)(rand()%360),false); SND_MEDEXPLODE; } b.sphere.p += (b.Pos-b.oPos); b.frame<7?b.frame+=0.5f:b.frame=0; } void Render_GravityBullet(Bullet& b, const float interp) { UTIL_GL::SetBlend(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glColor4f(1,1,1,1); Vec2 p = UTIL_Misc::Interpolate(b.Pos,b.oPos,interp); RenderRotatedSprite(gpEngine->sprMissile,(int)b.frame,p.x+8,p.y+8,16,16,b.rot); /* glDisable(GL_TEXTURE_2D); glColor4f(1,1,0,1); GeoDraw2D::DrawSphere(b.sphere, 15);//*/ } void Collide_GravityBullet(Bullet& b) { b.IsActive = false; gpEngine->SpawnExplosion(gpEngine->sprExplosionSmall,b.Pos+Vec2(0,0),130,0.75f, (float)(rand()%360),false); SND_MEDEXPLODE; } //================================================================================================// /********************** ** Power bullet type ** ***********************/ //================================================================================================// void Spawn_PowerBullet(Bullet& b, Vec2 pos, Vec2 vel) { b.IsActive = true; b.oPos = b.Pos = pos; b.Vel = vel; b.frame = 0; b.fLife = 10; b.sphere = Sphere(5,pos+Vec2(8,8)); } void Render_PowerBullet(Bullet& b, const float interp) { UTIL_GL::SetBlend(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glColor4f(0,1,0,1); Vec2 p = UTIL_Misc::Interpolate(b.Pos,b.oPos,interp); RenderRotatedSprite(gpEngine->sprBulletSet1,2,p.x+8,p.y+8,16,16,b.rot); /* glDisable(GL_TEXTURE_2D); glColor4f(1,1,0,1); GeoDraw2D::DrawSphere(b.sphere, 5);//*/ } void Collide_PowerBullet(Bullet& b) { if(!b.IsActive) return; gpEngine->SpawnSpriteEffect(1,b.sphere.p,Vec2(32,32),gpEngine->sprBulletHit2,0.35f,false,NULL,true); b.IsActive = false; } //================================================================================================// /****************** ** mid boss type ** *******************/ //================================================================================================// void Spawn_BlastBullet(Bullet& b, Vec2 pos, Vec2 vel) { b.IsActive = true; b.oPos = b.Pos = pos; b.Vel = vel; b.frame = 0; b.fLife = 1; b.sphere = Sphere(8,pos+Vec2(10,10)); } void Render_BlastBullet(Bullet& b, const float interp) { UTIL_GL::SetBlend(GL_SRC_ALPHA,GL_ONE); Vec2 p = UTIL_Misc::Interpolate(b.Pos,b.oPos,interp); Vec2 r,u; UTIL_Misc::MakeVectors(b.rot,r,u); float rot = b.rot-90; glColor4f(1,0,0,1); RenderRotatedSprite(gpEngine->sprGlowBullets,2,p.x+8+r.x*10,p.y+8+r.y*10,16,16,rot); glColor4f(1,0.5f,0,1); RenderRotatedSprite(gpEngine->sprGlowBullets,2,p.x+8+r.x*5,p.y+8+r.y*5,16,16,rot); glColor4f(1,1,0,1); RenderRotatedSprite(gpEngine->sprGlowBullets,2,p.x+8,p.y+8,16,16,rot); /* glDisable(GL_TEXTURE_2D); glColor4f(1,1,0,1); GeoDraw2D::DrawSphere(b.sphere, 15);//*/ } //================================================================================================// /****************** ** big boss type ** *******************/ //================================================================================================// void Spawn_BossBullet(Bullet& b, Vec2 pos, Vec2 vel) { b.IsActive = true; b.oPos = b.Pos = pos; b.Vel = vel; b.frame = 0; b.fLife = 1000; b.sphere = Sphere(32,pos+Vec2(32,48)); } void Update_BossBullet(Bullet& b) { if(!b.IsActive) return; b.oPos = b.Pos; b.Pos += b.Vel; if(b.Pos.xScroll-100 || b.Pos.y<0 || b.Pos.y>480 || b.fLife<=0) b.IsActive = false; b.frame<15? b.frame+=0.75f: b.frame-=15; b.sphere.p += (b.Pos-b.oPos); } void Render_BossBullet(Bullet& b, const float interp) { UTIL_GL::SetBlend(GL_SRC_ALPHA,GL_ONE); glColor4f(1,1,1,1); Vec2 p = UTIL_Misc::Interpolate(b.Pos,b.oPos,interp); RenderSprite(gpEngine->sprFireBall,(int)b.frame,p.x-96,p.y-64,256,256); /* glDisable(GL_TEXTURE_2D); glColor4f(1,1,0,1); GeoDraw2D::DrawSphere(b.sphere, 15);//*/ } void Render_BossPowerBullet(Bullet& b, const float interp) { UTIL_GL::SetBlend(GL_SRC_ALPHA,GL_ONE); glColor4f(0.3f,1,1,1); Vec2 p = UTIL_Misc::Interpolate(b.Pos,b.oPos,interp); RenderRotatedSprite(gpEngine->sprGlowBullets,0,p.x+8,p.y+8,16,16,b.rot+90); /* glDisable(GL_TEXTURE_2D); glColor4f(1,1,0,1); GeoDraw2D::DrawSphere(b.sphere, 5);//*/ }