打地鼠Demo

using UnityEngine;
using System.Collections;

public enum MoleStates
{
    NormalState,// 初始状态
    UpState,// 钻出来状态
    DownState,//钻进去状态
    HitState//打击状态
}
public struct Data
{
    public MoleStates currentState; // 地鼠动画状态
    public int currentIndex;// 地鼠动画帧下标
}
public class GameScript : MonoBehaviour {  // 这些public 的变量需要在unity中设置
    public Texture2D backGround;
    public Texture2D moleNormalState; // 地鼠状态
    public Texture2D mouseNormalState;// 鼠标状态
    public int moleWidth;//
    public int moleHeight;
    public Texture2D mouseHitState;// 鼠标打击状态
    public Texture2D [] vertigoFrame; // 眩晕动画帧数
    public Texture2D [] moleAnimationFrame;//地鼠动画帧数
    public float animationSpeed;// 地鼠动画播放速度
    public int gameTime;//游戏倒计时
    public float hitAnimationSpeed;//打击动画播放速度
    public float moleSpeed;// 地鼠随机出来的速度

    private int row;//地图行,列
    private int col;
    Texture2D mouseImage;// 中间变量,存储锤子图片
    int  curVetigoFrame;//

    float tempTime; // 累加每次deltaTime
    float randomTime; // 地鼠没有出来前,时间累加 用于地鼠图片的计时器
    float hitTime; // 眩晕效果计时器
    float secondTime;// 游戏没有结束前,时间累加 游戏总时间计时器

    Data [,] moleDatas;//结构体数据 读取对应的图片下标和地鼠状态
    //bool hasMole;
    int score;

    float hitX;//眩晕效果 左上角坐标
    float hitY;
    int hitIndex;//打击眩晕效果帧动画下标
    bool isOver;
    bool isHitAnimation;//是否显示打击眩晕效果

    void OnGUI()
    {
        GUI.DrawTexture( new Rect(0f, 0f, Screen.width, Screen.height),backGround );

        for(int i = 0; i < row; ++i)
        {
            for(int j = 0; j < col ; ++j)
            {
                GUI.Label( new Rect( j * moleWidth + (( Screen.width - moleWidth * col ) >> 1), i * moleHeight + (( Screen.height - moleHeight * row ) >> 1),moleWidth, moleHeight ), moleAnimationFrame[ moleDatas[i,j].currentIndex ]);
            }
        }
        // 绘制眩晕效果
        GUI.Label (new Rect(hitX,hitY,100f, 100f),vertigoFrame[hitIndex] );
        float mouseX = Input.mousePosition.x;
        float mouseY = Input.mousePosition.y;
        // 绘制锤子动画
        GUI.Label( new Rect( mouseX - 26, Screen.height - mouseY - 40, 100f, 100f ), mouseImage );

        // 设置文本颜色,设置字体颜色
        GUI.skin.label.normal.textColor = Color.blue;
        GUI.skin.label.fontSize = 40;
        //绘制得分
        GUI.Label( new Rect(10f,10f,200f,90f), string.Format("Score:{0}", score) );
        //绘制倒计时
        GUI.Label( new Rect(10f,100f,200f,90f), string.Format("Time:{0}", gameTime) );
        // 游戏结束后 绘制lable
        if(isOver)
        {
            GUI.skin.label.alignment = TextAnchor.MiddleCenter;
            GUI.skin.label.fontSize = 68;
            GUI.Label( new Rect(0f, 0f, Screen.width, Screen.height),string.Format( "Game Over!" ) );
        }

    }
    void Awake() //初始化
    {
        row = 4;
        col = 4;
        tempTime = 0f;
        randomTime = 0f;
        hitTime = 0f;
        secondTime = 0f;
        //hasMole = false;
        score = 0;
        hitIndex = 0;
        isOver = false;
        isHitAnimation = false;
        mouseImage = mouseNormalState;
        moleDatas = new Data[row, col];
        // 初始化地鼠数据
        for(int i = 0; i < row; ++i)
        {
            for(int j = 0; j < col ; ++j)
            {
                moleDatas[i,j].currentIndex = 0;
                moleDatas[i,j].currentState = MoleStates.NormalState;
            }
        }
    }
    void Update()
    {
        if (!isOver)
        {
            // 鼠标事件监听
            MouseListener();
            // 控制current动画帧
            ControlCurrentAnimFrame();
            // 产生随机地鼠
            RandomMole();
            // 打击眩晕效果动画
            HitAinmation();
            // 时间大于一秒后,让游戏时间减一
            if (secondTime > 1f)
            {
                // 时间归0
                secondTime = 0f;
                gameTime--;
                // 当游戏时间小于1时游戏结束
                if (gameTime < 1)
                {
                    isOver = true;
                }
            }
            else
            {
                // 否则继续运行
                secondTime += Time.deltaTime;
            }
        }

    }
    // 打击眩晕效果动画
    void HitAinmation()
    {
        // 如果打中则播放动画
        if (isHitAnimation)
        {
            // 打击时间 > 动画播放速度
            if (hitTime > hitAnimationSpeed)
            {
                hitTime = 0f;
                // 一帧一帧的播放
                hitIndex++;
                // 播到最后一帧 置0动画停止
                if (hitIndex > vertigoFrame.Length - 1)
                {
                    hitIndex = 0;
                    isHitAnimation = false;
                }
            }
            else
            {
                hitTime += Time.deltaTime;
            }
        }
    }
    // 鼠标事件监听
    void MouseListener()
    {
        if ( Input.GetMouseButtonDown(0) )
        {
            // 将锤子变为打击状态
            mouseImage = mouseHitState;
            float mouseX = Input.mousePosition.x;
            float mouseY = Screen.height - Input.mousePosition.y;// 屏幕左上角y坐标为屏幕的高,所以叫减去当前鼠标点击的y坐标
            // 获取打中的是哪个地鼠 行和列
            int r = (int) ((mouseY - ( Screen.height - moleHeight * row ) / 2 ) / moleHeight );
            int c = (int) ((mouseX - ( Screen.width - moleHeight * col ) / 2 ) / moleWidth );

            // 根据状态打地鼠
            if(moleDatas[r,c].currentState == MoleStates.DownState || moleDatas[r,c].currentState == MoleStates.UpState )
            {
                moleDatas[r,c].currentState = MoleStates.HitState;
            }
        }
        if( Input.GetMouseButtonUp(0) )
        {
            mouseImage = mouseNormalState;
        }
    }

