安卓游戏 收集钱袋(自制)

本人对游戏这一块很有兴趣,刚好 又兼着学安卓,所以就学着做了下安卓的 游戏

源码位置

链接: http://pan.baidu.com/s/1eQ4gdI6 密码: g58e

本文章是自己学习和记录用,喜欢的人可以阅读,写的不好的勿喷

开始,安卓基本的东西和环境的搭建就不细说了,先进行游戏的基本分析:

需要的元素:钱 钱袋 画板

小游戏,仅仅是机能的一些测试,所以没有做的很好,

个人喜欢做游戏的原因就是因为游戏和现实的世界非常的贴近,能够用现实的想法去思考游戏

比如本游戏:首先,钱肯定是默认的情况下就不停的运动的,然后钱袋,由玩家去控制,也能进行移动,当钱和钱袋接触,进行加分,并且钱消失,就是这么一段简单的想法

主Activity

package com.rp;



import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//设置全屏
		this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		//显示自定义的SurfaceView视图
		setContentView(new MySurfaceView(this));
	}
}

 钱这个类

package com.rp;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;

public class Money {
	//定义钱币
	private Rect money;
	public int moneyX=0,moneyY=0; //钱包的坐标
	public int speed=2;//钱币的下落速度
	public int height;
	private boolean isdeath=false;

	private int cnt;//分数
	
	public Money(int moneyX,int speed,int height){
		this.moneyX  = moneyX;
		this.speed = speed;
		this.height = height;
		this.cnt = speed;
	}
	
	
	public void DrawMoney(Canvas canvas,Paint paint){
		money = new Rect(moneyX, moneyY, moneyX+10, moneyY+20);
		canvas.drawRect(money, paint);
	}
	//钱的逻辑
	/***
	 * 自由下落  当过界的时候重新运动
	 */
	public void logic(){
		
		if(isdeath()){
			moneyY =0;
		}else{
			moneyY +=speed;
		}
		
	}
	/***
	 * 死亡函数
	 * 当钱过界,或者遇到钱袋即死亡
	 */
	public boolean isdeath(){
		if(this.moneyY>=this.height){
			isdeath = true;
		}else{
			isdeath = false;
		}
		return isdeath;
		
	}
	public int getCnt() {
		return cnt;
	}


	public void setCnt(int cnt) {
		this.cnt = cnt;
	}
	

}

  这里加入了一个摇杆系统,没特别作用,好看罢了

package com.rp;

import android.graphics.Canvas;
import android.graphics.Paint;

public class Yaogan {
	//定义两个圆形的中心点坐标与半径
	public float smallCenterX = 40, smallCenterY = 490, smallCenterR = 20;
	public float BigCenterX = 40, BigCenterY = 490, BigCenterR = 40;
	
	
	public void DrawYaogan(Canvas canvas,Paint paint){
		
		//绘制大圆
		canvas.drawCircle(BigCenterX, BigCenterY, BigCenterR, paint);
		//绘制小圆
		canvas.drawCircle(smallCenterX, smallCenterY, smallCenterR, paint);
		
	}
	
	/** 
	 * 小圆针对于大圆做圆周运动时,设置小圆中心点的坐标位置
	 * @param centerX 
	 *            围绕的圆形(大圆)中心点X坐标
	 * @param centerY 
	 *            围绕的圆形(大圆)中心点Y坐标
	 * @param R
	 * 			     围绕的圆形(大圆)半径
	 * @param rad 
	 *            旋转的弧度 
	 */
	public void setSmallCircleXY(float centerX, float centerY, float R, double rad) {
		//获取圆周运动的X坐标   
		smallCenterX = (float) (R * Math.cos(rad)) + centerX;
		//获取圆周运动的Y坐标  
		smallCenterY = (float) (R * Math.sin(rad)) + centerY;
	}
	
	/**
	 * 得到两点之间的弧度
	 * @param px1    第一个点的X坐标
	 * @param py1    第一个点的Y坐标
	 * @param px2    第二个点的X坐标
	 * @param py2    第二个点的Y坐标
	 * @return
	 */
	public double getRad(float px1, float py1, float px2, float py2) {
		//得到两点X的距离  
		float x = px2 - px1;
		//得到两点Y的距离  
		float y = py1 - py2;
		//算出斜边长  
		float Hypotenuse = (float) Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
		//得到这个角度的余弦值(通过三角函数中的定理 :邻边/斜边=角度余弦值)  
		float cosAngle = x / Hypotenuse;
		//通过反余弦定理获取到其角度的弧度  
		float rad = (float) Math.acos(cosAngle);
		//当触屏的位置Y坐标<摇杆的Y坐标我们要取反值-0~-180  
		if (py2 < py1) {
			rad = -rad;
		}
		return rad;
	}

}

 主要调用类

package com.rp;

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Region;
import android.media.MediaPlayer;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

/**
 * 
 * @author sunzhiyan
 * @version 0.1
 *
 */
public class MySurfaceView extends SurfaceView implements Callback, Runnable {
	private SurfaceHolder sfh;
	private Paint paint;
	private Thread th;
	private boolean flag;
	private Canvas canvas;
	private int screenW, screenH=532;
	private int x=100,y=400;//手指触屏的坐标
	private Yaogan yaogan;
	//定义一个音乐播放器
	private MediaPlayer mediaplay;
	//**********************************************
	private Rect rect;
	private Money money;
	private Region reg;
	//定义一个主角
	
	//定义一套钱币
	private ArrayList<Money> arrayList =  new ArrayList<Money>();;
	
