`

android游戏开发学习笔之八 (学习书籍 Android游戏编程之从零开始)

阅读更多

/**
* 操作游戏中的人物
*
* @time 上午11:27:35
* @author retacn yue
* @Email zhenhuayue@sina.com
*/
@SuppressWarnings("unused")
public class PlaySurfaceView extends SurfaceView implements Callback, Runnable {
private int screenX, screenY;
private SurfaceHolder sfh;
private Thread thread;
private Canvas canvas;
private boolean flag;
private Paint paint;


private Bitmap person;// 人物图片
private final int DIR_LEFT = 0;
private final int DIR_RIGHT = 1;
// 人物的方向(默认是向右)
private int dir = DIR_RIGHT;
private int person_x, person_y;// 人物的位置坐标
private boolean isUp, isDown, isLeft, isRight;// 处理按键卡现象
private int currentFream;// 当前帧


public PlaySurfaceView(Context context) {
super(context);
sfh = this.getHolder();
sfh.addCallback(this);


paint = new Paint();
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);


this.setFocusable(true);
// 获得人物图片
person = BitmapFactory.decodeResource(this.getResources(), R.drawable.robot);


}


@Override
public void surfaceCreated(SurfaceHolder holder) {
screenX = this.getWidth();
screenY = this.getHeight();


flag = true;
thread = new Thread(this);
thread.start();


}


@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {


}


@Override
public void surfaceDestroyed(SurfaceHolder holder) {
flag = false;
}


@SuppressWarnings("static-access")
@Override
public void run() {
while (flag) {
try {
long start = System.currentTimeMillis();
// 绘图
draw();
// 游戏逻辑
logic();
long end = System.currentTimeMillis();
if (end - start < 50) {
thread.sleep(50 - (end - start));


}
} catch (InterruptedException e) {
e.printStackTrace();
}
}


}


/**
* 绘制图形
*/
private void draw() {
try {
canvas = sfh.lockCanvas();
if (null != canvas) {
canvas.drawColor(Color.WHITE);
// 绘制帧动画
drawFream(currentFream, canvas, paint);


}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != canvas) {
sfh.unlockCanvasAndPost(canvas);
}
}


}


/**
* 绘制帧动画
*
* @param paint
* 画笔
* @param canvas
* 画布
* @param currentFream
* 当前帧
*/
private void drawFream(int currentFream, Canvas canvas, Paint paint) {
// 取得上帧图片的高和宽
int freamW = person.getWidth() / 6;
int freamH = person.getHeight() / 2;


// 位图每列的帧数
int FreamRowNum = person.getWidth() / freamW;
// 得到帧相对于位图的坐标
// x
int x = currentFream % FreamRowNum * freamW;
// y
int y = currentFream / FreamRowNum * freamH;


canvas.save();
// 绘制与人物相同大小的可视区域 (默认是向右移动)
canvas.clipRect(person_x, person_y, person_x + freamW, person_y + freamH);


// 如果是向左移动
if (dir == DIR_LEFT) {
// 镜向反转
canvas.scale(-1, 1, person_x + freamW, person_y + freamH);
}
// 绘图
canvas.drawBitmap(person, person_x - x, person_y - y, paint);
canvas.restore();


}


/**
* 游戏逻辑
*/
private void logic() {
// 移动动画
if (isUp) {
person_y -= 5;
}
if (isDown) {
person_y += 5;
}
if (isLeft) {
person_x -= 5;
}
if (isRight) {
person_x += 5;
}
// 跑动动画
currentFream++;
if (currentFream >= 12) {
currentFream = 0;
}


}


/********************** 按键事件临听 *************************/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
// 向上
case KeyEvent.KEYCODE_DPAD_UP:
isUp = true;
break;
// 向下
case KeyEvent.KEYCODE_DPAD_DOWN:
isDown = true;
break;
// 向左
case KeyEvent.KEYCODE_DPAD_LEFT:
isLeft = true;
dir = DIR_LEFT;
break;
// 向右
case KeyEvent.KEYCODE_DPAD_RIGHT:
isRight = true;
dir = DIR_RIGHT;
break;


}
return super.onKeyDown(keyCode, event);
}


@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
// 向上
case KeyEvent.KEYCODE_DPAD_UP:
isUp = false;
break;
// 向下
case KeyEvent.KEYCODE_DPAD_DOWN:
isDown = false;
break;
// 向左
case KeyEvent.KEYCODE_DPAD_LEFT:
isLeft = false;
break;
// 向右
case KeyEvent.KEYCODE_DPAD_RIGHT:
isRight = false;
break;
}
return super.onKeyUp(keyCode, event);
}


/*********************************************************/
}

分享到:
评论

相关推荐

    Android 4 游戏编程入门经典

    《Android 4游戏编程入门经典》将引导你在Android平台上完整地开发出3个示例游戏,包括2D游戏和3D游戏。本书首先介绍游戏开发的理论基础,而且通过只使用剪刀、笔和纸从头设计一个完整的游戏,教会你游戏设计的基础...

    Android 4游戏编程入门经典

    第8章 2d游戏编程技巧  8.1 写在开始  8.2 向量  8.2.1 使用向量  8.2.2 一点三角学的知识  8.2.3 实现一个向量类  8.2.4 一个简单的用法示例  8.3 2d物理定律浅析  8.3.1 牛顿和欧拉,永远的好朋友  8.3.2...

    Android 4 游戏编程入门经典(英文完整版)

     《android4游戏编程入门经典》将引导你在android平台上完整地开发出3个示例游戏,包括2d游戏和3d游戏。本书首先介绍游戏开发的理论基础,而且通过只使用剪刀、笔和纸从头设计一个完整的游戏,教会你游戏设计的基础...

    android游戏编程入门

    《Android4游戏编程入门经典》是2012年清华大学出版社出版的图书,作者是(美)策希纳(Zechner,M.),无(美)格林(Green,R.)。 第1章 Android,后起之秀 1  1.1 Android简介 1  1.2 版本分裂 3  1.3 谷歌的角色 3  ...

    android游戏开发从入门到应用实例

    4-16-1(游戏保存之SharedPreference) 4-16-2(游戏保存之Stream) 4-3(View游戏框架) 4-4(SurfaceView游戏框架) 4-7-1(贝塞尔曲线) 4-7-2(Canvas画布) 4-8(Paint画笔) 4-9(Bitmap位图渲染与操作) 5-1(飞行射击游戏实战...

    《Android.4.游戏入门经典.第3版》PDF

    《Android 4游戏编程入门经典》囊括了成为一名成功的Android游戏开发者所需的全 部知识。本书是一本可以信赖的指南,能够帮助你在移动游戏开发中迅速“升级”。学完 本书并加以融会贯通,就能够编写出成功的Android...

    Android图像处理之画笔特效处理

    Android图像处理的画笔特效处理demo

    网易2018校招Android开发工程师笔试卷及答案.pdf

    网易2018校招Android开发工程师笔试卷及答案.pdf

    android笔画回放

    android ,笔画回放,触摸写字,Canvas 转 Bitmap

    Google Android SDK开发范例大全(第3版) 1/5

    余志龙、陈昱勋、郑名杰、陈小风,分别来自手机制造业、电视媒体业、网络、电信产业、软件开发等领域,擅长嵌入式系统软件设计、J2ME游戏开发、Android开发,以及12EE、JSP、Servlet、Java Bean、PHP、C#等程序语言...

    Google Android SDK开发范例大全(第3版) 4/5

    余志龙、陈昱勋、郑名杰、陈小风,分别来自手机制造业、电视媒体业、网络、电信产业、软件开发等领域,擅长嵌入式系统软件设计、J2ME游戏开发、Android开发,以及12EE、JSP、Servlet、Java Bean、PHP、C#等程序语言...

    Google Android SDK开发范例大全(第3版) 3/5

    余志龙、陈昱勋、郑名杰、陈小风,分别来自手机制造业、电视媒体业、网络、电信产业、软件开发等领域,擅长嵌入式系统软件设计、J2ME游戏开发、Android开发,以及12EE、JSP、Servlet、Java Bean、PHP、C#等程序语言...

    Google Android SDK开发范例大全(第3版) 5/5

    余志龙、陈昱勋、郑名杰、陈小风,分别来自手机制造业、电视媒体业、网络、电信产业、软件开发等领域,擅长嵌入式系统软件设计、J2ME游戏开发、Android开发,以及12EE、JSP、Servlet、Java Bean、PHP、C#等程序语言...

    Android绘图机制与处理技巧(四)——Android图像处理之画笔特效处理

    除了常用的画笔属性,比如普通的画笔(Paint),带边框、填充的style,颜色(Color),宽度(StrokeWidth),抗锯齿(ANTI_ALIAS_FLAG)等,Android还提供了各种各样专业的画笔工具,如记号笔、毛笔、蜡笔等,使用它们可以...

    android之Fragment学习dome

    android之Fragment学习dome http://blog.csdn.net/u014715724/article/details/52682491

    《Google Android SDK开发范例大全(第3版)》.pdf

     全书共分11章,主要以范例集的方式来讲述android的知识点,详细介绍了开发android的人机交互界面、android常用的开发控件、android手机收发短信等通信服务、开发android手机的自动服务功能和娱乐多媒体功能以及...

    Android应用源码之(Paint画笔).zip

    Android 应用开发源码 参考与学习使用

    android 画图画笔

    android 画图画笔

Global site tag (gtag.js) - Google Analytics