当前位置:  编程技术>移动开发
本页文章导读:
    ▪寨子腾讯“爱消除”游戏7日教程-DAY6        山寨腾讯“爱消除”游戏7日教程--DAY6【课程内容】设计消除特效及跌落特效,并完善游戏控制算法。 【源代码下载地址】http://download.csdn.net/detail/elong_2009/6455119 1、消除特效DrawDisappear 根据游.........
    ▪ 大众点评项目—初步准备        大众点评项目—初始准备我们要开发一款大众点评的App,首先请大家下载一下大众点评看一下我们具体要实现的效果吧,看一下我们要做些什么吧。主要功能流程图如下:以后每天更新! 这.........
    ▪ [041] 微信大众帐号开发教程第17篇-应用实例之智能翻译       [041] 微信公众帐号开发教程第17篇-应用实例之智能翻译内容概要 本篇文章为大家演示如何在微信公众帐号上实现“智能翻译”,本例中翻译功能是通过调用“百度翻译API”实现的。智能翻译.........

[1]寨子腾讯“爱消除”游戏7日教程-DAY6
    来源: 互联网  发布时间: 2014-02-18
山寨腾讯“爱消除”游戏7日教程--DAY6

【课程内容】设计消除特效及跌落特效,并完善游戏控制算法。

【源代码下载地址】http://download.csdn.net/detail/elong_2009/6455119

1、消除特效DrawDisappear

根据游戏规则,三个动物连成一行时,就会触发消除特效。

我们设计的消除特效是动物闪动几次后消失。当然,你也可以设计出更炫的效果来。

public void draw(GL10 gl, int witch, int col, int row)

{

if(0 == control.getCount() % 2) //这里实现闪动

{

gl.glPushMatrix();

drawAnimal.draw(gl, witch, col, row);

gl.glPopMatrix();

}

}

 

与DrawExchange类似,DrawDisappear也直接利用了DrawAnimal渲染类。

 

2、跌落特效DrawFill

当动物消除后,就会触发跌落特效,如果是纵向消除,那么就会连续触发跌落特效,直到所有格子都已经重新填充好动物。跌落完成后,会检测是否需要消除,如果是,又会触发消除特效,周而复始。

public void draw(GL10 gl, int witch, int col, int row)

{

gl.glPushMatrix();

gl.glTranslatef(0f, control.getY()*CrazyLinkConstent.translateRatio, 0f);

drawAnimal.draw(gl, witch, col, row);

gl.glPopMatrix();

}

 

同样,DrawFill也直接利用了DrawAnimal渲染类。

 

3、消除检测算法

消除的规则是三个或以上的同类动物连在一起,就会发生消除动作。我们将消除算法分解为X方向检测及Y方向检测,下面以X方向算法为例:

static boolean isInLineX(int col, int row)

{

int picId = mPic[col][row];

if(0 == col)

{

if(picId == mPic[col+1][row] && picId == mPic[col+2][row])

{

return true;

}

}

else if(1 == col)

{

if((picId == mPic[col-1][row] && picId == mPic[col+1][row])

|| (picId == mPic[col+1][row] && picId == mPic[col+2][row]))

{

return true;

}

}

else if(col > 1 && col < 5)

{

if((picId == mPic[col-2][row] && picId == mPic[col-1][row])

|| (picId == mPic[col-1][row] && picId == mPic[col+1][row])

|| (picId == mPic[col+1][row] && picId == mPic[col+2][row]))

{

return true;

}

}

else if(5 == col)

{

if((picId == mPic[col-2][row] && picId == mPic[col-1][row])

|| (picId == mPic[col-1][row] && picId == mPic[col+1][row]))

{

return true;

}

}

else if(6 == col)

{

if(picId == mPic[col-1][row] && picId == mPic[col-2][row])

{

return true;

}

}

return false;

}

 

Y方向的检测方法略。

综合XY方向检测,就可以得到完整的消除检测算法:

//消除检测算法

static boolean isInLine(int col, int row)

{

return isInLineX(col, row) || isInLineY(col, row);

}

 

4、跌落算法

当消除特效完成后,将对应的格子置为0,跌落算法检测到有0的格子,就会将其上方的格子跌落;如果消除的格子是最高的那一行,则随机产生跌落动物。

//跌落算法

static void fillPic()

{

for(int i = 0; i < (int)CrazyLinkConstent.GRID_NUM; i++)

{

for(int j = 0; j < (int)CrazyLinkConstent.GRID_NUM; j++) 

{

if(0 == mPic[i][j]) //0代表该格子是空的,需要跌落

{

if(j < (int)CrazyLinkConstent.GRID_NUM - 1)

{

//从上一行中跌落

mPic[i][j] = mPic[i][j + 1];

mPic[i][j + 1] = 0;

}

else

{

//如果消除的是最高的一行,则随机产生跌落动物

mPic[i][j] = getRandom();

}

}

}

}

}

 