	private int mx=0,my=0;
	private int count;
	/**
	 * SurfaceView初始化函数
	 */
	public MySurfaceView(Context context) {
		super(context);
		sfh = this.getHolder();
		sfh.addCallback(this);
		paint = new Paint();
		paint.setColor(Color.RED);
		paint.setAntiAlias(true);
		//调用游戏初始化
		initGame(context);
		setFocusable(true);
	}
		
	//初始化游戏函数
	public void initGame(Context context){
		//实例化一个遥杆
		yaogan = new Yaogan();
		//调用一个音乐文件
		 mediaplay = MediaPlayer.create(context, R.raw.bgmusic);
		//设置循环播放
		mediaplay.setLooping(true);
		//音乐的再次接着播放
		mediaplay.start();
		
		//定义一套钱币
		
		Money money01 = new Money((mx+0)*50,5,screenH);
		Money money02 = new Money((mx+1)*50,15,screenH);
		Money money03 = new Money((mx+2)*50,10,screenH);
		Money money04 = new Money((mx+4)*50,5,screenH);
		Money money05 = new Money((mx+5)*50,5,screenH);
		Money money06 = new Money((mx+6)*50,5,screenH);
		
		arrayList.add(money01);
		arrayList.add(money02);
		arrayList.add(money03);
		arrayList.add(money04);
		arrayList.add(money05);
		arrayList.add(money06);
		
		
		 
	}

	/**
	 * SurfaceView视图创建,响应此函数
	 */
	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		
		flag = true;
		//实例线程
		th = new Thread(this);
		//启动线程
		th.start();
	}

	/**
	 * 游戏绘图
	 */
	public void myDraw() {
		try {
			canvas = sfh.lockCanvas();
			if (canvas != null) {
				canvas.drawColor(Color.WHITE);				
				//绘制背景
				//Bitmap background = BitmapFactory.decodeResource(this.getResources(), R.drawable.background);
				//canvas.drawBitmap(background,0,0, paint);
				paint.setAlpha(0x77);
				
				//绘制一个钱币

				//取得鼠标的中心点 绘制主角
				rect = new Rect(x-20, y-20, x+20, y+20);
				reg = new Region(rect);

				for (int i = 0; i < arrayList.size(); i++) {
					//money.logic();
					arrayList.get(i).DrawMoney(canvas, paint);
					if(reg.contains(arrayList.get(i).moneyX, arrayList.get(i).moneyY)){
						count = count+arrayList.get(i).getCnt();
						//目标死亡
						arrayList.get(i).moneyY = 0;
						paint.setColor(Color.BLUE);
					}
				}	
								
/*				for (int i = 0; i < 7; i++) {
					 money = new Money();
					 money.DrawMoney(canvas, paint,(mx+i)*50,i+2);
					 arrayList.add(money);
				}	*/
				
		/*		if(reg.contains(moneyX, moneyY)){
					paint.setColor(Color.BLUE);
				}else{
				}*/

				
				//判断碰撞

				
				canvas.drawRect(rect, paint);
				
				//遥感
				yaogan.DrawYaogan(canvas,paint);

				//不停的对坐标进行监控
				canvas.drawText("x="+x+"y="+y, 100, 480, paint);
				
				//
				canvas.drawText("您的积分是"+count, 230, 500, paint);
			}
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			if (canvas != null)
				sfh.unlockCanvasAndPost(canvas);
		}
	}

	/**
	 * 触屏事件监听
	 */
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		//当用户手指抬起,应该恢复小圆到初始位置
		if (event.getAction() == MotionEvent.ACTION_UP) {
			yaogan.smallCenterX = yaogan.BigCenterX;
			yaogan.smallCenterY = yaogan.BigCenterY;
		} else {
			int pointX = (int) event.getX();
			int pointY = (int) event.getY();
			x =  pointX;
			y = pointY;
			//判断用户点击的位置是否在大圆内
			if (Math.sqrt(Math.pow((yaogan.BigCenterX - (int) event.getX()), 2) + Math.pow((yaogan.BigCenterY - (int) event.getY()), 2)) <= yaogan.BigCenterR) {
				//让小圆跟随用户触点位置移动
				yaogan.smallCenterX = pointX;
				yaogan.smallCenterY = pointY;
			} else {
				yaogan.setSmallCircleXY(yaogan.BigCenterX, yaogan.BigCenterY,yaogan.BigCenterR, yaogan.getRad(yaogan.BigCenterX, yaogan.BigCenterY, pointX, pointY));
			}
		}
		return true;
	}



	/**
	 * 按键事件监听
	 */
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		return super.onKeyDown(keyCode, event);
	}


	@Override
	public void run() {
		while (flag) {
			long start = System.currentTimeMillis();
			myDraw();
			logic();
			long end = System.currentTimeMillis();
			try {
				if (end - start < 50) {
					Thread.sleep(50 - (end - start));
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * SurfaceView视图状态发生改变,响应此函数
	 */
	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
	}

	/**
	 * SurfaceView视图消亡时,响应此函数
	 */
	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		flag = false;
	}
	/**
	 * 游戏逻辑
	 */
	private void logic() {
		for (int i = 0; i < arrayList.size(); i++) {
			//money.logic();
			arrayList.get(i).logic();
		}	
	}
}

基本代码已经给出,也没什么素材,代码本人亲测成功的,后期有打算完善的可能性,当然还是得需要一个美工得协助

posted on 2015-07-27 09:19  手撕高达的村长  阅读(388)  评论(0编辑  收藏  举报

导航