简单数组算法分享
发布日期:2022-03-03 10:44:01 浏览次数:1 分类:技术文章

本文共 3179 字,大约阅读时间需要 10 分钟。

1.算法来源于生活,来源于工程实际。我在2d游戏开发中遇到一个需要发射扇形区域的散射弹

角度是+120 到-120之前 这个区域可能有3个子弹。我在计算的时候是从+120计算到-120 也就是数组是a【0】 = 120  a[0] = 0  a【2】 = -120 。 这样正向去计算可能容易一些,但是现在他们需要a[0] = 0度 a[1] = 120度 a[2] = -120度    注意正角度在x轴上方 负角度在下方,这个通过向量的乘法来判断(用坐标表达式计算) 类似数组12345 要变为32415 下面的函数就是干这个事情 注意数组是引用类型。

public static void CenterFloatArray(float[] array)
    {
        int dyLength = array.Length;
        int center = array.Length / 2;
        for (int i = 0; i < array.Length; i++)
        {
            dyLength = array.Length - i;
            center = i + (dyLength - 1) / 2;
            int initPos = i;
            float value = array[center];
            for (int j = center; j > initPos; j--)
            {
                array[j] = array[j - 1];
            }
            array[initPos] = value;
        }
    }
2.游戏需要有一个优先级的东西,比如技能遥感优先,方向遥感优先,主目标优先。怎么实现这么个机制,我这里也是用数组来实现。主要看GetMainTarget这个函数 他是一个递归的函数。会不断去消耗数组 a【0】 a[1] a[2] 如果技能遥感优先则查看a【0】对应的方向 如果不为0方向 则取这个方向,如果是0 那么取a[1]的值 依次类推  也可以做成循环,但是我似乎更喜欢递归式,这种思想很奇妙也很优雅

using UnityEngine;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using rkt;
public enum EnSortPriority
{
    SKILL_JOY_STICK = 0, // 副遥感优先
    MOVE_JOY_STICK = 1, // 主遥感优先
    MAIN_TARGET_FIRST = 2, // 主目标优先 
}

public class SkillTargetFilterCom : IRecycle
{

    public EffectOptionParameter m_effOp;
    public EnSortPriority[] m_enSortPriority = null;
    private int m_arrayIndex  = 0;
    private SDEffectTarget m_mainTarget = null;
    //加入技能的特性
    
    public SDEffectTarget MainTargetEntity { 
        get
        {
            
            return m_mainTarget;
        }
        set
        {
           
            m_mainTarget = value;
        }

    }
    public Vector3 MainTargetPos{ get; set; }
    public System.Func<Vector2> m_joyStickDirFunc;
    public Transform transform;
   

