Android弹球游戏

简介: 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

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.util.DisplayMetrics;
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
{
	// 桌面的宽度
	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();
		DisplayMetrics metrics = new DisplayMetrics();
		display.getMetrics(metrics);
		// 获得屏幕宽和高
		tableWidth = metrics.widthPixels;
		tableHeight = metrics.heightPixels;
		racketY = tableHeight - 80;
		final Handler handler = new Handler()
		{
			public void handleMessage(Message msg)
			{
				if (msg.what == 0x123)
				{
					gameView.invalidate();
				}
			}
		};
		gameView.setOnKeyListener(new OnKeyListener() // 
		{
			@Override
			public boolean onKey(View source, int keyCode, KeyEvent event)
			{
				// 获取由哪个键触发的事件
				switch (event.getKeyCode())
				{
					// 控制挡板左移  A左移
					case KeyEvent.KEYCODE_A:
						if (racketX > 0) racketX -= 10;
						break;
					// 控制挡板右移,D右移
					case KeyEvent.KEYCODE_D:
						if (racketX < tableWidth - RACKET_WIDTH) racketX += 10;
						break;
				}
				// 通知gameView组件重绘
				gameView.invalidate();
				return true;
			}
		});
		final Timer timer = new Timer();
		timer.schedule(new TimerTask() // 
			{
				@Override
				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);
	}

	class GameView extends View
	{
		Paint paint = new Paint();

		public GameView(Context context)
		{
			super(context);
			setFocusable(true);
		}
		// 重写View的onDraw方法,实现绘画
		public void onDraw(Canvas canvas)
		{
			paint.setStyle(Paint.Style.FILL);
			// 设置去锯齿
			paint.setAntiAlias(true);
			// 如果游戏已经结束
			if (isLose)
			{
				paint.setColor(Color.RED);
				paint.setTextSize(30);
				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);
			}
		}
	}
}


目录
相关文章
|
7月前
|
数据库连接 Android开发
安卓android期末项目之纸牌游戏之三
安卓android期末项目之纸牌游戏之三
66 0
|
7月前
|
存储 Android开发 数据库管理
Android安卓项目猜纸牌游戏之二 实体类
Android安卓项目猜纸牌游戏之二 实体类
30 0
|
4月前
|
算法 Java 定位技术
分享104个益智休闲安卓游戏源码,总有一款适合你
分享104个益智休闲安卓游戏源码,总有一款适合你
186 1
|
4月前
|
编解码 移动开发 人工智能
android游戏源码
android游戏源码
89 0
|
7月前
|
XML Android开发 数据格式
Android项目猜纸牌游戏之一 界面设计和资源文件的设计
Android项目猜纸牌游戏之一 界面设计和资源文件的设计
52 0
|
9月前
|
Android开发 Windows
Mac 好用的 Android 模拟器整理(玩游戏、装应用、支持咸鱼、拼多多...)
Mac 好用的 Android 模拟器整理(玩游戏、装应用、支持咸鱼、拼多多...)
10030 47
|
10月前
|
Android开发
最强大脑之《数字华容道》游戏Android端的具体实现
其实我的实现方式很是简单,自定义一个View,确定View大小后,绘制八个格子,确定八个格子的左上右下,随机给八个格子绘制数据,比如第八个格子绘制的是“1”,那么,随着手势的移动当第八个格子也就是“1”的左上右下和第一个格子的左上右下相等时,那么这个格子的位置是正确的,同理,其它格子也是如此实现,当所有的格子都找到位置后,一一比较都是相等的,那么我们就可以判断,移动成功,那么就可以进入下一关了。
129 0
|
开发工具 Android开发 Python
【Android 逆向】逆向修改游戏应用 ( APK 解析工具 | 解包 -> 分析 -> 重打包 -> 签名 流程 )
【Android 逆向】逆向修改游戏应用 ( APK 解析工具 | 解包 -> 分析 -> 重打包 -> 签名 流程 )
664 0
【Android 逆向】逆向修改游戏应用 ( APK 解析工具 | 解包 -> 分析 -> 重打包 -> 签名 流程 )
|
API Android开发
【Android 应用开发】Android游戏音效实现
【Android 应用开发】Android游戏音效实现
152 0
|
缓存 监控 数据可视化
如何用 GPU硬件层加速优化Android系统的游戏流畅度
作为一款VR实时操作游戏App,我们需要根据重力感应系统,实时监控手机的角度,并渲染出相应位置的VR图像,因此在不同 Android 设备之间,由于使用的芯片组和不同架构的GPU,游戏性能会因此受到影响。举例来说:游戏在 Galaxy S20+ 上可能以 60fps 的速度渲染,但它在HUAWEI P50 Pro上的表现可能与前者大相径庭。
如何用 GPU硬件层加速优化Android系统的游戏流畅度