android开发学习网游戏开发一般要学习多久?

Android游戏开发学习之引擎用法实例详解
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Android游戏开发学习之引擎用法,较为详细的分析了Android游戏开发中所常用的JBox2D引擎功能及相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
本文实例讲述了Android游戏开发学习之引擎用法。分享给大家供大家参考。具体如下:
汽车引擎是汽车的心脏,其决定了汽车的性能和稳定性,是人们在购车时相当关注的。而游戏中的物理引擎就如汽车的引擎一样,占据了非常重要的位置。一款好的物理引擎可以非常真实地模拟现实世界,使得游戏更加逼真,提供更好的娱乐体验。
一、JBox2D简介
JBox2D是开源物理引擎Box2D的Java版本,可以直接用于Android。由于JBox2D的图形渲染使用的是Processing库,因此在Android平台上使用JBox2D时,图形渲染工作只能自行开发。该引擎能够根据开发人员设定的参数,如重力、密度、摩擦系数和弹性系数等,自动地进行2D刚体物理运动的全方位模拟。
1.小球弹跳进阶版
在第1节中小球的下落、碰撞、弹起都是用代码来维护的,下面使用物理引擎来实现,并且加入了刚体之间的碰撞。
(1)常量类Constant
package box2d.
public class Constant {
public static final float RATE=10; //屏幕与现实世界的比例
public static final boolean DRAW_THREAD_FLAG= //绘制线程工作标识位
public static final float TIME_STEP=2.0f/60.0f; //模拟的频率
public static final int ITERA=10; //迭代次数
public static int SCREEN_WIDTH; //屏幕宽度
public static int SCREEN_HEIGHT; //屏幕高度
(2)抽象类MyBody
该类为自定义的抽象类,是所有自定义刚体类的基类。由于JBox2D中的刚体类对象仅具有物理仿真计算的功能,并没有提供Android平台下的绘制功能,直接使用不是很方便。因此,这里定义了MyBody对自定义刚体的绘制及JBox2D物理仿真对象进行了封装。
package box2d.
import org.jbox2d.dynamics.B
import android.graphics.C
import android.graphics.P
public abstract class MyBody {
B //JBox2D物理引擎中的刚体
//刚体的颜色
public abstract void drawSelf(Canvas canvas,Paint paint); //绘制的方法
(3)圆形刚体类MyCircleColor
package box2d.
import org.jbox2d.dynamics.B
import android.graphics.C
import android.graphics.P
import android.graphics.Paint.S
import static box2d.bheap.Constant.*; //静态导入
public class MyCircleColor extends MyBody {
//圆形半径
public MyCircleColor(Body body,float radius,int color) {
this.body=
this.radius=
this.color=
public void drawSelf(Canvas canvas, Paint paint) {
paint.setColor(color&0xCFFFFFF); //设置颜色
float x=body.getPosition().x*RATE;
float y=body.getPosition().y*RATE;
canvas.drawCircle(x, y, radius, paint); //画圆
paint.setStyle(Style.STROKE); //设置空心无填充
paint.setStrokeWidth(1);
paint.setColor(color); //画边
canvas.drawCircle(x, y, radius, paint);
paint.reset(); //恢复画笔设置
(4)矩形刚体类MyRectColor
package box2d.
import static box2d.bheap.Constant.RATE;
import org.jbox2d.dynamics.B
import android.graphics.C
import android.graphics.M
import android.graphics.P
public class MyRectColor extends MyBody {
float halfW//半宽
float halfH//半高
public MyRectColor(Body body,float halfWidth,float halfHeight,int color)
this.body=
this.halfWidth=halfW
this.halfHeight=halfH
this.color=
public void drawSelf(Canvas canvas,Paint paint)
paint.setColor(color&0x8CFFFFFF);
float x=body.getPosition().x*RATE;
float y=body.getPosition().y*RATE;
float angle=body.getAngle();
canvas.save();
Matrix m1=new Matrix();
m1.setRotate((float)Math.toDegrees(angle),x, y);
canvas.setMatrix(m1);
canvas.drawRect(x-halfWidth, y-halfHeight, x+halfWidth, y+halfHeight, paint);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(1);//设置线条宽度
paint.setColor(color);
canvas.drawRect(x-halfWidth, y-halfHeight, x+halfWidth, y+halfHeight, paint);
paint.reset();
canvas.restore();
(5)生成刚体形状的工具类Box2DUtil
package box2d.
import static box2d.bheap.Constant.RATE;
import org.jbox2d.collision.CircleD
import org.jbox2d.collision.PolygonD
import org.jbox2d.dynamics.B
import org.jbox2d.dynamics.BodyD
import org.jbox2d.dynamics.W
public class Box2DUtil {
* 创建矩形物体(颜色)
public static MyRectColor createBox (
float halfWidth,
float halfHeight,
boolean isStatic, //是否为静止的
World world,
PolygonDef shape=new PolygonDef(); //创建多边形描述对象
if(isStatic) {
shape.density=0;
shape.density=1.0f;
shape.friction=0.0f; //设置摩擦系数
shape.restitution=0.6f; //设置能量损失率
shape.setAsBox(halfWidth/RATE, halfHeight/RATE);
BodyDef bodyDef=new BodyDef(); //创建刚体描述对象
bodyDef.position.set(x/RATE,y/RATE); //设置位置
Body bodyTemp=world.createBody(bodyDef); //在世界中创建刚体
bodyTemp.createShape(shape); //指定刚体形状
bodyTemp.setMassFromShapes(); //设置物体质量
return new MyRectColor(bodyTemp, halfWidth, halfHeight, color);
* 创建圆形物体(颜色)
public static MyCircleColor createCircle (
float radius,
World world,
CircleDef shape=new CircleDef(); //创建圆描述对象
shape.density=2; //设置密度
shape.friction=0.0f; //设置摩擦系数
shape.restitution=0.95f; //设置能量损失率
shape.radius=radius/RATE;//设置半径
BodyDef bodyDef=new BodyDef(); //创建刚体描述对象
bodyDef.position.set(x/RATE,y/RATE); //设置位置
Body bodyTemp=world.createBody(bodyDef); //在世界中创建刚体
bodyTemp.createShape(shape); //指定刚体形状
bodyTemp.setMassFromShapes(); //设置物体质量
return new MyCircleColor(bodyTemp, radius, color);
(6)颜色工具类ColorUtil
package box2d.
public class ColorUtil {
static int[][] result=
{56,225,254},
{41,246,239},
{34,244,197},
{44,241,161},
{65,239,106},
{45,238,59},
{73,244,51},
{99,233,58},
{129,243,34},
{142,245,44},
{187,243,32},
{232,250,28},
{242,230,46},
{248,196,51},
{244,125,31},
{247,88,46},
{249,70,40},
{249,70,40},
{248,48,48},
{250,30,30},
{252,15,15},
{255,0,0},
public static int getColor(int index)
int[] rgb=result[index%result.length];
int result=0xff000000;
result=result|(rgb[0]&&16);
result=result|(rgb[1]&&8);
result=result|(rgb[2]);
(7)主控制类MyBox2dActivity
package box2d.
import java.util.ArrayL
import java.util.R
import org.jbox2d.collision.AABB;
import mon.Vec2;
import org.jbox2d.dynamics.W
import android.app.A
import android.content.pm.ActivityI
import android.os.B
import android.util.DisplayM
import android.view.W
import android.view.WindowM
import static box2d.bheap.Constant.*;
public class MyBox2dActivity extends Activity
AABB worldAABB;//创建 一个管理碰撞的世界
Random random=new Random();
//物体列表
ArrayList&MyBody& bl=new ArrayList&MyBody&();
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
//设置为全屏
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,
WindowManager.LayoutParams. FLAG_FULLSCREEN);
//设置为横屏模式
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//获取屏幕尺寸
DisplayMetrics dm=new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
if(dm.widthPixels&dm.heightPixels)
SCREEN_WIDTH=dm.widthP
SCREEN_HEIGHT=dm.heightP
SCREEN_WIDTH=dm.heightP
SCREEN_HEIGHT=dm.widthP
worldAABB = new AABB();
//上下界,以屏幕的左上方为 原点,如果创建的刚体到达屏幕的边缘的话,会停止模拟
worldAABB.lowerBound.set(-100.0f,-100.0f);
worldAABB.upperBound.set(100.0f, 100.0f);//注意这里使用的是现实世界的单位
Vec2 gravity = new Vec2(0.0f,10.0f);
boolean doSleep =
//创建世界
world = new World(worldAABB, gravity, doSleep);
final int kd=40;//宽度或高度
MyRectColor mrc=Box2DUtil.createBox(kd/4, SCREEN_HEIGHT/2, kd/4, SCREEN_HEIGHT/2, true,world,0xFFe6e4FF);
bl.add(mrc);
mrc=Box2DUtil.createBox(SCREEN_WIDTH-kd/4, SCREEN_HEIGHT/2, kd/4, SCREEN_HEIGHT/2, true,world,0xFFe6e4FF);
bl.add(mrc);
mrc=Box2DUtil.createBox(SCREEN_WIDTH/2, kd/4, SCREEN_WIDTH/2, kd/4, true,world,0xFFe6e4FF);
bl.add(mrc);
mrc=Box2DUtil.createBox(SCREEN_WIDTH/2, SCREEN_HEIGHT-kd/4, SCREEN_WIDTH/2, kd/4, true,world,0xFFe6e4FF);
bl.add(mrc);
//创建砖块
//砖块间距 行间距为20
模块宽度为10 最多一行为9块
final int bs=20;
final int bw=(int)((SCREEN_WIDTH-2*kd-11*bs)/18);
//============================================================
for(int i=2;i&10;i++)
if((i%2)==0)
//左侧蓝木块
for(int j=0;j&9-i;j++)
mrc=Box2DUtil.createBox
kd/2+bs+bw/2+i*(kd+5)/2+j*(kd+5)+3,
SCREEN_HEIGHT+bw-i*(bw+kd)/2,
ColorUtil.getColor(Math.abs(random.nextInt()))
bl.add(mrc);
//右侧蓝木块
for(int j=0;j&9-i;j++)
mrc=Box2DUtil.createBox
3*kd/2+bs-bw/2+i*(kd+5)/2+j*(kd+5)-3,
SCREEN_HEIGHT+bw-i*(bw+kd)/2,
ColorUtil.getColor(Math.abs(random.nextInt()))
bl.add(mrc);
if((i%2)!=0)
for(int j=0;j&10-i;j++)
mrc=Box2DUtil.createBox
kd/2+bs+kd/2+(i-1)*(kd+5)/2+j*(kd+5),
SCREEN_HEIGHT-(kd-bw)/2-(i-1)*(bw+kd)/2,
ColorUtil.getColor(Math.abs(random.nextInt()))
bl.add(mrc);
mrc=Box2DUtil.createBox
5*kd+bs+20,
SCREEN_HEIGHT-(kd+bw)*4-kd,
ColorUtil.getColor(Math.abs(random.nextInt()))
bl.add(mrc);
MyCircleColor ball=Box2DUtil.createCircle(SCREEN_WIDTH/2-24, kd, kd/2, world,ColorUtil.getColor(Math.abs(random.nextInt())));
bl.add(ball);
ball.body.setLinearVelocity(new Vec2(0,50));
GameView gv= new GameView(this);
setContentView(gv);
(8)显示界面类GameView
package box2d.
import android.graphics.C
import android.graphics.P
import android.view.SurfaceH
import android.view.SurfaceHolder.C
import android.view.SurfaceV
public class GameView extends SurfaceView implements Callback{
public GameView(MyBox2dActivity activity) {
super(activity);
this.activity=
this.getHolder().addCallback(this);
paint =new Paint();
paint.setAntiAlias(true);
dt=new DrawThread(this);
dt.start();
public void onDraw(Canvas canvas) {
if(canvas==null) {
canvas.drawARGB(255, 255, 255, 255); //设置背景颜色白色
for (MyBody mb : activity.bl) {
mb.drawSelf(canvas, paint);
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
public void surfaceCreated(SurfaceHolder holder) {
repaint();
public void surfaceDestroyed(SurfaceHolder holder) {
public void repaint() {
SurfaceHolder holder=this.getHolder();
Canvas canvas=holder.lockCanvas();
synchronized(holder){
onDraw(canvas);
} catch(Exception e){
e.printStackTrace();
} finally {
if(canvas!=null) {
holder.unlockCanvasAndPost(canvas);
(9)绘制线程类DrawThread
package box2d.
import static box2d.bheap.Constant.*;
//绘制线程
public class DrawThread extends Thread
public DrawThread(GameView gv)
public void run()
while(DRAW_THREAD_FLAG)
gv.activity.world.step(TIME_STEP, ITERA);//开始模拟
gv.repaint();
Thread.sleep(20);
} catch (InterruptedException e)
e.printStackTrace();
希望本文所述对大家的jsp程序设计有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具您所在的位置: &
Android游戏与应用开发最佳学习路线图
Android游戏与应用开发最佳学习路线图
为了帮助大家更好的学习 Android,并快速入门,我们特此为大家制定了以下学习路线图,希望能够帮助大家。
为了帮助大家更好的学习 Android,并快速入门,特此我们为大家制定了以下学习路线图,希望能够帮助大家。
一、路线图概括:
498)this.width=498;' onmousewheel = 'javascript:return big(this)' src="/wyfs02/M01/22/C5/wKioL1MmuhqwKutOAAAjaNXaUlo573.jpg" alt="" />
二、具体需要掌握知识点:
498)this.width=498;' onmousewheel = 'javascript:return big(this)' src="/wyfs02/M02/22/C4/wKiom1MmukGy97NfAABh0jlHKLs148.jpg" alt="" />
三、具体知识点与目标
&498)this.width=498;' onmousewheel = 'javascript:return big(this)' src="/wyfs02/M00/22/C4/wKiom1MmukHRdZ50AACczaLnqS0884.jpg" alt="" />
Java 基础入门
Java 开发环境搭建
熟练开发环境搭建、使用Eclipse编译运行调试项目
Java基本程序设计结构
熟练Java基本程序的书写、熟练运用数据类型、变量、流程、数组等
对象和类(OOP基础)
深刻理解面向对象思想、熟练运用类、对象、方法等Java基本程序单位
熟练Java继承程序设计思想、能够使用继承思想编写Java程序
接口与内部类
熟练Java接口的定义和使用、理解使用Java接口设计系统
异常与调试
理解Java异常的机制、能够捕获常见异常、可以自定义异常
熟练使用三种集合框架List、Map、Set;能够使用集合框架模拟数据库操作
熟练Java多线程的定义和使用,熟练Java的同步机制和通信机制,编写安全的Java多线程程序
熟练Java网络编程客户端和服务器端类、使用Java网络编程接口实现聊天室
Java IO 流
熟练各种Java I/O流的使用、使用IO流拷贝文件、上传、下载
熟练常见的Java GUI控件的使用、熟练Java事件的处理机制、熟练常见事件处理方法
Java 数据库编程(JDBC)
能够使JDBC访问各种数据库、MySQL、Oracle 熟练Java 的CRUD方法、使用Java调用存储过程
Java Web 编程
理解Web编程思想、理解Web编程的请求响应机制,熟练Servlet Web 编程
熟练使用Java基础知识、多线程、网络编程、IO、GUI实现聊天室
Android游戏与应用开发
应用开发部分
Android 基础入门
熟练Android平台搭建、熟练使用Android创建命令工具、编写第一个Android应用程序
Android 用户界面
熟练Android创建UI组件的应用、能够使用创建UI组件设计实际项目UI、熟练高级UI的使用,例如,MapView、WebView、Gallery、GridView 等
Android 基本组件
(Activity、Intent、Service、BroadCastReceiver、ContentProvider)
深刻理解Android应用程序的设计思想、熟练Android平台的四大组件Activity、Service、BroadcastReceiver、ContentProvider的使用,能够使用通知、Alarm等实现备忘录等真实项目
Android 数据存储
熟练Android平台的数据存储、熟练使用Sqlite数据库实现CRUD操作 熟练Android文件系统的操作
熟练使用Android 平台的多媒体的使用,播放音频、视频、操作图片
互联网应用
熟练Android平台的网络编程接口、熟练Sock、URL、ApacheClient的各种使用方法
GPS定位应用
熟练Android平台的定位API、能够使用这些API实现定位、跟踪、查找等功能
Android多线程
熟练Android平台的多线程处理方法、熟练使用Android平台的消息处理机制
Android 应用项目
学习版本控制工具、熟练团队开发流程
游戏开发部分
熟练Android平台的图形图像处理API、能够使用这些API绘制图形、动画等
View、SurfaceView
熟练View、SurfaceView、自定义视图
Android 平台下的传感器
能够使用Android 平台API实现感应操作
游戏中的物理和数学
Android 平台的物理特性实现
OpenGL ES初级
熟练OpenGL ES的常见API的使用
OpenGL进阶
能够使用OpenGL ES API实现一些特效
游戏引擎初步
熟练游戏引擎基础框架
游戏引擎音效模块
熟练游戏引擎音效部分实现
游戏引擎实体模块
熟练游戏引擎粒子系统实现
游戏引擎OpenGL 模块
熟练游戏引擎OpenGL ES 3D部分实现
Android 游戏项目
使用游戏引擎编写游戏
【编辑推荐】
【责任编辑: TEL:(010)】
关于&&的更多文章
本专题意在帮助想要了解Android的人能快速上手Android开发,能对
既然强大的Android Studio来了,有什么理由不去用呢?
继微信5.0以来,最近微信公众平台推出新版,除推出微
在诸多移动操作系统中,Android的成长性无疑是最强的
移动异构计算是相对于同构计算来说的,同构计算就是使
本书第1版曾被KDnuggets的读者评选为最受欢迎的数据挖掘专著,是一本可读性极佳的教材。它从数据库角度全面系统地介绍了数据挖掘
Windows Phone专家
Android开发专家
51CTO旗下网站Android游戏与应用开发最佳学习路线图_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Android游戏与应用开发最佳学习路线图
上传于||文档简介
&&A​n​d​r​o​i​d​游​戏​与​应​用​开​发​学​习
阅读已结束,如果下载本文需要使用5下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩24页未读,继续阅读
你可能喜欢全国免费咨询热线
华瑞IT教育依托湖南师范大学优质的教育资源,并借鉴计算机技术王国―印度成功的IT教育经验,开创了学历教育与职业教育相结合的新型人才培养模式.
高中生零起点班
转行跳槽升级班
软件项目提升班
企业定向委培班
待业速找工作班
免费咨询热线
9:00-22:00
您的位置: >
长沙学习android开发课程要多久
文章来源:
  长沙学习android开发课程要多久?要怎样才能将android技术学习好?如果没有基础,要学多久才能成为android开发工程师?  据手机研发业内不完全统计,目前国内的3G研发人才缺口有三、四百万之众,其中Android研发人才缺口已达到了40万左右,而真正有经验的开发者还很少,IT教育深知操作经验对于开发者的重要性,在对学员进行培养的过程中,采取实训课程及案例分析的教学模式,强化学员的经验积累,让学员毕业时即可以具备很强的项目经验 ,并且能够独立开发。&  &  Android以Java为编程语言,使接口到功能,都有层出不穷的变化,其中Activity等同于J2ME的MIDlet,一个 Activity 类(class)负责创建视窗(window),一个活动中的Activity就是在 foreground(前景)模式,背景运行的程序叫做Service。两者之间通过由ServiceConnection和AIDL连结,达到复数程序同时运行的效果。  IT教育在课程安排上由浅入深,从java语言基础技术逐步深入,让每个学员都掌握扎实的基础,所学技术包括Android系统级开发,Unix/Linux平台技术,企业级数据库技术,软件工程和设计模式,Java 语言核心技术等等,这些技术的掌握及项目经验的丰富,是从IT教育毕业的学员颇受企业的追捧的原因所在。  本文出自IT教育,更多关于-以及信息,可以在线咨询老师,或者拨打招生热线:7,免费体验试听抢座!&
从我国的iOS开发行业大环境来说,由于起步比其他国家晚,所以iOS开发的就...
您是不是在找...

我要回帖

更多关于 android开发学习网站 的文章

 

随机推荐