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

Создание игр » Featured, Уроки » Создание игры. Спрайты.

Создание игры. Спрайты.

Спрайты из DOOM IIСпрайты повсеместно используются в играх, особенно в 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));

На этом пока всё. В следующих уроках мы продолжим разговор о спрайтах и использовании спрайтов в игре, а так же, несколько позже, займёмся создание анимированых спрайтов.

Скачать проект с исходным кодом и спрайтами

»crosslinked«

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




Раздел: Featured, Уроки · Теги: Создание движка, спрайты

13 комментариев на "Создание игры. Спрайты."
  1. Scripter пишет:

    Как всегда интересно, продолжаю следить за созданием игры. Когда можно будет увидеть все этапы (которые уже разобрали и которые только предстоит) разработки?

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

    Спасибо )
    Осталось совсем немного. Рассчитываю, что конкретно по этой игре допишу все уроки (штук 7-10 ещё) уже до конца месяца, после чего приступим к следующей.

  3. Андрей пишет:

    Очень интересные уроки. Также, хотелось бы уроков по OpenGL.

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

    Андрей, спасибо!
    К сожалению, как я уже писал ранее в комментариях к статье “Создание игры. Выстрелы и столкновения.”, я уже достаточно давно не работаю с ОГЛ и вряд ли смогу написать какие-то особо ценные уроки. Однако, я стараюсь все уроки и исходники к ним писать так, что бы минимально привязываться к ДХ, потому, скажем, перевести текущий код игры на ОГЛ особого труда не составит – надо будет поменять вызовы функций ДХ на ОГЛ в движке (а так же заменить вектора и матрицы) и всё будет работать под ОГЛ.

  5. unnamed пишет:

    людиии спасайте

    такое сообщение при запуске

    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

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

      Попробуйте запустить в дебаге и посмотреть на какой строке (а так же стек вызовов) произошла ошибка. Возможно, Вы просто пытаетесь загрузить данные (текстуру например) из файла, который не существует, либо не может быть загружен (имеет неподходящий формат, скажем).

  6. unnamed пишет:

    я всё решил ругалось на device->settexture(0, texture); надо texture инициализировать в конструкторе сделал теперь другая проблема не рисует ничё

    ведь если камеру установить в 0 0 -2 и направить 0 0 0

    то спрайт в координатах 0 0 -1 должно рисовать отсечение невидимых граней выключено или как то так называется

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

      Спрайты могут отсекаться не только границами экрана, но и ближней/дальней плоскостью камеры. Соответственно, если матрицы вида/проекции не будут настроены правильно, то спрайт будет отсекаться, естественно.

  7. unnamed пишет:

    D3DXMatrixPerspectiveFovLH( &projectionMatrix, D3DX_PI/4, 1.0f, 1.0f, 100.0f ); вот установка матрицы проекции

  8. я пишет:

    у меня пример не запускается пытался написать сам то же самое(там окно при выполнении проги типа произошла ошибка хотите ль вы отправить сведения в майкрософт вот так

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

      Что пишет в дебаге? Где вылетает?

      1. я пишет:

        при запуске ошибка и ассемблеро подобную херню выдаёт

  9. я пишет:

    и кстати заметил что в экспресс выдаёт пару ошибок каких то непомню а в профешинал норм правда там предупреждения что типа нафига передаёте int если он принимает float

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

*

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