5、游戏控制主逻辑

我们的游戏逻辑是通过消息来控制的,我们定义如下消息类型:

public static final int EXCHANGE_START = 1;

public static final int EXCHANGE_END = 2;

public static final int LOADING_START = 3;

public static final int LOADING_END = 4;

public static final int DISAPPEAR_END = 5;

public static final int FILL_END = 6;

 

游戏控制逻辑通过handleMessage 来处理。丰富这个方法的处理,就可以得到更复杂的控制逻辑。

//消息处理

    public static Handler mHandler = new Handler(){   

        @Override  

public void handleMessage(Message msg) 

{

    // process incoming messages here

switch(msg.what)

{

case EXCHANGE_START:

{

Bundle b = msg.getData();

int col1 = b.getInt("col1");

int col2 = b.getInt("col2");

int row1 = b.getInt("row1");

int row2 = b.getInt("row2");

     mStatus[col1][row1] = 2; //处于交换状态

     mStatus[col2][row2] = 0;

     drawExchange = new DrawExchange(drawAnimal, mPic[col1][row1], col1, row1, mPic[col2][row2], col2, row2);     

     control.exchange = drawExchange.control;

break;

}

case EXCHANGE_END:

{

Bundle b = msg.getData();

int col1 = b.getInt("col1");

int col2 = b.getInt("col2");

int row1 = b.getInt("row1");

int row2 = b.getInt("row2");

int picId = mPic[col1][row1];

mPic[col1][row1] = mPic[col2][row2];

mPic[col2][row2] = picId;

     mStatus[col1][row1] = 1; //交换状态解除

     mStatus[col2][row2] = 1;

control.exchange = null;

drawExchange = null;

markInLine();

break;

}

case LOADING_START:

     drawLoading = new DrawLoading(loadingTextureId); //创建加载动画素材

     control.loading = drawLoading.control;

     break;

case LOADING_END:

control.loading = null;

drawLoading = null;

mIsLoading = false;

break;

case DISAPPEAR_END:

clearPic();

clearInline();

markFill();

break;

case FILL_END:

if(isNeedFill())

{

markFill();

}

else

{

if(isNeedClear())

{

markInLine();

}

}

break;

}

}

    };

 

本节的运行效果如下,显示游戏加载界面:

 

 

然后是游戏主界面,这时候已经完成交换、消除、跌落的特效。

 

 

自此,一个游戏的基本雏形已经基本完成。


    
[2] 大众点评项目—初步准备
    来源: 互联网  发布时间: 2014-02-18
大众点评项目—初始准备

我们要开发一款大众点评的App,首先请大家下载一下大众点评看一下我们具体要实现的效果吧,看一下我们要做些什么吧。主要功能流程图如下:以后每天更新!

这款app涉及的东西很多,我们会分功能实现,首先是必备的资源准备,服务器选择等。

下面介绍一下我们的基本配置:

服务器端数据库:MYSQL

服务器端语言:PHP      

客户端:Android     

 

数据库建表:

序号

表名

字段0

字段1

字段2

字段3

字段4

字段5

字段6

 

 

1

用户

user

u_id*

u_name

u_password

u_tel

email

h_photo

 

 

 

2

商户

store

s_id*

s_name

s_type

s_address

s_tel

s_opentime

s_level

s_photo

s_cohas

3

点评

critique

c_id*

u_id

s_id

c_content

c_level

c_price

 

 

 

4

商品

goods

g_id*

g_name

g_price

g_content

s_id

g_number

g_days

g_oldprice

 

5

订单

order

o_id*

u_id

g_id

o_state

 

 

 

 

 

6

优惠劵

coupon

co_id

s_id

co_photo

 

 

 

 

 

 

7

收藏

favorite

f_id

f_name

u_id

s_id

g_id

 

 

 

 


    
[3] [041] 微信大众帐号开发教程第17篇-应用实例之智能翻译
    来源: 互联网  发布时间: 2014-02-18
[041] 微信公众帐号开发教程第17篇-应用实例之智能翻译

内容概要

本篇文章为大家演示如何在微信公众帐号上实现“智能翻译”,本例中翻译功能是通过调用“百度翻译API”实现的。智能翻译是指用户任意输入想要翻译的内容(单词或句子),系统能自动识别用户采用的语言,并将其翻译为其他语言,目前支持的翻译方向:中->英、英->中和日->中。下面我们来看看智能翻译最终做出来的效果:

    

我们通过输入关键词“翻译”或者点击菜单“翻译”能够看到该功能的使用帮助,然后输入“翻译+内容”就能对内容进行翻译了。


百度翻译API介绍

点击查看百度翻译API使用说明,其实这份文档已经说的很详细了,笔者只是将我们调用该接口时最关心的内容摘取出来,主要如下:

