当前位置:首页 > 代码 > 正文

opengl3d打飞机游戏源代码(opengl游戏编程)

admin 发布:2022-12-19 18:10 165


今天给各位分享opengl3d打飞机游戏源代码的知识,其中也会对opengl游戏编程进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

如何使用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站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/16833.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载