animate.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:3k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /*
  2.  * animate.c - part of the chess demo in the glut distribution.
  3.  *
  4.  * (C) Henk Kok (kok@wins.uva.nl)
  5.  *
  6.  * This file can be freely copied, changed, redistributed, etc. as long as
  7.  * this copyright notice stays intact.
  8.  */
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11. #include <GL/glut.h>
  12. #include "chess.h"
  13. #define MOVE_FRAC 8
  14. int frac;
  15. int stage;
  16. int piece;
  17. int piece2;
  18. int X, Y, NX, NY, XD, YD;
  19. GLfloat CX1, CY1;
  20. GLfloat CX2, CY2, CZ2;
  21. FILE *inpf = NULL;
  22. extern int path[10][10];
  23. extern int board[10][10];
  24. extern int cycle[10][10], cyclem, cycle2;
  25. extern int stunt[10][10], stuntm, stunt2;
  26. void read_move(void)
  27. {
  28.     char buf[256];
  29.     if (!inpf)
  30. inpf = fopen("chess.inp", "r");
  31.     if (!inpf)
  32.     {
  33. fprintf(stderr, "Could not open file chess.inp for reading.n");
  34. exit(1);
  35.     }
  36.     if (feof(inpf))
  37. return;
  38.     fgets(buf, 200, inpf);
  39.     CX1 = NX = X = buf[0]-'a'+1;
  40.     CY1 = NY = Y = buf[1]-'0';
  41.     CX2 = XD = buf[2]-'a'+1;
  42.     CY2 = YD = buf[3]-'0';
  43.     piece = board[X][Y];
  44.     piece2 = board[XD][YD];
  45.     board[X][Y] = 0;
  46.     board[XD][YD] = 0;
  47.     solve_path(X, Y, XD, YD);
  48.     stage = 0;
  49.     frac = 0;
  50.     cyclem = cycle[X][Y];
  51.     cycle2 = cycle[XD][YD];
  52.     stuntm = stunt[X][Y];
  53.     stunt2 = stunt[XD][YD];
  54.     switch(path[X][Y])
  55.     {
  56.         case NORTH: NY--; break;
  57.         case SOUTH: NY++; break;
  58.         case WEST: NX--; break;
  59.         case EAST: NX++; break;
  60.         case NORTHWEST: NX--; NY--; break;
  61.         case NORTHEAST: NX++; NY--; break;
  62.         case SOUTHWEST: NX--; NY++; break;
  63.         case SOUTHEAST: NX++; NY++; break;
  64.     }
  65.     if (NY == YD && NX == XD)
  66. stage = 1;
  67. }
  68. void proceed(void)
  69. {
  70.     frac ++;
  71.     if (stage == 1)
  72.     {
  73. if (piece2 && frac <= MOVE_FRAC * 2)
  74. {
  75.     CZ2 = -((GLfloat) frac)/MOVE_FRAC/1.8;
  76.     return;
  77. }
  78. frac = 0;
  79. piece2 = 0;
  80. stage ++;
  81. return;
  82.     }
  83.     else if (stage == 3)
  84. return;
  85.     else
  86. CZ2 = 0.0;
  87.     if (frac >= MOVE_FRAC)
  88.     {
  89. frac = 0;
  90. X = NX;
  91. Y = NY;
  92. if (NX == XD && NY == YD)
  93. {
  94.     board[XD][YD] = piece;
  95.     cycle[XD][YD] = cyclem;
  96.     stunt[XD][YD] = stuntm;
  97.     piece = 0;
  98.     read_move();
  99.     return;
  100. }
  101.         switch(path[X][Y])
  102.         {
  103.             case NORTH: NY--; break;
  104.             case SOUTH: NY++; break;
  105.             case WEST: NX--; break;
  106.             case EAST: NX++; break;
  107.             case NORTHWEST: NX--; NY--; break;
  108.             case NORTHEAST: NX++; NY--; break;
  109.             case SOUTHWEST: NX--; NY++; break;
  110.             case SOUTHEAST: NX++; NY++; break;
  111.         }
  112. if (NX == XD && NY == YD)
  113.     stage ++;
  114.     }
  115.     CX1 = ((GLfloat) (X*(MOVE_FRAC-frac) + NX*frac))/ MOVE_FRAC;
  116.     CY1 = ((GLfloat) (Y*(MOVE_FRAC-frac) + NY*frac))/ MOVE_FRAC;
  117. }