Android游戏开发学习(2)--SurfaceView实例控制角色移动
先看效果http://dl.iteye.com/upload/attachment/0063/2160/04016eba-d425-39b0-9c96-5ddf00d70727.jpg
我用到的图片-http://dl.iteye.com/upload/attachment/0063/2164/5cadbe83-ffd2-33f5-a7d8-59dde06927bf.png
在看代码
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*W, 0, (enemy_start+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*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;}}}@Overridepublic 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);}@Overridepublic boolean onKeyUp(int keyCode, KeyEvent event) {is_up=false;is_down=false;is_left=false;is_right=false;return super.onKeyUp(keyCode, event);}@Overridepublic 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;//固定屏幕刷新的时间为50msif(useTime<50){Thread.sleep(50-useTime);}} catch (Exception e) {Log.e("Error", "刷屏线程出错了"+e);}finally{if(canvas!=null){sfh.unlockCanvasAndPost(canvas);}}}}@Overridepublic void surfaceCreated(SurfaceHolder holder) {screen_width=getWidth();screen_height=getHeight();gameThread=new Thread(this);run_flag=true;//启动线程gameThread.start();}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {run_flag=false;try {gameThread.join();} catch (InterruptedException e) {e.printStackTrace();}}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}}
最后源码下载:http://dl.iteye.com/topics/download/638556d9-97b2-3bd9-a7b7-13588b3eb8b5
页:
[1]