    public void Awake()
    {

    }
    //执行执行前指定init初始化操作 按优先级依次传入对应的枚举元素,这里用数组作为形参
    public void Init(EffectOptionParameter eop, EnSortPriority[] enSort, System.Func<Vector2> func)
    {
        this.m_effOp = eop;
        m_enSortPriority = enSort;
        m_arrayIndex = 0;
        m_joyStickDirFunc = func;
    }
    public void  GetMainTarget()
    {
        if(m_enSortPriority == null || m_enSortPriority.Length <= 0)
        {
            return; 
        }
        var ty = m_enSortPriority[m_arrayIndex];
        if (ty == EnSortPriority.SKILL_JOY_STICK) // 副遥感优先
        {
            var dir = UIJoyStick.GetDirection(m_effOp.joyStickId);
            if (dir != Vector2.zero)
            {
                MainTargetEntity = null;
                MainTargetPos = transform.position + 1000 * new Vector3(dir.x, dir.y, 0);
                return;
            }
            ++m_arrayIndex;
            if(m_arrayIndex >= m_enSortPriority.Length)
            {
                return;
            }
            GetMainTarget();
        }
        else if (ty == EnSortPriority.MAIN_TARGET_FIRST) // 主目标优先
        {
            var SDEffectTarget = SDEntityTargetEffect_.Find(m_effOp.TargetId);
            if (SDEffectTarget != null)
            {
                MainTargetEntity = SDEffectTarget;
                MainTargetPos = MainTargetEntity.TargetPosition(EntityBodyPart.Skeleton, EntityTargetVirtualNodeEnum._effece_);
                return ;
            }
            ++m_arrayIndex;
            if (m_arrayIndex >= m_enSortPriority.Length)
            {
                return ;
            }
            GetMainTarget();
        }
        else if (ty == EnSortPriority.MOVE_JOY_STICK) // 主遥感优先 
        {
            var dir = UIJoyStick.GetDirection(1);
            if (dir != Vector2.zero)
            {
                MainTargetEntity = null;
                MainTargetPos = transform.position + 1000 * new Vector3(dir.x, dir.y, 0);
#if UNITY_EDITOR
                rktLogUtil.GLog("主遥感优先"+ MainTargetPos + "位置"+dir);
#endif
                return;
            }
#if UNITY_EDITOR
            rktLogUtil.GLog("主遥感没动" + dir);
#endif
            ++m_arrayIndex;
            if (m_arrayIndex >= m_enSortPriority.Length)
            {
                return;
            }
            GetMainTarget();
        }
    }
    public void OnRecycle()
    {
        m_arrayIndex = 0;
        m_enSortPriority = null;
    }
}

转载地址:https://blog.csdn.net/yangjie6898862/article/details/121430395 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:setContentView(R.layout.activity_main) Error解决方法
下一篇:A追B如何计算子弹的飞行轨迹

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.36.148.124]2022年07月27日 17时16分11秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章

2021高考模拟考成绩查询时间,2021高三二模时间具体是几号 2020-01-10 11:49:20
网络中的多台计算机互相协作,主题五网络技术基础(含答案) 2020-01-10 11:49:20
c post传文件到服务器带参数,NSMutableURLRequest,在POST方式下传递参数 2020-01-10 11:49:19
攻击网站和攻击服务器的区别,DDoS攻击与CC攻击的区别是什么? 2020-01-10 11:49:19
江西省2021高考成绩排名查询,985/211大学2021年江西录取分数线及位次排名 2020-01-10 11:49:20
案例教学法 计算机,高校计算机案例教学法探讨 2020-01-10 11:49:18
计算机控制有效点火,计算机控制点火系统.ppt 2020-01-10 11:49:18
微信api服务器ip地址,api.weixin.qq.com服务器iP 2020-01-10 11:49:18
bombe计算机 诞生时间,bombe 2020-01-10 11:49:18
dw虚拟服务器,dw设置服务器 2020-01-10 11:49:18
mac系统如何使用ftp服务器地址,mac系统如何使用ftp服务器地址 2020-01-10 11:49:18
服务器多个网站使用二级域名,使用多少个二级域名比较好 2020-01-10 11:49:19
计算机控制系统a卷-答案,计算机控制系统A卷答案.doc 2020-01-10 11:49:17
30岁女计算机培训,30岁文科女自述:转行学IT之IT教会我的那些事儿 2020-01-10 11:49:17
java 点加减号递加或递减,递归方法调用中的后递增/递减(Java) 2020-01-10 11:49:17
java 关闭windows,使用Java关闭Windows 2020-01-10 11:49:17
计算机组成课设怎么做,计算机组成原理课设1 2020-01-10 11:49:17
python操作mongodb语法,如何使用python在mongodb中查询不同的结果? 2020-01-10 11:49:17
计算机论文指导记录卡,毕业论文指导记录表范文.doc 2020-01-10 11:49:17
桌面怎么设置 计算机 网络连接,电脑桌面的本地连接ip地址可以设置吗_本地连接ip地址设置方法 - 驱动管家... 2020-01-10 11:49:16