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

简介: 从0开发游戏引擎之引擎基础组件-Node类实现

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


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


Node.h


#pragma once
namespace 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;
    //set
    void 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; }
    //get
    int 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; }
    //bool
    bool 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() {};
  };
  //碰撞aabb
  struct 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;
    else
      auto_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;
        else
          hitQueue[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;
        else
          hitQueue[i].lastIn = false;
      }
    }
  }
}


相关文章
|
5月前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
128 1
|
2月前
|
JavaScript 前端开发 数据可视化
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
68 2
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
|
3月前
|
JavaScript 前端开发 jenkins
抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目
本文探讨了在不依赖Node和VSCode的情况下,仅使用记事本和浏览器开发一个完整的Vue3前端项目的方法。通过CDN引入Vue、Vue Router、Element-UI等库,直接编写HTML文件实现页面功能,展示了前端开发的本质是生成HTML。虽然日常开发离不开现代工具,但掌握这种基础方法有助于快速实现想法或应对特殊环境限制。文章还介绍了如何用Node简单部署HTML文件到服务器,提供了一种高效、轻量的开发思路。
|
4月前
|
Web App开发 JavaScript 前端开发
Node.js开发
Node.js开发
115 13
|
5月前
|
存储 JavaScript 前端开发
深入浅出Node.js后端开发
在数字化时代的浪潮中,后端开发作为连接用户与数据的桥梁,扮演着至关重要的角色。本文将以Node.js为例,深入探讨其背后的哲学思想、核心特性以及在实际项目中的应用,旨在为读者揭示Node.js如何优雅地处理高并发请求,并通过实践案例加深理解。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和思考。
|
5月前
|
Web App开发 开发框架 JavaScript
深入浅出Node.js后端开发
在这篇文章中,我们将一起探索Node.js的奇妙世界。无论你是刚接触后端开发的新手,还是希望深化理解的老手,这篇文章都适合你。我们将从基础概念开始,逐步深入到实际应用,最后通过一个代码示例来巩固所学知识。让我们一起开启这段旅程吧!
|
5月前
|
Web App开发 开发框架 JavaScript
深入浅出Node.js后端开发
本文将带你领略Node.js的魅力,从基础概念到实践应用,一步步深入理解并掌握Node.js在后端开发中的运用。我们将通过实例学习如何搭建一个基本的Web服务,探讨Node.js的事件驱动和非阻塞I/O模型,以及如何利用其强大的生态系统进行高效的后端开发。无论你是前端开发者还是后端新手,这篇文章都会为你打开一扇通往全栈开发的大门。
|
5月前
|
JavaScript 前端开发 API
深入理解Node.js事件循环及其在后端开发中的应用
本文旨在揭示Node.js的核心特性之一——事件循环,并探讨其对后端开发实践的深远影响。通过剖析事件循环的工作原理和关键组件,我们不仅能够更好地理解Node.js的非阻塞I/O模型,还能学会如何优化我们的后端应用以提高性能和响应能力。文章将结合实例分析事件循环在处理大量并发请求时的优势,以及如何避免常见的编程陷阱,从而为读者提供从理论到实践的全面指导。
|
4月前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
本文将带领读者从零基础开始,一步步深入到Node.js后端开发的精髓。我们将通过通俗易懂的语言和实际代码示例,探索Node.js的强大功能及其在现代Web开发中的应用。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的见解和技巧,让你的后端开发技能更上一层楼。
|
5月前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
本文将带你走进Node.js的世界,从基础到进阶,逐步解析Node.js在后端开发中的应用。我们将通过实例来理解Node.js的异步特性、事件驱动模型以及如何利用它处理高并发请求。此外,文章还会介绍如何搭建一个基本的Node.js服务器,并探讨如何利用现代前端框架与Node.js进行交互,实现全栈式开发。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
161 4

热门文章

最新文章