android 人物走动_Android游戏开发学习(2)--SurfaceView实例控制角色移动

这篇博客展示了如何在Android游戏中使用SurfaceView来控制人物角色的移动。通过监听按键事件,改变角色的坐标,实现了上下左右的移动动画。同时,文章提供了详细的代码示例和运行效果。
摘要由CSDN通过智能技术生成

先看效果

我用到的图片-

在看代码

package dk.game;

import android.app.Activity;

import android.os.Bundle;

import android.view.Window;

import android.view.WindowManager;

public class MainActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//去掉标题

requestWindowFeature(Window.FEATURE_NO_TITLE);

//全屏显示

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(new GameView(this));

}

}

package dk.game;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Rect;

import android.util.Log;

import android.view.KeyEvent;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

public class GameView extends SurfaceView implements Runnable,SurfaceHolder.Callback {

//刷屏主线程

private Thread gameThread;

//游戏屏幕宽和高

public static int screen_width,screen_height;

private Paint paint;

private Canvas canvas;

private SurfaceHolder sfh;

private boolean run_flag=false;

//敌人图片

private Bitmap bmp_enemy;

//移动速度

private int enemy_speed=5;

//角色移动控制帧

private int frame=0;

//按键上下左右移动的判断

private boolean is_up,is_down,is_left,is_right;

//上下左右移动动画帧编号

private int[] enemy_up={3,4,5};

private int[] enemy_down={0,1,2};

private int[] enemy_left={6,7,8};

private int[] enemy_right={9,10,11};

//当前帧动画

private int[] enemy_start=enemy_down;

//初始角色单帧图片右上角位置和单帧图片宽和高

//右上角位置作为图片的人物的控制点不太合适

//private int X=50,Y=50,W,H;

//人物的控制点坐标和宽高

private int X,Y,W,H;

public GameView(Context context) {

super(context);

sfh=getHolder();

sfh.addCallback(this);

paint =new Paint();

paint.setAntiAlias(true);

//获得焦点

setFocusable(true);

setClickable(true);

setFocusableInTouchMode(true);

//保持屏幕常亮

setKeepScreenOn(true);

bmp_enemy=BitmapFactory.decodeResource(getResources(), R.drawable.enemy);

W=bmp_enemy.getWidth()/13;

H=bmp_enemy.getHeight();

//这里我以单帧图片的中心点为控制点。具体控制点的位置,主要看你的图片了

X=X+W/2;

Y=Y+Y/2;

}

public void draw(Canvas canvas,Paint paint){

/* 第一种绘制方法 */

/*

canvas.drawColor(Color.GRAY);

//屏幕显示区域

Rect rect_dst=new Rect(X-W/2, Y-H/2, X+W/2, Y+H/2);

//图片截取区域

Rect rect_src=new Rect(enemy_start[frame]*W, 0, (enemy_start[frame]+1)*W, H);

canvas.drawBitmap(bmp_enemy,rect_src,rect_dst,paint);

*/

/* 第二种绘制方法 */

canvas.save();

canvas.drawColor(Color.GRAY);

//设置可视区域

canvas.clipRect(X-W/2, Y-H/2, X+W/2, Y+H/2);

canvas.drawBitmap(bmp_enemy,X-enemy_start[frame]*W-W/2,Y-H/2,paint);

canvas.restore();

}

public void logic(){

//根据按键状态判断

if(is_up){

Y-=enemy_speed;

}else if(is_down){

Y+=enemy_speed;

}else if(is_left){

X-=enemy_speed;

}else if(is_right){

X+=enemy_speed;

}

//边界暂时先不判断

if(X<0){

X=0;

}

if(Y<0){

Y=0;

}

if(X>screen_width){

X=screen_width;

}

if(Y>screen_height){

Y=screen_height;

}

//移动动画帧的处理

if((is_up || is_down||is_left ||is_right)|| frame!=0){

if(frame<2){

frame++;

}else{

frame=0;

}

}

}

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if(keyCode==KeyEvent.KEYCODE_DPAD_UP){

is_up=true;

enemy_start=enemy_up;

}else if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN){

is_down=true;

enemy_start=enemy_down;

}else if(keyCode==KeyEvent.KEYCODE_DPAD_LEFT){

is_left=true;

enemy_start=enemy_left;

}else if(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){

is_right=true;

enemy_start=enemy_right;

}

return super.onKeyDown(keyCode, event);

}

@Override

public boolean onKeyUp(int keyCode, KeyEvent event) {

is_up=false;

is_down=false;

is_left=false;

is_right=false;

return super.onKeyUp(keyCode, event);

}

@Override

public void run() {

while (run_flag) {

try {

long startTime=System.currentTimeMillis();

canvas=sfh.lockCanvas();

logic();

draw(canvas, paint);

long endTime=System.currentTimeMillis();

long useTime=endTime-startTime;

//固定屏幕刷新的时间为50ms

if(useTime<50){

Thread.sleep(50-useTime);

}

} catch (Exception e) {

Log.e("Error", "刷屏线程出错了"+e);

}finally{

if(canvas!=null){

sfh.unlockCanvasAndPost(canvas);

}

}

}

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

screen_width=getWidth();

screen_height=getHeight();

gameThread=new Thread(this);

run_flag=true;

//启动线程

gameThread.start();

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

run_flag=false;

try {

gameThread.join();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

@Override

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

}

最后源码下载

http://dl.iteye.com/topics/download/638556d9-97b2-3bd9-a7b7-13588b3eb8b5

大小: 9.8 KB

大小: 1.1 KB

下载次数: 239

分享到:

2012-02-15 10:26

浏览 9146

评论

2 楼

winslord

2012-12-31

楼上的童鞋,此例中对角色的控制需要使用带键盘的手机,或者使用模拟器。

楼主做的挺好,我运行了一下。很灵活

1 楼

lnb333666

2012-05-13

楼主,代码貌似没效果,图片一直在左上角动不了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值