    // 产生随机地鼠
    void RandomMole()
    {
        // 随机时间 > 一只地鼠动画所需播放速度
        if ( randomTime > moleSpeed )
        {
            randomTime = 0f;
            int i = Random.Range(0 , row);
            int j = Random.Range(0 , col);

            if( moleDatas[i,j].currentState == MoleStates.NormalState )
            {
                moleDatas[i,j].currentState = MoleStates.UpState;
            }

        }
        else
        {
            randomTime += Time.deltaTime;
        }
    }

    // 控制current动画帧
    void ControlCurrentAnimFrame()
    {
        for(int i = 0; i < row; ++i)
        {
            for(int j = 0; j < col ; ++j)
            {
                // 控制动画播放时间
                if( tempTime > animationSpeed )
                {
                    tempTime = 0f;
                    switch( moleDatas[i,j].currentState )
                    {
                        case MoleStates.NormalState:
                        {
                            moleDatas[i,j].currentIndex = 0;
                        }
                            break;
                        case MoleStates.UpState:
                        {
                            //hasMole = true;
                            moleDatas[i,j].currentIndex ++;
                            if( moleDatas[i,j].currentIndex > moleAnimationFrame.Length - 1 )
                            {
                                moleDatas[i,j].currentIndex = moleAnimationFrame.Length - 1;
                                moleDatas[i,j].currentState = MoleStates.DownState;
                            }
                        }
                            break;
                        case MoleStates.DownState:
                        {
                            moleDatas[i,j].currentIndex --;
                            if ( moleDatas[i,j].currentIndex < 1 )
                            {
                                moleDatas[i,j].currentState = MoleStates.NormalState;
                                //hasMole = false;
                            }
                        }
                            break;
                        case MoleStates.HitState:
                        {
                            curVetigoFrame ++;
                            score += 5;
                            Debug.Log( string.Format("score = {0}",score) );
                            hitY = i * moleHeight + (( Screen.height - moleHeight * row ) >> 1);
                            hitX = j * moleWidth + (( Screen.width - moleWidth * col ) >> 1);
                            isHitAnimation = true;
                            moleDatas [i, j].currentState = MoleStates.NormalState;
                            //hasMole = false;
                        }
                            break;
                        default:

                            break;
                    }
                }
                else
                {
                    tempTime += Time.deltaTime;

                }
            }
        }

    }
}
时间: 2024-11-04 00:58:45

