天地之灵学习小组
我们学习小组的OpenGL学习笔记 大家一定要互相折磨呀~~
posts - 150,  comments - 156,  trackbacks - 0
昨天没有写笔记,请大家责骂。
原因是,不小心断网了,发送键点出去返回给我一个无情的该页无法显示。中午本想补上,结果greenbrower死掉一次,写了一大片都这样不见了,巨崩溃,懒得写第三遍。直接上代码。
  1 #include <GL/glut.h>
  2 #include <ctime>
  3 
  4 static const int WindowWidth = 640;
  5 static const int WindowHeight = 480;
  6 
  7 int count = 0;
  8 int speed = 4;
  9 
 10 enum GridType
 11 {
 12     NOTHING, CAPSULE, WORM
 13 };
 14 
 15 enum Connect
 16 {
 17     NOT_CONNECTED, LEFT, RIGHT, UP, DOWN
 18 };
 19 
 20 enum Color
 21 {
 22     BLACK, YELLOW, BLUE, RED
 23 };
 24 
 25 enum DoctorDirect
 26 {
 27     DD_NODIRECT, DD_UP, DD_DOWN, DD_LEFT, DD_RIGHT
 28 };
 29 
 30 
 31 class Bottle
 32 {
 33 private:
 34     GridType b_grid_type[8][16];
 35     Color b_color[8][16];
 36     int b_x,b_y; //bottle的位置
 37     Connect b_connect;
 38 public:
 39     void drawBottle( void )
 40     {
 41         //画瓶子的外壳
 42         //画瓶子的内部,根据b_x,b_y和瓶子的内容物
 43     }
 44     Bottle( int level )
 45     {
 46         //生成level*4个虫子
 47     }
 48 };
 49 
 50 class Doctor
 51 {
 52 private:
 53     int d_x,d_y; //活动药丸(左下角)相对于瓶子的位置
 54     bool d_state; //横的0,竖的1
 55     Color d_color[2]; //俩药丸的颜色
 56     DoctorDirect d_direct;
 57 public:
 58     void drawDoctor( void )
 59     {
 60         //画医生的形象
 61         //画活动药丸
 62     }
 63     Doctor( void )
 64     {
 65         //确定初始位置
 66         //随机生成两药丸颜色
 67     }
 68     void move( void )
 69     {
 70         //伪码就先不写了,我纸上写了一堆,思路很清晰
 71     }
 72     void fall( void )
 73     {
 74         d_direct = DD_DOWN;
 75         move();
 76     }
 77     void setDirect( DoctorDirect direct )
 78     {
 79         d_direct = direct;
 80     }
 81 };
 82 
 83 static Bottle* bottle = NULL;
 84 static Doctor* doctor = NULL;
 85 
 86 void init( void )
 87 {
 88     //new两个类
 89 }
 90 
 91 void key( unsigned char key_char, int not_use, int not_use_1 )
 92 {
 93     switch ( key_char )
 94     {
 95     case 'w':
 96     case 'W':
 97         doctor->setDirect( DD_UP );
 98         break;
 99     case 's':
100     case 'S':
101         doctor->setDirect( DD_DOWN );
102         break;
103     case 'a':
104     case 'A':
105         doctor->setDirect( DD_LEFT );
106         break;
107     case 'd':
108     case 'D':
109         doctor->setDirect( DD_RIGHT );
110         break;
111     default:
112         doctor->setDirect( DD_NODIRECT );
113     }
114 }
115 
116 void step( void )
117 {
118     if ( dead() ) return ;
119     //还没写完
120     ++count; if ( count == speed ) { count = 0; doctor->fall(); }
121 }
122 
123 void timer( int not_use )
124 {
125     step();
126     glutPostRedisplay();
127     if ( !dead() )
128     {
129         glutTimerFunc( 1000/speed, timer, 0 );
130     }
131 }
132 
133 void draw()
134 {
135     bottle->drawBottle();
136     doctor->drawDoctor();
137 }
138 
139 void display( void )
140 {
141     glClear( GL_COLOR_BUFFER_BIT );
142     draw();
143     glutSwapBuffers();
144 }
145 
146 int main( int argc, char * argv[] )
147 {
148     glutInit( &argc, argv );
149     glutInitDisplayMode( GLUT_RGBA|GLUT_DOUBLE );
150     glutInitWindowPosition( 5050 );
151     glutInitWindowSize( WindowWidth, WindowHeight );
152     glutCreateWindow( "Dr Mario By PureMilk" );
153     glutDisplayFunc( display );
154     glutKeyboardFunc( key );
155     glutTimerFunc( 1000/speed, timer, 0 );
156     gluOrtho2D( 0, WindowWidth, WindowHeight, 0 );
157     glutMainLoop();
158     
159     return 0;
160 }
谢谢vczh的指点,还望多点播点播俺。这次的思路是不是比那个混乱代码要好些了……