1)通过发送HTTP GET请求调用百度翻译API。

2)百度翻译API请求地址:

  http://openapi.baidu.com/public/2.0/bmt/translate

3)调用API需要传递from、to、client_id和q四个参数,描述如下:

key value 描述 from 源语言语种:语言代码或auto 仅支持特定的语言组合,下面会单独进行说明 to 目标语言语种:语言代码或auto 仅支持特定的语言组合,下面会单独进行说明 client_id 开发者在百度连接平台上注册得到的授权API key 请阅读如何获取api key q 待翻译内容 该字段必须为UTF-8编码,并且以GET方式调用API时,需要进行urlencode编码。 在调用接口前,我们要先获取到api key。获取方式比较简单,根据提示一步步操作就可以,笔者就不再赘述了。
4)对于智能翻译,参数from和to的传都是auto。
4)参数q的编码方式为UTF-8,传递之前要进行urlencode编码。

5)接口返回结果示例如下:

{"from":"en","to":"zh","trans_result":[{"src":"today","dst":"\u4eca\u5929"}]}
返回结果里的中文是unicode编码,需要通过json_decode进行转换,转换后的示例如下:

{
    "from": "en",
    "to": "zh",
    "trans_result": [
        {
            "src": "today",
            "dst": "今天"
        },
        {
            "src": "tomorrow",
            "dst": "明天"
        }
    ]
}

JSON处理工具包Gson介绍

Gson是Google提供的用于在Java对象和JSON数据之间进行转换的Java类库。通过使用Gson类库,我们可以将JSON字符串转成Java对象,反之亦然。下载地址:https://code.google.com/p/google-gson/downloads/list,Gson的使用比较简单,直接调用它的方法toJson()或fromJson()就能完成相应的转换,但需要注意的是:在使用Gson将json字符串转换成Java对象之前,需要先创建好与目标Java对象。读者可以在维基百科上学习它的使用示例http://zh.wikipedia.org/wiki/Gson。


代码实现

1)创建与百度翻译API返回的JSON相对应的Java类

import java.util.List;

/**
 * 调用百度翻译api查询结果
 * 
 * @author liufeng
 * @date 2013-10-21
 */
public class TranslateResult {
	// 实际采用的源语言
	private String from;
	// 实际采用的目标语言
	private String to;
	// 结果体
	private List<ResultPair> trans_result;

	public String getFrom() {
		return from;
	}

	public void setFrom(String from) {
		this.from = from;
	}

	public String getTo() {
		return to;
	}

	public void setTo(String to) {
		this.to = to;
	}

	public List<ResultPair> getTrans_result() {
		return trans_result;
	}

	public void setTrans_result(List<ResultPair> trans_result) {
		this.trans_result = trans_result;
	}
}
注意:这里的类名可以任意取,但是成员变量的名字应于翻译API返回的JSON字符串中的属性名保持一致,否则将JSON转换成TranslateResult对象时会报错。

TranslateResult类中的trans_result属性是一个ResultPair集合,该类的代码如下:

/**
 * 结果对
 * 
 * @author liufeng
 * @date 2013-10-21
 */
public class ResultPair {
	// 原文
	private String src;
	// 译文
	private String dst;

	public String getSrc() {
		return src;
	}

	public void setSrc(String src) {
		this.src = src;
	}

	public String getDst() {
		return dst;
	}

	public void setDst(String dst) {
		this.dst = dst;
	}
}
说明:这两个类的封装是Gson类库所要求的,如果读者不是用Gson解析json字符串,而是用JSON-lib,就没有必要封装这两个类。


2)接口调用 

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import com.google.gson.Gson;

/**
 * 
 * @author liufeng
 * @date 2013-10-21
 */
public class BaiduTranslateService {
	/**
	 * 发起http请求获取返回结果
	 * 
	 * @param requestUrl 请求地址
	 * @return
	 */
	public static String httpRequest(String requestUrl) {
		StringBuffer buffer = new StringBuffer();
		try {
			URL url = new URL(/blog_article/requestUrl/index.html);
			HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();

			httpUrlConn.setDoOutput(false);
			httpUrlConn.setDoInput(true);
			httpUrlConn.setUseCaches(false);

			httpUrlConn.setRequestMethod("GET");
			httpUrlConn.connect();

			// 将返回的输入流转换成字符串
			InputStream inputStream = httpUrlConn.getInputStream();
			InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
			BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

			String str = null;
			while ((str = bufferedReader.readLine()) != null) {
				buffer.append(str);
			}
			bufferedReader.close();
			inputStreamReader.close();
			// 释放资源
			inputStream.close();
			inputStream = null;
			httpUrlConn.disconnect();

		} catch (Exception e) {
		}
		return buffer.toString();
	}

