Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 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 демонстрирует три эффекта: § Гаснущее изображение; § Исчезновение изображения по точкам; § Оплывание изображения. Попытаемся кратко разобраться в механизмах каждого из них, чтобы понять основные идеи экранных эффектов вообще.
|