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. 把angular项目整合到.net mvc中

    之前的开发选择的是完全舍弃服务端,仅保留最简单web服务器提供angular经打包的静态资源,此外所有的业务与数据请求都访问一个分离的WebApi来实现.不过最近碰到一个需求,有必要使用多个客户端,而 ...

  2. mysql in 和 not in 语句用法

    1.mysql in语句 select * from tb_name where id in (10,12,15,16);2.mysql not in 语句 select * from tb_name ...

  3. php中的命名空间

    a.php <?php namespace a\b; class Apple{ function get_info(){ echo 'aaa'.'<br/>'; } } ?> ...

  4. [编织消息框架][netty源码分析]11 UnpooledHeapByteBuf 与 ByteBufAllocator

    每种ByteBuf都有相应的分配器ByteBufAllocator,类似工厂模式.我们先学习UnpooledHeapByteBuf与其对应的分配器UnpooledByteBufAllocator 如何 ...

  5. Example010实现浏览器兼容改内容的函数,自写

    <!-- 实例010实现浏览器兼容改内容的函数 --> <!DOCTYPE html> <html lang="en"> <head> ...

  6. Mac应用推荐

    知识管理 Outline Curio Together 开发 Clion Vim + spf13 Transmit 辅助应用 Moom PopClip Timing AppClean Markdown ...

  7. Texlive + TexStudio + Language Tool Win7配置

    Texlive的配置很简单,安装的时候跟着向导一步一步安装就可以了. TexStudio也是同样的安装过程,没什么技巧.这里提一下界面颜色的配置.习惯了暗底白字,所以就google了一下相关的配置,大 ...

  8. JAVA基础——编程练习(二)

    JAVA编程练习(二) 今天我为了巩固之前的java基础知识的学习,再次进行实战演习,编写了一个小小的java控制台程序,主要是运用java面向对象的思想来完成这个小项目. 一.项目背景介绍 根据所学 ...

  9. SQL联表查询

    数据库中最最常用的语法----select.简单的select语法很直白: select column from table where expression: 从((from)存储数据的地方(tab ...

  10. 第一个SpringMVC实例和解析(HelloSpringMVC)

    1. 开发步骤: (1)增加Spring支持 下载Spring安装包和其依赖的commons-logging.jar,复制到项目Web应用的lib文件夹(WebRoot/WEB-INF/lib): S ...