Студопедия

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

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

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






Листинг 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

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

ИТОГ

В этой главе был представлен потрясающий курс, посвященный идеям и способам представления мира игры и действиям в нем. Среди прочего мы узнали:

§ Об объектно-пространственном и модульном методах представления мира игр;

§ О демонстрационных режимах;

§ О моделировании физических явлений.

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


 






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