从最简单的源代码开始,切勿眼高手低—(第一波)

从正式学习安卓到现在,差不多整整一年了,去年暑假,大约也就是6,7月份的样子,从图书馆借了好多书,安卓的,java的,假期里算是把李刚的完完整整的看完了,当时就只顾着看书,很少敲代码,也没做笔记,凭着脑子看,看完感觉收获还是挺大的,又看了mars老师的视频,没看完,大约看了第一季十几集差不多,终归停留在好像懂了的层面,也没做什么东西.        暑假过后,断断续续的学一点,发现java有点

大家好,又见面了,我是全栈君。

        从正式学习安卓到现在,差不多整整一年了,去年暑假,大约也就是6,7月份的样子,从图书馆借了好多书,安卓的,java的,假期里算是把李刚的<疯狂安卓讲义>完完整整的看完了,当时就只顾着看书,很少敲代码,也没做笔记,凭着脑子看,看完感觉收获还是挺大的,又看了mars老师的视频,没看完,大约看了第一季十几集差不多,终归停留在好像懂了的层面,也没做什么东西.

        暑假过后,断断续续的学一点,发现java有点薄弱,毕竟没系统的学过,寒假之后到前段时间系统的把java过了一遍.到这时候我开始意识到做笔记和敲代码的重要性了,不做笔记,很快就会把当时明白的知识点遗忘掉,不敲代码,等真正用到的时候不知道怎么下手.

直到前段时间,自己亲手写了个小游戏,我才真正体会到学习的乐趣.还是要多实际的去操作才行.期末了,忙着各种考试,也有点迷茫接下来该怎么继续学习,感觉自己挺懂了,其实大多还是眼高手低.前天,碰巧在安卓巴士上找到一个别人分享的文件,里面是二十来个游戏的源代码,有点如获至宝的感觉啊.

于是按照从小到大的顺序排列了下来,打算现在开始加上暑假,挨着看一遍,自己实现一遍.

最小的一个便是下面这个.界面就是下面一个挡板,可控制左右移动,把下落的球弹上去.很常见的一个案例.看了一遍源代码,大体自己重写了一遍.收货真的很大,以后写完一个贴上来一个,也算是给代码做个笔记.

如果你也是新手,一定要多写.自己多写.亲手写.


下面是源码

public class PinBall extends Activity{
	
	private int tableHeight;
	private int tableWidth;
	Random random = new Random();
	
	//挡板大小和坐标
	private final int racket_width = 70;
	private final int racket_height = 20;
	private int racketY;
	private int racketX;
	
    //球体大小,速度,坐标
	private final int ballR = 12;
	private int ballX;
	private int ballY;
	private int Vy = 3;
	//生成一个比率(-0.5~0.5之间),用于产生随机方向
	private double xyRate = random.nextDouble() - 0.5;
	private int Vx = (int) (Vy * 2 * xyRate); 
	
	//游戏进行时标志
	private boolean isLose = false;
	
	@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 game = new  GameView(this);
		setContentView(game);
		//获取桌面大小
		WindowManager manager = getWindowManager();
		Display display = manager.getDefaultDisplay();
		tableHeight = display.getHeight();
		tableWidth = display.getWidth();
		//根据获取的桌面大小初始化坐标
		initXY();
		
		//重绘
		final Handler handler = new Handler(){
			public void handleMessage(Message message){
				if(message.what == 0x123){
					game.invalidate();
				}
			}
		};
		
