弹球小游戏

本文介绍了一个基于Android平台的简易弹球游戏开发过程。该游戏利用Java语言实现,并使用了基本的Android视图组件来绘制游戏界面。文章详细阐述了如何通过触摸屏控制游戏中的球拍移动、如何设置球的运动轨迹及速度变化,以及如何判断游戏结束等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package test.example.lxm.test;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;


public class MainActivity extends Activity {

    boolean isClose; //游戏是否已结束
    //屏幕大小
    int windowWidth;
    int windowHeight;
    //小球位置、半径a
    int ballX;
    int ballY;
    int ballR = 20;
    //球拍的位置、大小
    int paiX;
    int paiY;
    int paiWidth = 100;
    int paiHeight = 25;
    //球的速度
    int ballSpeedX = 30;
    int ballSpeedY;

    TimerTask timerTask;

    GameView gameView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //设置全屏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        //获取屏幕大小
        WindowManager windowManager = getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        DisplayMetrics displayMetrics = new DisplayMetrics();
        display.getMetrics(displayMetrics);
        windowWidth = displayMetrics.widthPixels;
        windowHeight = displayMetrics.heightPixels;
        init(); //初始化

        gameView = new GameView(this);
        setContentView(gameView);



        //时间控件,控制球的位置
        final Timer timer = new Timer();

        gameView.setOnClickListener(new View.OnClickListener() { //单击界面重新开始游戏
            @Override
            public void onClick(View v) {
                if(isClose){
                    init();
                    isClose = false;
                    timer.schedule(timerTask,0,100);
                }
            }
        });

    }

    //界面更新
    final Handler handler = new Handler(){
        public void handleMessage(Message msg) {
            if(msg.what == 0x123){
                gameView.invalidate();
            }
        }
    };

    private void init(){

        isClose = true;
        Random random = new Random();
        //设置球拍位置
        paiX = (windowWidth - paiWidth)/2;
        paiY =  windowHeight - paiHeight;
        //设置球的位置
        ballX = random.nextInt(200) + 20;
        ballY = random.nextInt(10) + 20;
        ballSpeedY = (int) ((random.nextDouble() - 0.5) * ballSpeedX *2);

        if(timerTask != null){
            timerTask.cancel();
            timerTask = null;
        }
        timerTask = (new TimerTask() {
            @Override
            public void run() {
                if((ballX <= 0 || ballX >= windowWidth-ballR*2) && ballY < paiY){ //到达屏幕右边缘,且高度没到底,反方向
                    ballSpeedX = -ballSpeedX;
                }
                if(ballY >= paiY && (ballX + ballR < paiX || ballX - ballR  > paiX + paiWidth)){ //游戏结束
                    isClose = true;
                    timerTask.cancel();
                    timerTask = null;
                }else if(ballY <= 0 || ballY>= paiY){ //到达边缘或到达拍子,反方向
                    ballSpeedY = -ballSpeedY;
                }
                //改变球的位置
                ballX += ballSpeedX;
                ballY += ballSpeedY;
                handler.sendEmptyMessage(0x123);
            }
        });
    }


    class GameView extends View{

        Paint paint;
        public GameView(Context context) {
            super(context);
            paint = new Paint();
            paint.setAntiAlias(true);
            paint.setStyle(Paint.Style.FILL);
            paint.setColor(Color.GREEN);
        }

        protected void onDraw(Canvas canvas) {
            canvas.drawColor(Color.WHITE);
            //游戏已结束
            if(isClose) {
                paint.setTextSize(50);
                canvas.drawText(getResources().getString(R.string.gameOver), windowWidth / 2 - 50, windowHeight / 2 - 20, paint);
            }
            else{
                //画球
                canvas.drawCircle(ballX + ballR,ballY + ballR,ballR,paint);
                //画球拍
                canvas.drawRect(paiX,paiY,paiX + paiWidth,paiY + paiHeight,paint);
            }
        }

        float oldX;
        //球拍跟着手指移动
        public boolean onTouchEvent(MotionEvent event) {
            super.onTouchEvent(event);
            float newX = event.getX();
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN: //开始移动位置

                    oldX = event.getX();
                    break;
                case MotionEvent.ACTION_MOVE: //结束移动位置
                    float newPoint = paiX + newX - oldX;
                    if(newPoint < 0 ){
                        newPoint = 0;
                    }else if(newPoint > windowWidth-paiWidth){
                        newPoint = windowWidth - paiWidth;
                    }
                    paiX  = (int)newPoint;
                    oldX = newX;
                    invalidate();
                    break;
            }
            return true;
        }


    }

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值