☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Sigel Tutorial 1. Свой Crimsoland.
последняя версия исходника, описание как делалось / делать выложу вечером.

#define SIGEL_USE_ONLY
#define SIGEL_DEVIL
#define SIGEL_SOUND
#include <sigel/ISigel.h>
Surface *bb = 0;
Entity *player = 0;
float dt = 0;
Billboard *bspark;
Texture *bsparktex;
Texture *btex;
Texture *enemytex;
Texture *nnmap;
Camera *eye = 0;
class Bullet
{
Entity *ent;
float l;
public:
Bullet(float precission);
~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;
float energy;
float ebartime;
Vector2D target;
public:
Enemy();
~Enemy();
void Update();
void Draw();
};
typedef std::list<Bullet*> TBList;
TBList blist;
typedef std::list<Flash*> TFList;
TFList flist;
typedef std::list<Enemy*> TEnList;
TEnList enlist;
Bullet::Bullet(float precission = 0)
{
ent = new Entity(bb);
ent->Blend(BM_ADD);
ent->Position(player);
ent->Rotate(player);
ent->MoveY(0,2);
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.08f * dt);
l -= dt;
if(l<0)
delete this;
}
float Bullet::Dist(float x,float z)
{
return ent->Dist(x,z);
}
void Bullet::Kill()
{
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_ALPHA);
ent->Position(rnd(4.0f,60.0f),0.6f,rnd(4.0f,60.0f));
ent->BindTex(enemytex);
target.x = rnd(8.0f,56.0f);
target.y = rnd(8.0f,56.0f);
energy = 100.0f;
visibility = 0.5f;
ebartime = 0;
enlist.push_back(this);
}
Enemy::~Enemy()
{
delete ent;
enlist.remove(this);
}
void Enemy::Update()
{
float x = ent->X();
float z = ent->Z();
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)
{
(*ci)->Kill();
energy-=10.0f;
if(d<1.5f)
energy -= 4.0f;
if(d<1.0f)
energy -= 8.0f;
if(d<0.5f)
energy -= 16.0f;
}
}
if(energy<0)
delete this;
}
void Enemy::Draw()
{
Vector3D res;
eye->Project(ent,res);
if(res.z>0)
{
int x = res.x-50;
int y = res.y-50;
Color(100,100,100,200);
Rect(x-3,y-3,106,18);
Color(200,200,200,200);
Rect(x-2,y-2,104,16);
Color(150,150,150,200);
Rect(x-1,y-1,102,14);
Color(0,255,0,200);
Rect(x,y,energy,12);
}
}
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(64.0f,16.0f);
Entity *efloor = new Entity(sfloor);
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");
VWait(0);
TFont *fnt = new TFont("tahoma.txt");
player -> Position(32.0f,0.5f,32.0f); //ставим игрока на середину. (чуть выше земли).
int move = 0;
float frame = 0;
player->BindTex(playerdiffus[(int)frame]);
HidePointer();
float fire = 0;
float enemyborn = 0;
while(!KeyDown(VK_ESCAPE))
{
dt = GetFrameTime();
//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);
cam->Position(player);
cam->PositionY(24.0f);
//стрельбa
if(MouseDown(1))
{
if(fire<1)
{
Bullet *b = new Bullet(2.0f);
fire = 100;
}
}
if(MouseDown(2))
{
if(fire<1)
{
for(int i=0;i<10;++i)
{
Bullet *b = new Bullet(22.5f);
}
fire = 1111;
}
}
fire = max_(0,fire-dt);
//создание врагов
enemyborn+=dt;
if(enemyborn>3000)
{
Enemy *e = new Enemy();
enemyborn = 0;
}
misc::update_this<TBList>(blist);
misc::update_this<TFList>(flist);
misc::update_this<TEnList>(enlist);
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);
Blend(BM_ADD);
cur->Draw(MouseX()-16,MouseY()-16);
Blend(BM_ALPHA);
Flip();
}
ShowPointer();
DeInit();
debug::endlog();
};
геймплей дальше сильно усложняться не будет, лишь враги начнут двигаться и пожирать игрока. кстати, врагов видно не будет. они будут невидимками. просто на их месте будет искажаться пространство.
Дальше будет в основном только украшение (враги-невидимки, свет от пуль, кровища, бамп/спекуляр на земле и т.д.)
"игра" и исходники:
ttp://rghost.ru/177734
скрин:

|