Android大作业报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
移动设备软件应用与开
发
大作业报告
姓名:
学号:
班级:
院系:
日期:
任课教师:
一、程序的运行环境、安装步骤
1、运行环境
游戏运行环境:Android1.5以上版本
2、程序的组成部份:
2.1、JDK安装
1.我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量:
2.JAVA_HOME值为:D:\Program Files\Java\
3.CLASSPATH值
为:.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;%JAVA
_HOME%\bin;
4.Path: 在开始追加%JAVA_HOME%\bin;
5.NOTE:前面四步设置环境变量对搭建Android开发环境不是必须的,可以
跳过。
安装完成之后,可以在检查JDK是否安装成功。
打开cmd窗口,输入java –version 查看JDK的版本信息。
出现类似下面的画面表示安装成功了:
2.2、Eclipse安装
2.3、Android SDK安装
在Android Developers下载android-sdk_r05-windows.zip,下载完成后解压到任意路径。
运行SDK Setup.exe,点击Available Packages。
如果没有出现可安装的包,请点击Settings,选中Misc中的"Force "这项,再点击Available Packages 。
选择希望安装的SDK及其文档或者其它包,点击Installation Selected、Accept All、Install Accepted,开始下载安装所选包
在用户变量中新建PATH值为:Android SDK中的tools绝对路径(本机为
D:\AndroidDevelop\android-sdk-windows\tools)。
image图2、设置Android SDK的环境变量
“确定”后,重新启动计算机。
重启计算机以后,进入cmd命令窗口,检查SDK 是不是安装成功。
运行android –h 如果有类似以下的输出,表明安装成功:
图3、验证Android SDK是否安装成功
2.4、ADT安装
打开Eclipse IDE,进入菜单中的"Help" -> "Install New Software"
点击Add...按钮,弹出对话框要求输入Name和Location:Name自己随便取,Location输入
确定返回后,在work with后的下拉列表中选择我们刚才添加的ADT,我们会看到下面出有Developer Tools,展开它会有Android DDMS和Android Development Tool,勾选他们。
如下图所示:
然后就是按提示一步一步next。
完成之后:
选择Window > Preferences...
在左边的面板选择Android,然后在右侧点击Browse...并选中SDK路径,本机为:
D:\AndroidDevelop\android-sdk-windows点击Apply、OK。
配置完成。
2.5、创建AVD
为使Android应用程序可以在模拟器上运行,必须创建AVD。
1、在Eclipse中。
选择Windows > Android SDK and AVD Manager
2、点击左侧面板的Virtual Devices,再右侧点击New
3、填入Name,选择Target的API,SD Card大小任意,Skin随便选,Hardware 目前保持默认值
4、点击Create AVD即可完成创建AVD
注意:如果你点击左侧面板的Virtual Devices,再右侧点击New ,而target下拉列表没有可选项时,这时候你:
点击左侧面板的Available Packages,在右侧勾选,如下图所示:
然后点击Install Selected按钮,接下来就是按提示做就行了
要做这两步,原因是在1.3、Android SDK安装中没有安装一些必要的可用包(Available Packages)。
2.5、创建Android工程
三、程序开发平台
(1)代码行数:1000
(2)开发环境:Android Developer Tools Build:
apache-ant-1.9.3
四、程序功能说明:
单机屏幕按住不放可以拖动魔方转动,魔方上下左右空白处可以转动魔方相对那一面。
五、应用核心源码
class MFtestSurfaceView extends GLSurfaceView {
private MFtestRenderer mRenderer;
private float mPreviousX;
private float mPreviousY;//上一次的点
private float mDownPreviousX;
private float mDownPreviousY;//上一次的Down点
// private int oldDownX;
// private int
private float theta;
private float fai;//球坐标
public MFtestSurfaceView(Context context){
super(context);
theta=(float)3.14159/4;
fai=(float)3.14159/4;
// Set the Renderer for drawing on the GLSurfaceView
mRenderer = new MFtestRenderer();
setRenderer(mRenderer);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
@Override
public boolean onTouchEvent(MotionEvent e) {
// MotionEvent reports input details from the touch screen
// and other input controls. In this case, you are only
// interested in events where the touch position changed.
float x = e.getX();
float y = e.getY();
switch (e.getAction()) {
case MotionEvent. 移动的话
float dx = x - mPreviousX;
float dy = y - mPreviousY;//x,y的变换值(不是0,就是1)
float te=theta;
theta=theta+dy/100; //角度是弧度值
if (!(theta>0&&theta<3.14159))
{
theta=te; //法线始终向上
}
fai=fai+ dx/100; //x=rsinθcosφ
mRenderer.eyez=(float)(3*Math.sin(theta)*Math.cos(fai));
//y=rsinθsinφ
mRenderer.eyex=(float)(3*Math.sin(theta)*Math.sin(fai));
////z=rcosθ利用球坐标使观察点始终维持在半径为3的球上
mRenderer.eyey=(float)(3*Math.cos(theta));
requestRender();
//" "+y);
break;
case MotionEvent.ACTION_DOWN:
mDownPreviousX=x;
mDownPreviousY=y;
break;
case MotionEvent.ACTION_UP:
if((((x-mDownPreviousX)>-5)&&((x-mDownPreviousX)<5))&&(((y-mDownPreviousY)>-5 )&&((y-mDownPreviousY)<5)))//(((x-mDownPreviousX)>-3)||((x-mDownPreviousX)>-3))&&((( y-mDownPreviousY)>-3)||((y-mDownPreviousY)>-3))
{
//;
if( x < (mRenderer.width*(1-Math.sqrt(18)/6)/2) )
{
//左
//" 左"+y);
mRenderer.action = 1;
DrawAnimation();
}
else if( x > mRenderer.width-(mRenderer.width*(1-Math.sqrt(18)/6)/2) )
{
//右
//" 右"+y);
mRenderer.action = 2;
DrawAnimation();
}
else if(y < mRenderer.height/2.0 - (1.5*mRenderer.width)/6){
//上
//" 上"+y);
mRenderer.action = 3;
DrawAnimation();
}
else if(y > mRenderer.height/2.0 + (1.5*mRenderer.width)/6){
//下
//" 下"+y);
mRenderer.action = 4;
DrawAnimation();
}
else{
mRenderer.action = 0;
}
}
break;
}
mPreviousX = x;
mPreviousY = y;//保存这次点
return true;
}
private void DrawAnimation(){
ChangeMoveByAction();//确定是哪个面旋转
mRenderer.angle=0;
while(mRenderer.angle<85){//绘制旋转效果
mRenderer.angle=mRenderer.angle+5;
try{
Thread.sleep(40);
}
catch(InterruptedException e){
}
requestRender();
}//绘制旋转效果
mRenderer.angle=0;
mRenderer.action = 0;
DrawColorChange();//改变颜色
requestRender();
}
private void DrawColorChange(){
switch (mRenderer.move)
{
case 70:
LeftShift( 0*27+0*3, 0*27+6*3, 0*27+8*3, 0*27+2*3);
LeftShift( 0*27+1*3, 0*27+3*3, 0*27+7*3, 0*27+5*3);
LeftShift( 1*27+6*3, 5*27+8*3, 4*27+2*3, 2*27+0*3);
LeftShift( 1*27+7*3, 5*27+5*3, 4*27+1*3, 2*27+3*3);
LeftShift( 1*27+8*3, 5*27+2*3, 4*27+0*3, 2*27+6*3);
break;
case 66:
LeftShift( 3*27+0*3, 3*27+6*3, 3*27+8*3, 3*27+2*3);
LeftShift( 3*27+1*3, 3*27+3*3, 3*27+7*3, 3*27+5*3);
LeftShift( 1*27+0*3, 2*27+2*3, 4*27+8*3, 5*27+6*3);
LeftShift( 1*27+1*3, 2*27+5*3, 4*27+7*3, 5*27+3*3);
LeftShift( 1*27+2*3, 2*27+8*3, 4*27+6*3, 5*27+0*3);
break;
case 85:
LeftShift( 1*27+0*3, 1*27+6*3, 1*27+8*3, 1*27+2*3);//////////
LeftShift( 1*27+1*3, 1*27+3*3, 1*27+7*3, 1*27+5*3);
LeftShift( 0*27+0*3, 2*27+0*3, 3*27+0*3, 5*27+0*3);
LeftShift( 0*27+1*3, 2*27+1*3, 3*27+1*3, 5*27+1*3);
LeftShift( 0*27+2*3, 2*27+2*3, 3*27+2*3, 5*27+2*3);
break;
case 68:
LeftShift( 4*27+0*3, 4*27+2*3, 4*27+8*3, 4*27+6*3);
LeftShift( 4*27+1*3, 4*27+5*3, 4*27+7*3, 4*27+3*3);
LeftShift( 0*27+6*3, 2*27+6*3, 3*27+6*3, 5*27+6*3);
LeftShift( 0*27+7*3, 2*27+7*3, 3*27+7*3, 5*27+7*3);
LeftShift( 0*27+8*3, 2*27+8*3, 3*27+8*3, 5*27+8*3);
break;
case 82:
LeftShift( 2*27+0*3, 2*27+6*3, 2*27+8*3, 2*27+2*3);
LeftShift( 2*27+1*3, 2*27+3*3, 2*27+7*3, 2*27+5*3);
LeftShift( 1*27+2*3, 0*27+2*3, 4*27+2*3, 3*27+6*3);
LeftShift( 1*27+5*3, 0*27+5*3, 4*27+5*3, 3*27+3*3);
LeftShift( 1*27+8*3, 0*27+8*3, 4*27+8*3, 3*27+0*3);
break;
case 76:
LeftShift( 5*27+0*3, 5*27+6*3, 5*27+8*3, 5*27+2*3);
LeftShift( 5*27+1*3, 5*27+3*3, 5*27+7*3, 5*27+5*3);
LeftShift( 1*27+0*3, 3*27+8*3, 4*27+0*3, 0*27+0*3);
LeftShift( 1*27+3*3, 3*27+5*3, 4*27+3*3, 0*27+3*3);
LeftShift( 1*27+6*3, 3*27+2*3, 4*27+6*3, 0*27+6*3);
break;
default:
break;
}
}
private void ChangeMoveByAction(){
//F 70 B 66 U 85 D 68 R 82 L76(这个注释恐怕只有我能看懂- -!)
switch(mRenderer.action){
case 1:
if( (mRenderer.eyex > 0) && (mRenderer.eyez > 0) ){
mRenderer.move=76;
}
else if( (mRenderer.eyex > 0) && (mRenderer.eyez < 0) ){
mRenderer.move=70;
}
else if( (mRenderer.eyex < 0) && (mRenderer.eyez < 0) ){
mRenderer.move=82;
}
else if( (mRenderer.eyex < 0) && (mRenderer.eyez > 0) ){
mRenderer.move=66;
}
break;
case 2:
if( (mRenderer.eyex > 0) && (mRenderer.eyez > 0) ){
mRenderer.move=66;
}
else if( (mRenderer.eyex > 0) && (mRenderer.eyez < 0) ){
mRenderer.move=76;
}
else if( (mRenderer.eyex < 0) && (mRenderer.eyez < 0) ){
mRenderer.move=70;
}
else if( (mRenderer.eyex < 0) && (mRenderer.eyez > 0) ){
mRenderer.move=82;
}
break;
case 3:
mRenderer.move=85;
break;
case 4:
mRenderer.move=68;
break;
}
}
private void memcpy(int one,int two){
mRenderer.face_color[one]=mRenderer.face_color[two];
mRenderer.face_color[one+1]=mRenderer.face_color[two+1];
mRenderer.face_color[one+2]=mRenderer.face_color[two+2];
}
private void LeftShift(int a,int b,int c,int d){
// a<b<c<d 左移
float temp1=mRenderer.face_color[a];
float temp2=mRenderer.face_color[a+1];
float temp3=mRenderer.face_color[a+2];
memcpy(a,b);
memcpy(b,c);
memcpy(c,d);
mRenderer.face_color[d]= temp1;
mRenderer.face_color[d+1]=temp2;
mRenderer.face_color[d+2]=temp3;
}
}
private void DrawRotation(GL10 gl){
// 绘制小立方体
switch (move)
{
case 70:
DrawCube19(gl); DrawCube11(gl); DrawCube2(gl); DrawCube22(gl);
DrawCube13(gl); DrawCube5(gl); DrawCube25(gl); DrawCube16(gl);
DrawCube8(gl); DrawCube18(gl); DrawCube10(gl); DrawCube1(gl);
DrawCube21(gl); DrawCube4(gl); DrawCube24(gl); DrawCube15(gl); DrawCube7(gl);
gl.glPushMatrix();
gl.glRotatef(-angle,0.0f,0.0f,1.0f);
DrawCube0(gl); DrawCube9(gl); DrawCube17(gl); DrawCube3(gl);
DrawCube12(gl); DrawCube20(gl); DrawCube6(gl); DrawCube14(gl); DrawCube23(gl);
gl.glPopMatrix();
break;
case 66:
DrawCube0(gl); DrawCube9(gl); DrawCube17(gl); DrawCube3(gl);
DrawCube12(gl); DrawCube20(gl); DrawCube6(gl); DrawCube14(gl);
DrawCube23(gl); DrawCube18(gl); DrawCube10(gl); DrawCube1(gl);
DrawCube21(gl); DrawCube4(gl); DrawCube24(gl); DrawCube15(gl); DrawCube7(gl);
gl.glPushMatrix();
gl.glRotatef(angle,0.0f,0.0f,1.0f);
DrawCube19(gl); DrawCube11(gl); DrawCube2(gl); DrawCube22(gl);
DrawCube13(gl); DrawCube5(gl); DrawCube25(gl); DrawCube16(gl); DrawCube8(gl);
gl.glPopMatrix();
break;
case 85:
DrawCube3(gl); DrawCube23(gl);DrawCube24(gl); DrawCube25(gl);
DrawCube4(gl); DrawCube5(gl); DrawCube6(gl); DrawCube7(gl);
DrawCube8(gl); DrawCube12(gl); DrawCube13(gl); DrawCube14(gl);
DrawCube15(gl);DrawCube16(gl);DrawCube20(gl); DrawCube21(gl); DrawCube22(gl);
gl.glPushMatrix();
gl.glRotatef(-angle,0.0f,1.0f,0.0f);
DrawCube0(gl); DrawCube1(gl); DrawCube2(gl);DrawCube9(gl);
DrawCube10(gl); DrawCube11(gl); DrawCube17(gl); DrawCube18(gl); DrawCube19(gl);
gl.glPopMatrix();
break;
case 68:
DrawCube0(gl); DrawCube1(gl); DrawCube2(gl); DrawCube3(gl);
DrawCube4(gl); DrawCube5(gl); DrawCube9(gl); DrawCube10(gl);
DrawCube11(gl);DrawCube12(gl); DrawCube13(gl); DrawCube17(gl);
DrawCube18(gl); DrawCube19(gl);DrawCube20(gl); DrawCube21(gl); DrawCube22(gl);
gl.glPushMatrix();
gl.glRotatef(angle,0.0f,-1.0f,0.0f);
DrawCube6(gl); DrawCube7(gl); DrawCube8(gl);DrawCube14(gl);
DrawCube15(gl);DrawCube16(gl); DrawCube23(gl);DrawCube24(gl); DrawCube25(gl);
gl.glPopMatrix();
break;
case 82:
DrawCube9(gl); DrawCube10(gl); DrawCube11(gl); DrawCube25(gl);
DrawCube12(gl); DrawCube13(gl); DrawCube14(gl); DrawCube15(gl);
DrawCube16(gl); DrawCube17(gl); DrawCube18(gl); DrawCube19(gl);
DrawCube20(gl); DrawCube21(gl); DrawCube22(gl); DrawCube23(gl);DrawCube24(gl);
gl.glPushMatrix();
gl.glRotatef(-angle,1.0f,0.0f,0.0f);
DrawCube0(gl); DrawCube1(gl); DrawCube2(gl); DrawCube3(gl);
DrawCube4(gl); DrawCube5(gl); DrawCube6(gl); DrawCube7(gl); DrawCube8(gl);
gl.glPopMatrix();
break;
case 76:
DrawCube0(gl); DrawCube1(gl); DrawCube2(gl); DrawCube3(gl);
DrawCube4(gl); DrawCube5(gl); DrawCube6(gl); DrawCube7(gl);
DrawCube8(gl); DrawCube9(gl); DrawCube10(gl); DrawCube11(gl);
DrawCube12(gl); DrawCube13(gl); DrawCube14(gl); DrawCube15(gl); DrawCube16(gl);
gl.glPushMatrix();
gl.glRotatef(-angle,-1.0f,0.0f,0.0f);
DrawCube17(gl); DrawCube18(gl); DrawCube19(gl); DrawCube20(gl);
DrawCube21(gl); DrawCube22(gl); DrawCube23(gl);DrawCube24(gl); DrawCube25(gl);
gl.glPopMatrix();
break;
default:
break;
}
六、工程运行效果截图
七、简要开发过程
10月20日查找Android开发的配置及流程
10月22日查找资料确定要使用的算法与数据结构
10月23日系统设计
10月24日开始编码
10月28日游戏基本功能完成,进入测试阶段
11月2日程序开发完成,编写文档
八、总结
因为之前自己学习过Android游戏开发的相关知识,也自己做过一
个小游戏,所以对这方面比较了解,不过之前开发的小游戏是用Cocos2d引擎完成,和Android原生的不太一样,通过这次大作业的完成,对Android的基本开发有了一定的了解。
对图像的绘制有了一定的了解。