Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 11.6. Идеальный газ (GAS.C).
// ВКЛЮЧАЕМЫЕ ФАЙЛЫ //////////////////////////////////////// #include < dos.h> #include < bios.h> #include < stdio.h> #inciude < math.h> #include < conio.h> #include < graph.h> // ОПРЕДЕЛЕНИЯ ///////////////////////////////////////// #define NUM_ATOMS 300 // СТРУКТУРЫ /////////////////////////////////////////////// // структура атома typedef struct ant_typ { int x, y; // позиция атома int xv, yv; // скорость атома } atom, *atom_ptr; // ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ' /////////////////////////////////// unsigned char far *video_buffer = (char far *)0xA0000000L; // указатель на видеобуфер unsigned int far *clock = (unsigned int far *)0x0000046C;. // указатель на внутренний таймер // наши атомы atom atoms[NUM_ATOMS]; // ФУНКЦИИ ///////////////////////////////////////////////// void Timer(int clicks) { // эта функция использует внутренний таймер с частотой 18.2 " тик" /с. // 32-битовое значение этого таймера находится по адресу 0000: 046Ch unsigned int now; // получить текущее время now = *clock; // Ожидаем до истечения указанного периода времени. Заметьте, что // каждый " тик" имеет длительность примерно в 55мс. while(abs(*clock - now) < clicks){} } // конец Timer //////////////////////////////////////////////////////// void Plot_Pixel_Fast(int x, int y, unsigned char color) { // эта функция рисует точку заданного цвета несколько быстрее чем //обычно, за счет применения операции сдвига вместо операции // умножения // используется тот факт, что 320*у = 256*у + 64*у = у< < 8 + у< < 6 video_buffer[((y< < 8) + (у< < 6)} + х] = color; } // конец Plot_Pixel_Fast //////////////////////////////////////////// void Initialize_Atoms (void) { int index; for (index=0; index< NUM_ATOMS; index++) { // выбор случайного положения и траектории для каждого атома //и их фона atoms[index].х = 5 + rand()%300; atoms [index].у = 20 + rand()%160; atoms [index].xv = -5 + rand() %10; atoms[index].yv = -5 + rand()%10; } // конец цикла } // конец Initialize_Atoms //////////////////////////////////////////////// void Erase_Atoms(void) { int index; // обрабатываем в цикле все атомы, стирая их изображения for (index=0; index< NUM_ATOMS; index++) { Plot_Pixel_Fast(atoms[index].x, atoms[index].y, 0); } // конец цикла } // конец Erase_Atoms //////////////////////////////////////////////////////////// void Move_Atoms(void) { int index; // обрабатываем в цикле все атомы, перемещая каждый атом. // Также проверяем столкновение атомов со стенками контейнера. for (index=0; index< NUM_ATOMS; index++) { // переместить атомы atoms[index].x+=atoms[index].xv; atoms[index].y+=atoms[index].yv; // если атом столкнулся со стенкой, меняем знак скорости // на противоположный if (atoms[index].х > 310 11 atoms[index].x < 10) { atoms[index].xv =-atoms[index].xv; atoms [index].x+=atoms [index].xv; } // конец оператора if if (atoms[index].у > 190 11 atoms[index].у < 30) ( atoms[index].yv=-atoms[index].yv; atoms[index].y+=atoms[index].yv; } // конец оператора if } // конец цикла } // конец Move_Atoms //////////////////////////////////////// void Draw_Atoms(void) { int index; // рисуем все атомы в цикле for (index=0; index< NUM_ATOMS; index++) { Plot_Pixel_Fast (atoms[index].x, atoms [index].y, 10); } // конец цикла } // конец Draw_Atoms // ОСНОВНАЯ ПРОГРАММА ////////////////////////////////////// void main(void) { // устанавливаем режим 320х200х256 _setvideomode(_MRES256COLOR); _settextposition[2, 0); printf(" Hit any key to exit."); // рисуем контейнер _setcolor(9); _rectangle(_GBORDER, 0, 16, 319, 199); // инициализируем атомы Initialize_Atoms(); while(! kbhit()) { // стираем все атомы Erase_Atoms (); // перемещаем все атомы Move_Atoms(); // теперь рисуем атомы Draw_Atoms(); // немного подождем Timer(1); } // конец while // восстанавливаем исходный видеорежим _setvideoroode(_DEFAULTMODE); }// конец функции main Все, физики с меня достаточно! Я думаю, что идея вам понятна: когда вы хотите что-то смоделировать, посидите и разберитесь с несколькими правилами или уравнениями, описывающими этот процесс. После того как вам все станет ясно, найдите самый простой путь воссоздания этого процесса в вашей игре. ИТОГ В этой главе был представлен потрясающий курс, посвященный идеям и способам представления мира игры и действиям в нем. Среди прочего мы узнали: § Об объектно-пространственном и модульном методах представления мира игр; § О демонстрационных режимах; § О моделировании физических явлений. Главная идея, которую вы должны были понять, одолев эту главу, такова: здесь не изложены догмы, а просто рассмотрены возможные варианты осуществления тех или иных вещей. Если вы знаете метод лучше - используйте его. Мы заложили фундамент, а все остальное в ваших руках.
|