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();
    }
}


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

posted @ 2015-03-30 20:47  小の太阳  阅读(2470)  评论(1编辑  收藏  举报