2021-05-20

消消乐学习心得

设计思路
一、实体类,封装一个水果图标。包含x,y坐标,图片(bitmap),一个id用于匹配,宽、高
二、布局方面一个Activity和一个自定义的View,主角当然是我们这个View。
三、在构造方法里面初始化游戏相关数据

public GameView(Context context, AttributeSet attr) {
        super(context, attr);
        screenHeight = DisplayUtil.getScreenHeight(context);
        screenWidth = DisplayUtil.getScreenWidth(context);
        // 音乐相关初始化
        bgMedia = MediaPlayer.create(this.getContext(), R.raw.bg_game);
        bgMedia.setOnCompletionListener(this);
        bgMedia.start();
        // swap = MediaPlayer.create(this.getContext(), R.raw.swap);

        // int ave = screenWidth / (row + 2); // 将屏幕宽度分为 row + 2 等份
        int ave = 0;
        int size = (screenWidth - ave * 2) / row; // 其它两分为:舞台距离屏幕左右边的像素
        ZooUtil.initZooData(size, size, this.getResources()); // 初始化动物头像数据
        // 背景图片
        background = BitmapFactory.decodeResource(this.getResources(), R.mipmap.game_bg);
        floorBg = BitmapFactory.decodeResource(this.getResources(), R.mipmap.floor_bg);
        /*
         * 计算出舞台距离左边屏幕的距离
         * 计算方式为:
         *   (屏幕总宽度 - 人物头像的宽 * 总行数) / 2
         */
        int leftSpan = (screenWidth - ZooUtil.getAnimalWidth() * row) / 2;
        int topSpan = (screenHeight - ZooUtil.getAnimalHeight() * col) / 3;
        // 将游戏舞台的坐标、高宽保存起来
        StageUtil.initStage(leftSpan, topSpan,
                leftSpan + ZooUtil.getAnimalWidth() * row,
                topSpan + ZooUtil.getAnimalHeight() * col);
        // 实例化画笔
        paint = new Paint();
        paint.setFlags(Paint.ANTI_ALIAS_FLAG);
        paint.setAntiAlias(true); // 消除锯齿
        initGamePoint();
    }
    
	/**
     * 生成游戏坐标
     */
    private void initGamePoint() {
        currScore = 0; // 清空当前得分
        bitmaps = new FlashBitmap[row][col];
        // 生成背景图片的坐标(仅背景图片,后续可考虑将特效也加进来)
        for (int i = 0; i < row; ++i) {
            for (int j = 0; j < col; ++j) {
                do {
                    // 计算头像坐标
                    FlashBitmap bitmap = ZooUtil.getAnimal();
                    bitmap.setX(StageUtil.getStage().getX() + i * ZooUtil.getAnimalWidth());
                    bitmap.setY(StageUtil.getStage().getY() + j * ZooUtil.getAnimalHeight());
                    transBitmap[i][j] = bitmap.clone();
                    bitmap.setY(0); // 在顶部慢慢下落
                    bitmaps[i][j] = bitmap;
                } while(StageUtil.checkClearPoint(bitmaps));
            }
        }
    }

四、重写该View的onDraw方法,在这个方法里面进行水果图像的绘制

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 绘制背景图片
        Bitmap bgBitmap = DisplayUtil.resizeBitmap(background, screenWidth, screenHeight);
        canvas.drawBitmap(bgBitmap, 0, 0, paint);
        Bitmap floor = DisplayUtil.resizeBitmap(floorBg, ZooUtil.getAnimalWidth(), ZooUtil.getAnimalHeight());
        // 每一个小头像背后的背景
        for (int i = 0; i < row; ++i) {
            for (int j = 0; j < col; ++j) {
                if(transBitmap[i][j] != null){
                    int x = (int) transBitmap[i][j].getX();
                    int y = (int) transBitmap[i][j].getY();
                    canvas.drawBitmap(floor, x, y, paint);
                }
            }
        }
        // 舞台中的所有动物头像
        FlashBitmap bitmap;
        for (int i = 0; i < row; ++i) {
            for (int j = 0; j < col; ++j) {
                bitmap = bitmaps[i][j];
                if(bitmap != null // 不为空并且坐标点要进入舞台
                        && StageUtil.inStage(bitmap.getX(), bitmap.getY() + bitmap.getHeight() / 2)){
                    canvas.drawBitmap(bitmap.getBitmap(), bitmap.getX(), bitmap.getY(), paint);
                }
            }
        }
        // 是否需要加载消除
        synchronized (this){
            if (load) {
                pool.execute(new Runnable() {
                    @Override
                    public void run() {
                        clearBitmap();
                    }
                });
                load = false;
            }
        }
        paint.setColor(Color.WHITE);
        paint.setTextSize(32);
        paint.setTypeface(Typeface.create(Typeface.DEFAULT_BOLD , Typeface.BOLD));
        canvas.drawText("当前关卡:" + level, 10, StageUtil.getStage().getHeight() + 70, paint);
        canvas.drawText("当前得分:" + currScore, 10, StageUtil.getStage().getHeight() + 120, paint);
        canvas.drawText("通关分数:" + accessScore[level - 1], 10, StageUtil.getStage().getHeight() + 170, paint);
        // 刷新屏幕的频率(理论上小于25,人就会感觉物体是在移动)
        postInvalidateDelayed(1);
    }

五、重写onTouchEvent方法监听该View的按下、抬起、移动等相关事件


@Override
    public boolean onTouchEvent(MotionEvent event) {
        // 判断交换状态是否完毕
        if(swapState){
            return false;
        }
        // 如果正在做下落动画不允许操作
        if(loadAnimalState){
            return false;
        }
        // 获取当前触控位置
        float ex = event.getX();
        float ey = event.getY();
        switch (event.getAction()) {
            // 按下
            case MotionEvent.ACTION_DOWN:
                // 判断是否该点是按在舞台上
                if (!isDown && StageUtil.inStage(ex, ey)) {
                    p1.setX(ex);
                    p1.setY(ey);
                    isDown = true;
                }
                break;
            // 移动
            case MotionEvent.ACTION_MOVE:
                // 判断是否该点是按在舞台上
                if (!isDown && StageUtil.inStage(ex, ey)) {
                    p1.setX(ex);
                    p1.setY(ey);
                    isDown = true;
                }
                break;
            // 抬起
            case MotionEvent.ACTION_UP:
                if (isDown) {
                    p2.setX(ex);
                    p2.setY(ey);
                    isDown = false;
                    prepSwap(); // 预处理交换
                }
                break;
        }
        // 使系统响应事件,返回true
        return true;
    }

总结

结合坦克大战的制作经验,深刻的认识了多线程,用安卓做的,其实安卓里面嵌入H5也比较合适的。(新人,不喜勿喷)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值