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

本文共 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如何计算子弹的飞行轨迹

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月11日 13时22分14秒