- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
Структура для хранения данных:
typedef struct rs_script_t {
int status; // on/off
int next_stage;
int next_time;
} rs_script_t;
Макросы:
#define SEQ(scr1,t) \
const int scr_zero = __COUNTER__; \
rs_script_t *scr = scr1; \
if ( (scr->status) && (t > scr->next_time) ) { \
switch(scr->next_stage) { \
#define END_SEQ } };
#define SEQ_FIRST \
case 0: \
scr->next_stage = scr_zero;
#define SEQ_DT(dt) \
scr->next_stage = __COUNTER__ + 1; \
scr->next_time += dt; \
break; \
case __COUNTER__: \
#define SEQ_DT_TAGGED(dt,tag) \
scr->next_stage = __COUNTER__ + 1; \
scr->next_time += dt; \
break; \
case __COUNTER__: \
case (100000+tag): \
#define SEQ_LAST_DEFAULT \
scr->status = 0; \
break; \
\
default: \
DEBUG10f(":: ERROR, unknown stage position: %d \n", scr->next_stage); \
break;
#define SEQ_GOTO(dt,tag) \
scr->next_stage = 100000+tag; \
scr->next_time += dt; \
break;
#define SEQ_GOTO_INSTANT(tag) \
scr->next_stage = 100000+tag; \
break;
Пользоваться примерно так:
void process() { // вызывать каждый кадр
SEQ(&scrtest, rs_app.app_time)
SEQ_FIRST
printf("Ноль\n");
SEQ_DT(1000)
printf("Один\n");
SEQ_DT(1000)
printf("Два\n");
SEQ_DT_TAGGED(1000, 555)
printf("Три (метка №555) \n");
SEQ_DT(1000)
printf("Четыре\n");
SEQ_DT(1000)
printf("Пять\n");
SEQ_DT(1000)
printf("Шесть, повторяем с метки №555, если нажат Шифт\n");
if (rs_keyboard_is_key_down(RS_KEY_SHIFT_L)) {
SEQ_GOTO(1000, 555);
};
printf("Завершаем. \n");
SEQ_LAST_DEFAULT
END_SEQ;
};
kipar 23.12.2013 10:34 # +3
---
Собственно да, посмотрел исходник, они также сделаны - либо на switch, либо на gcc-изме "labels as values".
someone 23.12.2013 10:51 # +4
LispGovno 19.01.2014 17:38 # +2
Во время коммунизма, значит прислали в одно далекое сибирское рабочее поселение бензопилу "дружба".
Берут значит, хмурые сибирские сишники, и подсовывают пиле тоненький прутик.
- Бзык! - сказала пила, и перепилила прутик.
- Хмм! - сказали хмурые сибирские сишники и подсунули прутик потолще.
- Бжжзык! - сказала пила, и перепилила прутик потолще.
- Хмм! - сказали хмурые сибирские сишники и подсунули целое бревно.
- Бзззззз! - сказала пила, и перепилила бревно.
- Хмм! - сказали хмурые сибирские сишники и подсунули толстый стальной прут.
- Бзззззз---жжж--хряк! - сказала пила, и поломалась.
- То-то! - сказали хмурые сибирские сишники.
Stertor 19.01.2014 23:15 # +2
Монашка-настоятельница женского монастыря собрала монашек и упавшим голосом объявила: Мы прогневали господа, вчера наш монастырь посетил мужской дух!..
(Все монашки хором)
-О господи, за что ты посылаешь нам такие испытания!
(Один голос)
-Ахахах!...
Монашка продолжает:
-Вчера в саду я обнаружила использованный презерватив!
(Все монашки хором)
-О господи, за что ты посылаешь нам такие испытания!
(Один голос)
-Ахахах!...
-Но есть и хорошая новость: в презервативе обнаружена дырка!
(Все монашки хором)
-Ахахах!!!
(Один голос)
--О господи, за что ты посылаешь мне такие испытания!..
KoBudHbIu_nemyx 25.08.2021 17:56 # 0