Simple2D-26 Simple2D 最后的工作,开发结束

  开始的时候打算将 Simple2D 做成一个库的,但现在没有那个功夫了。

  要渲染顶点数据,就必须将渲染函数放置到 glClear( ) 函数和 SwapBuffers( ) 函数之间,但又不希望开发时涉及 Simple2D 的内部。使用回调函数进行刷新回调和渲染回调,需要时添加相应的回调函数即可。

  假设使用 Simple2D 开发一个游戏,更新操作和渲染操作都在自定义的类 GameApplication (类名是自定义的,这里使用的是 GameApplication)中完成。GameApplication 有两个函数,分别是 Update( ) 函数和 Draw( ) 函数,更新的操作在 Update( ) 函数中实现,渲染的操作在 Draw( ) 函数中实现。

  那么 Simple2D 需要实例化一个不知类名的类,并调用该类的方法。这里通过类模板和多态的方法实现。Application 是一个抽象类,提供 Update( ) 和 Draw( ) 的虚方法。GameApplication 继承 Application 并实现 Update( ) 和 Draw( ) 方法,这样 Simple2D 可以通过基类来调用子类的方法:

    class Application
    {
    public:
        Application() {}
        virtual ~Application() {}

        virtual void Update(float dt) = 0;
        virtual void Draw(GraphicsContext* gc) = 0;
    };
  class GameApplication : public Application
  {
  public:
      void Update(float dt) {}
      void Draw(GraphicsContext* gc) {}
  };
    Application app = new GameApplication;
    app->Update(0);
    app->Draw(nullptr);

  ApplicationInstance 是一个模板类,用来实例化自定义类

    //-------------------------------------------------------------------
    // ApplicationPrivate
    //-------------------------------------------------------------------
    class ApplicationInstancePrivate
    {
    public:
        ApplicationInstancePrivate();
        virtual ~ApplicationInstancePrivate();

        virtual std::unique_ptr<Application> Create() = 0;
    };

    //-------------------------------------------------------------------
    // ApplicationInstance
    //-------------------------------------------------------------------
    template<class ApplicationClass>
    class ApplicationInstance : public ApplicationInstancePrivate
    {
    public:
        std::unique_ptr<Application> Create()
        {
            return std::unique_ptr<Application>(new ApplicationClass());
        }
    };

  当 Simple2D 调用 ApplicationInstance 的 Create( ) 方法时实例化自定义类并返回该类的对象指针,ApplicationInstance 需要在外部实例化,模板参数为自定义类名:

ApplicationInstance<GameApplication> app;

  当 ApplicationInstance  实例化时需要将实例的对象指针传递给 Simple2D 使用:

namespace Simple2D
{
    static ApplicationInstancePrivate* app_instance = nullptr;

    ApplicationInstancePrivate::ApplicationInstancePrivate()
    {
        app_instance = this;
    }

    ApplicationInstancePrivate::~ApplicationInstancePrivate()
    {
    }
}

  这里说明了为什么 ApplicationInstance 需要继承 ApplicationInstancePrivate 抽象类,因为 ApplicationInstance 是一个模板类,要保存模板类实例的对象指针需要使用这种方法。当 Simple2D 有了 ApplicationInstance 的对象指针,就可以通过该对象的 Create( ) 函数实例化 GameApplication 并调用该类的方法进行更新和渲染操作了:

std::unique_ptr<Application> app = app_instance->Create();

  Simple2D 还提供 Engine 对象来进行内部状态的设置,例如帧率、窗口标题、窗口大小、背景擦除颜色以及 ImGui 的中文支持的开关。这是一个单例类,可以在任意地方调用。

  最后是一个 Simple2D.h 的头文件,引出 Simple2D 内部的文件:

#pragma once

#include <Core\Log.h>
#include <Core\Math.h>
#include <Core\Event.h>
#include <Core\Engine.h>
#include <Core\Common.h>
#include <Core\Random.h>
#include <Core\Program.h>
#include <Core\Painter.h>
#include <Core\Renderer.h>
#include <Core\PathHelper.h>
#include <Core\TextRender.h>
#include <Core\TexturePool.h>
#include <Core\RenderWindow.h>
#include <Core\EventDispatcher.h>
#include <Core\GraphicsContext.h>
#include <Core\StandardProgram.h>

