博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
安卓游戏 收集钱袋(自制)
阅读量:5943 次
发布时间:2019-06-19

本文共 8508 字,大约阅读时间需要 28 分钟。

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

源码位置

链接: 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坐标

 主要调用类

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
arrayList = new ArrayList
();; 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(); } }}

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

转载地址:http://mkwxx.baihongyu.com/

你可能感兴趣的文章
Linux下php连接sql server 2008
查看>>
python字符串格式化
查看>>
关于html和CSS的几个基本知识点
查看>>
Fiddler (三) Composer创建和发送HTTP Request
查看>>
C语言 多维数组和指针
查看>>
DotNetBar的使用—(界面风格)
查看>>
2.3系列系统中不支持SimpleDateFormat作字段被序列化
查看>>
DJANGO MODEL FORMSETS IN DETAIL AND THEIR ADVANCED USAGE
查看>>
ADO.NET复习——自己编写SqlHelper类
查看>>
库函数strlen源码重现及注意问题
查看>>
《实例化需求》读书笔记
查看>>
常用Java8语法小结
查看>>
ZJOI2019 Day2 游记
查看>>
ccf题库中2015年12月2号消除类游戏
查看>>
WinForm窗体间如何传值
查看>>
Ado.Net 连接数据库
查看>>
java多线程系列1:Sychronized关键字
查看>>
解释性的语言vs编译性语言
查看>>
codevs 1105 过河
查看>>
Java三大主流框架概述
查看>>