`
daikainan
  • 浏览: 202035 次
  • 性别: 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  
楼主,代码貌似没效果,图片一直在左上角动不了

相关推荐

    实例3--使用surfaceView

    在Android开发中,SurfaceView是一个非常重要的视图组件,它主要用于处理复杂的图形绘制和视频播放等需要高性能、低延迟的场景。本实例将深入探讨SurfaceView的工作原理和使用方法,帮助开发者更好地理解和利用这一...

    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游戏开发入门级经典实例"这个主题旨在为初学者提供简单易懂的游戏开发实践,帮助他们快速进入Android游戏开发的世界。虽然...

    surfaceView实例 4-10

    Sample3_7:这是一个实际的项目样本,可能包含一个使用SurfaceView实现特定功能的示例,例如游戏中的角色移动、粒子效果或者自定义的视频播放控件。 通过以上各个章节的学习,你将全面掌握SurfaceView的使用,能够...

    android游戏开发实例

    在Android游戏开发中,涉及到许多核心技术和组件,这些在标题和描述中有所提及。下面将对这些关键知识点进行深入解析。 1. **View与SurfaceView**: - **View**:是Android UI系统的基础,它代表屏幕上的一个可视...

    android游戏开发原创实例人物移动+子弹+跳高

    在Android游戏开发中,创建一个具有人物移动、子弹发射以及跳跃功能的游戏实例是一个常见的实践,这对于初学者来说是一个很好的学习项目。在这个实例中,我们将深入探讨Android游戏开发的基础知识,包括2D图形处理、...

    安卓Android源码——(SurfaceView游戏框架).zip

    总之,SurfaceView是安卓游戏开发中的重要工具,通过理解和熟练运用它的特性,开发者能够构建出流畅且高效的移动游戏。这个压缩包提供的源码是一个很好的学习资源,可以帮助你深入理解SurfaceView在游戏开发中的应用...

    Android小游戏实例

    我们通常会使用SurfaceView或者其子类SurfaceHolder.Callback来控制游戏循环,确保游戏逻辑的平滑运行。通过不断地重绘Canvas,我们可以实现动态效果,如角色移动、碰撞检测等。帧率控制(如通过Thread.sleep或...

    Android SurfaceView 游戏 flabby bird 完整代码

    主Activity创建SurfaceView实例,设置SurfaceHolder回调,并启动子线程进行游戏循环。同时,我们需要处理布局文件,确保SurfaceView在屏幕上正确显示。 总结,通过学习和实践这个Flabby Bird游戏,开发者不仅能掌握...

    Android应用开发详解 11-18.rar 光盘内容

    3. **游戏应用开发**:在Android平台上开发游戏涉及到OpenGL ES、SurfaceView、Canvas、Bitmap的高效使用,以及游戏框架如libGDX、Cocos2d-x的理解与实践。同时,还需了解游戏状态管理、碰撞检测、动画制作和性能...

    android游戏开发大全 案例源程序7-10

    在Android游戏开发的世界里,开发者可以利用Android SDK和各种游戏引擎来创造丰富的移动游戏体验。本资源包聚焦于"Android游戏开发大全"的第7至10章,提供了丰富的案例源程序,帮助开发者深入理解游戏开发的核心技术...

    Android游戏开发之物体来回移动

    在Android游戏开发中,物体来回移动是一个常见的动态效果,它涉及到动画原理、坐标系统、帧率控制以及物理运动规律等多个知识点。在这个主题中,我们将深入探讨如何实现物体在屏幕上来回移动的效果,并结合具体的...

    android游戏编程实例基础

    本资源提供了一个详细的实例教程,即《从零开始Android游戏编程(第二版)》,这本书是学习Android游戏开发的优秀教材。 首先,Android游戏编程的核心在于理解Android系统架构和SDK。Android SDK提供了丰富的API和...

    Android应用源码之(SurfaceView游戏框架)-IT计算机-毕业设计.zip

    本示例源码是关于使用SurfaceView构建游戏框架的实例,适合计算机科学与技术专业的学生进行毕业设计或移动开发App的学习。SurfaceView是Android系统中一个专门用于处理高性能图形绘制的视图组件,尤其适用于游戏或...

    安卓Android源码——体育游戏-疯狂足球源码.zip

    《安卓Android源码——体育游戏-疯狂足球源码》是一个专为Android平台设计的体育游戏应用的源代码,它提供了一个完整的开发实例,对于想要学习Android游戏开发的开发者来说是宝贵的资源。源码包含了实现游戏功能的...

    Android 软件开发与游戏开发1 至 32系列博文大合集

    游戏开发源码则可能涵盖2D和3D游戏开发的基础,如使用Android的SurfaceView进行游戏渲染,学习OpenGL ES进行图形绘制,理解游戏循环和帧率控制,以及物理引擎的运用。此外,可能还会涉及游戏状态管理、碰撞检测、...

    Android源码游戏开发疯狂足球CrazyFootball

    CrazyFootball游戏的源码中,我们可以看到如何使用Android的SurfaceView或者OpenGL ES进行2D或3D图形绘制,如何实现游戏的帧率控制,以及如何处理触摸事件来控制游戏对象的移动和交互。 再者,"实例"意味着实际操作...

    Android应用小实例--跟随手指的小球 .

    在Android平台上,开发一款应用程序,让一个小球跟随手指移动,是一个经典的交互式UI设计实例。这个实例主要涉及到了Android的视图系统、事件处理以及绘图机制。下面将详细讲解这些知识点。 首先,Android的视图...

    android开发资料大全

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

Global site tag (gtag.js) - Google Analytics