(GLUT)壁ドン

OpenGL
【2018年1月10日から放送開始】TVアニメ『ダメプリ ANIME CARAVAN』 OPムービー【OP BREAKERZ】

アニメ『ダメプリ ANIME CARAVAN』

腐女子アニメは、大好物。姫がイケメン王子たちに囲まれます。たぶん。
「忘れちゃったの~?」「初対面ですよねぇ?」「今、出会ったでしょ?」私の中ではクレイジーな会話が見どころです。
壁ドンしてくれるのを期待しながら見てます。(まだ一話しか見てませんが)

ブログ記事のタイトルは、将来内容が思い出せるようにつけているのですが、今回は「壁ドン」と適当につけてしまったので、そのうち記事の内容忘れますね。
今回は壁ドンというか、球のバウンドのアニメーションです。

ソースをドン。

takk@deb9:~$ cat -n bounce1.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, 1.0, 0.0, 0.0},   //0 GREEN
     8  {1.0, 1.0, 1.0, 0.0},   //1 WHITE
     9  };
    10
    11  #define GREEN 0
    12  #define WHITE 1
    13
    14  struct maru_struct
    15  {
    16      GLdouble rx;
    17      GLdouble ry;
    18      GLdouble rsize;
    19      int color;
    20      int dir;
    21  };
    22
    23  #define MARU_NUM 6
    24  #define SPEED 0.05
    25
    26  struct maru_struct maru[MARU_NUM];
    27
    28  #define COLOR(n) colors[n][0],colors[n][1],colors[n][2],colors[n][3]
    29
    30  void maru_disp(GLdouble x, GLdouble y, GLdouble r, int color)
    31  {
    32      GLdouble xx, yy;
    33      int i,n=20;
    34      double deg,offs = 90.0;
    35
    36      glBegin(GL_POLYGON);
    37      glColor4f(COLOR(color));
    38
    39      for(i=0; i<n; i++){
    40          deg = (360.0/n) * i + offs;
    41          xx = x + r * cos(DEG2RAD(deg));
    42          yy = y + r * sin(DEG2RAD(deg));
    43          glVertex2d(xx, yy);
    44      }
    45
    46      glEnd();
    47  }
    48
    49  void callback_timer(int value)
    50  {
    51      glutPostRedisplay();
    52      glutTimerFunc(30,callback_timer,0);
    53  }
    54
    55  void maru_init()
    56  {
    57      struct maru_struct* p;
    58      int i;
    59      for(i=1;i<MARU_NUM;i++){
    60          p = &maru[i];
    61          p->rx = ((rand()%200)-100)/100.0;
    62          p->ry = ((rand()%200)-100)/100.0;
    63          p->rsize = (rand()%50)/200.0;
    64          p->dir = rand()%360;
    65          p->color = GREEN;
    66      }
    67  }
    68
    69  void maru_move()
    70  {
    71      struct maru_struct* p;
    72      int i;
    73
    74      for(i=1;i<MARU_NUM;i++){
    75          p = &maru[i];
    76          if(p->rx < -1.0) p->dir = ((180-p->dir)+360)%360;
    77          if(p->rx >  1.0) p->dir = ((180-p->dir)+360)%360;
    78          if(p->ry < -1.0) p->dir = ((360-p->dir)+360)%360;
    79          if(p->ry >  1.0) p->dir = ((360-p->dir)+360)%360;
    80          p->rx += SPEED * cos(p->dir*M_PI/180.0);
    81          p->ry += SPEED * sin(p->dir*M_PI/180.0);
    82      }
    83  }
    84
    85  void callback_display()
    86  {
    87      struct maru_struct* p;
    88      int i;
    89      glClearColor(COLOR(WHITE));
    90      glClear(GL_COLOR_BUFFER_BIT);
    91
    92      maru_move();
    93      for(i=1;i<MARU_NUM;i++){
    94          p = &maru[i];
    95          maru_disp(p->rx, p->ry, p->rsize,p->color);
    96      }
    97
    98      glFlush();
    99  }
   100
   101  int main(int argc, char *argv[])
   102  {
   103      maru_init();
   104
   105      glutInit(&argc, argv);
   106      glutInitDisplayMode(GLUT_RGBA);
   107      glutCreateWindow("bounce1");
   108
   109      glutTimerFunc(30,callback_timer,0);
   110      glutDisplayFunc(callback_display);
   111
   112      glutMainLoop();
   113
   114      return 0;
   115  }
   116
takk@deb9:~$

実行すると、5個のボールが壁ドンしつづけます。

コメント

タイトルとURLをコピーしました