打地鼠Demo的相关文章

微信h5支付demo微信H5支付demo非微信浏览器支付demo微信wap支付

一.首先先确定H5支付权限已经申请!(需要微信h5支付demo的可以加 851 488 243 备注:h5支付) 二.开发流程 1.用户在商户侧完成下单,使用微信支付进行支付 2.由商户后台向微信支付发起下单请求(调用统一下单接口)注:交易类型trade_type=MWEB 3.统一下单接口返回支付相关参数给商户后台,如支付跳转url(参数名"mweb_url"),商户通过mweb_url调起微信支付中间页 4.中间页进行H5权限的校验,安全性检查(此处常见错误请见下文) 5.如支付成

Maven+SpringMVC+Freemarker入门Demo

1 参考http://blog.csdn.net/haishu_zheng/article/details/51490299,用第二种方法创建一个名为mavenspringmvcfreemarker的Maven工程. 2 文件目录结构如下图所示 3 在pom.xml中添加springmvc和freemarker的依赖包,添加完之后的完整内容为 [html] view plain copy <project xmlns="http://maven.apache.org/POM/4.0.0&q

Spring Security入门Demo

一.spring Security简介 SpringSecurity,这是一种基于Spring AOP和Servlet过滤器的安全框架.它提供全面的安全性解决方案,同时在Web请求级和方法调用级处理身份确认和授权.在Spring Framework基础上,Spring Security充分利用了依赖注入(DI,Dependency Injection)和面向切面技术. 二.建立工程 参考http://blog.csdn.net/haishu_zheng/article/details/51490

沫沫金Echarts移动端demo

鄙视百度!!! 官网给的Demo支持自动大小,确不给完整的源码XXX 自己动手,丰衣足食 http://echarts.baidu.com/demo.html#bar-tick-align 用最基本的柱状图官网代码 简单两步,实现移动端自适应大小 //1.下载Echarts <script src="dep/Echarts/echarts-all-3.js"></script> //2.chart容器宽度自适应 <!-- 为ECharts准备一个具备大小(

Flask---使用Bootstrap新建第一个demo

Flask---使用Bootstrap新建第一个demo 参考自http://www.jianshu.com/p/417bcbad82fb 还有<Flask web开发> 前端用到Bootstrap开源框架,Bootstrap是客户端框架,后台当然就是Flask了. 服务器需要做的只是提供引用了Bootstrap层叠样式表(CSS)和JS文件的html响应,并且在html.css和js代码中实例化需要的组件,这些操作的最理想的执行环境就是模板 关于模板的介绍及其实现原理:https://kb.

struts2和hibernate整合的小Demo

jar包下载地址 创建一个web项目. 导入jar包 配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="

移动端上传照片 预览+draw on Canvas demo(解决iOS等设备照片旋转90度的bug)

背景: 本人的一个移动端H5项目,需求如下: 手机相册选取或拍摄照片后在页面上预览 然后绘制在canvas画布上. 这里,我们先看一个demo(http://jsfiddle.net/q3011893/83qfqpk8/embedded/) 操作步骤: 1.点击选择文件,拍摄一张照片,此时"预览:"文字下会显示你刚才拍摄的照片: 2.再点击"draw on Canvas",该按钮下的画布会绘制你刚才拍摄的照片. 正常的结果: 正文: 让input file支持拍照+

爬虫2:html页面+beautifulsoap模块+post方式+demo

爬取html页面,有时需要设置参数post方式请求,生成json,保存文件中. 1)引入模块 import requests from bs4 import BeautifulSoup url_ = 'http://www.c.....................' 2)设置参数 datas = { 'yyyy':'2014', 'mm':'-12-31', 'cwzb':"incomestatements", 'button2':"%CC%E1%BD%BB",

Nancy之基于Self Hosting的补充小Demo

前面把Hosting Nancy with ASP.NET.Self Hosting Nancy和Hosting Nancy with OWIN 以demo的形式简单描述了一下. 这篇是为Self Hosting Nancy.和Owin 下面的Self Hosting作个补充. 首先是Self Hosting Nancy的补充: 这里主要是介绍一下Topshelf 官网:http://topshelf-project.com/ GitHub地址:https://github.com/Topshe