1. 游戏思路

(1)用ImageView显示地鼠,初始状态将ImageView设置为不可见状态。当开始游戏后,通过sendMessageDelayed()方法延时发送消息,使ImageView显示出来,即实现了地鼠间隔出现的效果。

(2)通过Random获取随机数,给ImageView随机坐标,实现地鼠随机位置出现的效果。

(3)打中1次分数加1,同时记录出现的地鼠数量,当数量达到设定的最大数量,则游戏结束。

2. 代码

布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    tools:context="com.studying.network.GameActivity">

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@drawable/mouse"
        android:visibility="gone" />

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="80dp" />

    <Button
        android:id="@+id/button"
        android:layout_width="100dp"
        android:layout_height="40dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="20dp"
        android:text="@string/start_game"
        android:textSize="12sp" />

</RelativeLayout>

Activity:

public class GameActivity extends Activity implements View.OnClickListener{

    private ImageView mImageView;
    private TextView mTextView;
    private Button mButton;

    private MyHandler mMyHandler = new MyHandler(this);

    public int mWidth;                              //设备屏幕宽度
    public int mHeight;                             //设备屏幕高度
    private int mTotalCount;                        //已经出现的地鼠数量
    private int mSuccessCount;                      //打中的地鼠数量

    public static final int SHOW_CODE = 100001;     //消息标识
    public static final int MAX_COUNT = 10;         //会出现的全部地鼠数量
    public static final int RANDOM_TIME = 500;      //地鼠出现的随机时间最大值

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);

        initView();
        setTitle("打地鼠");
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        mWidth = dm.widthPixels;
        mHeight = dm.heightPixels;
    }

    private void initView() {
        mImageView = (ImageView) findViewById(R.id.image_view);
        mTextView = (TextView) findViewById(R.id.text_view);
        mButton = (Button) findViewById(R.id.button);
        mImageView.setOnClickListener(this);
        mButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button:
                start();
                break;
            case R.id.image_view:
                mImageView.setVisibility(View.GONE);
                mSuccessCount++;
                mTextView.setText("打到了" + mSuccessCount + "只,共" + MAX_COUNT + "只");
                break;
        }
    }

    //游戏初始化
    private void start() {
        mTextView.setText("开始游戏!");
        mButton.setText("游戏中");
        mButton.setEnabled(false);
        next(0);
    }

    //设置下一只地鼠的出现
    private void next(int delayTime) {
        int positionX = new Random().nextInt(mWidth - 160);
        int positionY = new Random().nextInt(mHeight - 320);

        Message message = Message.obtain();
        message.what = SHOW_CODE;
        message.arg1 = positionX;
        message.arg2 = positionY;

        mMyHandler.sendMessageDelayed(message, delayTime);
        mTotalCount++;
    }

    private static class MyHandler extends Handler {

        private WeakReference<GameActivity>weakReference;

        MyHandler(GameActivity activity) {
            this.weakReference = new WeakReference<>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            GameActivity activity = weakReference.get();

            switch (msg.what) {
                case SHOW_CODE:
                    //游戏结束条件
                    if (activity.mTotalCount > MAX_COUNT) {
                        activity.clear();
                        Toast.makeText(activity, "地鼠打完了!", Toast.LENGTH_SHORT).show();
                        return;
                    }

                    //设置地鼠定时出现
                    int positionX = msg.arg1;
                    int positionY = msg.arg2;
                    activity.mImageView.setX(positionX);
                    activity.mImageView.setY(positionY);
                    activity.mImageView.setVisibility(View.VISIBLE);
                    int randomTime = new Random().nextInt(RANDOM_TIME) + RANDOM_TIME;
                    activity.next(randomTime);
                    break;
            }
        }
    }

    //重置游戏数据
    private void clear() {
        mTotalCount = 0;
        mSuccessCount = 0;
        mImageView.setVisibility(View.GONE);
        mButton.setText("开始游戏");
        mButton.setEnabled(true);
    }
}

