3D游戏如何制作呢?

2D游戏场景中加入3D元素怎么实现呢?

本文将讲解如何在适当的地方添加3D元素?

第一步:创建的SDL2的 窗口,视图需要和OpenGL的结合起来。

代码例子如下:

int SkComm::init() {
#ifndef __WP8__
#ifdef __SKYPARK_IPHONE__int iRet = SDL_Init(SDL_INIT_VIDEO);
#else
#ifdef __SKYPARK_LINUX__int iRet = SDL_Init(SDL_INIT_VIDEO);
#elseint iRet = SDL_Init(SDL_INIT_EVERYTHING);
#endif
#endifif (iRet < 0) {return -1;}iRet = TTF_Init();if (iRet < 0) {return -2;}int iPos = 0;#ifdef __SKYPARK_WIN__iPos = 40;int skypark_ScreenWidth = 800;int skypark_ScreenHeight = 600;
#endif
#ifdef __ANDROID__int skypark_ScreenWidth = Android_ScreenWidth;int skypark_ScreenHeight = Android_ScreenHeight;
#endif
#ifdef __SKYPARK_MAC__iPos = 40;int skypark_ScreenWidth = 800;int skypark_ScreenHeight = 600;
#endif
#ifdef __SKYPARK_IPHONE__int skypark_ScreenWidth = 480;int skypark_ScreenHeight = 320;
#endif
#ifdef __SKYPARK_LINUX__iPos = 40;int skypark_ScreenWidth = 800;int skypark_ScreenHeight = 600;
#endif
#ifdef HAVE_OPENGLSDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); //设置GL版本的SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);//设置多缓存的个数SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);//设置深度缓存大小的,另外如果讲24改成32你会发现性能会下降很多很多很多很多的。m_screen_window = SDL_CreateWindow("skypark", iPos, iPos,skypark_ScreenWidth, skypark_ScreenHeight, SDL_WINDOW_OPENGL);
#elsem_screen_window = SDL_CreateWindow("skypark", iPos, iPos,skypark_ScreenWidth, skypark_ScreenHeight, SDL_WINDOW_SHOWN);
#endifif (m_screen_window == NULL) {return -3;}
#ifdef HAVE_OPENGLm_glcontext = SDL_GL_CreateContext(m_screen_window);int oglIdx = -1;int nRD = SDL_GetNumRenderDrivers();for(int i=0; i<nRD; i++){SDL_RendererInfo info;if(!SDL_GetRenderDriverInfo(i, &info)){if(!strcmp(info.name, "opengl")){oglIdx = i;}}}m_screen_renderer = SDL_CreateRenderer(m_screen_window, oglIdx,SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC);#elsem_screen_renderer = SDL_CreateRenderer(m_screen_window, -1,SDL_RENDERER_ACCELERATED);
#endifif (m_screen_renderer == NULL) {return -4;}g_SP.setScreen(skypark_ScreenWidth, skypark_ScreenHeight);
#elsem_screen_renderer = &g_SkRenderer;
#endifreturn 0;
}

第二步:

如何实现坐标的统一呢?

上一章我们已经实现了平台的坐标自适应。所有 我们当然希望在3D场景中,坐标也是自适应的。

如何做到呢?我们创建3D游戏场景的坐标顶点,取窗口的一半,就可以了。代码如下:

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

