Показать сообщение отдельно
Старый 31.03.2009, 07:31   #3
HolyDel
 
Регистрация: 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

скрин:
Нажмите на изображение для увеличения
Название: _ISh2 2009-03-31 06-29-09-99.jpg
Просмотров: 1166
Размер:	333.5 Кб
ID:	5726
(Offline)
 
Ответить с цитированием
Эти 8 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
-=SCiP=- (31.03.2009), ABTOMAT (31.03.2009), Aceton (31.03.2009), dimanche13 (01.04.2009), falcon (31.03.2009), h1dd3n (31.03.2009), H@NON (31.03.2009), impersonalis (31.03.2009)