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

Листинг 11.6. Идеальный газ (GAS.C).

Функция № 18: Адрес флага ожидания и адрес «семафора» DIGPAK | Функция № 21: Установка режима обратной записи DMA | Функция № 25: SetDPMIMode | Функция № 18: PollMidPak | Функция № 23: ReportSequenceNumber | АЛГОРИТМЫ, СТРУКТУРЫ ДАННЫХ И МЕТОДОЛОГИЯ ВИДЕОИГР | Алгоритм 11.1. Контроль столкновений с помощью описанных прямоугольников. | Листинг 11.2. Структура данных игрока. | Листинг 11.3. Функции полета мухи. | Листинг 11.4. Муравейник (ANTS.С). |


Читайте также:
  1. А. Идеальный газ.
  2. Идеальный (совершенный) поршневой компрессор
  3. Идеальный газ. Давление газа. Основное уравнение МКТ.
  4. Идеальный газ. Смеси газов
  5. Идеальный для строительства блок
  6. ИДЕАЛЬНЫЙ ПРЕЗИДЕНТ ГЛАЗАМИ МОЛОДОГО ПОКОЛЕНИЯ
  7. Идеальный руководитель

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

#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

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

ИТОГ

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

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

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

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

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


 


Дата добавления: 2015-07-12; просмотров: 107 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Листинг 11.5. Падение мяча (BALL.C).| Мнимое время, прерывания и многозадачность

mybiblioteka.su - 2015-2024 год. (0.009 сек.)