下面的程序开发了一个简单的弹球小游戏,其中小球和球拍分别以圆形区域和矩形区域代替:
主程序:
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;
}
}