`
daikainan
  • 浏览: 200652 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

Android游戏开发学习(2)--SurfaceView实例控制角色移动

阅读更多

先看效果

 

 

 

我用到的图片-

 

在看代码

 

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
分享到:
评论
2 楼 winslord 2012-12-31  
楼上的童鞋,此例中对角色的控制需要使用带键盘的手机,或者使用模拟器。
楼主做的挺好,我运行了一下。很灵活
1 楼 lnb333666 2012-05-13  
楼主,代码貌似没效果,图片一直在左上角动不了

相关推荐

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

    7-13-5-2(通过移动关节绑定两个Body动作) 7-13-6(鼠标关节-拖拽Body) 7-14(AABB获取Body) 7-4(Box2d物理世界) 7-5在物理世界中添加矩形) 7-7(添加自定义多边形) 7-9(在物理世界中添加圆形) 8-1(迷宫小球) 8-2(堆房子...

    android开发资料大全

    android移动开发案例精选 Android通过画线实现button效果 Android如何防止apk程序被反编译 Android 之 AIDL 和远程 Service 调用 Android 相对布局技巧 android开发环境之Logcat(日志)教程实例汇总 android网络通信...

    android开发揭秘PDF

    第11 章Android游戏开发实例 11.1 手机游戏开发简介 11.2 游戏框架设计 11.3 地图设计 11.4 主角设计 11.5 图层管理器 11.6 游戏音效 11.7 游戏存档 11.8 小结 第四部分 高级篇 第12章 AndroidOpenGL开发 基础 12.1...

    Android应用开发揭秘pdf高清版

    不仅详细讲解了Android框架、Android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发等基础知识,而且还深入阐述了传感器、语音识别、桌面组件开发、Android游戏引擎设计、Android应用优化、OpcnGL等...

    Android高级编程--源代码

     由于Android构建在开源代码的框架之上,而且提供了强大的SDK库和开放的理念,所以它为广大的没有任何移动应用程序开发经验的新手开辟了一条开发完美的移动应用程序的康庄大道。而富有经验的移动开发人员现在也可以...

    《Android应用开发揭秘》附带光盘代码.

    《Android应用开发揭秘》全部实例源代码,配合《Android应用开发揭秘》使用 前言  第一部分 准备篇  第1章 Android开发简介  1.1 Android基本概念  1.1.1 Android简介  1.1.2 Android的系统构架  1.1.3 ...

    《Android应用开发揭秘》源码

     第11 章Android游戏开发实例  11.1 手机游戏开发简介  11.2 游戏框架设计  11.3 地图设计  11.4 主角设计  11.5 图层管理器  11.6 游戏音效  11.7 游戏存档  11.8 小结  第四部分 高级篇  第12章 ...

    Android中SurfaceView用法简单实例

    主要介绍了Android中SurfaceView用法,以一个简单的图形绘制及改变位置实现方法分析了SurfaceView的使用技巧,需要的朋友可以参考下

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    Google Android SDK开发范例大全(完整版)共4个分卷 目录 第1章 了解.深入.动手做. 1.1 红透半边天的Android 1.2 本书目的及涵盖范例范围 1.3 如何阅读本书 1.4 使用本书范例 1.5 参考网站 第2章 Android初体验 2.1...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    Google Android SDK开发范例大全(完整版)共4个分卷 目录 第1章 了解.深入.动手做. 1.1 红透半边天的Android 1.2 本书目的及涵盖范例范围 1.3 如何阅读本书 1.4 使用本书范例 1.5 参考网站 第2章 Android初体验 2.1...

    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#等程序语言...

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

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

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    Google Android SDK开发范例大全(完整版)共4个分卷 目录 第1章 了解.深入.动手做. 1.1 红透半边天的Android 1.2 本书目的及涵盖范例范围 1.3 如何阅读本书 1.4 使用本书范例 1.5 参考网站 第2章 Android初体验 2.1...

    android surfaceview示例源码下载

    摘要:Java源码,Android源码,android android中的surfaceview示例源码下载,Android SurfaceView在游戏开发中使用想当广泛,SurfaceView对于画面的控制有着更大的自由度,它不像View那样要用handler来更新,但是网上...

Global site tag (gtag.js) - Google Analytics