弹球小游戏(自定义view应用)

本文介绍了一款简易弹球游戏的开发过程,包括游戏主程序的设计与实现,以及自定义View绘制游戏元素的方法。游戏实现了小球与球拍的交互,并通过触摸事件控制球拍移动。

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

下面的程序开发了一个简单的弹球小游戏,其中小球和球拍分别以圆形区域和矩形区域代替:

主程序:

package com.example.clipdrawabledemo;

import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.graphics.Bitmap;
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.View.OnTouchListener;
import android.view.Window;
import android.view.WindowManager;

public class GameActivity extends Activity {

	private int tableHight;
	private int tableWidth;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);//没标题
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);//全屏
		final GameView gView=new GameView(this);
		setContentView(gView);
		
		
		WindowManager windowManager=getWindowManager();
		Display display=windowManager.getDefaultDisplay();
		DisplayMetrics metrics=new DisplayMetrics();
		display.getMetrics(metrics);
		tableHight=metrics.heightPixels;//获取屏幕的高度
		tableWidth=metrics.widthPixels;//获取屏幕的宽度
		gView.setRacketY(tableHight-20);//矩形的初始位置
		
		//监听触摸事件
		gView.setOnTouchListener(new OnTouchListener() {
			
			@Override
			public boolean onTouch(View view, MotionEvent event) {
				// TODO Auto-generated method stub
				float x=event.getX();
				float y=event.getY();
				switch(event.getAction()){
					case MotionEvent.ACTION_MOVE:
						gView.setRacketX((int) x);
						//gView.setRacketY((int) y);//可设置矩形的智能横向移动
						break;
				}
				gView.invalidate();//重绘图
				return true;
			}
		});
		
		final Handler mHandler=new Handler(){

			@Override
			public void handleMessage(Message msg) {
				// TODO Auto-generated method stub
				super.handleMessage(msg);
				if(msg.what==0x123){
					gView.invalidate();
				}
			}
			
		};
		
		final Timer time=new Timer();
		time.schedule(new TimerTask() {
			
			@Override
			public void run() {
				System.out.println("BallX()="+gView.getBallX()+";BallY()="+gView.getBallY());
				System.out.println("Racketx()="+gView.getRacketX()+";getRacketY()="+gView.getRacketY());
				// TODO Auto-generated method stub
				//当小球碰到左边界或者右边界的时候,横向方向改变
				if((gView.getBallX()-gView.getBall_size()<=0)||(gView.getBallX()+gView.getBall_size()>=tableWidth)){
					gView.setXspeed(-gView.getXspeed());
					gView.setYspeed(new Random().nextInt(15));
				}
				//当小球底部边界高于挡板的位置且横向不在球拍范围内,游戏结束
				if(((gView.getBallY()+gView.getBall_size())>gView.getRacketY())&&(
						((gView.getBallX()+gView.getBall_size())<gView.getRacketX())||
						((gView.getBallX()-gView.getBall_size())>(gView.getRacketX()+gView.getRacket_width()))
						)
						){
					time.cancel();
					gView.setGame_str("游戏结束");
					gView.setIsLose(true);
				}
				//当小球位于球拍范围内,且达到球拍位置,小球反弹
				else if((gView.getBallY()<=0)||
						(((gView.getBallY()+gView.getBall_size())>=gView.getRacketY())&&
						((gView.getBallX()+gView.getBall_size())>=gView.getRacketX())&&
						((gView.getBallX()-gView.getBall_size())<=(gView.getRacketX()+gView.getRacket_width()))
						)
						){
					gView.setYspeed(-gView.getYspeed());
					gView.setXspeed(new Random().nextInt(15));
					/*//小球的移动速度加速
					if(gView.getYspeed()<0){
						gView.setYspeed(gView.getYspeed()-5);
					}
					if(gView.getXspeed()<0){
						gView.setXspeed(gView.getXspeed()-5);
					}*/
				}
				//移动小球
				gView.setBallY(gView.getBallY()+gView.getYspeed());
				gView.setBallX(gView.getBallX()+gView.getXspeed());
				
				mHandler.sendEmptyMessage(0x123);
				
				/*if((Math.abs(gView.getBallX()+gView.getBall_size())>tableWidth)||(Math.abs(gView.getBallY()+gView.getBall_size())>tableHight)){
					time.cancel();
					gView.setGame_str("恭喜过关");
					gView.setIsLose(true);
				}*/
			}
		},0,100);		
	}	
}