{//g_SkComm.log("[%s][%d]context=%d", __FILE__, __LINE__, context);glMatrixMode(GL_PROJECTION | GL_MODELVIEW);glLoadIdentity();//坐标统一,设置大小为窗口一半glOrtho(-g_iScreenWidthHalf, g_iScreenWidthHalf, g_iScreenHeightHalf,-g_iScreenHeightHalf, -1000, 1000);sk_gl_setOrtho(-g_iScreenWidthHalf, g_iScreenWidthHalf,g_iScreenHeightHalf, -g_iScreenHeightHalf, 0, 1);}

第三步:

在游戏绘图线程中,绘制2D和绘制3D相互结合:

主循环:

while (true) {SkEvent event;while (g_SkComm.poll_event(&event)) {g_SkGame.doEvent(&event);}Sint64 iCurTime = g_SkGameTimer.getGameMTime();while (g_SkGameTimer.m_siGameLastTime + g_SkGameTimer.siGameLoopMsec< iCurTime) {g_SkGameTimer.m_siGameLastTime += g_SkGameTimer.siGameLoopMsec;g_SkGameThread.run(g_SkGameTimer.m_siGameLastTime);}bool bShow = true;while (siShowBegin + g_SkGameTimer.siShowLoopMsec < iCurTime) {siShowBegin += g_SkGameTimer.siShowLoopMsec;if (bShow) {//g_SkGame.show(&g_SkShow);{Render();}g_SkShow.flush();bShow = false;}}//g_SkComm.log("[%s][%d]\n", __FILE__, __LINE__);//g_SkComm.msleep(3000);g_SkComm.msleep(SkGameTimer::siGameManLoopMsec);}

游戏内容绘制:

static void Render() {//绘制2D的游戏场景glPushMatrix();glLoadIdentity();glOrtho(-g_iScreenWidthHalf, g_iScreenWidthHalf, g_iScreenHeightHalf,-g_iScreenHeightHalf, -1000, 1000);g_SkGame.show(&g_SkShow);glPopMatrix();glRotatef(5.0, 1.0, 1.0, 1.0);//绘制3D的三角{float x = 30.0, y = 30.0;glBegin (GL_TRIANGLES);glColor3f(1.0, 0.0, 0.0);glVertex2f(x, y + 90.0);glColor3f(0.0, 1.0, 0.0);glVertex2f(x + 90.0, y - 90.0);glColor3f(0.0, 0.0, 1.0);glVertex2f(x - 90.0, y - 90.0);glEnd();}//绘制3D的立方体draw3D();}
static void draw3D() {static float color[8][3] = { { 1.0, 1.0, 0.0 }, { 1.0, 0.0, 0.0 }, { 0.0,0.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 0.0, 1.0, 1.0 }, { 1.0, 1.0, 1.0 },{ 1.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 } };static float cube[8][3] = { { 50, 50, -50 }, { 50, -50, -50 }, { -50, -50,-50 }, { -50, 50, -50 }, { -50, 50, 50 }, { 50, 50, 50 }, { 50, -50,50 }, { -50, -50, 50 } };/* Do our drawing, too. *///glClearColor(0.0, 0.0, 0.0, 1.0);//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glBegin (GL_QUADS);glColor3f(1.0, 0.0, 0.0);glVertex3fv(cube[0]);glVertex3fv(cube[1]);glVertex3fv(cube[2]);glVertex3fv(cube[3]);glColor3f(0.0, 1.0, 0.0);glVertex3fv(cube[3]);glVertex3fv(cube[4]);glVertex3fv(cube[7]);glVertex3fv(cube[2]);glColor3f(0.0, 0.0, 1.0);glVertex3fv(cube[0]);glVertex3fv(cube[5]);glVertex3fv(cube[6]);glVertex3fv(cube[1]);glColor3f(0.0, 1.0, 1.0);glVertex3fv(cube[5]);glVertex3fv(cube[4]);glVertex3fv(cube[7]);glVertex3fv(cube[6]);glColor3f(1.0, 1.0, 0.0);glVertex3fv(cube[5]);glVertex3fv(cube[0]);glVertex3fv(cube[3]);glVertex3fv(cube[4]);glColor3f(1.0, 0.0, 1.0);glVertex3fv(cube[6]);glVertex3fv(cube[1]);glVertex3fv(cube[2]);glVertex3fv(cube[7]);glEnd();//glMatrixMode (GL_MODELVIEW);//glRotatef(5.0, 1.0, 1.0, 1.0);
}

好了,到这里,我们就实现了,在2D的游戏场景里面添加了2个3D的元素。

效果图如下:(蓝色部分为游戏全部场景)

总结:

游戏分为三个层次:游戏逻辑层,游戏引擎层和软件渲染层。

游戏逻辑层用于控制游戏逻辑,如大鸡怪移动,玩家发子弹,陨石移动,判断输赢这类,这些事比较高层的。

中层的渲染引擎,提供较为底层的渲染支持,包括模型、图片、虚拟摄像机、灯光等等的对象。有一个渲染器,获取渲染对象来进行渲染。同时还获取了一些底层的支持。

最后一层就是软件渲染层,用CPU来实现了directx/openGL这些很底层的渲染API的功能,在CPU上模拟,实现最底层的3D渲染的逻辑。

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

SDL渲染3D动画图片相关推荐

  1. 首届实时渲染3D动画创作大赛结果公布,看大奖英伟达A6000花落谁家

    根据评选标准,经过评委组层层选拔,首届实时渲染3D动画创作大赛,最终获奖结果出炉啦. 本次赛事报名人数达212人,入围作品共40份,其中Omniverse组11份,专业组15份,学生组14份.在宣布最 ...

  2. 8款帅酷的HTML5/CSS3 3D动画、图片、菜单应用

    今天要给大家分享8款帅酷的HTML5/CSS3应用,它们中包括很酷的HTML5 3D动画应用,也包括实用的CSS3图片.菜单.进度条等插件,一起来看看吧. 1.HTML5 Canvas火焰燃烧动画 如 ...

  3. 小程序 mathjs渲染公式_Mac 3D渲染和动画制作----KeyShot 9 Pro

    KeyShot 9 Pro for Mac是应用在Mac上的一款3D渲染和动画制作软件,keyshot是您快速创建精彩视觉效果所需的一切.在实时3D渲染工作流程显示结果即时,缩短了创建逼真的产品拍摄的 ...

  4. KeyShot 11 Pro for Mac(3D渲染和动画制作) V11.3.2.2中文安装+更新内容

    keyshot11 pro for mac最新版已经全面升级,功能强大,操作好用,并且实现简体中文界面.keyshot 11是一款基于mac平台开发的的3D渲染工具,是非常强大的光线追踪与全域光渲染软 ...

  5. 简化3D渲染和动画制作丨上海道宁为您带来强大的3D渲染软件——KeyShot

    KeyShot是一款互动性的 光线追踪与全域光渲染程序 无需复杂的设定 即可产生相片般真实的3D渲染影像 上海道宁为您带来强大的KeyShot 旨在简化3D渲染和动画制作 软件包含了750+数千种预设 ...

  6. Mac电脑3D渲染和动画制作KeyShot Pro中文

    Keyshot是一个单机实时渲染应用程序.它可以快速.轻松地创神奇的渲染和动画效果,支持Mac和PC上的多种3D文件格式.它可以实时查看效果,使用方便,可以更快地创造视觉效果:材料超越了材料的外观,为 ...

  7. SDL开发笔记(三):使用SDL渲染窗口颜色和图片

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  8. 3d动画用云渲染靠谱吗?

    3d动画是一种利用计算机技术制作的动画形式,它可以模拟真实世界的物体和场景,创造出各种惊人的效果和视觉体验.3d动画广泛应用于影视.游戏.广告.教育等领域,成为当今最流行的艺术表现形式之一.据统计,2 ...

  9. 2023超级3D动画渲染工具——key shot“底纹云渲染”

    KeyShot是Luxion的3D渲染动画工具,属于交互式光线跟踪和全局照明渲染器. 与KeyShot一起使用的软件包括3dsMax.Maya.Rhino.NX和C4D. 它可以方便快捷地创建3D模型 ...

  10. 3D动画渲染软件 KeyShot 11 Pro for mac

    KeyShot 11 Pro for Mac是一款以先进的技术算法.全局光照领域的研究和Luxion内部研究为基础而开发,可以帮助用户轻松进行各种3D图像的渲染的3D动画渲染软件,keyshot11 ...

最新文章

  1. 雷林鹏分享:MySQL 及 SQL 注入
  2. 17行代码AC——习题5-3 卡片游戏(Throwing cards away I, UVa 10935,约瑟夫环)_解题报告
  3. 信息学奥赛一本通(1217:棋盘问题)
  4. c#编程指南(四) 组元(Tuple)
  5. java c 引用区别_Java的引用c++的引用和C指针的区别
  6. http://blog.sina.com.cn/s/blog_6145ed810102vr8k.html
  7. Swift游戏实战-跑酷熊猫 12 与平台的碰撞
  8. 1.1.27 word表格里的文字不显示
  9. JavaScriptjQuery.检测相等和存在
  10. jenkind + git + mave + shell + tomcat
  11. win10 linux子系统开启桌面显示
  12. 看看MySQL几种主流备份方案的优缺点
  13. 【生活相关】一(坚持)
  14. Python控制语句执行流程
  15. 神经网络机器翻译总结
  16. 安卓root后查看WiFi密码
  17. 配置Kafka的参数auto.offset.reset时earliest和latest的区别
  18. 小甲鱼python入门笔记(三)
  19. java标识命名服务_阿里巴巴Java开发规约第一章编程规约-命名风格篇
  20. Bug随手记----关于java.lang.IllegalStateException: The following classes could not be excluded because the

热门文章

  1. 《梁宁·产品思维30讲》
  2. 可靠性工程师是做什么的?需要哪些能力?
  3. 惠普服务器故障代码_HP服务器常见代码
  4. 【万人围观】20位著名作家,100句惊艳了时光的名句
  5. CISSP-OSG-每章小结梳理
  6. 计算机应用基础个人简历制作,计算机应用基础信息技术基础《项目3-4制作个人简历》教案...
  7. 7714天,王小川正式卸任搜狗CEO!网友:别了。。。
  8. 015 PHP中的曲苑杂坛
  9. 【微信篇】取证遇到微信昵称、微信号、微信账号、微信ID一次性区分清楚
  10. 物联网应用之远程控制