Уроки Коммент.

Создание игр » Новости » Создание игры. Фон, звёзды.

Создание игры. Фон, звёзды.

Создание игры. Звёзды. На этом этапе создания игры мы сделаем звёздный фон.

У меня получаются достаточно короткие уроки. Если они слишком уж коротки или малоинформативны – пишите в комментариях о неясных моментах, я дополню статьи и постараюсь поподробнее расписать все непонятные моменты – ведь у нас задача не просто создать игру, но и сделать так, что бы Вы понимали, как это происходит, до самых мелких деталей и ньюансов.

На картинке этого поста изображено то, что у нас получится в итоге. В динамике смотреться будет лучше, поверьте.

Звёздный фон состоит из отдельных звёзд разной величины. Я решил сделать отдельный класс звезды, хотя это, в общем-то, совсем не обязательно. Однако, мне показалось, что так будет удобнее.

class CStarField
{
	//! Текстура со спрайтом звезды
	CTexturePtr m_pTex;
 
	//! счётчик времени для рождения новых звёзд
	float m_fDT;
 
	struct Star // одна звезда
	{
		D3DXVECTOR2 m_pos; // позиция на экране
		int m_size; // размер
		Star(D3DXVECTOR2 pos=D3DXVECTOR2(0,0), int size=8);
	};
	std::vector<Star> vecStars;
public:
	CStarField(void);
	~CStarField(void);
	void Update(float fDeltaTime);
	void Draw();
};

Как видите, помимо конструктора и дестуркутора, нам понадобилась всего лишь пара функций: одна из них рендерит наши звёды (функция Draw), а вторая занимается апдейтом нашего игрового звёздного неба (проще говоря, она двигает звёзды). Что как именно функции это делают, понятно из комментариев, смотрите исходник:

void CStarField::Update( float fDeltaTime )
{
	// двигаем звёзды
	// чем больше звезда - тем быстрее она движется
	for (int i=0; i<vecStars.size(); i++)
	{
		vecStars[i].m_pos.y += vecStars[i].m_size*fDeltaTime*50;
		if (vecStars[i].m_pos.y>300) // если звезда вышла за экран
		{
			// убираем её из массива
			// перемещаем последнюю в массиве на место этой
			vecStars[i] = vecStars[vecStars.size()-1];
			// и уменьшаем размер массива
			vecStars.resize(vecStars.size()-1);
		}
	}
 
	// генерируем новые звёзды, если прошло больше,
	// чем 0.1 сек
	m_fDT += fDeltaTime;
	while(m_fDT>.1f)
	{
		vecStars.push_back(Star(D3DXVECTOR2( (rand()%800)-400, -300),
			(rand()%5)+1));
		m_fDT-=.1f;
	}
}
 
void CStarField::Draw()
{
	// устанвливаем текстуру звёзды
	Graphics::get().SetTexture(0, m_pTex);
	// рисуем всё зёзды по очереди
	for (int i=0; i<vecStars.size(); i++)
	{
		D3DXVECTOR2 pos = vecStars[i].m_pos;
		float size = float(vecStars[i].m_size);
		Graphics::get().DrawSprite(m_pTex, pos, D3DXVECTOR2(size, size));
	}
}

Как видите, наш графический движок уже служит нам верой и правдой – сейчас для рендеринга игровых объектов достаточно написать 1-3 строки кода, сравните это с тем, как мы рисовали квад с текстурой в первых уроках.

Вот и этот урок по созданию игры неожиданно закончился ) Всем желающим предлагаются исходники: скачать. Либо можете просто скачать демку и посмотреть что получилось.

Ещё по этой теме:




Раздел: Новости

5 комментариев на "Создание игры. Фон, звёзды."
  1. ололош пишет:

    обьясните мне чё такое fDeltaTime?

    1. Вячеслав пишет:

      Время, прошедшее в предыдущего кадра.

  2. Shadow пишет:

    Огромное спасибо за такие уроки и примеры! Есть чему поучиться. Правда, не сразу получается во всё вникнуть, но со временем думаю получится. :)

  3. Евгений пишет:

    Демка у меня не пашет, хотя вижак 2012 стоит. Но мне в принципе она и не нужна. Спасибо за статью)

  4. Yar пишет:

    :) Спасибо! уже веселее! читаем далее!

Оставить комментарий

*

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>