• Unity-3d Day06 单例模式打地鼠


    直接上代码啦:

    先搞一个老鼠类  模型一定要先构思好

    using UnityEngine;
    using System.Collections;
    
    public class Mouse 
    {
    
        //老鼠所在的位置
        public int x;
        public int y;
        //当前地鼠是否是随机到的位置
        public bool isCurrentRandom = false;
    
        //记录地鼠对象的生成时间
        public float createTime;
        //记录地鼠对象的消失速度
        public int  level = 30;
    
        //求出当前的地鼠应该哪第几张图片
        public int Index()
        {
            if (!isCurrentRandom)
                return 0;
    
            int result = (int)((Time.time - createTime) * level) % 27;
    
            //当result = 0,1,2,3,4,5,6,7,8,9,10,11,12,13时,result不变
    
            //当result = 14,15,16,17,18,19,20,21,22,23,24,25,26时,
            //result   = 13,12,11,10,9 ,8 ,7 ,6 ,5 ,4 ,3 ,2 ,1
    
            int count = MouseManager.GetInstance ().textureList.Length;
    
            if (result  < count) 
            {
                isAscending = true;
            } else 
            {
                isAscending = false;
                result = (count * 2 - 1) - result;
            }
    
    
            return result;
        }
        public bool isAscending = true;
    
    
        public Mouse()
        {
            x = 0;
            y = 0;
            isCurrentRandom = false;
        }
    
        public Mouse(int px,int py)
        {
            x = px;
            y = py;
        }
        //重置地鼠的状态...
        public void Reset(bool random)
        {
            createTime = Time.time;
    
            isCurrentRandom = random;
    
        }
    
        
    }


    老鼠模型的单例模式:

    using UnityEngine;
    using System.Collections;
    
    public class MouseManager {
        //单例
        private MouseManager()
        {
        }
    
        static MouseManager s_MouseManager = null;
    
        public static MouseManager GetInstance()
        {
            if (null == s_MouseManager) 
            {
                s_MouseManager = new MouseManager ();
            }
            return s_MouseManager;
        }
        //老鼠运动的所有图片
        public Texture2D[] textureList;
        //老鼠图片的宽度
        private float texWidth = 75f;
        //老鼠图片的高度
        private float texHeight = 75f;
        //是否有老鼠正在运动
        public bool hasMouse = false;
    
        //获取一个老鼠对象应该放的位置...
        public Rect GetMouseRect(Mouse sender)
        {
            Rect rect = new Rect();
    
            rect.width = texWidth;
            rect.height = texHeight;
    
            rect.x = texWidth * sender.y;
            rect.y = texHeight * sender.x;
    
            return rect;
        }
        //获取一个老鼠对象应该现实的图片...
        public Texture2D GetMouseTexture(Mouse sender)
        {
            int index = sender.Index ();
    
            if (index == 1 && !sender.isAscending) 
            {
                hasMouse = false;
    
                sender.Reset (false);
            }
    
            return textureList [index];
        }
    
        //获取所有老鼠对象应该摆放的区域
        public Rect GetMouseArea(int row,int column)
        {
            Rect rect = new Rect ();
    
            rect.x = 20f;
            rect.y = 100f;
    
            rect.width = column * texWidth;
            rect.height = row * texHeight;
    
            //Debug.Log (rect);
            return rect;
        }
    }

    gamemanager:

    using UnityEngine;
    using System.Collections;
    
    public class GameManager : MonoBehaviour {
    
        //背景纹理图片
        public Texture2D backgroundTex;
    
        //地鼠对象队列
        private Mouse[] mouseList;
    
        //地鼠对象用的纹理队列
        public Texture2D[] mouseTexList;
        //打中图片
        public Texture2D[] hitTexList;
    
        public int level;
    
        //分数计算结果
        public float score;
        //计时
        private float time = 60f;
    
    
        private bool isHit;
        private int temp_index;
        private Texture2D temp_tex;
        private float temp_time = 0f;
        private int temp_count = 0;
        void OnGUI()
        {
            //添加纹理背景...
            DrawBackground ();
    
            //修正游戏级别
            level = level >= 30 && level <= 110 ? level : 20;
            //获取单例对象
            MouseManager mger = MouseManager.GetInstance ();
    
            GUILayout.BeginArea (mger.GetMouseArea(row,column));
            //添加一个地鼠
            for (int index = 0; index < mouseList.Length; index++) {
    
                //修改每个地鼠对象的级别
                mouseList[index].level = level;
    
                Rect mouseRect = mger.GetMouseRect (mouseList [index]);
                Texture2D mouseTex = mger.GetMouseTexture (mouseList [index]);
    
                Mouse theMouse = mouseList[index];
                if (GUI.Button (mouseRect, mouseTex)) {
                    if(theMouse.isCurrentRandom){
                        score += 10;
                        isHit = true;
                        temp_index = index;
                    }
                }
            }
            GUILayout.EndArea ();
            //重新设置鼠标纹理
            ResetMouseTexture();
            if(isHit){
                //添加打中效果
                print("打中效果");
                DrawHitTexture();
            }
    
            //设置文字颜色
            GUI.color = Color.blue;
            //添加分数显示label
            DrawScoreLable();
            //添加时间显示label
            DrawTimeLable();
        }
        void DrawHitTexture(){
            MouseManager mger = MouseManager.GetInstance ();
            Rect mouseRect = mger.GetMouseRect (mouseList [temp_index]);
            Rect rect = new Rect(mouseRect.x + 5f, mouseRect.y + 85f, mouseRect.width + 30f, mouseRect.height+ 30f);
            GUI.DrawTexture(rect, temp_tex);
            HitTime();
        }
        //打击动画计时
        void HitTime(){
            if(Time.time - temp_time > 5*Time.deltaTime){
                temp_count++;
                temp_tex = hitTexList[temp_count];
                temp_time = Time.time;
            }
            if(temp_count == 2){
                temp_count = 0;
                isHit = false;
            }
        }
        void DrawScoreLable()
        {
            Rect rect = new Rect();
            rect.x = 0f;
            rect.y = 0f;
            rect.width = 60f;
            rect.height = 30;
            GUI.Label(rect, "分数:" + score.ToString());
    
        }
        void DrawTimeLable()
        {
            Rect rect = new Rect();
            rect.x = 0f;
            rect.y = 40f;
            rect.width = 60f;
            rect.height = 30;
            ShowTextTime();
            GUI.Label(rect, "时间:" + time.ToString());
        }
        //计时方法
        void ShowTextTime()
        {
            time = 60 - (int)Time.time;
        }
        void JudgeTime()
        {
            if(time == 0f){
                Time.timeScale = 0;
            }
            //每过5秒增加2的速度
            if(Time.time % 5  < Time.deltaTime){
                level += 2;
            }
    
        }
        private Texture2D mouseCurrentTexture;
        public Texture2D mouseRaiseTexture;
        public Texture2D mouseDownTexture; 
        void ResetMouseTexture()
        {
            Screen.showCursor = false;
            Rect cursorRect = new Rect();
            cursorRect.x = Input.mousePosition.x - 10f;
            cursorRect.y = Input.mousePosition.y + 20f;
            cursorRect.y = Screen.height - cursorRect.y;
    //        cursorRect.width = mouseCurrentTexture.width;
    //        cursorRect.height = mouseCurrentTexture.height;
            cursorRect.width = 75f;
            cursorRect.height = 75f;
            //绘制当前使用的鼠标纹理
            GUI.DrawTexture(cursorRect, mouseCurrentTexture);
    
        }
        //绘制背景用的函数方法...
        void DrawBackground()
        {
            Rect rect = new Rect (0, 0, backgroundTex.width, backgroundTex.height);
    
            //在rect变量的范围内,绘制背景纹理...
            GUI.DrawTexture (rect, backgroundTex);
        }
            
        //行数
        public int row = 1;
        //列数
        public int column = 1;
    
        //游戏初始化方法...
        void GameInit()
        {
            row = row >= 4 && row <= 6 ? row : 4;
            column = column >= 4 && column <= 15 ? column : 4;
    
            //设置鼠标默认纹理  是抬起的图片
            mouseCurrentTexture =  mouseRaiseTexture;
            //
            temp_tex = hitTexList[0];
    
            //将纹理图片的地址赋值给单例对象
            MouseManager.GetInstance ().textureList = this.mouseTexList;
            MouseManager.GetInstance ().hasMouse = false;
    
            //通过(行数 * 列数)得到老鼠的个数
            mouseList = new Mouse[row * column];
    
            //通过2维数组来计算每个老鼠对象的位置...
            for (int x = 0; x < row; x++) {
    
                for (int y = 0; y < column; y++) {
    
                    //创建一个老鼠对象
                    Mouse m = new Mouse (x, y);
    
                    mouseList[x * column + y] = m;
                }
    
            }
        }
        //随机一个老鼠,特别厉害的老鼠
        void RandomMouse()
        {
            if (MouseManager.GetInstance ().hasMouse)
                return;
    
            int x = Random .Range(0, row);
            int y = Random .Range(0, column);
    
            int index = x * column + y;
    
            Mouse m = mouseList [index];
    
            //重置老鼠对象的值为真...
            m.Reset (true);
    
            //当有一个老鼠提起来之后,MouseManager的hasMouse设置为true
            MouseManager.GetInstance ().hasMouse = true;
        }
    
        // Use this for initialization
        void Start () 
        {
            //游戏初始化...
            GameInit ();
        }
        
        // Update is called once per frame
        void Update () 
        {
            RandomMouse ();
    
            if(Input.GetMouseButtonDown(0)){
                mouseCurrentTexture = mouseDownTexture;
            }
            if(Input.GetMouseButtonUp(0)){
                mouseCurrentTexture = mouseRaiseTexture;
            }
            JudgeTime();
        }
    }


    感觉上用了单例模式反倒麻烦了呢 可能是还没有写比较麻烦的游戏吧

  • 相关阅读:
    nginx优化配置
    mysql查看变量/配置文件位置
    关于ubuntu的ssh远程登录的问题
    ubuntu镜像下载地址
    百度地图标注地点
    Yii常用方法
    python_将一组数据展示成直方图(以list为例)
    opencv_形态学结构化元素对形态学图像处理的影响
    C语言学习_从VC++6.0开始
    SVM原理(1)
  • 原文地址:https://www.cnblogs.com/little-sun/p/4379128.html
Copyright © 2020-2023  润新知