Читайте также: |
|
// ВКЛЮЧАЕМЫЕ ФАЙЛЫ ////////////////////////////////////////
#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). | | | Мнимое время, прерывания и многозадачность |