Стэн Трухильо - Графика для Windows средствами DirectDraw

Тут можно читать онлайн Стэн Трухильо - Графика для Windows средствами DirectDraw - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Графика для Windows средствами DirectDraw
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    4.88/5. Голосов: 81
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 100
    • 1
    • 2
    • 3
    • 4
    • 5

Стэн Трухильо - Графика для Windows средствами DirectDraw краткое содержание

Графика для Windows средствами DirectDraw - описание и краткое содержание, автор Стэн Трухильо, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Графика для Windows средствами DirectDraw - читать онлайн бесплатно полную версию (весь текст целиком)

Графика для Windows средствами DirectDraw - читать книгу онлайн бесплатно, автор Стэн Трухильо
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Рассмотрим столкновение, в котором участвуют два спрайта. Наш код должен обнаруживать столкновение и сообщать об этом спрайтам. Предположим, один из спрайтов получает уведомление, немедленно вычисляет новую траекторию и изменяет свое положение. Когда сообщение о столкновении дойдет до второго спрайта, столкнувшийся с ним спрайт уже будет находиться в новом месте. Более того, перемещение первого спрайта может привести к тому, что для второго спрайта предыдущего столкновения как бы и не будет.

Чтобы избежать подобных неприятностей, необходимо соблюдать два правила:

1. Положение спрайтов не должно изменяться до завершения цикла проверок.

2. Каждый спрайт должен хранить информацию о положении спрайта, с которым он столкнулся, вместо того, чтобы обращаться к нему с запросом при обработке столкновения.

Класс Spriteэти правила соблюдает и, следовательно, справляется со всеми проблемами. Для этого обработка каждого столкновения осуществляется за две стадии, которые мы назовем подтверждением (acknowledgment) и реакцией (reaction). На стадии подтверждения спрайт всего лишь сохраняет статус и положение другого спрайта — его собственное положение и статус остаются неизменными. Затем, на стадии реакции, по ранее сохраненным данным определяются дальнейшие действия, вызванные столкновением. На этой стадии положение и статус спрайта могут изменяться. Функция Hit()класса Spriteиспользуется для подтверждения, а функция Update() — для реакции. Класс Spriteопределяется так:

class Sprite {

public:

Sprite(LPDIRECTDRAWSURFACE, int x, int y);

LPDIRECTDRAWSURFACE GetSurf() {

return surf;

}

operator LPDIRECTDRAWSURFACE() const {

return surf;

}

int GetX() {

return x;

}

int GetY() {

return y;

}

int GetCenterX() {

return x+w/2;

}

int GetCenterY() {

return y+h/2;

}

void SetXY(int xx, int yy) {

x=xx;

y=yy;

}

void SetXYrel(int xx,int yy) {

x+=xx;

y+=yy;

}

CRect GetRect();

virtual void Update();

void Hit(Sprite*);

void CalcVector();

private:

LPDIRECTDRAWSURFACE surf;

int x, y;

int w, h;

int xinc, yinc;

BOOL collide;

struct CollideInfo {

int x, y;

} collideinfo;

};

Конструктор класса Spriteполучает три аргумента: указатель на поверхность DirectDraw, изображающую новый спрайт, и два целых числа, определяющих начальное положение спрайта. Так как конструктору передается поверхность DirectDraw, одна и та же поверхность может использоваться для нескольких спрайтов. Конструктор можно было бы написать так, чтобы в качестве аргумента он получал имя BMP-файла и сам создавал поверхность, но тогда каждый спрайт был бы связан с отдельной поверхностью — даже если для создания нескольких спрайтов используется один и тот же BMP-файл.

Две следующие функции делают одно и то же, но имеют разный синтаксис. Функция GetSurf()и оператор-функция operator LPDIRCETDRAWSURFACE()возвращают указатель на поверхность DirectDraw, которая используется данным спрайтом. Мы уже видели, как GetSurf()используется функцией SpritesCollidePixel(). Перегруженный оператор LPDIRECTDRAWSURFACE()создан для удобства, благодаря ему объекты Spriteможно использовать вместо указателей на поверхности DirectDraw. Как вы увидите позднее, этот перегруженный оператор используется в программе Bumper.

Функции GetX(), GetY(), GetCenterX(), GetCenterY(), SetXY(), SetXYRel()и GetRect()предназначены для работы с положением спрайта. Мы уже видели, как функция GetRect()применяется на практике. В программе Bumper функции GetCenterX()и GetCenterY()используются для определения центральной точки спрайта, по которой определяется новое направление движения после столкновения.

Функция CalcVector()вычисляет вектор направления движения спрайта. Это направление выбирается случайным образом, и его в любой момент можно пересчитать заново.

Две последние функции, Hit()и Update(), уже упоминались выше. Они обеспечивают подтверждение и реакцию на столкновения.

В закрытой ( private) секции объявляются переменные класса Sprite. Первая из них, surf, — указатель на интерфейс DirectDrawSurface, используемый для работы с поверхностью данного объекта Sprite. В переменных x, y, wи hхранятся положение и размеры поверхности. Переменные xincи yincслужат для анимации спрайта. Как вы вскоре увидите, они инициализируются случайными величинами. Эти две переменные определяют направление, в котором движется спрайт.

В самом конце объявляются переменные collideи collideinfo. При обнаружении столкновения логической переменной collideприсваивается значение TRUE, во всех остальных случаях она равна FALSE. Структура collideinfoсодержит информацию о происшедшем столкновении. В данном случае нас интересует лишь положение второго спрайта, участвующего в столкновении.

Сейчас мы подробно рассмотрим все функции класса Sprite. Конструктор класса выглядит так:

Sprite::Sprite(LPDIRECTDRAWSURFACE s, int xx, int yy) {

DDSURFACEDESC desc;

ZeroMemory(&desc, sizeof(desc));

desc.dwSize=sizeof(desc);

desc.dwFlags=DDSD_WIDTH | DDSD_HEIGHT;

s->GetSurfaceDesc(&desc);

surf=s;

x=xx;

y=yy;

w=desc.dwWidth;

h=desc.dwHeight;

collide=FALSE;

CalcVector();

}

Конструктор получает в качестве аргументов указатель на поверхность DirectDraw и исходное положение спрайта. Сохранить эти значения в переменных класса нетрудно, однако мы еще должны инициализировать переменные ширины и высоты ( wи h). Для этого необходимо запросить у поверхности DirectDraw ее размеры. С помощью структуры DDSURFACEDESCи функции GetSurfaceDesc()мы узнаем размеры и присваиваем нужные значения переменным. Переменной collideприсваивается значение FALSE(потому что столкновение еще не было обнаружено). Наконец, мы вызываем функцию CalcVector(), которая определяется так:

void Sprite::CalcVector() {

xinc=(rand()%7)-3;

yinc=(rand()%7)-3;

}

Функция CalcVector()инициализирует переменные xincи yincс помощью генератора случайных чисел rand(). Полученное от rand()значение преобразуется так, чтобы оно принадлежало интервалу от –3 до 3. Эти значения будут использоваться для перемещения спрайта при очередном обновлении экрана. Обратите внимание — одна или обе переменные вполне могут быть равны нулю. Если нулю равна только одна переменная, перемещение спрайта ограничивается осью X или Y. Если нулю равны обе переменные, спрайт вообще не двигается.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Стэн Трухильо читать все книги автора по порядку

Стэн Трухильо - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Графика для Windows средствами DirectDraw отзывы


Отзывы читателей о книге Графика для Windows средствами DirectDraw, автор: Стэн Трухильо. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x