Создание игр » Featured, Уроки » Создание игры. Спрайты.
Создание игры. Спрайты.
Спрайты повсеместно используются в играх, особенно в 2д-играх. Изначально под термином “спрайты” подразумевали небольшие графические картинки, которые выводились на экран. Очень быстро в компьютерах появились и возможности аппаратного ускорения вывода спрайтов, что привело к их повсеместному использованию. Спрайты использовались в и первых трёхмерных играх – например, в играх Wolfenstein, Doom и многих других персонажи были спрайтами. В наше время спрайты так же используются, в том числе существует и их аппаратная поддержка. Спрайты в наше время представляют из себя текстуру и (обычно) квад, на который эта текстура “натягивается”. Возможности современного железа позволяют выводить тысячи и даже десятки тысяч спрайтов в кадре и практически все современные 2д-игры используют именно спрайты, а не какие-то инфые технологии для вывода 2д-графических объектов (спрайты частей уровня, спрайты главного героя, спрайты врагов, спрайты вещей/бонусов и т.д.).
Спрайты в движке
Спрайты уже сейчас используются в нашей игре – звёзды, противники, наш корабль – все они рисуются спрайтами. Но мне хотелось бы вынести спрайты в отдельный класс, для того, что бы в будущем было более удобно использовать спрайты и что бы писать меньше кода. Итак, класс спрайта:
class CSprite { // текстура спрайта CTexturePtr m_pTexture; VertPosTc m_v[4]; //вертексы спрайта CRect m_rect; CPoint m_pivot; public: CSprite(const std::wstring& strTexFileName=L"", int x=0, int y=0, int sx=0, int sy=0, int pivotx=0, int pivoty=0); ~CSprite(void); CRect TexRect() const ; CPoint TexPivot() const ; void Draw(D3DXVECTOR2 pos, float size=1.0f) const; }; |
Использование спрайтов
Ренедринг спрайтов теперь стал намного удобнее – мы загружаем (создаём) спрайт, указывая его размеры и положение на текстуре и после этого рисуем его где угодно вызвом m_Sprite.Draw(позиция[, размер_если_надо]);
Помимо спрайтов
Кроме того, я местами заменил циклы, на использование алгоритма for_each – посмотрите, мне кажется, что так код стал значительно компактнее и понятнее. Например, вот так сейчас выглядит апдейт летящих снарядов:
for_each(vecBulletPlayer.begin(), vecBulletPlayer.end(), bind2nd(mem_fun_ref(&CBullet::Update), fDeltaTime)); for_each(vecBulletEnemy.begin(), vecBulletEnemy.end(), bind2nd(mem_fun_ref(&CBullet::Update), fDeltaTime)); |
На этом пока всё. В следующих уроках мы продолжим разговор о спрайтах и использовании спрайтов в игре, а так же, несколько позже, займёмся создание анимированых спрайтов.
Скачать проект с исходным кодом и спрайтами
Раздел: Featured, Уроки · Теги: Создание движка, спрайты
Как всегда интересно, продолжаю следить за созданием игры. Когда можно будет увидеть все этапы (которые уже разобрали и которые только предстоит) разработки?
Спасибо )
Осталось совсем немного. Рассчитываю, что конкретно по этой игре допишу все уроки (штук 7-10 ещё) уже до конца месяца, после чего приступим к следующей.
Очень интересные уроки. Также, хотелось бы уроков по OpenGL.
Андрей, спасибо!
К сожалению, как я уже писал ранее в комментариях к статье “Создание игры. Выстрелы и столкновения.”, я уже достаточно давно не работаю с ОГЛ и вряд ли смогу написать какие-то особо ценные уроки. Однако, я стараюсь все уроки и исходники к ним писать так, что бы минимально привязываться к ДХ, потому, скажем, перевести текущий код игры на ОГЛ особого труда не составит – надо будет поменять вызовы функций ДХ на ОГЛ в движке (а так же заменить вектора и матрицы) и всё будет работать под ОГЛ.
людиии спасайте
такое сообщение при запуске
Unhandled exception at 0x4fdf799b in main.exe: 0xC0000005: Access violation writing location 0xcccccc7c.
вот что в окне autos
texture – LPDIRECT3DTEXTURE9
texture / IDirect3DBaseTexture9 / IDirect3DResource9 / IUnknown
__vfptr CXX0030: Error: expression cannot be evaluated
Попробуйте запустить в дебаге и посмотреть на какой строке (а так же стек вызовов) произошла ошибка. Возможно, Вы просто пытаетесь загрузить данные (текстуру например) из файла, который не существует, либо не может быть загружен (имеет неподходящий формат, скажем).
я всё решил ругалось на device->settexture(0, texture); надо texture инициализировать в конструкторе сделал теперь другая проблема не рисует ничё
ведь если камеру установить в 0 0 -2 и направить 0 0 0
то спрайт в координатах 0 0 -1 должно рисовать отсечение невидимых граней выключено или как то так называется
Спрайты могут отсекаться не только границами экрана, но и ближней/дальней плоскостью камеры. Соответственно, если матрицы вида/проекции не будут настроены правильно, то спрайт будет отсекаться, естественно.
D3DXMatrixPerspectiveFovLH( &projectionMatrix, D3DX_PI/4, 1.0f, 1.0f, 100.0f ); вот установка матрицы проекции
у меня пример не запускается пытался написать сам то же самое(там окно при выполнении проги типа произошла ошибка хотите ль вы отправить сведения в майкрософт вот так
Что пишет в дебаге? Где вылетает?
при запуске ошибка и ассемблеро подобную херню выдаёт
и кстати заметил что в экспресс выдаёт пару ошибок каких то непомню а в профешинал норм правда там предупреждения что типа нафига передаёте int если он принимает float