自定义view:

package com.example.clipdrawabledemo;

import java.util.Random;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class GameView extends View {

	Paint paint=new Paint();
	Random rand=new Random();
	private int ballX=rand.nextInt(468);//小球x坐标的初始位置,这个随机数可以是屏宽-球半径的任意值,我的机器是800*480
	private int ballY=rand.nextInt(20);//小球y坐标的初始位置,这个随机数可以是屏高-球半径的任意值,我的机器是800*480
	private int ball_size=12;//小球半径
	private int yspeed=10;//小球纵向移动的速度
	private double xyRate=rand.nextDouble()-0.5;
	private int xspeed=(int) (yspeed*xyRate*2);//小球横向移动的速度
	
	private int racketX=rand.nextInt(200);//挡板左边x坐标
	private int racketY;//挡板上边y左边
	private int racket_hight=20;//挡板高度
	private int racket_width=480;//挡板宽度
	
	Boolean isLose=false;//是否结束游戏
	private String game_str;
	public GameView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		setFocusable(true);//设置改View有控制焦点的能力
	}

	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
		if(isLose){//游戏结束时,显示
			paint.setColor(Color.rgb(255,0,0));
			paint.setTextSize(40);//设置字体大小
			canvas.drawText(game_str,180,400, paint);//早指定位置写字
		}
		paint.setStyle(Paint.Style.FILL);//画笔实心
		paint.setAntiAlias(true);//抗锯齿
		paint.setColor(Color.rgb(0,0,255));//设置画笔颜色
		canvas.drawCircle(ballX, ballY, ball_size, paint);//画圆
		paint.setColor(Color.rgb(0, 255,0));//设置颜色
		canvas.drawRect(racketX, racketY,racketX+racket_width,racketY+racket_hight, paint);//画矩形
		
	}
	
	public int getBallX() {
		return ballX;
	}

	public void setBallX(int ballX) {
		this.ballX = ballX;
	}

	public int getBallY() {
		return ballY;
	}

	public void setBallY(int ballY) {
		this.ballY = ballY;
	}

	public int getBall_size() {
		return ball_size;
	}

	public void setBall_size(int ball_size) {
		this.ball_size = ball_size;
	}
	
	public int getRacketX() {
		return racketX;
	}

	public void setRacketX(int racketX) {
		this.racketX = racketX;
	}

	public int getRacketY() {
		return racketY;
	}

	public void setRacketY(int racketY) {
		this.racketY = racketY;
	}

	public int getRacket_hight() {
		return racket_hight;
	}

	public void setRacket_hight(int racket_hight) {
		this.racket_hight = racket_hight;
	}

	public int getRacket_width() {
		return racket_width;
	}

	public void setRacket_width(int racket_width) {
		this.racket_width = racket_width;
	}
	public int getYspeed() {
		return yspeed;
	}

	public void setYspeed(int yspeed) {
		this.yspeed = yspeed;
	}

	public int getXspeed() {
		return xspeed;
	}

	public void setXspeed(int xspeed) {
		this.xspeed = xspeed;
	}

	public Boolean getIsLose() {
		return isLose;
	}

	public void setIsLose(Boolean isLose) {
		this.isLose = isLose;
	}
	
	public String getGame_str() {
		return game_str;
	}

	public void setGame_str(String game_str) {
		this.game_str = game_str;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值