☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Sigel Tutorial 1. Свой Crimsoland.
Aceton, проверь эту версию плиз:
http://rghost.ru/180172
кстати, тут уже можно набрать очки и проиграть))
управление WASD + мыш(3 кнопки)
вот ее исходник:
#define SIGEL_USE_ONLY //указываем что движек будет юзаться не весь
#define SIGEL_DEVIL //подрубмаем модуль DEVIL. для загрузкаи разных форматов изображений
#define SIGEL_SOUND //подрубаем модель для работы со звуком
#include <sigel/ISigel.h> //подрубаем сам двиг.
Surface *bb = 0; //сюрфейс квада. много где будет использоваться
Entity *player = 0; //игрок
float dt = 0; //DeltaTime. время кадра в миллисекундах
Billboard *bspark = 0; // спрайт для вспышек от выстрелов
Texture *bsparktex = 0; //текстуры вспышек выстрелов (8 в 1)
Texture *btex = 0; //текстура пули
Texture *enemytex = 0; //текустура врага
Texture *nnmap = 0; //текстура смещений нормалей (для преломления пространства под врагом)
Texture *bloodtex[6];
Camera *eye = 0; //камера
float playeren=0; //энергия игрока
int score = 0;
int scoremul = 0;
float smtime = 0;
Texture *bloodlake = 0;
class Bullet //класс пули
{
Entity *ent; //интити пули
float l; //время жизни
public:
Bullet(int tp); //tp - тип пули
~Bullet(); //деструктор
void Update(); //функция обновления
float Dist(float x,float y); //функция возвращает расстояние до пули
void Kill(); //убивает пулю
};
class Flash //класс вспышки от выстрела
{
Entity *ent; //интити вспышки
float l; //время жизни
public:
Flash(Entity *asent); //параметр - на место какого интити ставим вспышку
~Flash();
void Update(); //функция обновления
};
class Enemy //класс врага
{
Entity *ent; //интити врага
float visibility; //видимость - от 0 до 1
float energy; //энергия - от 0 до 100
float ebartime; //время жизни полоски жизни - от 0 до 1000
Vector2D target; //куда прет враг если игрока нет рядом
bool findplayer;
public:
Enemy(); //конструктор
~Enemy(); //деструктор
void Update(); //функция обновления
void Draw(); //функция 2д отрисовки
};
class BloodSpark
{
Entity *ent;
float sz;
float dx,dy,dz;
float turnspeed;
public:
BloodSpark(Entity *asent,Vector2D &dir);
~BloodSpark();
void Update();
};
typedef std::list<Bullet*> TBList; //тип списка с пулями
TBList blist; //список с пулями
typedef std::list<Flash*> TFList; //тип списка с вспышками
TFList flist; //список со вспышками
typedef std::list<Enemy*> TEnList; //тип списка с врагами
TEnList enlist; //список с врагами
typedef std::list<BloodSpark*> TBSList;
TBSList bslist;
Bullet::Bullet(int tp = 0)
{
ent = new Entity(bb);
ent->Blend(BM_ADD);
ent->Position(player);
ent->Rotate(player);
ent->MoveY(0,2);
float precission = 0;
switch(tp)
{
case 0:
precission = 0;
break;
case 1:
precission = 3.0f;
break;
case 2:
precission = 22.5f;
break;
case 3:
precission = 60.0f;
break;
default:
precission = 0;
break;
};
ent->Turn(0,rnd(-precission,precission),0);
ent->BindTex(btex);
ent->Scale(0.5f);
l = 1000.0f;
Flash *f = new Flash(ent);
blist.push_back(this);
}
Bullet::~Bullet()
{
delete ent;
blist.remove(this);
}
void Bullet::Update()
{
ent->Move(0.07f * dt);
l -= dt;
if(l<0)
delete this;
}
float Bullet::Dist(float x,float z)
{
return ent->Dist(x,z);
}
void Bullet::Kill()
{
float dx,dz;
ent->GetDirY(dx,dz);
BloodSpark *bs = new BloodSpark(ent,Vector2D(dx,dz));
l = -1;
}
Flash::Flash(Entity *asent)
{
ent = new Entity(bspark);
ent->Blend(BM_ADD);
ent->Position(asent);
ent->BindTex(bsparktex);
ent->Animate(0.0f,8.0f,7.0f / 500.0f);
flist.push_back(this);
l = 500;
}
Flash::~Flash()
{
delete ent;
flist.remove(this);
}
void Flash::Update()
{
l-=dt;
if(l<0)
delete this;
}
Enemy::Enemy()
{
ent = new Entity(bb);
ent->Blend(BM_DECAL);
Vector2D pos(rnd(-1.0f,1.0f),rnd(-1.0f,1.0f));
pos.normalize();
pos*= 50.0f;
ent->Position(pos.x,0.6f,pos.y);
ent->BindTex(enemytex);
target.x = rnd(-32.0f,32.0f);
target.y = rnd(-32.0f,32.0f);
energy = 100.0f;
visibility = 0.5f;
ebartime = 0;
findplayer = 0;
enlist.push_back(this);
}
Enemy::~Enemy()
{
delete ent;
enlist.remove(this);
}
void Enemy::Update()
{
float x = ent->X();
float z = ent->Z();
//поход к новой точке и преследование игрока
float d = ent->Dist(player);
Vector2D dir;
if(d<2) //пожираем игрока
{
playeren -= dt*0.02f; // за 0.02 * 1000 = 20. по 20 ед в секунду тратится здоровье игрока.
}
if(d<10) //если расстояние мало - находим игрока
findplayer = 1;
if(d>20) //если велико - теряем
findplayer = 0;
if(findplayer) //если игрок далеко, и мы его не видим
{
dir.x = player->X() - ent->X();
dir.y = player->Z() - ent->Z();
}
else
{
if(Dist2D(x,z,target.x,target.y)<2) //если цель близка, то ставим ее на новое мест
{
target.x = rnd(-32.0f,32.0f);
target.y = rnd(-32.0f,32.0f);
}
dir.x = target.x - ent->X();
dir.y = target.y - ent->Z();
}
if(dir.length()>1)
{
dir.normalize();
dir *= (dt * 0.007f);
ent->Translate(dir.x,0,dir.y);
}
//столкновение с пулями
TBList::const_iterator ci = blist.begin();
TBList::const_iterator ce = blist.end();
for(;ci!=ce;++ci)
{
float d = (*ci)->Dist(x,z);
if(d<2)
{
if(energy>-1.0f)
{
(*ci)->Kill();
energy-=10.0f;
if(d<1.5f)
energy -= 20.0f;
if(d<1.0f)
energy -= 30.0f;
if(d<0.5f)
energy -= 40.0f;
ebartime = 1000.0f;
}
}
}
//столкновение с игроком
if(energy<0)
{
if(smtime>0)
{
scoremul ++;
}
else
{
scoremul =1;
}
score += scoremul;
smtime = 500;
delete this;
}
}
void Enemy::Draw()
{
Vector3D res;
eye->Project(ent,res);
if(res.z>0)
{
int x = (int)res.x-50;
int y = (int)res.y-50;
unsigned char a = (unsigned char)(ebartime / 4.0f);
ebartime = max_(0,ebartime-dt);
Color(100,100,100,a);
Rect(x-3,y-3,106,18);
Color(200,200,200,a);
Rect(x-2,y-2,104,16);
Color(150,150,150,a);
Rect(x-1,y-1,102,14);
Color(0,255,0,a);
Rect(x,y,(int)energy,12);
}
}
BloodSpark::BloodSpark(Entity *asent,Vector2D &dir)
{
ent = new Entity(bb);
ent->Blend(BM_ALPHA);
ent->Position(asent);
ent->BindTex(bloodtex[rand(5,5)]);
ent->Scale(rnd(0.3f,0.4f));
ent->Rotate(0,rnd(0,360.0f),0);
dx = dir.x * 0.01f;
dz = dir.y * 0.01f;
dy = 0.02f;
turnspeed = rnd(120.0f,600.0f) * 0.001f;
turnspeed *= ((rand(0,1)*2)-1);
bslist.push_back(this);
}
BloodSpark::~BloodSpark()
{
delete ent;
bslist.remove(this);
}
void BloodSpark::Update()
{
ent->Translate(dx*dt,dy*dt,dz*dt);
ent->Turn(0,turnspeed*dt,0);
dy -= dt*0.00005f;
if(ent->Y()<0.1f)
delete this;
}
sGAME
{
debug::startlog();
Init();
AppTitle("_ISh2");
Image *cur = new Image("media/cur.jpg");
eye = new Camera();
Entity *cam = new Entity(EC_PIVOT);
eye->BindEntity(cam);
cam->Rotate(-90.0f,0,0); //поворачиваем камеру вниз. Игра то с видом сверху.
bb = new Surface();
bb->MakeQuad(2.0f);
player = new Entity(bb);
player->Blend(BM_ALPHA);
Texture *playerdiffus[19];
for(int i=0;i<19;++i)
{
char buff[80];
sprintf_s(buff,80,"media/solider/%d.png",i+1);
playerdiffus[i] = new Texture(buff);
}
Surface *sfloor = new Surface();
sfloor->MakeQuad(34.0f,8.0f);
Surface *avzone = new Surface();
avzone->MakeQuad(32.0f,32.0f);
Entity *efloor = new Entity(sfloor);
Entity *eavzone = new Entity(avzone);
eavzone->Blend(BM_ADD);
eavzone->Color(64,64,0);
eavzone->SetY(0.1f);
eavzone->Hide();
Texture *fdiffus = new Texture("media/Fieldstone.png",TF_MIPMAP | TF_ANISOTROPIC);
efloor->BindTex(fdiffus);
bspark = new Billboard(1.0f);
bspark->AnimLenght(8);
bspark->SetSmoothAnim(1);
bsparktex = new Texture("media/bflash.jpg");
btex = new Texture("media/bullet.jpg");
enemytex = new Texture("media/enemy.png");
nnmap = new Texture("media/nnmap.jpg");
for(int i=0;i<6;++i)
{
char buff[80];
sprintf_s(buff,80,"media/Blood%d.tga",i);
bloodtex[i] = new Texture(buff);
}
VWait(0);
TFont *fnt = new TFont("media/font.txt");
player -> Position(0.0f,0.5f,0.0f); //ставим игрока на середину. (чуть выше земли).
int move = 0;
float frame = 0;
player->BindTex(playerdiffus[(int)frame]);
HidePointer();
float fire = 0;
float enemyborn = 0;
playeren = 100;
float borntime = 3000;
score = 0;
while((!KeyDown(VK_ESCAPE)) && playeren>0 )
{
dt = GetFrameTime();
smtime = max_(0,smtime-dt);
//3d
move = 0;
Vector2D mdir(0,0);
if(KeyDown('W'))
{
move = 1;
mdir.y -= 1;
}
if(KeyDown('S'))
{
move = 1;
mdir.y += 1;
}
if(KeyDown('A'))
{
move = 1;
mdir.x -= 1;
}
if(KeyDown('D'))
{
move = 1;
mdir.x += 1;
}
if(move)
{
if(mdir.length()>0.1f)
mdir.normalize();
mdir *= (dt*0.01f);
player->Translate(mdir.x,0,mdir.y);
frame += dt * 0.03f;
if(frame>18.0f)
frame -= 18.0f;
player->BindTex(playerdiffus[(int)frame]);
}
float a = atan2f((float)((ScreenWidth()/2)-MouseX()),(float)((ScreenHeight()/2)-MouseY()));
player->RotateY(a*57.1f);
//eavzone->Hide();
if(player->X()<-32.0f)
player->SetX(-32.0f);
if(player->X()>32.0f)
player->SetX(32.0f);
if(player->Z()<-32.0f)
player->SetZ(-32.0f);
if(player->Z()>32.0f)
player->SetZ(32.0f);
cam->Position(player);
cam->PositionY(24.0f);
//стрельбa
if(MouseDown(1))
{
if(fire<1)
{
Bullet *b = new Bullet(1);
fire = 100;
}
}
if(MouseDown(2))
{
if(fire<1)
{
for(int i=0;i<11;++i)
{
Bullet *b = new Bullet(2);
}
fire = 800;
}
}
if(MouseDown(3))
{
if(fire<1)
{
for(int i=0;i<400;++i)
{
Bullet *b = new Bullet(3);
}
fire = 4000;
}
}
fire = max_(0,fire-dt);
//создание врагов
enemyborn+=dt;
if(enemyborn>borntime)
{
Enemy *e = new Enemy();
enemyborn = 0;
if(borntime>750)
borntime *= 0.99f;
}
misc::update_this<TBList>(blist);
misc::update_this<TFList>(flist);
misc::update_this<TEnList>(enlist);
misc::update_this<TBSList>(bslist);
AnimUpdate(dt);
Render();
//2d
Blend(BM_ALPHA);
std::for_each(enlist.begin(),enlist.end(),std::mem_fun<void,Enemy>(&Enemy::Draw));
Color(255,255,255,255);
fnt->Text(GetFPS(),10,10);
char buff[80];
sprintf_s(buff,80,"Здоровье: %d",(int)playeren);
fnt->Text(buff,10,40);
sprintf_s(buff,80,"Очков: %d",(int)score);
fnt->Text(buff,10,70);
sprintf_s(buff,80,"Врагов: %d",(int)enlist.size());
fnt->Text(buff,10,100);
Blend(BM_ADD);
cur->Draw(MouseX()-16,MouseY()-16);
Blend(BM_ALPHA);
Flip();
}
ShowPointer();
DeInit();
{
char buff[80];
sprintf_s(buff,80,"Вы набрали %d очков! Тянет на мировой рекорд...",score);
Msg(buff);
}
debug::endlog();
};
Последний раз редактировалось HolyDel, 01.04.2009 в 20:03.
|