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

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

源码位置

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

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

时间: 2024-07-31 14:25:30

安卓游戏 收集钱袋(自制)的相关文章

用 Android-X86 和 VirtualBox 玩安卓游戏

目前的系统是 Ubuntu 14.04,近日玩了玩 flash 版的<皇家禁卫军:前线>塔防游戏,还是想试试原生安卓游戏的表现.发现大概有两个选择: 各类安卓模拟器:官方SDK模拟器,bluestacks(win),Genymotion(跨平台) Android-x86, 这个牛B的开源项目将Android移植到了x86平台,这样就能直接在PC或虚拟机上流畅的运行了. 系统已装 vbox,所以直接第二个选择. 1.下载Android-x86系统镜像文件 首先到http://www.androi

Adreno Profiler分析任意安卓游戏特效+抓取资源

听说可以抓去任意游戏特效..保存下,有空研究 AdrenoProfiler 下载地址 Adreno Profiler分析任意安卓游戏特效+抓取资源 教程

孤岛能源安卓游戏安卓源码

这个是在那个安卓教程网分享过来的,孤岛能源安卓游戏安卓源码,孤岛能源是一个以孤岛为背景的模拟动作游戏,游戏中你的角色是 Android 机器人,目的是找到该岛上充满能量的能源造福人类.游戏中,你可以选择按键操作,也可以选择触摸操作.希望你能顺利完成任务. 效果图: 详细说明:http://android.662p.com/thread-5236-1-1.html

前景光明:国内安卓游戏市场趋势

前不久,有外媒发表了一篇文章,文中专门点评了中国移动游戏市场的四个主要的趋势.那么接下来,就让我们来看一看这四大趋势到底是哪些.   1.中国拥有巨大的游戏市场在2014年,中国手机用户已经达到了12亿,而且这个数字仍在以惊人的速度增长着,毫无疑问中国已经在加速成为了世界上第一大游戏市场.据Flurry的数据统计,中国是全球iOS和安卓激活量最高的国家,同时根据App Annie的统计,中国iOS应用下载量居全球第二,仅次于美国,而在下载增长速度上,中国则是当之无愧的第一. 2.利润空间有余虽然

【用PS3手柄在安卓设备上玩游戏系列】谈安卓游戏对手柄的支持

不同的游戏对于手柄的支持程度是不一样的,对应所需要进行的手柄设置也不尽相同.我没有这样的时间和精力,针对每一款游戏去写博客,但找出不同游戏中的共同点,针对同一类的游戏去写博客,应该是可行的.我把安卓上的游戏分成下面四种类型: 1.原生支持实体手柄的 安卓系统本身是支持实体手柄的.淘宝上面随便一搜"安卓手柄",就能找到各种外设厂商针对安卓系统定制的游戏手柄.游戏厂商跟外设厂商的支持总是相辅相成的,在游戏厂商的支持下,有些游戏是原生支持手柄的.这里的"原生"二字,强调的

安卓游戏上线必备攻略!怎么样在14天内接完16个大平台的SDK!

最近发现MDT推出去的系统的有不同问题,其问题就不说了,主要是策略权限被域继承了.比如我们手动安装的很多东东都是未配置壮态,推的就默认为安全壮态了,今天细找了一下,原来把这个关了就可以了. 安卓游戏上线必备攻略!怎么样在14天内接完16个大平台的SDK!

用WPE+CCproxy+自动代理截取安卓游戏封包

用WPE+CCproxy+自动代理截取安卓游戏封包>> window.location.href="https://jingyan.baidu.com/article/c33e3f488c103aea15cbb5e3.html" 原文地址:https://www.cnblogs.com/wuhairui/p/9591944.html

安卓游戏开发之对线性布局和相对布局的初步认识

上一次带大家初步了解了安卓游戏开发的布局,这次带大家再进一步探索相对布局和线性布局,这一次我的目标是在主页设置两个按钮,然后分别跳转到线性布局和相对布局 线性布局:线性布局是我们在开发中最常见的布局方式之一,线性布局可以分为水平线性布局和垂直线性布局这两种布局方式 相对布局:相对布局也是常用的布局之一,它可以设置某一个控件相对于其他控件的位置,这些位置可以包括上下左右等,因此相较于其他的布局方式而言具有很大的灵活性. 步骤: 1.首先是添加两个按钮,添加响应事件(方便直接跳转到两个不同的界面)

《飞机大战》安卓游戏开发源码(终)

前言:最 近闲来无事,而且也是因为刚接触安卓不久,所以萌生了以后在开发web 项目的过程中同样开发安卓手游,因前一段时间项目需要独立完成了一款功能型手机app ,该App比较简单,全是按钮操作,也就是Activity之间的相互传值与过渡,所以对安卓的基本知识有了一定了解,在我的印象当中,感觉安卓手游是比 较困难的,但是有困难就要克服,所以有了开发游戏的念头. 上一篇文章中写到了飞机的发射子弹,在本文中,将继续完善代码,该代码也是最终的代码,本游戏至此开发结束,游戏界面很粗糙,毕竟不是专业开发游