/
main.c
97 lines (82 loc) · 2.07 KB
/
main.c
1
2
3
4
5
6
7
8
9
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
89
90
91
92
93
94
95
96
97
#include <types.h>
#include <stdint.h>
#include <spr0.h>
#include <im2.h>
#include "ball1.h"
#include "ball2.h"
#include "ball3.h"
#include "letak.h"
#include "moln.h"
enum {
sprPhases=4,
sprites=5
};
// Структура положения спрайта
typedef struct {
uint8_t x; // координаты
uint8_t y;
int8_t phase; // текущая фаза (0..3)
Sprite0** phases; // Все фазы спрайта
int8_t sx; // шаг по X
int8_t sy; // шаг по Y
}sprMovie;
// Описания движения всех спрайтов
sprMovie sprMovies[sprites] = {
{0,0,0,ball1,1,1},
{4,4,0,ball2,0,1},
{4,4,0,ball3,2,0},
{8,8,0,letak,1,1},
{12,12,0,moln,1,0},
};
int main() {
uint8_t i;
//
spr0_set_scr_adr(0x6000);
scr0_fill_atr(7);
scr0_flip4000();
SEI();
while (1) {
// Очистка только атрибутов! Это быстро, если фон однотонный
scr0_fill_atr(0);
// Вывод
for(i=0; i<sprites; i++ ){
spr0_out0_attr( sprMovies[i].phases[sprMovies[i].phase],
sprMovies[i].x,sprMovies[i].y);
// Шагаем по X
if( sprMovies[i].sx > 0 ){
// Вправо
sprMovies[i].phase++;
// Шаг?
if( sprMovies[i].phase >= sprPhases ){
sprMovies[i].phase=0;
sprMovies[i].x+=sprMovies[i].sx;
}
}else{
// Влево
sprMovies[i].phase--;
// Шаг?
if( sprMovies[i].phase < 0 ){
sprMovies[i].phase=sprPhases-1;
sprMovies[i].x+=sprMovies[i].sx;
}
}
// Шагаем по Y
sprMovies[i].y+=sprMovies[i].sy;
// Меняем направлния, если достигнут край экрана
if( ( sprMovies[i].sx > 0 ) && ( sprMovies[i].x > 29 ) ) {
sprMovies[i].sx=-1;
} else if( ( sprMovies[i].sx < 0 ) && ( sprMovies[i].x < 1 ) ) {
sprMovies[i].sx=1;
}
if( ( sprMovies[i].sy > 0 ) && ( sprMovies[i].y > 21 ) ) {
sprMovies[i].sy=-1;
} else if( ( sprMovies[i].sy < 0 ) && ( sprMovies[i].y < 1 ) ) {
sprMovies[i].sy=1;
}
}
HALT();
scr0_flip4000();
}
//
return 0;
}