`
羊咩咩
  • 浏览: 14660 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

android 弹球游戏

阅读更多

老师说,我们要做个弹球游戏,好,我就做了个传说中的弹球游戏。

 

先看效果:




 

 

 
 

 

 

好吧,的确是简陋了点,不过基本功能还是实现了的。

 

先看主界面

activity_main.xml

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/ballbg1" >

    <ImageButton
        android:id="@+id/play"
        android:layout_width="120dp"
        android:layout_height="60dp"
        android:layout_above="@+id/exit"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="37dp"
        android:background="@drawable/play1" />
    
    <ImageButton
        android:id="@+id/exit"
        android:layout_width="120dp"
        android:layout_height="60dp"
        android:layout_alignLeft="@+id/play"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="56dp"
        android:background="@drawable/exit1" />

    
    
</RelativeLayout>

 

 

ballbg1.png




 
 


 play.png




 
 

exit.png



 

 

图片都是一手p出来的,水平虽然差了点,不过是血和泪的结晶啊。

 

再看主界面.java

package com.PinballGame.pinball;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {
	//屏幕宽
	public static int tableWidth;
	//屏幕高
	public static int tableHeight;
	//常亮属性
	PowerManager powerManager = null;
	WakeLock wakeLock = null;
	
	MediaPlayer media = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //音频
//        media = MediaPlayer.create(this, R.raw.start);
//        media.start();
        
        //设置常亮
        this.powerManager = (PowerManager)this.getSystemService(Context.POWER_SERVICE);
        this.wakeLock = this.powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Lock");
        
	    //获取窗口管理器
	  	WindowManager  windowManager = getWindowManager();
	  	Display display = windowManager.getDefaultDisplay();
	  	DisplayMetrics metrics = new DisplayMetrics();
	  	display.getMetrics(metrics);
	  	//获取屏幕宽和高
	  	tableWidth = metrics.widthPixels;
	  	tableHeight = metrics.heightPixels;
	  	
	  	//按钮宽和高
	  	int botwidth = (int) ((int) tableWidth/2.5);
	  	int botheight = (int) ((int) tableHeight/8);
	  	
        //设置play
        ImageButton playbot =(ImageButton) findViewById(R.id.play);
        ViewGroup.LayoutParams playbotn = (ViewGroup.LayoutParams) playbot.getLayoutParams();
        playbotn.width = botwidth;
        playbotn.height = botheight;
        
        playbot.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View source) {
				Intent intent = new Intent(MainActivity.this, PlayActivity.class);
				startActivity(intent);
			}
		});
        
        //设置 exit
        ImageButton exitbot =(ImageButton) findViewById(R.id.exit);
        ViewGroup.LayoutParams exitbotn = (ViewGroup.LayoutParams) exitbot.getLayoutParams();
        exitbotn.width = botwidth;
        exitbotn.height = botheight;
        
        exitbot.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View source) {
				/** 弹出对话框*/
				new AlertDialog.Builder(MainActivity.this)
					//设置标题
					.setTitle("天王盖地虎")
					//设置图标
					.setIcon(R.drawable.goodbay)
					//设置内容
					.setMessage("你确定要离开?")
					//添加确定按钮
					.setPositiveButton("确定", new DialogInterface.OnClickListener() {
						
						@Override
						public void onClick(DialogInterface dialog, int which) {
							// TODO Auto-generated method stub
							System.exit(0);
						}
					})
					//添加取消按钮
					.setNegativeButton("取消", new DialogInterface.OnClickListener() {
						
						@Override
						public void onClick(DialogInterface dialog, int which) {
							// TODO Auto-generated method stub
							
						}
					})
					.create()
					.show();
					
				
			}
		});
    }
    
    //唤醒
    @Override
    protected void onResume(){
    	super.onResume();
//    	media.start();
    	this.wakeLock.acquire();
    }

    //暂停
    @Override
    protected void onPause(){
    	super.onPause();
//    	media.stop();
    	this.wakeLock.release();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}

 

好吧,里面有屏幕常亮啦,唤醒啦,bababab~,好吧。其他好像没什么

 

再看play_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/playRoot"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    
</LinearLayout>

 平淡无奇,好继续。

 

 

看看 PlayActivity.java

package com.PinballGame.pinball;

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

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class PlayActivity extends Activity implements  OnTouchListener, OnGestureListener {
	//常亮属性
	PowerManager powerManager = null;
	WakeLock wakeLock = null;
	
	//playView
	PlayView playView = null;
	/**手势*/
	private  GestureDetector mGestureDetector;   
	public PlayActivity(){
		mGestureDetector =  new  GestureDetector( (OnGestureListener) this ); 
	}
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.play_activity);
      //设置常亮
      this.powerManager = (PowerManager)this.getSystemService(Context.POWER_SERVICE);
      this.wakeLock = this.powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Lock");
      
	  //创建PlayView组件
	  playView = new PlayView(this, null);
	  setContentView(playView);
	  
	  playView.setOnTouchListener(new OnTouchListener() {
		
		@Override
		public boolean onTouch(View v, MotionEvent event) {
			return  mGestureDetector.onTouchEvent(event); 
		}
	});
	  
	  //handler
	  final Handler handler = new Handler(){
		  public void handleMessage(Message msg){
			  if( msg.what == 0x123){
				  playView.invalidate();
			  }
		  }
	  };
	  
	  //定时器
	  final Timer timer = new Timer();
	  timer.schedule(new TimerTask() {
		
		@Override
		public void run() {
			//结束判断
			if( (playView.circleY + playView.radius) > (playView.paiY + playView.paiHeight) ){
				timer.cancel();
				playView.isOver = true;
			}else{
				//碰到墙壁时X的改变
				if( playView.circleX <= playView.radius 
						|| playView.circleX >= playView.screenWidth - playView.radius ){
					playView.speedX = -playView.speedX;
				}
				//碰到墙壁时Y的改变
				if( playView.circleY <= playView.radius
							|| ( playView.circleX >= playView.paiX 
								&& playView.circleX <= (playView.paiX + playView.paiWidth)
								&& (playView.circleY + playView.radius) >= playView.paiY
								&& (playView.circleY + playView.radius) <= playView.paiY + playView.paiHeight)  ){
					playView.speedY = -playView.speedY;
				}
				
				//初始化后才判断
				if( playView.baffleX != null ){
					//碰到障碍时X的改变
					for( int i = 0; i < playView.baffleLev; i++ ){
						int tag = 0;
						if( playView.circleY >= playView.baffleY[i] 
								&& playView.circleY <= (playView.baffleY[i] + playView.perHeight) ){
							for( int j = 0; j < playView.baffleNum; j++ ){
								if( playView.baffleArr[j][i] == 0 ){
									if( playView.circleX >= (playView.baffleX[j] - playView.radius)
											&& playView.circleX <= (playView.baffleX[j] + playView.perWidth + playView.radius) ){
										playView.speedX = -playView.speedX;
										playView.baffleArr[j][i] = 1;
										playView.baffleTotle--;
										tag = 1;
										break;
									}
								}
							}
							if( tag == 1 ) break;
						}
					}
					//碰到障碍时Y的改变
					for( int i = 0; i < playView.baffleNum; i++ ){
						int tag = 0; 
						if( playView.circleX >=  playView.baffleX[i] 
								&& playView.circleX <= ( playView.baffleX[i] + playView.perWidth ) ){
							for( int j = 0; j < playView.baffleLev; j++ ){
								if( playView.baffleArr[i][j] == 0 ){
									if( playView.circleY >= (playView.baffleY[j] - playView.radius)
											&& playView.circleY <= (playView.baffleY[j] + playView.perHeight+ playView.radius) ){
										playView.speedY = -playView.speedY;
										playView.baffleArr[i][j] = 1;
										playView.baffleTotle--;
										tag = 1;
										break;
									}
								}
							}
							if( tag == 1) break;
						}
					}
				}
				playView.circleX += playView.speedX;
				playView.circleY += playView.speedY;
			}
			handler.sendEmptyMessage(0x123);
		}
	}, 0, 10);
	  
    }
    
    //唤醒
    @Override
    protected void onResume(){
    	super.onResume();
    	this.wakeLock.acquire();
    }

    //暂停
    @Override
    protected void onPause(){
    	super.onPause();
    	this.wakeLock.release();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    /**手势中的按下*/
    public boolean onDown(MotionEvent e){
    	return true;
    }
    
    /**手势中的拖动*/
    public boolean onScroll(MotionEvent e1, MotionEvent e2,  float  distanceX,  float  distanceY) {
    	float tempX = playView.paiX - distanceX;
    	if( tempX < 0 ) tempX = 0;
    	if( tempX > playView.screenWidth - playView.paiWidth ) tempX = playView.screenWidth - playView.paiWidth;
    	playView.paiX = tempX;
    	playView.invalidate();
    	return true;
    }
    
	@Override
	public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,
			float arg3) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void onLongPress(MotionEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onShowPress(MotionEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean onSingleTapUp(MotionEvent arg0) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// TODO Auto-generated method stub
		return false;
	}
    
}

 

里面有手势,不过不是很懂。

 

在看PlayView.java

package com.PinballGame.pinball;


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

public class PlayView extends View{
	//屏幕宽高
	int screenWidth = 0;
	int screenHeight = 0;
	
	//障碍挡板宽
	public int baffleWith;
	//每份宽
	int perWidth = 0;
	//间隔宽
	int InterWidth = 0;
	
	//每份高
	int perHeight = 0;
	//间隔高
	int InterHeight = 0;
	
	//挡板层数
	public int baffleLev = 8;
	//每层挡板数
	public int baffleNum = 5;
	//挡板颜色
	public int[] colors = {Color.BLUE, Color.RED, Color.GREEN, Color.YELLOW, Color.BLUE, Color.RED, Color.GREEN, Color.YELLOW};
	//挡板总数
	public int baffleTotle = baffleLev * baffleNum;
	
	//障碍物X坐标
	int  baffleX [] = null;
	//障碍物Y坐标
	int baffleY [] = null;
	//障碍物标签
	int baffleArr[][] = null;
	
	//画笔
	Paint paint = null;
	
	//弹球的X坐标
	float circleX = -1;
	//弹球的Y坐标
	float circleY = -1;
	//弹球的半径
	int radius = 0;
	//弹球的X初速度
	int speedX = 1;
	//弹球的Y初速度
	int speedY = 1;
	
	//球拍X坐标
	float paiX = -1;
	//球拍Y坐标
	float paiY = -1;
	//球拍宽
	int paiWidth = 0;
	//球拍高
	int paiHeight = 0;
	
	//游戏是否结束
	boolean isOver = false;
	//游戏得分
	int scroe = 0; 
	
	public PlayView(Context context, AttributeSet set) {
		super(context, set);
		// TODO Auto-generated constructor stub
	}
	
	@Override
	protected void onDraw(Canvas canvas){
		super.onDraw(canvas);
		if( isOver ){
			paint = paint != null ? paint : new Paint();
			paint.setColor(Color.RED);
			paint.setTextSize(40);
			canvas.drawText("游戏结束啦", 50, 200, paint);
		}else if( baffleTotle == 0 ){
			paint.setColor(Color.RED);
			paint.setTextSize(40);
			canvas.drawText("你胜利啦", 50, 200, paint);
		}else{
			//把画布变成黑色
			canvas.drawColor(Color.BLACK);
			
			//画障碍物
			drawBaffle(canvas);
			
			//画球
			drawCircle(canvas);
			
			//画拍子
			drawPai(canvas);
		}
		
	}
	
	/**画障碍物*/
	public void drawBaffle(Canvas canvas){
		//屏幕宽高
		screenWidth = screenWidth != 0 ? screenWidth : MainActivity.tableWidth;
		screenHeight = screenHeight != 0 ? screenHeight: MainActivity.tableHeight;
		
		//每份宽
		perWidth = perWidth != 0 ? perWidth : screenWidth/(baffleNum+2);
		//间隔宽
		InterWidth = InterWidth != 0 ? InterWidth : perWidth*2/(baffleNum+1);
		
		int tempLev = baffleLev/2;
		//每份高
		perHeight = perHeight != 0 ? perHeight :  screenHeight/2/(colors.length+tempLev+2);
		//间隔高
		InterHeight = InterHeight !=0 ? InterHeight : perHeight/2;
		
		int tempHeight = 0;
		int tempH = 0;
		int tempWidht = 0;
		int tempW = 0;
		
		//画笔
		paint = new Paint();
		//去锯齿
		paint.setAntiAlias(true);
		//设置画笔宽
		paint.setStrokeWidth(3);
		//设置填充
		paint.setStyle(Paint.Style.FILL);
		
		//初始化障碍物X坐标
		baffleX = baffleX != null ? baffleX : new int[baffleNum];
		//初始化障碍物Y坐标
		baffleY = baffleY != null ? baffleY : new int[baffleLev];
		//初始化障碍物标签
		baffleArr = baffleArr != null ? baffleArr : new int[baffleNum][baffleLev];
		
		for(int i = 0; i < baffleLev; i++ ){
			//设置颜色
			paint.setColor(colors[i]);
			if ( i == 0 ) tempHeight = InterHeight + perHeight;
			else tempHeight = tempHeight + InterHeight + perHeight;
			tempH = tempHeight + perHeight;
			//保存Y坐标
			if( baffleY[i] == 0 ) baffleY[i] = tempHeight;
			for(int j = 0; j < baffleNum; j++ ){
				tempWidht = (j+1)*InterWidth + j*perWidth;
				tempW = tempWidht + perWidth;
				//保存X坐标
				if( baffleX[j] == 0 ) baffleX[j] = tempWidht;
				//判断是否已消除
				if(baffleArr[j][i] == 0 ){
					canvas.drawRect(tempWidht, tempHeight ,tempW ,tempH, paint);
				}
			}
		}
		
	}
	
	/**画弹球*/
	public void drawCircle(Canvas canvas){
		paint.setColor(Color.WHITE);
		circleX = circleX != -1 ? circleX : screenWidth/8;
		circleY = circleY != -1 ? circleY : screenHeight/2 + perHeight;
		radius = radius != 0 ? radius : perHeight/2;
		canvas.drawCircle(circleX, circleY, radius, paint);
	}
	
	/**画拍子*/
	public void drawPai(Canvas canvas){
		paiWidth = paiWidth != 0 ? paiWidth : screenWidth/5;
		paiHeight = paiHeight != 0 ? paiHeight : perHeight;
		paiX = paiX != -1 ? paiX : (screenWidth-paiWidth)/2;
		paiY = paiY != -1 ? paiY : screenHeight - perHeight*3;
		canvas.drawRect(paiX, paiY,paiX+paiWidth ,paiY+paiHeight ,paint);
	}

}

 

然后展示给老师看,老师说,勉强给个及格。我操###,写了不少时间好么。

还说view不好,要改回surferView,不过太懒了,不想改了,凑合用着吧。

 

源码奉上,欢迎改造!

 http://pan.baidu.com/s/1xhtxt

 

apk下载:

http://pan.baidu.com/share/link?shareid=3381226173&uk=1444496286

  • 大小: 20.3 KB
  • 大小: 2 KB
  • 大小: 6.6 KB
  • 大小: 9.1 KB
  • 大小: 23 KB
  • 大小: 19.4 KB
分享到:
评论

相关推荐

    简陋android弹球游戏

    【标题】:“简陋android弹球游戏” 这个项目标题揭示了我们正在讨论的是一个基于Android平台的简单游戏,称为“弹球游戏”。Android是Google开发的开源操作系统,主要用于移动设备,如智能手机和平板电脑。开发者...

    Android弹球游戏源码

    安卓游戏开发初学者非常有用,一款弹球游戏,基于Android Studio 2.2.2开发,代码内已含工程配置信息,在Android 5.0.2 上验证通过。滑屏退出游戏。 代码内增加了两个APP 启动阶段,可分别用于初始资源配置如网络...

    AndBall:Android弹球游戏

    【AndBall: Android弹球游戏】是一款基于AndEngine游戏开发引擎构建的移动平台游戏,主要由张舒贤、张俊、邬文怀和叶菁菁四位贡献者共同开发完成。这款弹球游戏专为Android系统设计,兼容从版本8到版本22的设备,为...

    Andriod弹球游戏源码

    《Android弹球游戏源码解析》 Android平台上的游戏开发是一项充满挑战与乐趣的工作,而“Android弹球游戏”作为一款简单的单机游戏,为初学者提供了很好的学习实例。这款游戏的核心在于挡板与小球之间的碰撞反弹,...

    Android studio 小游戏,弹球小游戏

    【Android Studio小游戏:弹球小游戏】是基于Android开发平台,使用Android Studio集成开发环境创建的一款简单而有趣的休闲游戏。这个游戏通常包含一个弹球和多个障碍物,玩家通过控制挡板来反射弹球,避免弹球掉落...

    Android 弹球小游戏

    【Android 弹球小游戏】是一款基于安卓平台的简单游戏,主要设计用于开发者进行技术实践,尤其是对于初学者,它提供了一个学习和理解Android开发中关键概念的实例。这款游戏的实现涉及了多个Android开发的重要知识点...

    Android 基于JBox2D的Android游戏开发全源码-IT计算机-毕业设计.zip

    《基于JBox2D的Android游戏开发全源码》是一个非常适合Android开发初学者以及毕业设计项目的实践案例。这个源码库包含了一款Android游戏的完整实现,它利用了JBox2D物理引擎来创建真实感的游戏环境。在这里,我们将...

    android开发弹球游戏

    在Android平台上,开发一款弹球游戏是一个典型的移动应用开发实例,可以帮助开发者深入理解Android游戏编程的基本原理和实践技巧。本文将详细探讨如何利用Eclipse IDE进行Android开发,创建一个简单的弹球游戏。 ...

    3D重力弹球游戏-Android源代码.rar

    一款运行于Android环境 的3D重力弹球游戏源代码,是一个过关游戏,一关比一关难度增加,3D弹球在迷宫中弹跳,并附有迷宫地图设计器的源代码。测试时候不知道咋搞的,一运行APK,虚拟器就自动退出,有兴趣的帮我查找...

    Android弹球效果的实现

    本项目"Android弹球效果的实现"就是一个很好的实例,它通过自定义View展示了逼真的弹球运动效果,同时还能自适应屏幕尺寸,提供良好的用户体验。 首先,我们要理解这个项目的核心——自定义View。在Android中,...

    android 源代码(彩色弹珠游戏)

    【Android 源代码分析——彩色弹珠游戏】 在Android平台上开发游戏,开发者通常会利用Java语言和Android SDK来创建丰富的交互式应用。本项目"彩色弹珠游戏"提供了完整的源代码,它是一个简单的休闲游戏,玩家通过...

    目标弹球小游戏(Android)

    《Android平台下的目标弹球小游戏开发详解》 在Android平台上,开发一款小游戏是开发者们实践技术、提升技能的常见方式。本文将详细解析一个名为"目标弹球"的小游戏,这款小游戏展示了Android游戏开发的基本技术和...

    ANDROID中的经典弹球游戏源代码

    项目: 安卓经典弹球游戏 关于项目 经典弹球游戏是一个安卓项目,旨在为用户提供经典的弹球游戏体验。该项目使用Android Studio开发,采用Java编程语言进行游戏逻辑实现,并使用XML进行UI设计。该游戏重现了经典弹球...

    android 弹球效果

    总结起来,实现Android的弹球效果需要结合动画、物理模拟、碰撞检测等多个方面知识,通过合理的编程技巧和优化手段,可以创建出既美观又流畅的弹球游戏或交互元素。在实际项目中,可以参考现有的开源项目,如使用Box...

    弹球小游戏

    android studio 平台下的开发的小游戏,只有大体的界面,萌新希望大佬能帮忙改进

    基于Android Studio的打砖块游戏(简易版).zip

    《基于Android Studio的打砖块游戏开发详解》 在移动应用开发领域,Android Studio作为Google官方推荐的Android应用开发工具,具有强大的功能和便捷的集成开发环境。本项目"基于Android Studio的打砖块游戏(简易版...

    自制简单android弹球小游戏

    在自学android的过程中自行开发的简单小游戏。为2.2系统,自行试验中可以在真机上运行。因为是自学作品,程序中或许会存在bug。 此程序用到UI编程,intent,Acitivity间跳转,xml资源使用,canvas绘图,SQLite数据库...

    Vector-Pinball:弹球游戏为Android

    Vector Pinball是一款用于Android设备的弹球游戏。 它是根据GPL版本3发布的; 请参阅“以获取许可证文本。 图形刻意简单。 目前,所有内容均以直线和圆画出。 重点是游戏玩法和精确的物理原理。 它为Box2D物理引擎...

    android游戏开发eclipes源代码

    本项目是一个使用Eclipse开发的Android小游戏——弹球游戏(PangBall),它展示了如何利用Java语言和Android SDK构建一个基本的移动游戏。 首先,我们需要了解Eclipse的基础知识。Eclipse是一款开源的IDE,广泛用于...

    自制android弹球小游戏

    在自学android的过程中自行开发的简单小游戏。为2.2系统,自行试验中可以在真机上运行。因为是自学作品,程序中或许会存在bug。 此程序用到UI编程,intent,Acitivity间跳转,xml资源使用,canvas绘图,SQLite数据库...

Global site tag (gtag.js) - Google Analytics