		final Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			
			@Override
			public void run() {
				//左右边框
				if(ballX < 0 || (ballX + ballR > tableWidth)){
					Vx = -Vx;
				}
				//超过下边界且未被球拍接住
				if((ballY + ballR > racketY) && (ballX + ballR < racketX || ballX > racketX + racket_width)){
					timer.cancel();
					isLose = true;
				}
				//被球拍打回或者反弹时到达顶部
				if(ballY < 0 || (ballY + ballR > racketY && ballX > racketX && ballX < racketX + racket_width )){
					Vy = -Vy;
				}
				ballX += Vx;
				ballY += Vy;
				handler.sendEmptyMessage(0x123);
			}
		}, 0, 10);
		
		//给游戏view加监听器
		game.setOnTouchListener(new OnTouchListener() {
			
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				int x = (int) event.getX();
				int mid = tableWidth/2;
				switch (x > mid ? 1 : 2) {
				case 1:
					if(racketX + racket_width < tableWidth){
						racketX += 10;	
					}
					break;
				case 2:
					if(racketX > 0){
						racketX -= 10;
					}
					break;
				}
				game.invalidate();
				return true;
			}
		});
		
	}
	
	private void initXY(){
		racketY = tableHeight - 80;
		racketX = random.nextInt(tableWidth);
		ballX = random.nextInt(tableWidth);
		ballY = random.nextInt(10) + 20;
	}
	
	class GameView extends View{

		private static final float TEXT_SIZE = 40;

		public GameView(Context context) {
			super(context);
			// TODO Auto-generated constructor stub
			setFocusable(true);
		}

		@Override
		protected void onDraw(Canvas canvas) {
			Paint paint = new Paint();
			paint.setStyle(Paint.Style.FILL);
			//游戏结束
			if (isLose) {
				paint.setTextSize(TEXT_SIZE);
				paint.setColor(Color.RED);
				canvas.drawText("Game Over!", tableWidth/2 - paint.getTextSize()*2, tableHeight/2 - paint.getTextSize()/2, paint);
			}
			//游戏继续
			else {
				paint.setColor(Color.BLUE);
				canvas.drawCircle(ballX, ballY, ballR, paint);
				paint.setColor(Color.GREEN);
				canvas.drawRect(racketX, racketY, racketX + racket_width, racketY + racket_height, paint);
				
			}
		}
		
		
	}
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/121478.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • k8s pod配置_k8s cka

    k8s pod配置_k8s ckak8sPod的结构Pod定义Pod的配置镜像拉取策略启动命令环境变量(不推荐)端口设置资源配额Pod的介绍Pod的结构每个Pod中都包含一个或者多个容器,这些容器可以分为两类:用户程序所在的容器,数量可多可少。Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个:可以以它为依据,评估整个Pod的健康状况。可以在根容器上设置IP地址,其它容器都共享此IP(Pod的IP),以实现Pod内部的网络通信(这里是Pod内部的通讯,Pod之间的通讯采用虚拟二层网络技术来实现,我们当前环境使

  • Mysql存储过程基本语法

    Mysql存储过程基本语法Mysql存储过程基本语法转载自这篇文章delimiter//一般情况下MYSQL以;结尾表示确认输入并执行语句,但在存储过程中;不是表示结束,因此可以用该命令将;号改为//表示确认输入并执行。一.创建存储过程1.基本语法:createproceduresp_name()begin………end2.参数传递二.调用存储过程1.基本语法:ca…

  • java 递归函数

    java 递归函数一、递归函数,通俗的说就是函数本身自己调用自己…如:n!=n(n-1)!你定义函数f(n)=nf(n-1)而f(n-1)又是这个定义的函数。。这就是递归二、为什么要用递归:递归的目的是简化程序设计

  • 架构之业务架构[通俗易懂]

    架构之业务架构[通俗易懂]业务架构之产品经理的职责产品经理的职责用户的原始需求往往是零散和碎片化的,产品经理的职责就是:告诉用户,系统长什么样子;告诉开发,他要实现什么功能。产品经理定义了系统的外表。产品经理的职责:1、收集用户的原始需求,2、梳理成一个个业务流程,每个业务流程由多个业务步骤组成。一个业务步骤包含三部分的内容:输入、输出和业务功能。3、需求梳理好后,产品经理会把每个步骤具体化为页面原型。在原型中,会以直观的方式给出各个步骤的输入或输出,以及用户的操作过程,最后再把这些页面串起来,形成一个业

    2022年10月12日
  • 搜索、推荐、广告系统等人工智能优质技术资源最全整理[通俗易懂]

    搜索、推荐、广告系统等人工智能优质技术资源最全整理[通俗易懂]前沿文章目录前沿开源地址[算法学习资料:AI_Tutorial](https://github.com/cbamls/AI_Tutorial)开源相关LuceneSolrElasticLucidWorks中文分词大公司阿里百度京东美团点评携程去哪儿搜狗一号店待分类开发应用理论基础源码解读常见问题其他人工智能领域文集算法学习资料:AI_Tutorial人工智能、AI架构、搜索系统、推荐系统…

  • 5G核心网UPF是什么_3gpp 5g协议

    5G核心网UPF是什么_3gpp 5g协议目录文章目录目录UPF参考文档UPFUPF(…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号