Создание игр » DirectX 9, Featured » Создание игры. Фон, звёзды.
Создание игры. Фон, звёзды.
На этом этапе создания игры мы сделаем звёздный фон.
У меня получаются достаточно короткие уроки. Если они слишком уж коротки или малоинформативны – пишите в комментариях о неясных моментах, я дополню статьи и постараюсь поподробнее расписать все непонятные моменты – ведь у нас задача не просто создать игру, но и сделать так, что бы Вы понимали, как это происходит, до самых мелких деталей и ньюансов.
На картинке этого поста изображено то, что у нас получится в итоге. В динамике смотреться будет лучше, поверьте.
Звёздный фон состоит из отдельных звёзд разной величины. Я решил сделать отдельный класс звезды, хотя это, в общем-то, совсем не обязательно. Однако, мне показалось, что так будет удобнее.
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 строки кода, сравните это с тем, как мы рисовали квад с текстурой в первых уроках.
Вот и этот урок по созданию игры неожиданно закончился ) Всем желающим предлагаются исходники: скачать. Либо можете просто скачать демку и посмотреть что получилось.
Раздел: DirectX 9, Featured · Теги: Создание игр
обьясните мне чё такое fDeltaTime?
Время, прошедшее в предыдущего кадра.
Огромное спасибо за такие уроки и примеры! Есть чему поучиться. Правда, не сразу получается во всё вникнуть, но со временем думаю получится.
Демка у меня не пашет, хотя вижак 2012 стоит. Но мне в принципе она и не нужна. Спасибо за статью)
Спасибо! уже веселее! читаем далее!