Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг 7.8. Пример прокрутки (DEFEND.C).






// ВКЛЮЧАЕМЫЕ ФАЙЛЫ ////////////////////////////////////////

#include < stdio.h>

#include < math.h>

#include < graph.h>

#inciude < malloc.h>

#include < memory.h>

#include < string.h>

// ОПРЕДЕЛЕНИЯ ///////////////////////////////////////////

#define SCREEN_WIDTH (unsigned int)320

#define SCREEN_HEIGHT (unsigned int)200

// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ ////////////////////////////////////////

unsigned char far *video_buffer = (char far *)0xA0000000L; //указатель на видеобуфер

unsigned char far *double_buffer = NULL;

// ФУНКЦИИ /////////////////////////////////////////////////

void Show_View_Port(char far *buffer, int pos)

{

// Копирование части дублирующего буфера на экран

unsigned int y, double_off, screen_off;

// нужно переместить 100 строк, перемещаем их построчно

for (y=0; у< 100; у++) {

// расчет начального смещения дублирующего буфера

//у * 640 +pos

double_off = ((у< < 9) + (у< < 7) + роs);

// расчет начального смещения в видеобуфере

// у * 320 + 80

screen_off = (((у+50)< < 8) + ((у+50)< < 6) + 80);

// перемещение данных

_fmemmove ((char far *)& video_buffer[screen off],

(char far *)& double_buffer[double_off], 160);

} // конец цикла for

} // конец Show View_Port ////////////////////////////////////////////////////////////////

void Plot_Pixel_Fast_D2(int x, int y, unsigned char color)

{

// прорисовка пикселей в дублирующем буфере нашего виртуального

// экрана размером 640х100 пикселей

// учтем, что 640*у = 512*у + 128*у = у< < 9 + у< < 7

double_buffer[ ((у< < 9) + (у< < 7)) + х] = color;

} // конец Plot_Pixel_Fast_D2 ////////////////////////////////////////////////////////////

void Draw_Terrain(void) {

// эта функция рисует ландшафт в дублирующем буфере

// размером 640х100 пикселей

int х, у=70, index;

// очистка памяти

_fmemset(double_buffer, 0, (unsigned int}640*(unsigned int)100);

// рисуем звезды

for (index=0; index< 200; index++)

{

Plot_Pixel_Fast_D2(rand()%640, rand()%70, 15);

} // конец цикла for

//рисуем горы

for (x=0; x< 640; х++)

{

// расчет смещения

y+=-1 + rand()%3;

// проверяем, находятся ли горы в приемлемых границах

if (y> 90) у=90;

else

if (y< 40) у=40;

// рисуем точку в дублирующем буфере

Plot_Pixel_Fast_D2 (x, y, 10);

} // конец цикла for } // конец Draw_Terrain

// ОСНОВНАЯ ПРОГРАММА //////////////////////////////////////

void main(void)

{

int done=0, sx=0;

// установка видеорежима 320х256х256

_setvideomode(_MRES256COLOR);

_settextposition(0, 0);

printf(" Use < > to move. Press Q to quit.");

// рисуем небольшое окно

_setcolor(l);

_rectangle(_GBORDER, 80-1, 50-1, 240+1, 150+1);

// резервируем память под дублирующий буфер

double_buffer=(char far *)_fmalloc(SCREEN_WIDTH*SCREEN_HEIGHT+1);

Draw_Terrain();

Show_View_Port(double_buffer, sx);

// главный цикл

while (! done)

{// не Нажал ли игрок клавишу?

if (kbhit())

switch(getch())

{

case ', ': // переместить окно влево, если это возможное

{

sх-=2;

if (sx< 0)

sx=0;

} break;

case '.': // переместить окно вправо если это возможно

{

sx+=2;

if (sx > 640-160)

sx=640-160;

} break;

case 'q': // игроку надоело?

{

done=1; } break;

} // конец оператора switch

// копируем окно просмотра на экран

Show_View_Port(double_buffer, sx);

_settextposition(24, 0);

printf(" Viewport position = %d ", sx);

} // конец оператора if

} // конец оператора while

// восстановление видеорежима

_setvideomode(_DEFAULTMODE);

}// конец функции main

