- 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;
};