#include <Framework\Tween.h>
#include <Framework\Signal.h>
#include <Framework\Sprite.h>
#include <Framework\Variant.h>
#include <Framework\TimeLine.h>
#include <Framework\Action.h>
#include <Framework\Noise.h>
#include <Framework\Gui.h>

#include <Particle\ParticleEffect.h>
#include <Particle\ParticleSystem.h>
#include <Particle\ParticleEmitter.h>

#include <External\ImGui\imgui.h>
#include <External\ImGui\Dialog.h>
#include <External\Tinyxml\tinyxml2.h>

  所以使用 Simple2D 只需要引入两个头文件 Application.h 和 Simple2D.h 即可。

  结束语

  cocos2d-x 是我第一个学习的游戏引擎,Simple2D 的粒子系统和动作系统的灵感来自 cocos2d-x。之后,产生了自己实现一个游戏引擎的想法。hge 是一个开源的 2D 游戏引擎,使用的是 directx9 进行渲染,通过学习 hge 源码学会了 diectx9。但是,发现 directx9 已经过时了。后来找到 ClanLib 这个游戏引擎,于是花了一两个月的时间学习 ClanLib 的源码,几乎把 ClanLib 的源码敲了一半,最后因为太难就放弃了。不过也有收获,那就是 directx11,第一次接触可编程渲染流水线。

  虽然以前也想学 OpenGL,但是找不到好的教程,就放弃了。但是前一段时间,无意中发现了一个网站 LearnOpenGL CN,这是一个很好的学习 OpenGL 的网站。在学习 OpenGL 之后,就迫不及待的使用 OpenGL 来做一个项目,那就是 Simple2D。

  Simple2D 是在 4 月份开始的一个项目,为此写了一系列的文章,来记录开发 Simple2D 的点点滴滴。开始有很大的热情,全身心都投入到 Simple2D 中。但最终敌不过时间,随着时间的推移,刚开始的热情都没有了,后来对 Simple2D 感到烦躁,虽然想中途放弃的,但还是坚持了下来。前后使用了 4 个月的时间,总算完成了。虽然 Simple2D 是一个比较简单的项目,但也是我第一个有头有尾的的项目。最后,使用 Simple2D 开发了 2048 这个游戏,来证明 Simple2D 也是可以用的。

  关于游戏 2048 的实现就不打算写文章了,感兴趣的可以看 Game2048 的源码实现。如果对 OpenGL 或开发小游戏感兴趣,但又不知道怎么做,Simple2D 这系列的文章获取可以帮到你。从 OpenGL 环境的搭建、简单渲染系统的实现、简单游戏开发框架以及 2048 游戏的实现都有比较详细的介绍。按照开始的设想,会在 Simple2D 添加上物理引擎 Box2D,除了 OpenGL 渲染方式还支持 DX11 的方式,但没有那个热情了。

  源码下载:Simple2D-20.rar

时间: 2024-10-16 06:57:32

Simple2D-26 Simple2D 最后的工作,开发结束的相关文章

还有几十分钟今年工作就结束了,对今年做个简单的总结吧。

今天真正意义上工作了一年,从以前在成都的四川日报招标比选网,到如今的搜房.自己也蜕变了很多. 项目上:在四川日报招标比选网,完成的找项导,招财宝,四川日报招标比选平台.现在想起来那家公司真的是非常不错呢.会发很多东西,过节总是会给我们惊喜.记得我遇到困难的时候项目经理会陪着我加班,真的很感激他引我上手,还有电影卡购物卡什么的,除了工资低一点其他的真的挺不错的.如果不是我那会有哪种闯劲的话,我可能真的舍不得离开那里.记得离职的时候我跟老大聊了半天,老大叫我什么时候想回去,公司随时给你欢迎.虽然只是

Cocos2d-x 3.2 大富翁游戏项目开发-单机开发结束

今天找了下资源图片,把其余2个关卡地图做完了,包括夏日海滩,本来想找空中花园的地图,可是搜了半天没找到好的图片,就改成了冰天雪地的地图. 代码基本没有什么大的变化,大家一看就明白了,不再解释.(可以用beyondcompare同前期代码比对着看) 这样单机部分到此就结束了,感谢大家的支持和鼓励,后期继续编写对战版本,请关注..... 点击下载apk 点击下载代码

11.8 1.5.1开发结束