Handler案例-简易打地鼠游戏(延时处理消息)的更多相关文章

  1. Android 多线程 打地鼠游戏

    前言:最近比较喜欢多线程了,看到了一些线程案例,这里总结一下打地鼠游戏的整个过程. 1.首先是主活动要加载的布局,我一般就喜欢早点把这个写上,这样就好在主活动中玩弄这些控件了.闲话不多说,一个Fram ...

  2. Android打地鼠游戏源码带道具购买的Android游戏开发

    这是一款基于安卓的打地鼠游戏,界面简洁,有level模式打地鼠和无尽模式打地鼠两种游戏模式,并可以通过商店使用金币进行道具的购买,道具可以让你更容易通关:同时金币可以在游戏通关的时候获取.工程中有较为 ...

  3. iOS版打地鼠游戏源码

    打地鼠游戏源码,游戏是一款多关卡基于cocos2d的iPad打地鼠游戏源码,这也是一款高质量的打地鼠游戏源码,可以拥有逐步上升的关卡的设置,大家可以在关卡时设置一些商业化的模式来盈利的,非常完美的一款 ...

  4. 无聊的人用JS实现了一个简单的打地鼠游戏

    直入正题,用JS实现一个简单的打地鼠游戏 因为功能比较简单就直接裸奔JS了,先看看效果图,或者 在线玩玩 吧 如果点击颜色比较深的那个(俗称坏老鼠),将扣分50:如果点击颜色比较浅的那个(俗称好老鼠) ...

  5. 打地鼠游戏iOS源码项目

    打地鼠游戏源码,游戏是一款多关卡基于cocos2d的iPad打地鼠游戏源码,这也是一款高质量的打地鼠游戏源码,可以拥有逐步上升的关卡的设置,大家可以在关卡时设置一些商业化的模式来盈利的,非常完美的一款 ...

  6. 团队项目——打地鼠游戏(SPEC)系统性能评估测试

    1.SPEC测试的目标: 本轮测试的目的是测试打地鼠游戏的需求以及确保每个需求都能得到满足的方法.编写此需求说明书是为了使用户和开发人员对所开发的系统有一致的理解.通过阅读此说明书,开发人员可以了解当 ...

  7. 打地鼠游戏ios源码

    打地鼠游戏源码,游戏是一款多关卡基于cocos2d的iPad打地鼠游戏源码,这也是一款高质量的打地鼠游戏源码,可以拥有逐步上升的关卡的设置,大家可以在关卡时设置一些商业化的模式来盈利的,非常完美的一款 ...

  8. Angular4 自制打地鼠游戏

    前端工程师新手一枚,之前一直做些小设计,以及静态页面的编写工作.刚刚接触 Angular 没有多久,四个月前对于 Javascript也只是会写 alert 之流,现在进步算是很大,下面是自制的打地鼠 ...

  9. 打地鼠游戏iOS源代码项目

    打地鼠游戏源代码,游戏是一款多关卡基于cocos2d的iPad打地鼠游戏源代码.这也是一款高质量的打地鼠游戏源代码.能够拥有逐步上升的关卡的设置,大家能够在关卡时设置一些商业化的模式来盈利的,很完美的 ...

随机推荐

  1. zoom与scale的异同

    zoom与scale的异同点 作为一名前端,尤其是页面要兼容ie浏览器的前端,肯定对着两个属性都很熟悉. zoom和scale都是css中常用的放大和缩小一个元素的方法,在scale还没有成为css3 ...

  2. Java 获取字符串Hash值

    Java 生成字符串的Hash值: /** * A hashing method that changes a string (like a URL) into a hash suitable for ...

  3. touchmover手机移动端的拖动

    <!DOCTYPE html><html> <head> <meta charset="utf-8"> <meta name= ...

  4. c# ActiveMQ 类

    using System;using System.Collections.Generic;using System.Text; using Apache.NMS;using Apache.NMS.A ...

  5. SQl server 2012安装问题 error code 0x858C001b 解决方法

    英文版系统安装中文版sql server的缘故,改安装英文版即可.

  6. java基础之集合框架(1)

    一.介绍Collection 1.概念:Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection ...

  7. 原生的Ajax的实现

    <script type="text/javascript"> // Ajax固定的模版 // 第一步:创建xhr对象,使用new关键字来调用内置的构造函数 var x ...

  8. log 的 debug()、 error()、 info()方法的区别

    软件中总免不了要使用诸如 Log4net, Log4j, Tracer 等东东来写日志,不管用什么,这些东东大多是大同小异的,一般都提供了这样5个日志级别:    × Debug    × Info  ...

  9. Lucene的使用与重构

    忽然一想好久不写博客了,工作原因个人原因,这些天一直希望一天假如36个小时该多好,但是,假如不可能. 由于近期在项目中接触了lucene,这个已经没有人维护的全文搜索框架,确实踩了不少坑,为什么用lu ...

  10. CJOJ 2255 【NOIP2016】组合数问题 / Luogu 2822 组合数问题 (递推)

    CJOJ 2255 [NOIP2016]组合数问题 / Luogu 2822 组合数问题 (递推) Description 组合数\[C^m_n\]表示的是从n个物品中选出m个物品的方案数.举个例子, ...