Показать сообщение отдельно
Старый 01.04.2009, 19:48   #15
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Sigel Tutorial 1. Свой Crimsoland.

Нажмите на изображение для увеличения
Название: screen_6.JPG
Просмотров: 960
Размер:	344.3 Кб
ID:	5749

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.
(Offline)
 
Ответить с цитированием