1.5.1合并了订单和充值单. 最大的变化时创建/编辑充值单,不再关联订单,而是关联合同,也不再从订单取相关信息,改为用户自行选择.这边最让我纠结的是下单产品和下单账户的联动. 在这块研究了三四天,尤其是编辑时,带出代理商或者直客时,取到当前下单账户,并且渲染出来,而创建时是选择客户后进行联动取数据,其实没有差别, 但是编辑时获取下单账户总是慢于渲染下单账户,因此下单账户一直为空. 于是想把渲染下单账户这个函数放在获取下单账户方法里面进行,但是这样一旦选择代理商/直客就会渲染下单账户. 可是实际

工作周记 - 第九周 (2016/07/18 - 2016/07/22) 这么快就结束了吗?这才真正开始呢!

其实后台开发已经接近尾声,目前后台团队作为辅助参与到app的接口调试中 当然接口调试会发生很多莫名的情况,需要辅助解决 简述一下遇到的问题: 1.手机号验证规则,老的手机验证正则表达式是不支持新号的,现在运营商开放了很多新号,导致规则失效,比如新增的 147 开头的手机号就验证不了,还好有同事新换手机号... 2.配置hibernate验证bean到springmvc中的时候需要注意request和bean的w位置,如下: 这2个位置需要互换,如下为正确 如果不这样,那么在发送验证出错的情况会发

微信公众账号开发教程

微信公众账号开发教程 一.第1篇-引言 本文转载来自柳峰老师的博客,在这里非常感谢柳峰老师的分享和贡献! 内容方面,大概会涉及到: 1)前沿知识:微信公众帐号的分类.两种模式各自的特点和区别.开发模式的配置使用等: 2)API中各类消息的使用(我已经对api进行封装并打成了jar包,到时候会考虑分享出来): 3)微信公众帐号开发中的小技巧(如换行.通过代码发送表情.屏幕飘雪花.表情的接收识别.在Android和iOS上表现不一致等等): 4)与业务系统对接的方法(链接.短信等,除了技术讲解还会做

iOS开发 非常全的三方库、插件、大牛博客等等

UI 下拉刷新 EGOTableViewPullRefresh- 最早的下拉刷新控件. SVPullToRefresh- 下拉刷新控件. MJRefresh- 仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能.可以自定义上下拉刷新的文字说明.具体使用看"使用方法". (国人写) XHRefreshControl- XHRefreshControl 是一款高扩展性.低耦合度的下拉刷新.上提加载更多的组件.(国人写) CBStoreHo

iOS开发之聊天模块--内容保存逻辑实现

需求详解: 在实际开发中,有可能是在后期优化的时候,会有这么需要优化的需求:聊天输入框保存之前输入的文本,提高用户的良好体验. 在聊天模块中,用户可能会在输入框输入若干字符,但是没有点击发送就点击退出聊天,或者要点击用户头像确认用户的信息,或者比如需要向好友发送另一个好 友的ID不得不暂时退出当前好友聊天界面跳转找到别的界面找ID,然而当前聊天输入框也已经输入好了若干字符,用户当然不希望退出之后就删除之前输入好的 文字.所以这里就需要暂时保存用户输入好的但是没有发送出去的字符串. 但是,还需要满

stc89c52开发板遥控器解码 红外线发射 内置 eeprom 存储 串口显示编码

单片机,大概三年前,就买了一本 <爱上单片机> 最后就学会,用面包板了,编程书上基本没讲. 看原理图,看时序图,看数据手册, 都没讲. 而且书上自带的代码写的很烂. 1,缩近控制不好 2,命名混乱 3,做if 的时候 不变的常量放在左侧,这是很基本的约定 ... 最后,还是什么也没有学会. 直到去年,开始学 ARM 了. 学完了 ARM 前面发的(s3c2440)以后, 在回头看单片机,发现单片机真是,简单的不得了! 但是也发现,单片机,不如 ARM 功能强大.速度也慢.很多控制器,没有,要用

iOS开发之资料收集

github排名:https://github.com/trending, github搜索:https://github.com/search. 此文章转自github:https://github.com/Tim9Liu9/TimLiu-iOS UI 下拉刷新 EGOTableViewPullRefresh- 最早的下拉刷新控件. SVPullToRefresh- 下拉刷新控件. MJRefresh- 仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者