Почему, вот:
//============= 'game' это, собственно, сама игра ==================
void SUPERMARIO::Game()
{
InitForStartGame(0);
//music(NORMAL_MUSIC);
while (GAMECYCLE) //цикл игры
{
//I. построение изображения
MOVEOBJ::TotalAnimatedObject=0;
prMonetsChangePhase();
prPuziri();
prBuildGamePicture();
prShowDebugInfo();
//II. логика игры
BirdsOtSten(); //птички отталкиваются от стен
SkeletonCollect(); //собираем скелетов
prCleverobjRefresh(); //обновляем все у умных объектов
prMarioDeathOnShipah(); //марио гасится на шипах
prForMarioProtected(); //чтобы марио был защищенным
prPrizeCatch(Rick, Prize);//призы не проходят сквозь стенки и марио ловит призы
prBricksNudgePrize(); //кирпичи могут подталкивать призы
prBricksRestore(); //восстанавливаем кирпичи
prTurtleCikAlien(); //черепаха сбивает других чужих
prMonetsTimeEndTimeLiveAndScoreCreate();//надо создать очки когда монетка пропадает
prIfGameOver(); //если конец игры
prBossSalivaDeathMario();// кегли башки гасят марио и не пролетают через стены
prBossSendSaliveAndKeepAtMario();//башка пускает "кегли" и находится вблизи от марио
ArmsKillAlien(); // оружие убивает чужих
prLiftUpDown(); //меняем направление лифта и обновляем его координаты
prMarioDeathOnFlower();//марио гасится на зубастых цветках
prFlowersUpDown(); //поднимаем и опускаем зубастые цветки
MindobjFunctions(Rick, Cleverobj);//различные функции
MindobjFunctions(Rick, CleverAlien);//предусмотренные для Mindobj
prMarioFlyDownCleverobj(); //марио слетает с клевых объектов
prMarioPositionerOnCleverobject();//позиционируем Mario на клевый объект
prMarioRenewXY();//обновляем координаты Mario
//если ноги марио близко к лифту, марио падает
prMarioClammyToLift(); //на лифт и его ускорение приравнять к нулю
prMarioDownsBrickDestroy();//обрушиваем кирпичи под ногами у марио
prArmsCollisionWithWall();//оружие сталкивается со стенами *
prRememberOldMarioCoordinates();//запоминаем старые координаты Mario
prKeyboardProcess(); //обработка НАЖАТИЙ клавиш
GameModesTreat(); //обрабатываем ситуацию загрузки и рестарта уровня режимы игры
if (DoorOpenCounter) DoorOpenCounter--; //чтобы дверь успела открыться
prScrollBricks(); //двигается фон (спрайты воды и огня)
prChangeEffect(); //эффект перехода на другой экран
prShowFPS(); //показать FPS
prSynhronization(); //синхронизируемся (ждем когда таймер станет равным 1)
ShowLevelNumberTimeCounter++;
if (ShowLevelNumberTimeCounter<100)
{
Msg(" МИР ", 34,MSG_NOUPDATE);
if (LevelNumber<40)
{
scr.putNumb(LevelNumber/4+1,1);
scr<< '-';
scr.putNumb(LevelNumber%4+1,1);
}
else
{
scr.putNumb(LevelNumber);
}
}
static int ShowLog=0;
//выводим изображение на экран из DoubleBuffer
if (Keyb[KEY_L] && Keyb[KEY_LEFTCTRL])
{
Keyb^KEY_L;
ShowLog^=1;
}
if (ShowLog)
{
//сжимаем картинку
for(int i=0; i<100; i++)
{
memcpy(scr.DoubleBuffer+i*320, scr.DoubleBuffer+i*2*320,320);
}
scr.rectangle(0,100,320,100,0);
Log.Show();
}
scr.update();
} //конец цикла while
}//конец функции game
//функция main() пустая
//хинт: программа рантьше стартовала из конструктора класса SUPERMARIO (это под DOS)
// в данной версии стартует по другому (создается поток и из него уже)
void main()
{
}
void SUPERMARIO::DrawMenu()
{
Sound.InitDirectSound();
//режим чтения - двоичный (это важно!!!)
//иначе файл может не дочитываться до конца, если встретится служебный
//символ конца файла (код не помню)
//не знаю насколько это актуально для версии под Windows
//для DOS'a очень важно и актуально
_fmode=O_BINARY;
SPRITE spr(&scr,1);
SPRITE::IMAGE im;
im.ID=2;
im.Attribute=0;
spr.LoadSpriteform("graph\\zast.sp0",im);
im=spr.GetImage(2);
// spr.Show( (320-im.Len)/2,(200-im.Hei)/2,2);
scr.update();
LoadSprites(); //загружаем спрайты
LoadSounds(); //звуки
LoadMusic(); //музыку
scr.LoadPaletteFromFile("graph\\palette.dat");
//назначаем по умолчанию клавиши для игроков
//первый игрок
player[0].Left = KEY_LEFT;
player[0].Right = KEY_RIGHT;
player[0].Up = KEY_UP;
player[0].Down = KEY_DOWN;
player[0].Fire = KEY_SPACE;
player[0].Run = KEY_LEFTCTRL;
//второй игрок
player[1].Left = KEY_Z;
player[1].Right = KEY_C;
player[1].Up = KEY_S;
player[1].Down = KEY_X;
player[1].Fire = KEY_A;
player[1].Run = KEY_LEFTSHIFT;
//третий игрок
player[2].Left = KEY_PAD4;
player[2].Right = KEY_PAD6;
player[2].Up = KEY_PAD8;
player[2].Down = KEY_PAD5;
player[2].Fire = KEY_PAD0;
player[2].Run = KEY_PAD7;
//вычисляем скорость компьютера
/*
{
FunctionSpeed();
return;
}
*/
scr.clear();
//прерываем проигрывание музыки
//MidiStop();
Sound.play(SND_ZASTAVKA);
//обработка того, что возвратило меню
while (1)
{
if (GAMEEXIT==TRUE) return;
int menu_index=MenuMain();
//ONE PLAYER
if (menu_index==1)
{
PlayerCounter=1; //один игрок
/*for(int i=0; i<127; i++)
{
//scr.wait();
scr.DecrementPalette();
scr.DecrementPalette();
while (Timer.Counter==0) Sleep(1);
Timer.Counter=0;
}*/
scr.clear();
scr.update();
//scr.LoadPaletteFromFile("graph\\palette.dat");
Game();
Sound.play(SND_ZASTAVKA);
continue;
}
//TWO PLAYER
if (menu_index==2)
{
PlayerCounter=2; //два игрока
Game();
Sound.play(SND_ZASTAVKA);
continue;
}
//THREE PLAYER
if (menu_index==3)
{
PlayerCounter=3; //два игрока
Game();
Sound.play(SND_ZASTAVKA);
continue;
}
//CONFIGURATION
if (menu_index==4)
{
/*scr.clear();
scr.update();
char pass[]={ KEY_7, KEY_2,KEY_1,KEY_5,0 };
int wrong=0;
scr << cur(13,9);
scr << "ВВЕДИТЕ ПАРОЛЬ";
scr << cur(16, 12);
scr.rectangle(15*8,11*8,9*8,3*8,9);
scr.update();
for(UINT i=0;i