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


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

    源码位置

    链接: 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();
    		}	
    	}
    }

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

  • 相关阅读:
    input()和print()函数同时输入输出多个数据--python3
    2018-海信-算法工程师-面试问题
    2018-CVTE中央研究院-自然语言处理算法工程师-电话面问题
    windows服务demo
    C#获取刚插入的数据的id
    .net微软企业库的事务回滚
    C# NPOI的数据批量导入数据库
    C# 使用复选框实现循环添加多条信息入库!
    C# DataSet与DataTable的区别和用法
    C#如何编写短信接口,以及接口的调用,包括C#.net访问web,并处理返回值的简例。
  • 原文地址:https://www.cnblogs.com/sunxun/p/4679252.html
Copyright © 2020-2023  润新知