基类是设计模式中的模板方法模式,主要存放了一些通用的代码。

当时使用了U2D和U3D把2D UI和3D UI给区分开了,基类里面存放的主要的是本地矩阵和世界矩阵,角度、锚点、缩放、z顺序等。

Node.h

#pragma oncenamespace U2D
{class CNode;class CUI;class Cobject;class CAnimate;class CAnimateEx;class CAnimation;enum MovementEvent;typedef void (CNode::*event_selector)(CUI*);typedef void (CNode::*collider_selector)(int, Cobject*, int);//前面的int是自己的第几个碰撞区,中间的是对方的指针,后面的int是对方的第几个碰撞区typedef void (CNode::*animate_selector)(CAnimate*, MovementEvent);typedef void (CNode::*animation_selector)(CAnimation*, MovementEvent, char *);typedef void (CNode::*animateEx_selector)(CAnimateEx*, MovementEvent, int);//后面的int应该是索引在第几张图片class CNode{friend class CScene;protected:CNode *parent;   //父节点public:Matrix3 local_matrix; //自身矩阵Matrix3 world_matrix; //世界矩阵sColor local_color; //自身颜色sColor world_color; //世界颜色Vector2 pos;        //坐标偏移Vector2 scale;        //缩放Vector2 anchor; //锚点float angle;    //角度bool visible;   //是否可见bool flip;        //是否翻转int zOrder = 0;bool auto_sort = false;//setvoid setParent(CNode *parent) { this->parent = parent; }void setVisible(bool visible) { this->visible = visible; }void setAlpha(BYTE alpha) { local_color.a = (float)alpha / 255; }void setPosition(float x, float y) { this->pos.x = x; this->pos.y = y; }void setPosition(Vector2 p) { this->pos = p; }void setX(float x) { pos.x = x; }void setY(float y) { pos.y = y; }void setScale(float sx, float sy) { this->scale.x = sx; this->scale.y = sy; }void setFilp(bool flip) { this->flip = flip; }void setColor(BYTE r, BYTE g, BYTE b) { local_color.r = (float)r / 255; local_color.g = (float)g / 255; local_color.b = (float)b / 255; }void setAnchor(float ox, float oy) { this->anchor.x = ox; this->anchor.y = oy; }void setAngle(float angle) { this->angle = angle; }//getint getZorder() { return zOrder; }CNode*getPraent() { return parent; }sColor &getWorldColor() { return world_color; }Matrix3 &getWorldMatrix() { return world_matrix; }sColor &getlocalColor() { return local_color; }Matrix3 &getlocalMatrix() { return local_matrix; }float getScaleX() { return scale.x; }//水平翻转比值float getScaleY() { return scale.y; }//垂直翻转比值BYTE getAlpha() { return local_color.a * 255; }Vector2 getPosition() { return pos; }float getAngle() { return angle; }//boolbool isVisible() { return visible; }bool isFlip() { return flip; }void setZorder(int z) { this->zOrder = z; this->auto_sort = false; }CNode();virtual ~CNode() {};};class CElement :public CNode{public:virtual void draw() {};virtual RECT getBoundBox() = 0;virtual ~CElement() {};};//碰撞aabbstruct COLLIDER//这个是对象和对象的碰撞{
#define MaxHitArea 5    //最多只有5个碰撞点CAnimateEx *animEx;  //动画加强版的指针struct{int hitIndex;//碰撞的索引RECT hitRect;//碰撞的范围}lastAabb[MaxHitArea], nowAabb[MaxHitArea]; //碰撞点的数组,最多只有5个,不然效率低了int lastAabbNum;   //上一个碰撞的编号int nowAabbNum;       //现在的碰撞编号struct{int hitIndex;bool lastIn;bool nowIn;}hitQueue[MaxHitArea];int hitQueueNum;collider_selector listener_enter; //碰撞监听[进入]collider_selector listener_exit;//碰撞监听[离开]COLLIDER(CAnimateEx *animEx, collider_selector fun_enter, collider_selector fun_exit);void GenerateHitQueue();static bool Intersects(RECT &a, RECT &b){if (a.left<b.right && a.right>b.left &&a.top<b.bottom && a.bottom>b.top){return true;}return false;}};}

Node.cpp

#include "Engine.h"namespace U2D
{CNode::CNode(){scale = Vector2(1.0, 1.0);anchor = Vector2(0.5, 0.5);pos = Vector2(0, 0);visible = true;flip = false;angle = 0;if (CPlateForm::getInstance()->getAutoSort() == true)auto_sort = true;elseauto_sort = false;}COLLIDER::COLLIDER(CAnimateEx *animEx, collider_selector fun_enter, collider_selector fun_exit){this->animEx = animEx;listener_enter = fun_enter;listener_exit = fun_exit;lastAabbNum = 0;nowAabbNum = 0;hitQueueNum = 0;}void COLLIDER::GenerateHitQueue(){if (lastAabbNum > nowAabbNum){hitQueueNum = lastAabbNum;for (int i = 0; i < hitQueueNum; i++){hitQueue[i].hitIndex = lastAabb[i].hitIndex;hitQueue[i].lastIn = true;if (i < nowAabbNum)hitQueue[i].nowIn = true;elsehitQueue[i].nowIn = false;}}else{hitQueueNum = nowAabbNum;for (int i = 0; i < hitQueueNum; i++){hitQueue[i].hitIndex = nowAabb[i].hitIndex;hitQueue[i].nowIn = true;if (i < lastAabbNum)hitQueue[i].lastIn = true;elsehitQueue[i].lastIn = false;}}}}

从0开发游戏引擎之引擎基础组件-Node类实现相关推荐

  1. 06.JavaSwing(基础组件——JLabel类)

    软件界面是软件和用户之间的交流平台,而组件则是绘制软件界面的基本元素,是软件和用户之间的交流要素. 一.概述 JLabel组件用来显示文本和图像,可以只显示其一种,也可以同时显示.JLabel类提供了 ...

  2. 从0开发游戏引擎之引擎Win32平台的Platform类实现

    这个引擎是基于win32架构写的, Platform可以理解成是整个引擎的入口.控制着引擎的整个生命周期,内部主要完成了openGL.win32窗口句柄的初始化:键盘鼠标事件分发:主循环控制.关闭程序 ...

  3. 从0开发游戏引擎之游戏引擎中2D序列帧动画控制器的实现

    这种序列帧动画要求每一帧的宽高必须一一致,否则动画播起来会出问题. 需要的图片类似图1.1 会把所有的动作拼接到一张图上,这样做也是为了节省内存和减少DrawCall,切换动作的时候只需要重新计算图片 ...

  4. cocos2d-x3.0开发游戏部分机型(显卡类型)闪退问题

    拓展cocos2d-x3.0底层支持etc图片格式,把游戏中的模型使用etc格式的图片替换. 原先可以运行在联想(lenovo S880,显卡类型是PowerVP SGX 531)的机器上,但是换成e ...

  5. 07.JavaSwing(常用基础组件——JButton类)

    一.概述 JButton组件是最简单的按钮组件,在按下和释放2个状态之间进行切换,可以通过捕捉按下并释放的动作执行一些操作,从而完成和用户之间的交互. 二.构造函数 JButton();//创建不带有 ...

  6. 元宇宙开发:你在虚幻引擎中的第一个虚拟现实游戏

    了解如何开发零编程背景的Oculus Quest游戏 你会学到什么 为Oculus Quest构建应用程序 设计和开发虚拟现实游戏 在虚幻引擎中工作 使用材料和纹理 优化内容,实现移动和虚拟现实游戏的 ...

  7. 用函数式编程,从0开发3D引擎和编辑器(三):初步需求分析

    大家好,本文介绍了Wonder的高层需求和本系列对应的具体功能点. 确定Wonder高层需求 业务目标 Wonder是web端3D开发的解决方案,包括引擎.编辑器,致力于打造开放.分享.互助的生态. ...

  8. GJM : 各大开发游戏引擎

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  9. 王楠——海外华人程序员视角:解密移动游戏开发与Unity 4引擎特性

    海外华人程序员视角:解密移动游戏开发与Unity 4引擎特性 发表于2012-09-07 17:24| 12534次阅读| 来源CSDN整理| 0 条评论| 作者杨依帆 游戏开发Unity游戏引擎王楠 ...

最新文章

  1. HDU1407 测试你是否和LTC水平一样高 暴力、二分、hash
  2. 如何查看数据库索引的利用率?
  3. DataGrid添加CheckBox(下拉列表)
  4. Atitit 常见面试问题回答法 原则与细则 目录 1.1. 1、工作多久了?为什么离职? 1 1.2. 、自我评价 1 1.3. 问你有什么缺点 2 1.4. 4、理想薪资 2 1.5. 职业规
  5. 手机号码归属地查询,查询手机号码归属地
  6. 网站服务器 发包,如何实现CentOS不停向外发包_网站服务器运行维护,CentOS
  7. macOS 富士施乐打印机扫描仪「Fuji Xerox Scanner B.app」无权限问题
  8. 项目杂识-FOV(视场角)
  9. 百度地图api php开发教程,百度地图API使用方法详解,api使用方法详解_PHP教程
  10. [干货分享]硬件测试快速入门你必须了解的知识!
  11. 某站弹幕抓取,视频,评论......
  12. 解决ViVO 手机安装APP失败问题
  13. 微信小程序登录 获取头像不显示
  14. 一位台湾学校校长的演讲
  15. 计算机专业C语言编程学习重点:指针化难为易
  16. getsockopt( )函数详解
  17. docker for mysql
  18. 蓝桥18年JavaC组:字母阵列
  19. 记录几个 Android x86 系统的官网
  20. java微信公众号开发教程

热门文章

  1. Expression is not assignable
  2. 【附源码】Python计算机毕业设计人脸识别考勤系统
  3. 用ffmpeg修改MP4文件头信息,使其支持流式加载及播放
  4. 在vue页面监听中如何修改子元素的样式
  5. 内存整理的原理是什么?
  6. WSL2迁移与硬盘读写测试
  7. mysql原理、索引、优化-【公司内部培训】
  8. 详细理解HashMap数据结构,太齐全了!
  9. Dijkstra——最短路径路由算法java实现
  10. RFID-MFRC522射频识别模块,S50卡M1