Дайте Изменение различных цветов в форме

Я работал над игрой о семейной вражде, и я хотел случайным образом применить изменение цвета к группе кругов.

я пытался использовать цикл for в данном коде, но я знаю, что это неправильно. как рандомизировать?

    //looping set1

for(x=0;x<=15;x++)
{
    setcolor(x);
    sleep(3000);
}
setfillstyle(1,1);
fillpoly(13,lyt1);
fillpoly(9,lyt2);
fillpoly(9,lyt3);
fillpoly(12,lyt4);

//looping set2

for(x=0;x<=15;x++);
{
    setcolor(x);
    sleep(3000);
}
setfillstyle(1,1);
fillpoly(11,lyt5);
fillpoly(12,lyt6);
fillpoly(13,lyt7);
fillpoly(12,lyt8);

person Mirisu    schedule 06.01.2017    source источник


Ответы (1)


Я предполагаю, что вы находитесь в MS-DOS (не уверен, что это эмулированная или реальная версия или просто консоль Windows), но анимация и рандомизация выполняются немного по-другому.

Из-за различных ограничений (поэтому он работает на каждой платформе и не использует никаких дополнительных функций) структура программы вашего основного цикла должна выглядеть примерно так:

// main loop
const int dt=40; // [ms] approximate loop iteration time
int col_t=0,col_T=3000; // [ms] time and period for changing the colors
int col;
randomize();
col=random(16);
for (;;)
 {
 // 1. handle keyboard,mouse,joystick... here
 //    do not forget to break; if exit button is hit like: if (Key==27) break;

 // 2. update (world objects positions, score, game logic,etc)
 col_t+=dt;
 if (col_t>=col_T)
  {
  col_t=0; 
  col=random(16);
  }

 // 3. draw you scene here
 setcolor(col);

 // 4. CPU usage and fps limiter
 sleep(dt); // 40ms -> 25fps
 }

Эта структура не требует прерываний, поэтому ее легко понять новичкам. Но играм обычно требуется больше скорости, а обработчики событий работают быстрее. Для этого вам нужно будет использовать прерывания ISR для таких вещей, как клавиатура, PIT,...

Использование sleep() не является точным, поэтому, если вам нужно точное измерение времени, вы должны использовать либо PIT, либо RDTSC, но это может привести к несовместимости в эмулируемых средах...

Давно не писал код в MS-DOS, поэтому я не уверен, в какой библиотеке находятся подпрограммы random и randomize, они также могут называться Random,Randomize, держу пари, что они находятся в stdio.h или conio.h. Просто введите random в программу, поместите на нее курсор и нажмите ALT+F1, чтобы вызвать контекстную справку. Там вы прочтете, какую библиотеку включить. Также я не уверен, использовать ли random(15) или random(16), так что читайте, что там тоже правильно.

Если вы программируете игру, вам, вероятно, понадобятся некоторые меню. Либо включите их в основной цикл, либо создайте отдельный основной цикл для каждой игровой страницы и используйте goto, либо кодируйте каждую как отдельную функцию.

Взгляните на несколько моих связанных QA:

И документ setcolor

person Spektre    schedule 06.01.2017
comment
@Mirisu Я только что добавил ссылку на QA, на которую я только что ответил, связанную с PIT ISR. Это может вас заинтересовать ... - person Spektre; 23.04.2019