opengl3d打飞机游戏源代码(opengl游戏编程)
admin 发布:2022-12-19 18:10 165
今天给各位分享opengl3d打飞机游戏源代码的知识,其中也会对opengl游戏编程进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、如何使用Opengl
- 2、请问要编在linux下运行的mesa/opengl 3D游戏,代码一定要在linux下编吗?
- 3、关于基于MFC的openGL游戏的框架
- 4、opengl导入3ds。比如说飞机模型,能不能让这个飞机的起落架动起来。
- 5、求一个C#打飞机的游戏,界面已经大概设计好了,求代码,大神的都来看看!指点下
- 6、OpenGL主要是做游戏,但是有3D游戏引擎用他干嘛?而且3D的程序几乎都没有做的,那学他有什么用处?
如何使用Opengl
你既可以建立Win32项目使用API,也可以建立MFC工程
(一般不用MFC框架直接用API)
我给你一个例子吧,建立Win32空项目,添加一个cpp文件,编译执行就行了
(这是一个经典的opengl框架了)代码如下:
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glu32.lib")
#pragma comment(lib,"glaux.lib")
#include windows.h
#include gl/gl.h
#include gl/glu.h
#include gl/glaux.h
HDC hDC=NULL;
HGLRC hRC=NULL;
HWND hWnd=NULL;
HINSTANCE hInstance;
BOOL keys[256];
BOOL active=TRUE;
BOOL fullscreen=TRUE;
GLfloat rtri;
GLfloat rquad;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
GLvoid ResizeGLScene(GLsizei width,GLsizei height)
{
if(height==0)
height=1;
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int InitGL(GLvoid)
{
glShadeModel(GL_SMOOTH);
glClearColor(0.0f,0.0f,0.0f,0.5f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
return TRUE;
}
int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(-1.5f,0.0f,-6.0f);
glRotatef(rtri,0.0f,1.0f,0.0f);
glBegin(GL_TRIANGLES);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f,1.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(1.0f,-1.0f,1.0f);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(1.0f,-1.0f,1.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f,1.0f);
glEnd();
glLoadIdentity();
glTranslatef(1.5f,0.0f,-7.0f);
glRotatef(rquad,1.0f,1.0f,1.0f);
glBegin(GL_QUADS);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(1.0f,1.0f,-1.0f);
glVertex3f(-1.0f,1.0f,-1.0f);
glVertex3f(-1.0f,1.0f,1.0f);
glVertex3f(1.0f,1.0f,1.0f);
glColor3f(1.0f,0.5f,0.0f);
glVertex3f(1.0f,-1.0f,1.0f);
glVertex3f(-1.0f,-1.0f,1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(1.0f,1.0f,1.0f);
glVertex3f(-1.0f,1.0f,1.0f);
glVertex3f(-1.0f,-1.0f,1.0f);
glVertex3f(1.0f,-1.0f,1.0f);
glColor3f(1.0f,1.0f,0.0f);
//glVertex3f(1.0f,-1.0f,-1.0f);
//glVertex3f(-1.0f,-1.0f,-1.0f);
//glVertex3f(-1.0f,1.0f,-1.0f);
//glVertex3f(1.0f,1.0f,-1.0f);
glVertex3f(-1.0f,1.0f,-1.0f);
glVertex3f(1.0f,1.0f,-1.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-1.0f,1.0f,1.0f);
glVertex3f(-1.0f,1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,1.0f);
glColor3f(1.0f,0.0f,1.0f);
glVertex3f(1.0f,1.0f,-1.0f);
glVertex3f(1.0f,1.0f,1.0f);
glVertex3f(1.0f,-1.0f,1.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glEnd();
rtri+=0.2f;
rquad-=0.15f;
return TRUE;
}
GLvoid KillGLWindow(GLvoid)
{
if(fullscreen)
{
ChangeDisplaySettings(NULL,0);
ShowCursor(TRUE);
}
if(hRC)
{
if(!wglMakeCurrent(NULL,NULL))
MessageBox(NULL,"释放DC或RC失败","关闭错误",MB_OK|MB_ICONINFORMATION);
if(!wglDeleteContext(hRC))
MessageBox(NULL,"释放RC失败","关闭错误",MB_OK|MB_ICONINFORMATION);
hRC=NULL;
}
if(hDC !ReleaseDC(hWnd,hDC))
{
MessageBox(NULL,"释放DC失败","关闭错误",MB_OK|MB_ICONINFORMATION);
hDC=NULL;
}
if(hWnd !DestroyWindow(hWnd))
{
MessageBox(NULL,"释放窗口句柄失败","关闭错误",MB_OK|MB_ICONINFORMATION);
hWnd=NULL;
}
if(!UnregisterClass("OpenG",hInstance))
{
MessageBox(NULL,"不能注销窗口类","关闭错误",MB_OK|MB_ICONINFORMATION);
hInstance=NULL;
}
}
BOOL CreateGLWindow(char* title,int width,int height,int bits,BOOL fullscreenflag)
{
GLuint PixelFormat;
WNDCLASS wc;
DWORD dwExStyle;
DWORD dwStyle;
RECT WindowRect;
WindowRect.left=(long)0;
WindowRect.right=(long)width;
WindowRect.top=(long)0;
WindowRect.bottom=(long)height;
fullscreen=fullscreenflag;
hInstance=GetModuleHandle(NULL);
wc.style=CS_HREDRAW|CS_VREDRAW|CS_OWNDC;
wc.lpfnWndProc=(WNDPROC)WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_WINLOGO);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=NULL;
wc.lpszMenuName=NULL;
wc.lpszClassName="OpenG";
if(!RegisterClass(wc))
{
MessageBox(NULL,"注册窗口失败","错误",MB_OK|MB_ICONINFORMATION);
return FALSE;
}
if(fullscreen)
{
DEVMODE dmScreenSettings;
memset(dmScreenSettings,0,sizeof(dmScreenSettings));
dmScreenSettings.dmSize=sizeof(dmScreenSettings);
dmScreenSettings.dmPelsWidth=width;
dmScreenSettings.dmPelsHeight=height;
dmScreenSettings.dmBitsPerPel=bits;
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
if(ChangeDisplaySettings(dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
{
if(MessageBox(NULL,"全屏模式设置失败!\n使用窗口模式?","OpenGL 3D游戏编程",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
{
fullscreen=FALSE;
}
else
{
MessageBox(NULL,"程序将被关闭","错误",MB_OK|MB_ICONINFORMATION);
return FALSE;
}
}
}
if(fullscreen)
{
dwExStyle=WS_EX_APPWINDOW;
dwStyle=WS_POPUP;
ShowCursor(FALSE);
}
else
{
dwExStyle=WS_EX_APPWINDOW|WS_EX_WINDOWEDGE;
dwStyle=WS_OVERLAPPEDWINDOW;
}
AdjustWindowRectEx(WindowRect,dwStyle,FALSE,dwExStyle);
if(!(hWnd=CreateWindowEx(dwExStyle,"OpenG",title,
dwStyle|WS_CLIPSIBLINGS|WS_CLIPCHILDREN,0,0,
WindowRect.right-WindowRect.left,WindowRect.bottom-WindowRect.top,
NULL,NULL,hInstance,NULL)))
{
KillGLWindow();
MessageBox(NULL,"窗口创建失败","错误",MB_OK|MB_ICONINFORMATION);
return FALSE;
}
static PIXELFORMATDESCRIPTOR pfd=
{
sizeof(PIXELFORMATDESCRIPTOR),1,
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,bits,
0,0,0,0,0,0,
0,
0,
0,
0,0,0,0,
16,
0,
0,
PFD_MAIN_PLANE,
0,
0,0,0
};
if(!(hDC=GetDC(hWnd)))
{
KillGLWindow();
MessageBox(NULL,"不能创建一个窗口设备描述表","错误",MB_OK|MB_ICONINFORMATION);
return FALSE;
}
if(!(PixelFormat=ChoosePixelFormat(hDC,pfd)))
{
KillGLWindow();
MessageBox(NULL,"不能创建一个匹配的像素格式","错误",MB_OK|MB_ICONINFORMATION);
return FALSE;
}
if(!SetPixelFormat(hDC,PixelFormat,pfd))
{
KillGLWindow();
MessageBox(NULL,"不能设置像素格式","错误",MB_OK|MB_ICONINFORMATION);
return FALSE;
}
if(!(hRC=wglCreateContext(hDC)))
{
KillGLWindow();
MessageBox(NULL,"不能创建OpenGL渲染描述表","错误",MB_OK|MB_ICONINFORMATION);
return FALSE;
}
if(!wglMakeCurrent(hDC,hRC))
{
KillGLWindow();
MessageBox(NULL,"不能激活当前的OpenGL渲染描述表","错误",MB_OK|MB_ICONINFORMATION);
return FALSE;
}
ShowWindow(hWnd,SW_SHOW);
SetForegroundWindow(hWnd);
SetFocus(hWnd);
ResizeGLScene(width,height);
if(!InitGL())
{
KillGLWindow();
MessageBox(NULL,"初始化失败","错误",MB_OK|MB_ICONINFORMATION);
return FALSE;
}
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_ACTIVATE:
{
if(!HIWORD(wParam))
active=TRUE;
else
active=FALSE;
return 0;
}
case WM_SYSCOMMAND:
{
switch(wParam)
{
case SC_SCREENSAVE:
case SC_MONITORPOWER:
return 0;
}
break;
}
case WM_CLOSE:
{
PostQuitMessage(0);
return 0;
}
case WM_KEYDOWN:
{
keys[wParam]=TRUE;
return 0;
}
case WM_KEYUP:
{
keys[wParam]=FALSE;
return 0;
}
case WM_SIZE:
{
ResizeGLScene(LOWORD(lParam),HIWORD(lParam));
return 0;
}
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
MSG msg;
BOOL done=FALSE;
if(MessageBox(NULL,"你想在全屏模式下运行吗?","设置全屏模式",MB_YESNO|MB_ICONQUESTION)==IDNO)
{
fullscreen=FALSE;
}
if(!CreateGLWindow("Win32 SDK风格 OpenGL程序框架",640,480,16,fullscreen))
return 0;
while(!done)
{
if(PeekMessage(msg,NULL,0,0,PM_REMOVE))
{
if(msg.message==WM_QUIT)
done=TRUE;
else
{
TranslateMessage(msg);
DispatchMessage(msg);
}
}
else
{
if(active)
{
if(keys[VK_ESCAPE])
done=TRUE;
else
{
DrawGLScene();
SwapBuffers(hDC);
}
}
if(keys[VK_F1])
{
keys[VK_F1]=FALSE;
KillGLWindow();
fullscreen=!fullscreen;
if(!CreateGLWindow("Win32 SDK风格 OpenGL程序框架",640,480,16,fullscreen))
return 0;
}
}
}
KillGLWindow();
return msg.wParam;
}
请问要编在linux下运行的mesa/opengl 3D游戏,代码一定要在linux下编吗?
这个……你打算仅用vs的-编辑-功能吗?vs是-编译-不出Linux能跑的elf格式的可执行文件。就算代码编的没问题,也要重编译成linux下的可执行文件才行。交叉编译是非常辛苦的事情。win里面一个叫sygwin的编译调试工具,那个编出来的东西Linux可以跑。
我也初涉Linux编程。但我知道这两种系统的文件系统都不一样,所以程序的动态链接也想去深远。还有,系统调用也不一样。比如C代码中的system()在Linux和windows中都是直接运行系统命令,但这两个系统有完全不同的命令集。
Ubuntu是近年来很流行的Linux发行版。很多初学者都喜欢用那个。那个界面更友好一些。国内用的人很多。开发者也不再少数,你遇到什么问题直接可以去Ubuntu中国社区讨论。那边有高手也有新人。应该算目前国内用户量最多的系统。楼主也是新手的话就用这个吧。
楼主辛苦了,win下编Linux程序不是不可以,但你要清楚自己使用的所有库函数,清楚他们有没有Linux版的代码,可不可以在Linux环境下编译运行等。从理论上说这样的编译可以实现……祝楼主好运。
gcc是Linux里面最强大的开发工具GNU工具链的编译器。windows+GNU=sygwin。windows到Linux的交叉编译环境通常是那个。sygwin开发环境就是在gnu库上的编译开发Linux代码的环境。
p.s.我没写过3d程序,我是用C写靠近硬件的底层代码。但我没用过sygwin。因为我在Linux下直一般接用GCC编译。编辑代码用emacs。老师曾笑着说,vim那是穷人的工具。Emacs不只是编译工具那么简单,那是一个超mini的集成GNU开发环境。在那里面可以直接运行命令linux bash命令。调用gcc编译,调用运行gdb调试。嘛,调试其实我也很少用gdb,我一般用nemver或者用edb。楼主真要写Linux程序,索性直接进Ubuntu去开发算了。我更喜欢Fedora……有情结。Fedora是RedHat公司的得意之作,本来就是为开发者准备的。相对而言Ubuntu是作为桌面系统而推出的。Fedora是Linux名门之后,Ubuntu是后起之秀。其实还有些发行版,Debian,SUSE这两个更是有历史的……也都是不错的开发环境。
关于基于MFC的openGL游戏的框架
我写游戏的大概框架,用MFC我是不会了,opengl我用的是glut的框架
enum
{
level1,
level2,
level3,
};
int g_GameStatue=level1;
void Level_Init(int level)
{
//初始化图资源
}
void Level_Release(int level)
{
//清空地图资源
}
void Level_Run(int level)
{
//判断是否完成关卡
//是的话
Level_Release(level);
g_GameStatue=(level++);
}
//游戏主循环
int main()
{
while(1)
{
switch(g_GameStatue)
{
case level1:
static bool init=false;
if(init==false)
Level_Init(level1);
else
Level_Run(level1);
break;
case level2:
static bool init=false;
if(init==false)
Level_Init(level2);
else
Level_Run(level2);
case level3:
static bool init=false;
if(init==false)
Level_Init(level3);
else
Level_Run(level3);
}
Sleep(1);//节省cpu计算量
}
return 0;
}
opengl导入3ds。比如说飞机模型,能不能让这个飞机的起落架动起来。
如果模型本身有起落架活动的动画或者骨络的话可以很控制,如果模型本身不包含这些信息的话恐怕很难实现
求一个C#打飞机的游戏,界面已经大概设计好了,求代码,大神的都来看看!指点下
我从来没做过这种,但是我觉得挺有趣的,我准备花2个小时来做~~~ 我一直做BS的~~~
我的思路是这样的
创建一个键值对,KEY是飞机对象,VALUE是飞机舞台位置
飞机超过边界就继续从对面边界开始,直到击毁
然后创建一个TIMER 每个1毫秒执行一次
武器:
每一次左键,发送一颗子弹 创建一个键值对 KEY 子弹对象,VALUE子弹位置,如果子弹超出边界,从子弹键值对中移出,如果子弹位置和飞机位置相等 触发击毁事件 飞机从飞机键值对中移除
OpenGL主要是做游戏,但是有3D游戏引擎用他干嘛?而且3D的程序几乎都没有做的,那学他有什么用处?
你没有搞清楚 gl 和 游戏, 引擎 之间的关系.
他们之间的层次是:
游戏逻辑代码--游戏引擎--3D引擎--opengl/DX -- 显卡
游戏公司一般雇佣很多程序员来写游戏代码.这种代码现在一般都是用java,c#,lua 这类高级语言写的. 然后他们写的这些代码,会被塞到 游戏引擎里. 然后游戏肯定是需要复杂的图像来展现的对吧? 所以 游戏引擎里会有一部分代码来和opengl 交互. 告诉opengl我要画什么.
最后opengl把游戏资源(3d模型,图片 ,等)送入显卡,进行绘制.
所以 opengl是很底层的东西.一本没人需要学他.
opengl3d打飞机游戏源代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于opengl游戏编程、opengl3d打飞机游戏源代码的信息别忘了在本站进行查找喔。
版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;
- 上一篇:包含看看网站幻灯源代码的词条
- 下一篇:自动排列css代码(html自动排序)
相关推荐
- 05-17游戏推广平台代理,游戏推广代理赚钱吗
- 05-09百度游戏客服在线咨询,百度游戏客服在线咨询平台
- 05-07pb超级报表源代码(pb报表工具)[20240507更新]
- 05-07简历源代码可以上传照片的简单介绍[20240507更新]
- 05-07广告切换源代码免费下载(广告切换源代码免费下载安装)[20240507更新]
- 05-06阁楼网源代码(阁楼是什么网站)[20240506更新]
- 05-06源代码管理资源管理器(资源管理器运行代码)[20240506更新]
- 05-06人脸识别源代码pdf的简单介绍[20240506更新]
- 05-06包含超市管理系统java源代码的词条[20240506更新]
- 05-06商城app源代码免费(商城App源码)[20240506更新]
取消回复欢迎 你 发表评论:
- 标签列表
- 最近发表
- 友情链接