以前只知道,每隔固定一段时间都要重新画一遍屏幕,屏幕里面很简单,记分牌、瓶子及其内部、医生、帮助面板。就这么多而已,以前认为要画医生、药片、虫子只要调用画它们的函数就行了,诚然实际上也就是这样,但具体函数里面是什么就不晓得了。今天的操作系统课上想到了这个问题。记得刚开始看OpenGL的时候遇到了一个叫点画线和点画面的问题,当时只注意了一下点画线,点画面就被我一带而过。今天想到要画出具有真实感的医生、药片、虫子不妨就采用点画面来试一试。
自己的思路是这个样子的,就拿画药丸的函数drawPill(/*参数*/)来说吧,首先有个static int pill_mask[](应该是个全局的,免得每次画的时候都要重新读取图像)数组里面存放了药片各个点是否有颜色的信息,至于数组里面的信息是从哪里来的,当然是从一幅图中读进来的喽。读取图像的函数可以在网上找到的嘛。每次调用本函数之前先设置好颜色信息,就是要画什么颜色的药丸,然后使用glEnable(GL_POLYGON_STIPPLE);来启动点画面模式,void glPolygonStipple(const GLubyte *pill_mask[]);来指定用什么样的什么什么(不知道专业术语,想必这样说大家也能理解),然后就可以画多边形了,当然画出来的就是一个非常可爱的药丸啦,最后不要忘记关闭点画面模式glDisable(GL_POLYGON_STIPPLE);啦,顺便附上测试用的小图一张(在画图程序里面随便搞的,有点像虫子了)。
下面就是我的那个顽皮的小程序了,还请各位哥哥姐姐弟弟妹妹看一看,顺便改一改,先谢谢啦!
#include <stdio.h>
#include <stdlib.h>
#include <gl/glut.h>
static GLubyte pill_mask[50];
void read_pill()
{
FILE *fp;
fp = fopen("mask.jpg", "rb");
if( !fp )
exit(0);
if( fseek(fp, -(int)sizeof(pill_mask), SEEK_END) )
exit(0);
if( !fread(pill_mask, sizeof(pill_mask), 1, fp) )
exit(0);
fclose(fp);
}
void drawPill(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_POLYGON_STIPPLE);
glPolygonStipple(pill_mask);
glRectf(-0.5,-0.5,0.5,0.5);
glDisable(GL_POLYGON_STIPPLE);
glFlush();
}
int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(200,200);
glutInitWindowPosition(300,300);
glutCreateWindow("Mask");
glShadeModel(GL_FLAT);
glutDisplayFunc(drawPill);
glutMainLoop();
return 0;
}
没有注释的,还请多担待
posted on 2008-10-28 21:17
正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(244)
评论(0) 编辑 收藏 引用 所属分类:
risky