• 个人存储不同类型的对象有一些想法的碰撞检测


      (声明:在下面是基于这样的思想的对象C++和2D图像)

       代码量较小的程序中。我们可能会直接把全部须要的对象的碰撞检測封装在类其中,然后在

    角色移动等动作的渲染过程中进行自己主动的碰撞检測。但这种做法有个弊端,那就是我们已知了需求,

    而我们假设须要扩展程序,则须要不断的在类内部进行加入。这种做法显然破坏了程序的扩展性,

    使得代码难以使用,因此我们须要该角色的类对外提供一个接口,利用这个接口,将那些须要进行

    碰撞检測的对象进行检測,然后进行角色的移动等动作的渲染。

       是这里有一个问题,由于碰撞检測的对象并非唯一的。特别是自己定义的怪物类对象,地图对象等。

    更是不尽同样的。假设我们为每一个对象都提供一个多态版本号的对外碰撞检測接口,那么随着须要碰撞检測

    类型对象的增多。这些多态函数的数目也会增多,这样一来会使程序更加的累赘,二来会不断的改动角色

    类中碰撞检測的内容。使得角色类的通用型。可扩展性和简洁性减少。这种做法并不比原来好上多少,

    因此我们须要换个思路。

       个更有效的做法是在类内部存储一种作为容器的数据结构,然后在该类的public其中提供获得该数据

    容器对象的接口,然后在外部环境中,将须要碰撞检測的对象不断插入到该容器数据结构中。而在该角色

    类内部,则通过碰撞检測函数不断遍历该容器中的元素,从而实现碰撞检測的功能。这样一来我们就能将

    角色类从纷繁复杂中分离出来,从而实现更加模块化的功能。

       是这里依然有一个问题没有解决,那就是容器中须要存储不同类型的数据结构对象来提供碰撞检測。

    对于此,我们能够这样来处理。我们并不存储太过详细的对象,如怪物类,地图类等。我们仅仅存储一些碰撞

    检測中用到的比較本源的东西,比如矩形。圆形,三角形对象等,而在那些比較详细的对象中统一提供这些

    碰撞检測区域的接口。利用这样的方法。我们能够把碰撞检測的类型减缩到个位数,使原来复杂的问题变的

    简单化了。

    但不过这样还是不够的,假设我们分别用矩形。圆形,三角形的容器存储,那么我们就须要

    提供三个对外的接口来分别接收不同类型的对象,这种做法似乎可行,但我依旧觉得这不够友好和简洁,

    我希望用一个容器来存储这些不同类型的对象。

       開始我想自己写这么一个数据结构的容器来存储。可是基于每一个对象所占的内存是不同的,我们怎样来

    让该容器来进行寻址定位呢?保存数据结构的大小可能是一个好的方法,但我想更好的方法是仅仅在该容器中

    保存各种对象指针,由于指针的大小仅仅是由操作系统的寻址能力和编译器来决定的,这意味着在同一台机器

    上在一个编译平台下各种数据类型的指针大小都是同样的,因此假设我们使用指针则能够使容器非常快的寻址

    到我们须要的元素。

       为想到了指针,于是我就立即联想到了void*类型,假设我们使用一个void*类型的容器,不就意味着我们

    能够用该容器来存储全部数据类型的指针了吗?这似乎是一个非常好的思路,可是我们在该角色类内部怎样将其

    转化为原来详细的类型以供调用呢?这就须要我们的容器在插入的时候同一时候额外提供一个表示该数据类型的索

    引,这样我们就能通过该索引来推断出我们所碰撞检測的对象是什么了!并且还不须要我自己来实现。在STL

    其中便提供了这种容器!。!


    详细方法我们能够这样做

    1.首先我们定义一种枚举类型来提供不同数据类型的索引號。

    enum CollType
    {
    	COLL_TYPE_RECT = 0,
    	COLL_TYPE_CIRCLE = 1,
    	COLL_TYPE_TRIANGLE = 2
    };

    2.然后在角色类中声明一种将CollType和void*构成pair用来作为双向链表list的元素,比如:

    typedef std::list<std::pair<CollType,void*>> CollListType;
    CollListType mCollList;

    这样一来,我们就能用mCollList来存储不同碰撞区域类型的对象来在类内部进行碰撞检測了。这里之所以选用

    std::list双向链表而不用顺序表的原因有两点:

    #1.插入和删除的速度很快,由于我们可能在之后的一段时间内对某个对象不进行碰撞检測。因此会有频繁的删除。

    #1.在碰撞检測时,在算法没有优化的情况下,通常我们是遍历容器每个元素来进行碰撞检測,这样一来。借助list

    的迭代器,我们遍历该容器的时间和顺序表相当。

    (这里临时不考虑借用树结构对区域切割来达到算法优化。这一部分以后再考虑实现。)


    3.在角色类中提供一个对外的接口以供调用:

    CollListType& getCollList(){ return mCollList; }

    4.在角色类内部遍历mCollList的元素来进行碰撞检測。



    5.我们在类外环境中通过getCollList()不断的加入须要进行碰撞检測的区域就可以。

    (假设我的思路中有什么不正确地方你能够指出。或者你有更好的方法能够和我一起交流,
    让我们一起加油。向着世界不断的进步吧!

    。)



      

      


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    [LeetCode]题解(python):136-Single Number
    [LeetCode]题解(python):135-Candy
    [LeetCode]题解(python):134-Gas Station
    [LeetCode]题解(python):133-Clone Graph
    [LeetCode]题解(python):132-Palindrome Partitioning II
    [LeetCode]题解(python):131-Palindrome Partitioning
    [LeetCode]题解(python):130-Surrounded Regions
    [LeetCode]题解(python):129-Sum Root to Leaf Numbers
    [LeetCode]题解(python):128-Longest Consecutive Sequence
    [LeetCode]题解(python):127-Word Ladder
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4730687.html
Copyright © 2020-2023  润新知