	/**
	 * utf编码
	 * 
	 * @param source
	 * @return
	 */
	public static String urlEncodeUTF8(String source) {
		String result = source;
		try {
			result = java.net.URLEncoder.encode(source, "utf-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 翻译(中->英 英->中 日->中 )
	 * 
	 * @param source
	 * @return
	 */
	public static String translate(String source) {
		String dst = null;

		// 组装查询地址
		String requestUrl = "http://openapi.baidu.com/public/2.0/bmt/translate?client_id=AAAAAAAAAAAAAAAAAAAAAAAA&q={keyWord}&from=auto&to=auto";
		// 对参数q的值进行urlEncode utf-8编码
		requestUrl = requestUrl.replace("{keyWord}", urlEncodeUTF8(source));

		// 查询并解析结果
		try {
			// 查询并获取返回结果
			String json = httpRequest(requestUrl);
			// 通过Gson工具将json转换成TranslateResult对象
			TranslateResult translateResult = new Gson().fromJson(json, TranslateResult.class);
			// 取出translateResult中的译文
			dst = translateResult.getTrans_result().get(0).getDst();
		} catch (Exception e) {
			e.printStackTrace();
		}

		if (null == dst)
			dst = "翻译系统异常,请稍候尝试!";
		return dst;
	}

	public static void main(String[] args) {
		// 翻译结果:The network really powerful
		System.out.println(translate("网络真强大"));
	}
}
代码解读:
1)第21-53行封装了一个http请求方法httpRequest(),相信读过之前教程的读者已经很熟悉了。

2)第61-69行封装了一个urlEncodeUTF8()方法,用于对url中的参数进行UTF-8编码。

3)第81行代码中的client_id需要替换成自己申请的api key。

4)第83行代码是对url中的中文进行编码。以后凡是遇到通过url传递中文参数的情况,一定要显示地对中文进行编码,否则很可能出现程序在本机能正常运行,但部署到服务器上却有问题,因为本机与服务器的默认编码方式可能不一样。

5)第88行代码就是调用百度翻译API。

6)第90行代码是使用Gson工具将json字符串转换成TranslateResult对象,是不是发现Gson的使用真的很简单?另外,前面提到过调用百度翻译API返回的json里如果有中文是用unicode表示的,形如“\u4eca\u5929”,那为什么这里没有做任何处理?因为Gson的内部实现已经帮我们搞定了。


公众账号后台调用

在公众账号后台,需要对接收到的文本消息进行判断,如果是以“翻译”两个字开头的,就认为是在使用智能翻译功能,然后将“翻译”两个字之后的内容作为翻译对象,调用API进行翻译;如果输入的只有“翻译”两个字,就提示智能翻译功能的使用指南。关键代码如下:

// 文本消息 
if (WeixinUtil.REQ_MESSAGE_TYPE_TEXT.equals(msgType)) {
	String content = requestMap.get("Content").trim();
	if (content.startsWith("翻译")) {
		String keyWord = content.replaceAll("^翻译", "").trim();
		if ("".equals(keyWord)) {
			textMessage.setContent(getTranslateUsage());
		} else {
			textMessage.setContent(BaiduTranslateService.translate(keyWord));
		}
		out.print(WeixinUtil.textMessageToXml(textMessage));
	}
}
第7行getTranslateUsage()方法得到的就是智能翻译功能的使用指南,代码如下:

/**
 * Q译通使用指南
 * 
 * @return
 */
public static String getTranslateUsage() {
	StringBuffer buffer = new StringBuffer();
	buffer.append(XiaoqUtil.emoji(0xe148)).append("Q译通使用指南").append("\n\n");
	buffer.append("Q译通为用户提供专业的多语言翻译服务,目前支持以下翻译方向:").append("\n");
	buffer.append("    中 -> 英").append("\n");
	buffer.append("    英 -> 中").append("\n");
	buffer.append("    日 -> 中").append("\n\n");
	buffer.append("使用示例:").append("\n");
	buffer.append("    翻译我是中国人").append("\n");
	buffer.append("    翻译dream").append("\n");
	buffer.append("    翻译さようなら").append("\n\n");
	buffer.append("回复“?”显示主菜单");
	return buffer.toString();
}

说明:希望通过本例的学习,除了掌握百度翻译API的调用之外,读者还能够掌握json字符串的解析方法,这样就能够自己学会调用更多互联网上开放的接口。


如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号xiaoqrobot来支持柳峰!

转帖请注明本文出自柳峰的博客(http://blog.csdn.net/lyq8479),请尊重他人的辛勤劳动成果,谢谢!

2楼chenyaqiang1小时前沙发,顶了再看。终于又出新文章了。一直的支持1楼u0126082991小时前我是java实习生,公司这几周让我做微信公共平台,看了您的代码,对我帮助很大,谢谢您,柳老师

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3