FeedBack:
# re: 10月16日_欢迎糖糖_By PureMilk
2008-10-17 17:53 | 天地之灵
关于key:
我猜测glutKeyboardFunc定义的应该是“按键”,比如说你按下a,首先是产生一次a,然后过一段时间,然后按固定的频率不断产生a。
如果使用这个接口,应该是直接在key被调用的时候向对应的方向移动就好了,不需要通过我上次说的那个复杂的状态判断。对于玛丽医生来说,这种方法其实够了。一个比较讨厌的毛病是,可能第一格移动比较慢,但后来的频率很快,如果想一直保持稳定的速度,或者自己控制这个速度,就用如下的方法:

我上次说的是另两种键盘输入获得的方法,这两种方法更原始一点:
1、某个键被按下,和松开的事件。
2、某个键是否被按下的状态。

通过这两种方式获得键盘输入,能够更精确地获得按键何时被松开、按下,或者在某个时刻是否被按住(另外这两种输入是可以互相推导的)
通常游戏都通过这两种输入之一来完成。另外这两种输入外加一个定时器也是可以推导出之前的那种方法的。
  回复  更多评论
  
# re: 10月16日_欢迎糖糖_By PureMilk[未登录]
2008-10-17 21:33 | missdeer
@天地之灵
“一个比较讨厌的毛病是,可能第一格移动比较慢,但后来的频率很快”
================================
好像QQ火拼俄罗斯就是这样的,所以也不算什么大毛病,连后来出现的那种键盘加速器外挂,都是能设置第一次按键消息与第二次按键消息之间的间隔时间长一点或短一点,所以这是正常且符合用户习惯的。  回复  更多评论
  
# re: 10月16日_欢迎糖糖_By PureMilk[未登录]
2008-10-17 21:38 | missdeer
@tt
drawBottle和drawDoctor这两个方法名太丑了,draw就够了,而且如果这两个类能从同一个基类派生的话,就可以多态了。不过现在只有两个类,两个对象可能看不出差别来。  回复  更多评论
  
# re: 10月16日_欢迎糖糖_By PureMilk
2008-10-17 21:41 | 陈梓瀚(vczh)
这个游戏太小了,bottle和doctor不需要就行任何抽象,类其实都可以没有。架构要根据软件的尺寸选择。  回复  更多评论
  
# re: 10月16日_欢迎糖糖_By PureMilk
2008-10-17 22:02 | 肖赫_王婷婷_王冠_郑燚_孙婷
@missdeer
我不知道什么是基类什么是派生。太丢人了囧  回复  更多评论
  
# re: 10月16日_欢迎糖糖_By PureMilk
2008-10-17 22:03 | 肖赫_王婷婷_王冠_郑燚_孙婷
@陈梓瀚(vczh)
有您这话俺就放心了。其实俺特别想像从前做算法题目一样,一main到底,偷笑  回复  更多评论
  
# re: 10月16日_欢迎糖糖_By PureMilk[未登录]
2008-10-17 22:14 | missdeer
@陈梓瀚(vczh)
当然要像云风那样完全用C写游戏也没错。
另外,在现有PC硬件条件下,什么时候软件尺寸会成为影响架构的主要因素了,这太误导人了,除非是嵌入式环境中。
  回复  更多评论
  
# re: 10月16日_欢迎糖糖_By PureMilk
2008-10-18 15:33 | 陈梓瀚(vczh)
当然了,难道你不希望在最小的成本开发出你想要的东西么。像这种又小又不需要维护的东西,写完就行了。DP的目的是让你便于维护,而不是为了什么其他的东西。  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



<2019年10月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(6)

随笔分类(149)

随笔档案(150)

同道中人

搜索

  •  

积分与排名

  • 积分 - 33583
  • 排名 - 533

最新随笔

最新评论

阅读排行榜

评论排行榜