Если вы похожи на меня, то, вероятно, захотите написать игру типа Defender. Отлично! Отложите книгу — и вперед. Не беспокойтесь, я подожду. По крайней мере, попытайтесь в своей программе заставить джойстик управлять полетом корабля.

О, вы уже вернулись? Тогда поговорим о тех специальных потрясающих эффектах, без которых ни одна игра никогда не завоюет популярности.

Специальные эффекты

Под специальными эффектами обычно понимают такие зрительные эффекты, которые, выходят за рамки обычного и хорошо запоминаются. Современные компьютерные игры все больше и больше походят на настоящее кино и имеют весьма впечатляющую графику. Однако всегда можно найти что-то еще, что заставит игрока удивится. Поэтому попытаемся добиться от него возгласа:

" Ого!!! "

Специальные эффекты могут быть какими угодно, начиная от ярких взрывов и кончая сверхъестественными явлениями, психоделической графикой и всем-чем-хотите. Например, сейчас я работаю над компьютерной моделью системы частиц для того, чтобы монстр разлетался на биллионы маленьких атомов, несущихся каждый по своей орбите. Это должно выглядеть отлично! Я не уверен, что я сделаю это, но если мне это удастся, то это будет сводить с ума!

Специальные эффекты — это та область, в которой вы должны полностью Проявить себя, потому что это самая творческая часть любой компьютерной игры. Запомните одну вещь: в любой игре должен быть по-крайней мере один потрясающий воображение эффект, такой эффект, который игрок не скоро забудет! Итак, к делу, тем более что в этом разделе мы поговорим и о других важных вещах.

Фоновая мультипликация

Мы просто не можем пройти мимо фоновой мультипликации. Компьютерные Игры в плане эффектов обошли своих предшественников — игры с фишками. Добавление небольших мультиков и эффектов, которые впрямую не связаны с Действиями в игре делает компьютерные игры забавнее и оригинальнее.

Хороший пример этому — оформление в игре Karate. Летающие птички, время от времени садящиеся на вершину действующего вулкана, — это как раз то, что надо. Для игры, созданием которой мы займемся в конце этой книги, я Придумал светлячков, которые просто мигают то тут, то там. Они не служат для Какой-то определенной цели, а просто делают мир игры немного более реалистичным и полным.

Эти небольшие, длящиеся не более минуты эпизоды вы должны добавить Уже после того, как игра сделана. Всегда пытайтесь добавить в оформление игры Немного небольших мультфильмов и зрительных эффектов — это придаст вашей игре своеобразие.


Экранные эффекты

Компьютерные игры становятся все больше и больше похожими на кинофильмы. В титрах количество программистов и инженеров совсем невелико. Их заменили режиссеры и продюсеры. И вообще все выглядит так, как будто это не дисплей компьютера, а кино- или телеэкран. В кино и по телевизору мы видим изображения смикшированные и растушеванные, кроме того, там применяются и другие эффекты (например, изменяется план или фокус съемки). В компьютерных играх также используют разнообразные экранные эффекты. Например, прохождение вами очередного уровня игры может отмечаться такими эффектами, как гаснущий или тающий экран (или еще что-нибудь эдакое)!

Смена экранов влияет на впечатление от игры. Экран, на котором просто меняется фон эпизодов, быстро надоедает. Я бы предпочел, например, чтобы новая картинка появлялась из-под разлетающихся осколков старого изображения или что-нибудь еще более замысловатое.

Программировать эффектные способы смены экрана на самом деле достаточно просто. Большинство из алгоритмов требует всего нескольких строк кода, а самые сложные из них не более дюжины строк. Это еще одна область, в которой вы должны будете проявить все свои таланты, чтобы добиться действительно стоящих результатов. Для примера я объединил три различных варианта исчезновения содержимого экрана в программу SCREENFX.C. Текст этой программы приведен в Листинге 7.9. Она использует функции работы с изображениями в формате PCX (созданные в пятой главе, «Секреты VGA-карт») и некоторые функции из библиотеки GRAPH0.C.

Программа SCREENFX.C демонстрирует три эффекта:

§ Гаснущее изображение;

§ Исчезновение изображения по точкам;

§ Оплывание изображения.

Попытаемся кратко разобраться в механизмах каждого из них, чтобы понять основные идеи экранных эффектов вообще.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.