📄 fireball.cpp.svn-base
字号:
#include "FireBall.h"
#include "gamedata.h"
#include "structs.h"
#include "../game/custom_time.h"
#include "../game/msg.h"
#include "../game/msgroute.h"
#include "../game/util.h"
#include <windows.h>
#include <gl/gl.h>
#include <limits.h>
#include <assert.h>
#include <math.h>
unsigned int FireBall::FireballID = 0;
FireBall::FireBall(Vertex initPos, Vertex destPos, unsigned int sender, float d)
{
oldPos = newPos = initPos;
SenderID = sender;
damage = d;
checked = true;
collide = false;
NeedChecked = true;
pos = initPos;
dest = destPos;
radius = 0.3;
moveSpeed = 40;
v_y = 0.001 * moveSpeed * (destPos.y-initPos.y) / GetDistance3D(initPos, destPos);
v_x = 0.001 * moveSpeed * (destPos.x-initPos.x) / GetDistance(initPos, destPos);
v_z = 0.001 * moveSpeed * (destPos.z-initPos.z) / GetDistance(initPos, destPos);
ID = FireballID++;
markForDeleted = false;
endTime = curT + 6000;
deleteTime = endTime + 1000;
exploded = false;
}
FireBall::~FireBall(void)
{
}
void FireBall::CalcNewPos()
{
oldPos = pos;
newPos.x = pos.x + incT * v_x;
newPos.y = pos.y + incT * v_y;
newPos.z = pos.z + incT * v_z;
}
void FireBall::Update()
{
if (curT >= deleteTime) {
markForDeleted = true;
return;
}
if (curT >= endTime) {
exploded = true;
explosionTime = curT;
}
if (!checked) {
assert( !"You must calculate new position before update!" );
return;
}
checked = false;
if (collide) {
if (collideId != -1) {
extra_data ex;
ex.damage = damage;
SendMsg(MSG_Damage, collideId, collideId, ex);
}
deleteTime = curT + 1000;
exploded = true;
explosionTime = curT;
collide = false;
NeedChecked = false;
} else {
if (!exploded)
pos = newPos;
//if (GetDistance3D(pos, dest) < 0.01)
// markForDeleted = true;
}
}
void FireBall::DeleteOldFB()
{
list<FireBall>::iterator i = fireBalls.begin();
while (i != fireBalls.end()) {
if (i->markForDeleted) {
i = fireBalls.erase(i);
} else
++i;
}
}
void FireBall::CalcFBNewPos()
{
list<FireBall>::iterator i = fireBalls.begin();
while (i != fireBalls.end()) {
i->CalcNewPos();
++i;
}
}
void FireBall::UpdateFireballs()
{
list<FireBall>::iterator i = fireBalls.begin();
while (i != fireBalls.end()) {
i->Update();
++i;
}
}
void FireBall::Render()
{
if(exploded) return;
glPushMatrix();
glTranslatef(pos.x,pos.y,pos.z);
GLUquadricObj *cylinder_obj= gluNewQuadric();
gluQuadricTexture(cylinder_obj,GL_TRUE);
glBindTexture(GL_TEXTURE_2D,bmptexture[0]);
glColor3f(1,1,0.5);
gluSphere(cylinder_obj,0.5,20,20);
glPopMatrix();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -