TVアニメ「たくのみ。」PV
アニメ『たくのみ。』
ビール飲みたくなります。
前回「(GLUT)球の衝突のアニメーション」で作った球が衝突したら停止するだけのプログラムの修正版です。最終的には扱いやすいC++にする予定。
takk@deb9:~$ cat -n collision2.c
1 #include <GL/glut.h>
2 #include <math.h>
3
4 #define DEG2RAD(deg) deg * 2.0 * M_PI / 360.0
5
6 GLdouble colors[][4]={
7 {0.0, 0.0, 0.0, 0.0}, //0 BLACK
8 {1.0, 1.0, 1.0, 0.0}, //1 WHITE
9 };
10
11 #define BLACK 0
12 #define WHITE 1
13
14 struct maru_struct
15 {
16 GLdouble rx;
17 GLdouble ry;
18 GLdouble rsize;
19 int color;
20 double dir;
21 int status;
22 };
23
24 #define MARU_NUM 2
25 #define STOP 0
26 #define RUN 1
27
28 struct maru_struct maru[MARU_NUM+1];
29
30 #define COLOR(n) colors[n][0],colors[n][1],colors[n][2],colors[n][3]
31
32 void maru_disp(GLdouble x, GLdouble y, GLdouble r, int color)
33 {
34 GLdouble xx, yy;
35 int i,n=20;
36 double deg,offs = 90.0;
37
38 glBegin(GL_LINE_LOOP);
39 glColor4f(COLOR(color));
40
41 for(i=0; i<n; i++){
42 deg = (360.0/n) * i + offs;
43 xx = x + r * cos(DEG2RAD(deg));
44 yy = y + r * sin(DEG2RAD(deg));
45 glVertex2d(xx, yy);
46 }
47
48 glEnd();
49 }
50
51 void callback_timer(int value)
52 {
53 glutPostRedisplay();
54 glutTimerFunc(10,callback_timer,0);
55 }
56
57 void maru_collision_check(int my_index)
58 {
59 struct maru_struct *my;
60 struct maru_struct *p;
61 int i;
62 my = &maru[my_index];
63 for(i=1;i<=MARU_NUM;i++){
64 if(i!=my_index){
65 p = &maru[i];
66 if((my->rsize + p->rsize) >=
67 sqrt(pow(my->rx - p->rx,2)+pow(my->ry - p->ry,2))){
68 my->status = STOP;
69 }
70 }
71 }
72 }
73
74 void maru_move()
75 {
76 struct maru_struct* p;
77 int i;
78
79 for(i=1;i<=MARU_NUM;i++){
80 p = &maru[i];
81 if(p->status == RUN){
82 p->rx += 0.01 * cos(p->dir*M_PI/180.0);
83 p->ry += 0.01 * sin(p->dir*M_PI/180.0);
84 }
85 }
86 }
87
88 void callback_display()
89 {
90 struct maru_struct* p;
91 int i;
92 glClearColor(COLOR(WHITE));
93 glClear(GL_COLOR_BUFFER_BIT);
94
95 maru_move();
96 for(i=1;i<=MARU_NUM;i++){
97 p = &maru[i];
98 maru_disp(p->rx, p->ry, p->rsize,p->color);
99 if(p->status == RUN){
100 maru_collision_check(i);
101 }
102 }
103
104 glFlush();
105 }
106
107 void maru_init()
108 {
109 struct maru_struct* p;
110 p = &maru[1];
111 p->rx = 0.0; p->ry = 0.4;
112 p->rsize = 0.1;
113 p->dir = 0;
114 p->color = BLACK;
115 p->status = STOP;
116
117 p = &maru[2];
118 p->rx = 0.1; p->ry =-0.8;
119 p->rsize = 0.1;
120 p->dir = 90;
121 p->color = BLACK;
122 p->status = RUN;
123 }
124
125 int main(int argc, char *argv[])
126 {
127 maru_init();
128
129 glutInit(&argc, argv);
130 glutInitDisplayMode(GLUT_RGBA);
131 glutCreateWindow("collision2");
132
133 glutTimerFunc(5000,callback_timer,0);
134 glutDisplayFunc(callback_display);
135
136 glutMainLoop();
137
138 return 0;
139 }
140
takk@deb9:~$



コメント