这个弹球游戏是没有砖块的打砖块游戏,简版,效果如下
package WangLi.Graphics.PinBall; import java.util.Random; import java.util.Timer; import java.util.TimerTask; 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.view.Display; import android.view.KeyEvent; import android.view.View; import android.view.View.OnKeyListener; import android.view.Window; import android.view.WindowManager; public class PinBall extends Activity { class GameView extends View { public GameView(Context context) { super(context); setFocusable(true); } //重写View的onDraw方法,实现绘画 public void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setStyle(Paint.Style.FILL); //如果游戏已经结束 if(isLose) { paint.setColor(Color.RED); paint.setTextSize(40); canvas.drawText("游戏已结束", 50, 200, paint); } //如果游戏还未结束 else { //设置颜色,并绘制小球 paint.setColor(Color.rgb(240, 240, 80)); canvas.drawCircle(ballX, ballY, BALL_SIZE, paint); //设置颜色,并绘制小球 paint.setColor(Color.rgb(80, 80, 200)); canvas.drawRect(racketX, racketY, racketX + RACKET_WIDTH, racketY + RACKET_HEIGHT, paint); } } } /** Called when the activity is first created. */ //桌面的宽度 private int tableWidth; //桌面的高度 private int tableHeight; //球拍的垂直位置 private int racketY; //定义球拍的高度和宽度 private final int RACKET_HEIGHT = 20; private final int RACKET_WIDTH = 70; //小球的大小 private final int BALL_SIZE = 12; //小球纵向的运行速度 private int ySpeed = 10; Random rand = new Random(); //返回一个-0.5~0.5比率,用于控制小球的运行方向 private double xyRate = rand.nextDouble() - 0.5; //小球横向的运行速度 private int xSpeed = (int)(ySpeed * xyRate * 2); //ballX和ballY代表小球坐标 private int ballX = rand.nextInt(200) + 20; private int ballY = rand.nextInt(10) + 20; //racketX代表球拍的水平位置 private int racketX = rand.nextInt(200); //游戏是否结束的旗标 private boolean isLose = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //去掉窗口标题 requestWindowFeature(Window.FEATURE_NO_TITLE); //全屏显示 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //创建GameView组件 final GameView gameView = new GameView(this); setContentView(gameView); //获取窗口管理器 WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); //获取屏幕宽和高 tableWidth = display.getWidth(); tableHeight = display.getHeight(); racketY = tableHeight - 80; final Handler handler = new Handler() { public void handleMessage(Message msg) { if(msg.what == 0x123) { gameView.invalidate(); } } }; gameView.setOnKeyListener(new OnKeyListener() { public boolean onKey(View source,int keyCode,KeyEvent event) { //获取由哪个键触发事件 switch(event.getKeyCode()) { //控制挡板左移 case KeyEvent.KEYCODE_DPAD_LEFT: if(racketX > 0) racketX -= 10; break; //控制挡板右移 case KeyEvent.KEYCODE_DPAD_RIGHT: //判断是否已移到最右端 if(racketX < tableWidth - RACKET_WIDTH) racketX += 10; break; } //通知gameView组件重绘 gameView.invalidate(); return true; } }); final Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { //如果小球碰到左边边框 if(ballX <= 0 || ballX >= tableWidth - BALL_SIZE) { xSpeed = -xSpeed; } //如果小球高度超出了球拍位置,且横向不在球拍范围之内,游戏结束 if(ballY >= racketY - BALL_SIZE && (ballX < racketX || ballX > racketX + RACKET_WIDTH)) { timer.cancel(); //设置游戏是否结束的旗标为true isLose = true; } //如果小球位于球拍之内,且到达球拍位置,小球反弹 else if(ballY <= 0 || (ballY > racketY - BALL_SIZE && ballX > racketX && ballX <= racketX + RACKET_WIDTH)) { ySpeed = -ySpeed; } //小球坐标增加 ballY += ySpeed; ballX += xSpeed; //发送消息,通知系统重绘 handler.sendEmptyMessage(0x123); } }, 0, 100); } }