`

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 studio游戏摇杆开发教程,仿王者荣耀摇杆

    Android Studio 游戏摇杆开发教程,仿王者荣耀...我们从游戏摇杆的基本结构开始,了解了摇杆的多点触控和数学知识的应用,并详细介绍了游戏摇杆的开发思路和实现方法。希望本文能够为您提供有价值的参考和学习价值。

    Android程序开发学习平台的设计.pdf

    Android程序开发学习平台是一款针对Android操作系统的应用,旨在为开发者提供便捷的学习途径,使得学习者能够随时随地通过智能手机进行Android编程的学习。随着Android在全球市场的占有率不断攀升,Android应用开发...

    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应用源码商业级水彩蜡笔涂鸦项目

    在Android平台上,开发一款商业级的水彩蜡笔涂鸦应用是一项挑战性的任务,涉及到许多技术细节...通过研究源码,开发者不仅能学习到具体的编程技巧,还能了解如何构建一个完整的商业化应用,提升自己的Android开发能力。

    五本android开发书籍+五个项目源码下载

    安卓航班网还提供了多本Android开发书籍的下载链接,这些书籍覆盖了从基础到进阶的不同阶段,非常适合想要深入学习Android开发的读者。 #### 1. 四本很给力的Android书籍 这四本书籍是精心挑选的,涵盖了Android...

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

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

    android实现屏幕画笔工具

    在Android平台上实现一个屏幕画笔工具,涉及到许多关键的技术点,包括图形绘制、触摸事件处理、用户交互设计等。下面将详细阐述这些知识点。 首先,Android的图形绘制主要依赖于Canvas和Paint对象。Canvas提供了...

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

    在Android平台上,图像处理是一个广泛且重要的领域,尤其在移动应用开发中,用户对视觉体验的需求日益提升。本文将深入探讨“Android图像处理之画笔特效处理”这一主题,通过一个具体的demo来展示如何在Android应用...

    Android游戏开发基础和经验.doc

    在Android游戏开发中,开发者需要掌握一系列基础知识和实践经验。本文主要围绕如何开发一个简单的Android游戏,如俄罗斯方块,来探讨关键的技术...在实践中不断学习和优化,将使你在Android游戏开发的道路上越走越远。

    Android开发60个精典案例.rar

    通过研究这些案例,开发者可以学习到Android应用开发的各种技术,包括UI设计、游戏开发、动画制作、用户交互、数据处理等方面的知识。实践这些案例不仅能提升编程技能,还能加深对Android SDK的理解,从而能够独立...

    android笔画回放

    在Android开发中,"android笔画回放"是一个有趣且实用的功能,它允许用户在屏幕上进行书写或绘画,然后系统能够记录并回放这些笔画的动作。这一特性常见于绘图应用、教育软件或者笔记应用中,为用户提供了一种交互式...

    android游戏打豆豆源码

    【Android游戏开发:打豆豆源码解析...通过深入研究源码,开发者可以学习到Android游戏开发的基础流程和技巧,进一步提升自己的编程技能。对于初学者来说,这是一份宝贵的实践资料,有助于理解Android游戏开发的全貌。

    android毛笔功能实现

    android实现毛笔效果,可以模拟毛笔字的感觉,体验毛笔涂鸦

    Android游戏开发 自定义手势--输入法手势技术

    在Android游戏开发中,自定义手势是一种增强用户体验和交互性的关键技术。本文主要探讨的是输入法手势技术,这是一种允许用户通过特定的手势操作来触发游戏内特定事件的方法。例如,用户可以画个圆来切换背景,或者...

    Android项目开发实战_欢乐写数字_安卓练手完整编程案例实例详解课程教程

    让小朋友在手机上看动画演示笔画顺序,然后...本章将使用 Android技术开发一款书写数字的游戏,让小朋友在玩中学会写数字。欢乐写数字程序集合了页面布局、设置颜色、动画演示、背量景音乐、添加功能按钮及对话框等技术。

    Android源码——屏幕画笔实现源码.zip

    通过深入学习和理解`Canvas`和`Paint`的使用,以及源码背后的实现逻辑,开发者可以更好地控制Android应用程序的视觉表现,创造出丰富多彩的用户体验。在实践中不断探索和优化,将使你的Android开发技能更上一层楼。

    Android自定义组件开发详解自制书签目录版方便看.pdf

    但他最终决定重新拿起笔来,向广大Android学习爱好者介绍自定义组件的开发,希望通过这种方式为读者铺平通往更高开发层次的道路。 李赞红在书中采用了一种类似于聊天的方式,试图通过这种方式与读者进行心灵上的...

Global site tag (gtag.js) - Google Analytics