初学OPENGL 2D小游戏制作请教

yonghuang456789 2013-11-19 11:15:35
我想的是点碰到边界会变成2个.就是一开始1个点.每次碰到就变2个.以此类推(下面设置了上限16个).可是初运行时可以.后面就不行了..请教各位大大们帮帮.

#include "stdafx.h"
#include <glut.h>
#include <math.h>
#define MAXSIZE 16

void Display(void);
void Reshape(int w, int h);
void mytime(int value); //每次点的坐标变换
void myinit(void);

void selectFont(int size, int charset, const char* face); //选择字体
void drawCNString(const char* str); //生成中文字体函数
void Keyboard(unsigned char key, int x, int y);
void drawpoint(); //画点
void gamea(void); //界面

int game=0;
float xball[MAXSIZE]={0},yball[MAXSIZE]={0};
int n=0;
float x=0,y=0;
float xdelta[MAXSIZE]={0},ydelta[MAXSIZE]={0};

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
char *argv[] = {"hello ", " "};
int argc = 2; // must/should match the number of strings in argv
glutInit(&argc, argv); //初始化GLUT库;
glutInitWindowSize(500,500); //设置显示窗口大小
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //设置显示模式;(注意双缓冲)
glutCreateWindow("Ball"); // 创建显示窗口
glutKeyboardFunc(Keyboard); //注册键盘响应回调函数
glutDisplayFunc(Display); //注册显示回调函数
glutReshapeFunc(Reshape); //注册窗口改变回调函数
myinit();
glutTimerFunc(200, mytime, 10);
glutMainLoop(); //进入事件处理循环
return 0;
}

void myinit()
{
glPointSize(5);
glLineWidth(3);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_POINT_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glEnable(GL_POLYGON_SMOOTH);
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
}

void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW); //设置矩阵模式为模型变换模式,表示在世界坐标系下
glLoadIdentity(); //将当前矩阵设置为单位矩阵

if (game==0)
{
gamea();
}

if (game==1)
{
drawpoint();
}

glutSwapBuffers(); //双缓冲的刷新模式;
}

void mytime(int value)
{
int z=n;
for (int i = 0;i<=z;i++)
{
xball[i]+=xdelta[i];
yball[i]+=ydelta[i];
if (xball[i]>=1||xball[i]<=-1)
{
n++;
xball[n]=xball[i];
yball[n]=yball[i];
xdelta[i]=xdelta[i]*(-1);
xdelta[n]=xdelta[i]*(-1);
ydelta[n]=ydelta[i]*(-1);
}
if (yball[i]>=1||yball[i]<=-1)
{
n++;
xball[n]=xball[i];
yball[n]=yball[i];
ydelta[i]=ydelta[i]*(-1);
ydelta[n]=ydelta[i]*(-1);
xdelta[n]=xdelta[i]*(-1);
}
}
glutPostRedisplay(); //重画,相当于10重新调用Display(),改编后的变量得以传给绘制函数
glutTimerFunc(200, mytime, 10);
}

void Reshape(GLsizei w,GLsizei h)
{
glMatrixMode(GL_PROJECTION); //投影矩阵模式
glLoadIdentity(); //矩阵堆栈清空
glViewport(0,0,w,h); //设置视区大小

glMatrixMode(GL_MODELVIEW); //模型矩阵模式

}

void Keyboard(unsigned char key, int x, int y)
{
switch(key)
{
case '1':
n=0;
x=0;
y=0;
xball[n]=0;
yball[n]=0;
xdelta[0]=0.1;
ydelta[0]=0.05;
game=1;
break;
case '2':
xdelta[0]=0;
ydelta[0]=0;
n=0;
x=0;
y=0;
game=0;
break;
case '3':
exit(0);
break;
}
glutPostRedisplay();
}

void selectFont(int size, int charset, const char* face)
{
HFONT hFont = CreateFontA(size, 0, 0, 0, FW_MEDIUM, 0, 0, 0,
charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, face);
HFONT hOldFont = (HFONT)SelectObject(wglGetCurrentDC(), hFont);
DeleteObject(hOldFont);
}

void drawCNString(const char* str)
{
int len, i;
wchar_t* wstring;
HDC hDC = wglGetCurrentDC();
GLuint list = glGenLists(1);

// 计算字符的个数
// 如果是双字节字符的(比如中文字符),两个字节才算一个字符
// 否则一个字节算一个字符
len = 0;
for(i=0; str[i]!='\0'; ++i)
{
if( IsDBCSLeadByte(str[i]) )
++i;
++len;
}

// 将混合字符转化为宽字符
wstring = (wchar_t*)malloc((len+1) * sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, wstring, len);
wstring[len] = L'\0';

// 逐个输出字符
for(i=0; i<len; ++i)
{
wglUseFontBitmapsW(hDC, wstring[i], 1, list);
glCallList(list);
}

// 回收所有临时资源
free(wstring);
glDeleteLists(list, 1);
}

void drawpoint()
{
glPointSize(4.0);
glColor3f(1,0,0);
for (int i = 0;i<=n;i++)
{
glPushMatrix();
glBegin(GL_POINTS);
glVertex2f(xball[i],yball[i]);
glEnd();
glPopMatrix();
}
}

void gamea(void)
{
glColor3f(1,0,1);
selectFont(24, GB2312_CHARSET, "楷体_GB2312"); //设置字体楷体48号字
glRasterPos2f(-0.3, -0.2); //在世界坐标250,250处定位首字位置
drawCNString("按'1'进去画面"); //写字“Hello,大家好”
glRasterPos2f(-0.3, -0.3); //在世界坐标250,250处定位首字位置
drawCNString("按'2'回到主界面"); //写字“Hello,大家好”
glRasterPos2f(-0.3, -0.4); //在世界坐标250,250处定位首字位置
drawCNString("按'3'退出程序"); //写字“Hello,大家好”
glPopMatrix();
}
...全文
391 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
一点不剩 2013-11-26
  • 打赏
  • 举报
回复
这个,好高端的样子,看不懂啊
junlinfushi 2013-11-21
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
那我就说三句“废话”吧: 代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试是程序员必须掌握的技能之一。
老赵又来拿分了
Daniel_31 2013-11-21
  • 打赏
  • 举报
回复
写的确实不错
ForestDB 2013-11-21
  • 打赏
  • 举报
回复
问题自己调。
max_min_ 2013-11-20
  • 打赏
  • 举报
回复
代码写的挺整齐的.
赵4老师 2013-11-20
  • 打赏
  • 举报
回复
那我就说三句“废话”吧: 代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试是程序员必须掌握的技能之一。
blink31 2013-11-20
  • 打赏
  • 举报
回复
我去,这么多代码。。。 你别让大家给你看逻辑方面的啊,罗列下具体事项好解决些 - - 我还以为是用OpengGL绘制2D图像方面的问题呢。。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