`
一口三个汉堡
  • 浏览: 116611 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

实例17--无敌抢钱鸡

 
阅读更多

  随着转化的进行,难度也在增加,这次的实例我弄了一天,当然有些时间是在弄其他的,随着代码量的增加,要更加理解源代码的结构,我这次采用uml弄出他们的各个类图和结构,这样让我更了解原作者的思想...然后再用android的方法的实现,当然因为都是java开发的,有些类是直接用的,这次还是使用了我本来的写的android_midp包,在androidSprite类中添加了碰撞方法.

下面是效果图:



 

 

 

MainView.java

package com.wjh.demon_17;

import java.util.Random;

import com.wjh.midp_me.GameView;

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.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;

public class MainView extends SurfaceView implements Callback,Runnable{
	
	
	public static final int GAME_UI		= 0;	//进入用户界面
	public static final int GAME_GAMING	= 1;	//进行游戏
	public static final int GAME_END		= 2;	//游戏结束
	public static final int GAME_STATE_NUM = 3;	//状态总数
	private int m_nState	= GAME_UI;				//存储当前的游戏状态
	
	private boolean		m_bRunning;				//控制线程运行
	private MyBack			m_Back;					//游戏背景
	private MyUI			m_UI;					//用户界面	
	private ChickSprite	m_Chick;				//管理小鸡对象
	private GoodsSprite	m_Goods[];				//管理物品对象
	private int			m_nScore = 0;			//当前得分
	private int			m_nTime = 60 * 10;		//游戏总时间
	private Random			m_Random;
	private int screenStartX = 0;//游戏界面开始坐标X
	private int screenStartY = 0;//游戏界面开始坐标Y
	private int screenWidth = 0;//游戏界面宽度
	private int screenHeight =0;//游戏界面高度
	
	private Context context ;
	int keyState = 0;
	Thread gameThread = null;
	SurfaceHolder holder = null;
	public MainView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		
		this.context = context;
		setFocusable(true);
		setFocusableInTouchMode(true);
		holder = this.getHolder();
		holder.addCallback(this);	
	}
	private void initView()
	{
		m_Random = new Random();
		m_Back = new MyBack(context);
		m_UI = new MyUI(context);
		screenStartX = (getWidth() - m_Back.getBackImageWidth())/2;
		screenStartY = (getHeight()-m_Back.getBackImageHeight())/2;
		screenWidth = screenStartX+m_Back.getBackImageWidth();
		screenHeight = screenStartY+m_Back.getBackImageHeight();
		
		try{
			//读取小鸡精灵图片,并设置小鸡的初始位置
			Bitmap img = BitmapFactory.decodeResource(getResources(), R.drawable.chick);
			m_Chick = new ChickSprite( img, 31, 29);
			m_Chick.setRefPixelPosition( getWidth() / 2, screenHeight- 18 );
			
			//读取物品图片,屏幕上最多同时掉落6个物品
			img = BitmapFactory.decodeResource(getResources(), R.drawable.goods);
			m_Goods = new GoodsSprite[6];
			for( int n = 0; n < m_Goods.length; n ++ )
				m_Goods[n] = new GoodsSprite( img, 19, 19 );
		}
		catch (Exception ex){} 
		setState(GAME_UI);							//设置游戏状态
	}
	private void setState( int state ){			//设置当前的游戏状态
		if( state < 0 || state >= GAME_STATE_NUM )
			return;
		m_nState = state;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(m_bRunning)
		{
			input();
			logic();
			doDraw();
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	//开始游戏主线程
	public void start()
	{
		if(gameThread == null)
		{
		gameThread = new Thread(this);
		gameThread.start();
		m_bRunning = true;
		}
	}
	//停止游戏主线程
	public void stop()
	{
		m_bRunning = false;
		if(gameThread != null)
		{
			try {
				gameThread.join();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	private int getKeyStates()
	{
		return keyState;
	}
	private void setKeyStates(int keyStates)
	{
		this.keyState = keyStates;
	}
	//输入判断
	public void input()
	{
		//根据不同的游戏状态,处理按键操作
				int keyStates = getKeyStates();
				switch( m_nState ){
				case GAME_UI:								//进入用户界面
					m_UI.Input(keyStates);
					if( m_UI.getState() == MyUI.UI_HIDE )	//当用户界面被隐藏时进入游戏
						setState(GAME_GAMING);
					break;
				case GAME_GAMING:							//进入游戏
					if( m_nTime <= 0 )						//如果游戏超时
						return;	
					m_Chick.Input(keyStates,screenStartX,screenStartY,screenWidth,screenStartY);
					break;
				}
	}
	//逻辑判断
	public void logic()
	{
		//根据不同的游戏状态,处理逻辑操作
				switch( m_nState ){
				case GAME_UI:								//进入用户界面
					break;
				case GAME_GAMING:							//进入游戏
					m_Chick.Logic();
					for( int n = 0; n < m_Goods.length; n ++ )
					m_Goods[n].Logic(screenHeight-10);
					Collides();								//碰撞检测
					CreateGoods();							//随机生成新物品
					m_nTime --;
					if( m_nTime <= 0 )						//如果游戏超时
						setState(GAME_END);
					break;
				}
	}
	
	private void Collides(){							//碰撞检测
		for( int n = 0; n < m_Goods.length; n ++ ){
			if( m_Chick.collidesWith(m_Goods[n]) )
			{//如果小鸡与物品发生碰撞,即小鸡接到了物品
				switch( m_Goods[n].getType() ){
				case GoodsSprite.GODDS_GOLD:			//接到金元宝
					m_nScore += 5;						//增加5个积分点
					break;
				case GoodsSprite.GODDS_DIAMOND:			//接到钻石
					m_nScore += 10;						//增加10个积分点
					break;
				case GoodsSprite.GODDS_FRUIT:			//接到圆形水果会被砸倒
					m_Chick.setState( ChickSprite.CHICK_DOWN );
					break;
				}
				m_Goods[n].setVisible(false);			//让物品消失
			}
		}
	}
	private void CreateGoods(){						//随机产生新物品
		//以1比20的概率产生新物品
		int rand = m_Random.nextInt() % 10;				//rand在-10~10之间
		if( rand != 0 )							
			return;
		for( int n = 0; n < m_Goods.length; n ++ ){
			if( m_Goods[n].isVisible() == false ){
				//随机设置新物品的种类及初始位置
				int type = Math.abs( m_Random.nextInt());
				type = type % GoodsSprite.GODDS_TYPE_NUM;
				m_Goods[n].setType(type);
				
				int x = m_Random.nextInt() % (screenWidth-screenStartX-10);
				x = Math.abs(x)+screenStartX;
				m_Goods[n].StartDrop( x,screenStartY+10);
				break;
			}
		}
	}
	public void doDraw()
	{
		Canvas c = null;
		try
		{
		c = holder.lockCanvas();
		synchronized (holder) {

			paint(c);
		}
		}finally{
			if(c != null)
			{
			holder.unlockCanvasAndPost(c);
			}
		}
	}
	//画图
	public void paint(Canvas canvas)
	{
		//用黑色清屏
		Paint backpaint = new Paint();
		backpaint.setColor(Color.BLACK);
		canvas.drawRect(0, 0, getWidth(), getHeight(), backpaint);
		
		Paint forePaint = new Paint();
		forePaint.setColor(Color.RED);
		forePaint.setTextSize(20);
		switch( m_nState ){
		case GAME_UI:									//显示标题界面
			m_UI.Paint(canvas, forePaint,getWidth(), getHeight());
			break;
		case GAME_GAMING:								//显示游戏画面
			m_Back.Paint(canvas, forePaint,getWidth(), getHeight());
			m_Chick.paint(canvas,forePaint);
			for( int n = 0; n < m_Goods.length; n ++ )
				m_Goods[n].paint(canvas,forePaint);
			//显示文字信息
			StringBuffer strText = new StringBuffer();
			strText.append("Time:");
			strText.append(m_nTime / 10);
			strText.append("     Score:");
			strText.append(m_nScore);
			canvas.drawText( strText.toString(),20,20,forePaint);
			break;
		case GAME_END:									//显示结束信息
			m_Back.Paint(canvas,forePaint, getWidth(), getHeight());
			StringBuffer strEndText = new StringBuffer();
			strEndText.append("游戏结束,本次得分:");
			strEndText.append(m_nScore);
			canvas.drawText( strEndText.toString(), 20, getHeight()/2,forePaint );
			break;
		}
	}
	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		// TODO Auto-generated method stub

		
	}
	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		// TODO Auto-generated method stub
		initView();
		start();
	
	}
	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		// TODO Auto-generated method stub
		stop();
		
	}
	
	float x1 = 0;
	float x2 = 0;
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub	
		switch(event.getAction())
		{
		case MotionEvent.ACTION_DOWN:
			setKeyStates(GameView.ACTION_FIRE);
			x1 = event.getX();
			x2 = 0;
			break;
		case MotionEvent.ACTION_UP:
			x2 =event.getX();
			if(x2-x1>50)
			{
				setKeyStates(GameView.ACTION_RIGHT);
			}else if(x1-x2>50)
			{
				setKeyStates(GameView.ACTION_LEFT);
			}
			x1= 0;
			x2 = 0;
			break;
		default :
			break;
		}
		return true;
	}


	
	
}

 源代码:Demon_17.rar

apk文件(后缀改为apk):Demon_17.zip

  • 大小: 12.1 KB
  • 大小: 7.7 KB
  • 大小: 7.8 KB
  • 大小: 7 KB
0
0
分享到:
评论

相关推荐

    基于S7-300PLC与MCGS6.2的饮料罐装生产线自动化控制系统设计,包含仿真、程序、IO表与电气原理,实现自动操作、灌装报警及瓶数记录功能 ,基于PLC的饮料罐装生产线控制系统设计 S7-30

    基于S7-300PLC与MCGS6.2的饮料罐装生产线自动化控制系统设计,包含仿真、程序、IO表与电气原理,实现自动操作、灌装报警及瓶数记录功能。,基于PLC的饮料罐装生产线控制系统设计。 S7-300PLC MCGS6.2仿真 仿真,程序,IO表,电气原理图,6500字说明。 实现功能有: (1)系统通过开关设定为自动操作模式,一旦启动,则传送带的驱动电机启动并一直保持到停止开关动作或罐装设备下的传感器检测到一个瓶子时停止;瓶子装满饮料后,传送带驱动电机必须自动启动,并保持到又检测到一个瓶子或停止开关动作。 (2)当瓶子定位在灌装设备下时,停顿1秒,罐装设备开始工作,灌装过程为5秒钟,罐装过程应有报警显示,5秒后停止并不再显示报警。 (2)用两个传感器和若干个加法器检测并记录空瓶数和满瓶数,一旦系统启动,必须记录空瓶和满瓶数,设最多不超过99999999瓶。 (4)可以手动对计数器清零(复位)。 ,关键词:S7-300PLC; MCGS6.2仿真; 传送带驱动电机; 传感器检测; 瓶装; 空瓶数; 满瓶数; 报警显示; 自动操作模式; 灌装设备。,基于S7-300PLC的饮料罐装

    python加密货币时间序列预测源码+数据集-最新出炉.zip

    python加密货币时间序列预测源码+数据集-最新出炉 加密货币分析: 对各种加密货币的数据进行分析和研究。可能会使用到从各种来源收集的数据,包括但不限于加密货币的价格、市值、交易量、交易时间等信息。 探索加密货币市场的趋势和模式,例如价格的波动情况、不同加密货币之间的相关性等。 数据处理与操作: 可能使用 Python 语言(Kaggle 上常用的数据分析语言),并运用一些数据处理和分析的库,如 pandas 用于数据的读取、清洗、整理和转换操作,将原始的加密货币数据转换为更易于分析的格式。 可视化展示: 通过可视化工具,如 matplotlib 或 seaborn 库,将加密货币的信息以图表的形式展示出来,以帮助直观地理解数据中的关系和趋势。 统计分析或预测: 可能会进行一些基本的统计分析,如计算加密货币价格的均值、中位数、标准差等统计量,以描述数据的特征。 或者使用机器学习或时间序列分析的方法对加密货币的价格进行预测,根据历史数据预测未来价格走势。 例如,使用 scikit-learn 进行简单的回归分析: 数据挖掘与特征提取: 挖掘加密货币数据中的特征,如找出影响价格的关键因素,对数据中的特征进行筛选和提取,以帮助更好地理解加密货币的市场行为。

    面对程序设计GJava

    类和对象、继承、封装、多态、接口、异常

    TF_demo1_keras.ipynb

    gee python相关教程

    夜间灯光数据 2023年全球_中国夜间灯光数据合集(数据权威)

    夜间灯光强度(平均灯光强度)的高低反映了一个地区城市化发展的水平,平均灯光强度越高,说明该地区城市群越多,城市化程度越高。夜间灯光数据现在越来越广泛地应用于经济增长分析、经济地理、城市经济学、数字经济等众多领域。 本数据包括三套: [1]中国类DMSP-OLS灯光数据1992-202 [2]中国超长序列灯光数据1984-2020 [3]全球类NPP-VIIRS夜间灯光数据2000-2022 包括:全国各省、市、县夜间灯光数据 矫正后夜间灯光数据 细分:标准差、平均值、总值、最大值和最小值

    工程项目总监绩效考核表.xls

    工程项目总监绩效考核表

    (数据权威)各省份一般公共预算转移支付数据(附送地级市转移支付)

    首先解释一下什么叫转移支付。其实,这和养老金的中央调剂是一样的。 每年,地方都要向中央缴纳财政。而中央又要根据各地方的财政实力,给予转移支付。比如一些经济弱省,本身财政收入就不够支出的,还得上交一部分给中央,怎么维持财政运转?由于各省市直接的财政收入能力存在差异,中央为实现各个地方的公共服务水平平等,于是便有了财政转移支付制度。 简单理解就是富省养穷省。 2022年全国一般预算内财政收入203703亿元,给地方转移支付了97144.75亿元,转移支付数额创下新高。

    基于门控卷积和堆叠自注意力的离线手写汉字识别算法研究.pdf

    基于门控卷积和堆叠自注意力的离线手写汉字识别算法研究.pdf

    逐月中国工业用水空间分布数据集(数据权威)

    【数据介绍】   作为第二大人类部门用水,高质量的工业用水格网数据对于水资源研究和管理至关重要。中国工业用水格网数据(China Industrial Water Withdrawal dataset, CIWW)基于超过 40 万家企业数据、月度工业产品产量数据和连续工业用水统计数据制作得到的一套1965-2020年逐月中国工业用水数据集,其空间分辨率为 0.1°和 0.25°。数据集包括工业用水、企业数量和企业生产总值(辅助数据)等变量,可被用于水文、地理学、环境、可持续发展等方面科学研究。 【数据来源】   数据来源为《中国经济普查年鉴》(省级工业取水量、工业产出)、《中国工业企业数据库》(企业地理位置、产值)、《中国工业产品产量数据库》(工业产品月生产量),以及《中国水资源公报》和(Zhou et al, 2020, PNAS)的工业用水量数据。 【数据处理】 首先通过2008年企业分布数据、经济普查年鉴中分省分部门的工业用水量和工业产值计算得到分省分部门工业用水效率和工业产品产量数据,得到了2008年逐月工业用水数据。然后结合中国水资源公报和相关文献中省级工业用水数据,以2008年工业用水的时空格局作为基础分配工业用水数据,最终得到1965-2020年逐月工业用水的格网数据。详细方法见High-resolution mapping of monthly industrial water withdrawal in China from 1965 to 2020 (Hou et al, 2024, ESSD). 将数据集与统计数据记录和其他数据集进行了验证,结果表示在时间尺度和空间尺度上都与统计数据具有一致性,相比已有工业用水数据有更好的精度。

    65 -质量管理部经理绩效考核表1.xlsx

    65 -质量管理部经理绩效考核表1

    11 -电脑部经理绩效考核表1.xlsx

    11 -电脑部经理绩效考核表1

    大英赛写作必备:实用英语万能句及其应用技巧

    内容概要:本文提供了针对大学生英语竞赛写作准备的重要资源——一系列通用的英文句子模板。这些模板涵盖了现代经济社会的各种话题,从科技进步到环境保护,以及个人品质和社会责任等,并且适用于论述类文章、观点对比和个人见解的表达。文章通过对每一句话的应用环境解释和语法提示,确保使用者可以在实际写作中正确且有效地应用这些表达方式。 适合人群:正在准备参加大学生英语竞赛的学生及其他希望提高书面表达能力的学习者。 使用场景及目标:考生能够在竞赛时间内迅速构建思路完整的文章,增强语言表达的流利性和规范性;帮助学习者积累高级词汇,提升英语写作水平并培养良好的思维逻辑。 阅读建议:结合历年优秀范文进行深入学习,熟悉不同类型话题下的表述方法;练习将提供的句子融入自身创作的文章中,通过不断修订和完善来巩固记忆。同时也可以用于日常的英语写作训练当中。

    法律事务专员绩效考核表.xls

    法律事务专员绩效考核表

    apache-commons-digester-javadoc-1.8.1-19.el7.x64-86.rpm.tar.gz

    1、文件内容:apache-commons-digester-javadoc-1.8.1-19.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/apache-commons-digester-javadoc-1.8.1-19.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    永磁同步电机磁场定向控制(矢量控制)Simulink仿真模型波形展现与解析,永磁同步电机的磁场定向控制(矢量控制)simulink仿真模型,波形完美 ,核心关键词:永磁同步电机; 磁场定向控制(矢量控

    永磁同步电机磁场定向控制(矢量控制)Simulink仿真模型波形展现与解析,永磁同步电机的磁场定向控制(矢量控制)simulink仿真模型,波形完美 ,核心关键词:永磁同步电机; 磁场定向控制(矢量控制); Simulink仿真模型; 波形完美;,永磁同步电机矢量控制仿真模型:磁场完美调控,波形精确无误

    07 -储运部经理绩效考核表1.xlsx

    07 -储运部经理绩效考核表1

    OQC检验员(成品出货检验员)绩效考核表.xls

    OQC检验员(成品出货检验员)绩效考核表

    基于Matlab2020b的电机控制算法:无传感FOC算法Simulink仿真模型及实践指导,定位+电流闭环强拖+ 角度渐变切+ 速度电流双闭环+ 无传感器角度估算SMO+ PLL 控制方式 Sim

    基于Matlab2020b的电机控制算法:无传感FOC算法Simulink仿真模型及实践指导,定位+电流闭环强拖+ 角度渐变切+ 速度电流双闭环+ 无传感器角度估算SMO+ PLL 控制方式 Simulink 仿真模型 (Matlab2020b版本)以及教授模型搭建 这是一种常用的无传感FOC电机控制算法,掌握这种算法的基本原理,并有仿真模型在手,就可以用它来指导实践中的程序调试,做到实际项目不盲目调试。 模型特点: 1. 所有模块都做到了模块化,各个模块分区清楚,结构清晰。 2. 所有电机和控制参数均在m文件中体现,变量注释清楚,随用随改。 3. 速度环和电流环PI参数均实现自动整定。 4. 模型采用标幺值系统。 5. 各状态切使用stateflow,模型结构清晰。 6.通用表贴和内嵌式电机。 ,定位;电流闭环强拖;角度渐变切换;速度电流双闭环;无传感器角度估算SMO;PLL控制方式;Simulink仿真模型;Matlab2020b版本建模;教授模型搭建;模块化设计;参数自动整定;标幺值系统;Stateflow应用;通用表贴和内嵌式电机。,基于Matlab 2020b的FOC电机

Global site tag (gtag.js) - Google Analytics