从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;
      }
    }
  }
}


相关文章
|
6天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
【10月更文挑战第36天】本文将引导您探索Node.js的世界,通过实际案例揭示其背后的原理和实践方法。从基础的安装到高级的异步处理,我们将一起构建一个简单的后端服务,并讨论如何优化性能。无论您是新手还是有经验的开发者,这篇文章都将为您提供新的视角和深入的理解。
|
11天前
|
Web App开发 存储 JavaScript
深入浅出Node.js后端开发
【10月更文挑战第31天】本文将引导你进入Node.js的奇妙世界,探索其如何革新后端开发。通过浅显易懂的语言和实际代码示例,我们将一起学习Node.js的核心概念、搭建开发环境,以及实现一个简单但完整的Web应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇通往高效后端开发的大门。
|
12天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
【10月更文挑战第30天】本文将通过一个Node.js的简单示例,引导你进入Node.js的世界。我们将从基础概念讲起,然后一步步深入到代码实现,最后总结Node.js在后端开发中的优势和应用场景。无论你是前端开发者还是后端新手,这篇文章都将为你打开一扇了解Node.js的大门。
25 2
|
25天前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
9天前
|
Web App开发 JavaScript 前端开发
探索后端开发:Node.js与Express的完美结合
【10月更文挑战第33天】本文将带领读者深入了解Node.js和Express的强强联手,通过实际案例揭示它们如何简化后端开发流程,提升应用性能。我们将一起探索这两个技术的核心概念、优势以及它们如何共同作用于现代Web开发中。准备好,让我们一起开启这场技术之旅!
23 0
|
1月前
|
Web App开发 存储 JavaScript
深入浅出Node.js后端开发
【10月更文挑战第7天】本文将带你进入Node.js的世界,从基本概念、环境搭建到实际案例,逐步深入探索Node.js在后端开发中的应用。我们将通过一个简单的在线聊天室项目,学习如何利用Node.js进行网络编程和数据处理,让你对Node.js有更全面的认识。
17 3
|
1月前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
【10月更文挑战第4天】本文将带你走进Node.js的世界,从基础的搭建到高级的应用,一步步揭示Node.js的强大与便捷。我们将通过实际的代码示例,让你在轻松的氛围中学习并掌握Node.js,开启你的后端开发之旅。
|
1月前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
【10月更文挑战第3天】在数字化时代的浪潮中,后端开发作为技术架构的核心,承载着数据处理和业务逻辑的重任。Node.js以其非阻塞I/O、事件驱动的特性,在众多后端技术中脱颖而出,成为高效、轻量级后端解决方案的代名词。本文将带领读者深入理解Node.js的精髓,从基础概念到实战应用,逐步揭示如何利用Node.js构建高性能的后端服务。通过浅显易懂的语言和实际案例分析,我们将探索Node.js在现代后端开发中的应用及其带来的变革。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往Node.js世界的大门,让你领略其背后的哲学和技术之美。
|
16天前
|
JavaScript 前端开发 安全
深入浅出Node.js后端开发
【10月更文挑战第26天】在这篇文章中,我们将一起探索Node.js的奇妙世界。不同于传统的Java或Python,Node.js以其异步非阻塞I/O和事件驱动的特性,在后端开发领域独树一帜。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和思考。从基础概念到实际应用,我们一步步深入Node.js的世界,让你了解其不仅仅是JavaScript运行环境那么简单。
|
1月前
|
Web App开发 JSON JavaScript
深入浅出:Node.js后端开发入门与实践
【10月更文挑战第4天】在这个数字信息爆炸的时代,了解如何构建一个高效、稳定的后端系统对于开发者来说至关重要。本文将引导你步入Node.js的世界,通过浅显易懂的语言和逐步深入的内容组织,让你不仅理解Node.js的基本概念,还能掌握如何使用它来构建一个简单的后端服务。从安装Node.js到实现一个“Hello World”程序,再到处理HTTP请求,文章将带你一步步走进Node.js的大门。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往后端开发新世界的大门。