Android游戏编程——View游戏框架

android游戏开发中常用的三种视图是:view、SurfaceView和GLSurfaceView。

View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;

SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发;

GLSurfaceView:基于SurfaceView视图再次进行拓展的视图类,专用于3D游戏开发的视图。

在2D游戏开发中,大致可以分为两种游戏框架,View和SurfaceView。

View游戏框架:

Activity:在Activity中首先设置全屏显示,分为两点:隐去状态栏和隐去应用程序的名字(这些代码必须写在显示view之前,否则会报错);随后是设置view。

另一种设置全屏的方法:在Mainfest文件中相应的Activity中写入如下代码:

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"


代码如下 :

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       /* this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
        		WindowManager.LayoutParams.FLAG_FULLSCREEN);
        */
        setContentView(new viewTest(this));
    }


view类中的代码:

package com.he;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;

public class viewTest extends View {
	float pX=20;
	float pY=20;
	
	public viewTest(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		setFocusable(true);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		Paint paint=new Paint();
		paint.setColor(Color.WHITE);
		canvas.drawText("MYGAME", pX, pY, paint);
		super.onDraw(canvas);
	}
	
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		if(keyCode==KeyEvent.KEYCODE_DPAD_UP){
			pY-=10;
			invalidate();
		}
		else if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN){
			pY+=10;
			invalidate();
		}
		else if(keyCode==KeyEvent.KEYCODE_DPAD_LEFT){
			pX-=10;
			invalidate();
		}
		else if(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){
			pX+=10;
			invalidate();
		}
		return super.onKeyDown(keyCode, event);
	}
	
	/*@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		float x=event.getX();
		float y=event.getY();
		//玩家手指点击屏幕的动作
		if(event.getAction()==MotionEvent.ACTION_DOWN){
			this.pX=x;
			this.pY=y;
		}
		//玩家手指抬起离开时的动作
		else if(event.getAction()==MotionEvent.ACTION_MOVE){
			this.pX=x;
			this.pY=y;
		}
		//玩家手指在屏幕上移动的动作
		else if(event.getAction()==MotionEvent.ACTION_UP){
			this.pX=x;
			this.pY=y;
		}
		invalidate();
		return super.onTouchEvent(event);
	}*/
	
	
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		float x=event.getX();
		float y=event.getY();
		this.pX=x;
		this.pY=y;
		invalidate();
		return super.onTouchEvent(event);
	}
	
}

此类中包括:构造方法、onDraw()、按键事件方法和触屏事件方法;

注意的是:

1.在构造方法中要为当前的View设置焦点,其实就是告诉系统,现在的这个视图要和用户交互,让系统来监听 此视图,因为一个界面中可以显示多个View视图,      andriod

为了避免出现多个view焦点混乱的问题,View类有了焦点属性,以及对应的设置焦点的方法:

setFocusable(true);

true表示当前视图不需要焦点,false表示当前的视图不需要焦点。
2.重新绘制画布的方法,有两个函数,这两个函数都会再次调用onDraw方法

invalidate()、postInvalidate();

这两个方法的区别是:invalidate()方法不能在当前线程中循环调用执行,这里说的线程不是系统 的主UI线程,而是指的子线程(自己创建的线程);而postInvalidate()方法可以 在子线程中循环调用执行,如果当前View创建线程循环重绘画布的话,这两种方法就没有什么区别了,都可以使用。

当画布中任何一个元素发生改变后都要调用这个重绘方法。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值