Android游戏开发基础

来源:互联网 发布:浙江省信访局网络投诉 编辑:程序博客网 时间:2024/05/16 23:50

一.处理输入设备

1.处理单点触摸事件

     public abstract boolean onTouch(View view,MotionEvent  event);

 MotionEvent主要包含下列三个方法:

       ①MotionEvent.getX()

    ②MotionEvent.getY()//报告触摸事件相对于View的 X和Y坐标

      ③MotionEvent.getAction()//返回触摸事件的类型

   MotionEvent.ACTION_DOWN

     MotionEvent.ACTION_MOVE

   MotionEvent.ACTION_CANCEL

   MotionEvent.ACTION_UP

      2.处理多点触摸事件

Public abstract boolean onTouch(View view,MotionEvent  event);

event.getX(pointerIndex)

event.getY(pointerIndex)//返回一根手指触摸屏幕的坐标 值

Int  pointerIndex=(content.getAction()&MotionEvent.ACTION_POINTER_ID_MASK)>>MotionEvent.ACTION_POINTER_ID_SHIFT;//得到事件的索引

Int action=event.getAction()&MotionEvent.ACTION_MASK;//得到操作掩码

3.处理按钮事件

为了接收按钮事件,视图必须获得焦点:

View.setFocusableInTouchMode(true);

//确保视图可获得焦点

View.requestFocus();

//请求该视图获得焦点

Public boolean onKey(View view,int keyCode,KeyEvent  event)

//view参数指定接受该按钮事件的视图,keyCode参数是 一个KeyEvent类 中定义的常量,最后一个参数是按钮事件本身,具有其他一些信息

KeyEvent中的方法:

KeyEvent.getAction():返回KeyEvent.ACTION_DOWN、 KeyEvent.ACTION_UP

KeyEvent.getUnicodeChar():返回该按钮在文本段中产生的Unicode字符

4.读取加速计状态

(1)确认设备上是否具有一个加速计

①获取一个Sensor实例,表明设备是否安装了加速器,及是在哪里注册监听器

SensorManager   manager=(SensorManager)Context.getSystemService(Context.SENSOR_SERVICE);

   ②检查加速计是否可用

Boolean hasAccel=manager.getSensorList(Sensor.TYPE_ACCELEROMETER).size()>0;

       (2)通过SensorManager来获取已经安装了的加速计,并向其注册 SensorEventListener

  Sensor sensor=manager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);

boolean success=manager.registerListener(listener,sensor,SensorManager.SENSOR_DELAY_GAME);

//参数SensorManager.SENSOR_DELAY_GAME用来指定 //监听器更新的频率,其更新内容来自加速计的最新状态。//这个特殊常量是专为游戏开发而设计的

         (3)接收SensorEvent

  Public void onSensorChanged(SensorEvent event)

//只有在传感器的状态发生改变时,才会调用该方法。 //但加速计的状态是时刻改变的

        (4)处理SensorEvent

      SensorEvent.values[0]//保存x轴的值

  SensorEvent.values[1]//保存y轴的值

 SensorEvent.values[2]//保存z轴的值

5.读取罗盘状态

将“读取加速计状态”中所有的Sensor.TYPE_ACCELEROMETER的地方替换为Sensor.TYPE_ORIENTATION即可

二.文件处理

1.读取资源文件

①获取AssetManager

     AssetManager  assetManager=Context.getAssets();

②打开任何类型的文件

InputStream inputStream=assetManager.open(“dir/dir2/filename.txt”);

//AssetManager.open()方法唯一的参数是相对于asset目录的文件名

2.访问外部存储

①请求实际访问外部存储空间的权限,需要在清单文件的<uses-permission>元素中添加该权限

<uses-permission android:name="string"/>  //用于指定我们想请求的权限的名称,包括

/*

android.permission.RECORD_AUDIO:允许访问音频录制硬件

android.permission.INTERNET:允许访问所有的互联网API

  android.permission.WRITE_EXTERNAL_STORAGE:允许读写外部存储器的文件

android.permission.ACCESS_COARSE_LOCATION:允许获得非GPS级别的访问权限,如用户所在的国家,这对配置语言的默认设置和分析十分有用

android.permission.WAKE_LOCK:允许获得一个唤醒锁

android.permission.NFC:允许应用程序通过NFC(Near-Field Communication,近场通信)执行IO,这对于涉及快速交换少量信息的游戏功能十分有用。

*/

②检查用户的设备上是否实际存在可用的外部存储空间

String state=Environment.getExternalStorageState();

如果state.equals(Environment.MEDIA_MOUNTED)返回true,则我们具有读写外部存储空间的全部权限

无法访问SD卡的原因:创建一个AVD并选择不模拟SD卡;该外部存储设备正在被其他对象使用

③获取其根目录的名称

File externalDir=Environment.getExternalStorageDirectory();

3.共享的首选项

Android为存储应用程序的键值对提供了一个简单的API,称为SharedPreferences。

①从活动中获得SharedPreferences

SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(this);//该SharedPreferences用于在该上下文中共享

SharedPreferences prefs=getPreferences(Context.MODE_PRIVATE);//允许选择共享首选项的私密程度,选项包括Context.MODE_PRIVATE,Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE

②获得编辑器

Edit editor=prefs.edit();

③插入值

editor.putString("key1","banana");

eidtor.putInt("key2",5);

④保存

editor.commit();

⑤读取值

String value1=prefs.getString("key1",null);

int value2=prefs.getInt("key2",0);

三.音频编程

在播放音效或音乐之前,确定音量按钮控制了正确的音频流:

Context.setVolumeControlStream(AudioManager.STREAM_MUSIC);

在活动的生命周期内该方法只需调用一次,最好在Activity.onCreate()方法中调用

1.播放音效

①初始化SoundPool实例

SoundPool  soundPool=new SoundPool(20,AudioManager.STREAM_MUSIC,0);

//第一个参数指定在同一个时刻最多能播放音效的个数,第二个参数指定了SoundPool使用什么音频流来输出该音频

②获取一个AssetFileDescriptor,并从一个音频文件加载音效到堆内存中

AssetFileDescriptor descriptor=assetManager.openFd("explosion.ogg");

int explosionId=soundPool.load(descriptor,1);

//load()方法中的第一个参数是AssetFileDescriptor,第二个参数用于指定该音效的优先级

③播放音效

SoundPool.paly(explosionId,1.0f,1.0f,0,0,1);

//第一个参数是从SoundPool.load()方法接收的句柄,接下来两个参数用于指定左右声道的音量,第四个参数是优先级,第五个参数指定音效循环播放的频率,最后一个参数是播放速率

④不在需要一个音效时,释放内存

SoundPool.unload(explosionId);

2.音乐流

①初始化MediaPlayer实例

MediaPlayer  mediaPlayer=new MediaPlayer();

②告诉MediaPlayer播放什么文件

AssetFileDescriptor descriptor=assetManager.openFd("music.ogg");

mediaPlayer.setDataSource(descriptor.getFileDescriptor(),descriptor.getShortOffset(),descriptor.getLength());

③让MeidaPlayer做好播放的准备

mediaPlayer.prepare();

④启动播放

mediaPlayer.start();

⑤暂停播放

mediaPlayer.pause();

//只有当成功准备好MediaPlayer并已启动播放时,调用此方法才会生效。为了恢复一个暂停的MediaPlayer,可再次调用MediaPlayer.start()方法而不必做任何准备

⑥停止播放

mediaPlayer.stop();

//当想启动一个停止的MediaPlayer时,需再次调用MediaPlayer.prepare()

⑦设置循环播放

mediaPlayer.setLooping(true);

⑧调整音乐播放的音量

mediaPlayer.setVolume(1,1);

⑨检查该播放是否完成

mediaPlayer.setOnCompletionListener(listener);

boolean isPlaying=mediaPlayer.isPlaying();//轮询

   释放资源

mediaPlayer.release();

四.基本图形编程

1.使用唤醒锁

①在清单文件中添加名为android.permission.WAKE_LOCK的<uses-permisson>标记

②从PowerManager中获取一个WakeLock的实例

PowerManager powerManager=(PowerManager)context.getSystemService(Context.POWER_SERVICE);

WakeLock wakeLock=powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK,"My lock");

③启动该唤醒锁

wakeLock.acquire();

④禁用或释放该唤醒锁

wakeLock.release();

通常,在Activity.onCreate()方法中实例化WakeLock,在Activity.onResume()方法中调用WakeLock.acquire(),而在Activity.onPause(0方法中调用WakeLock.release()

2.全屏

①去掉活动的标题栏

requestWindowFeature(Window.FEATURE_NO_TITLE);

②去掉通知栏

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

//必须在设置活动的内容视图之前调用这两个方法

3.在UI线程中不断渲染

①创建一个继承自View的类,并重写View,onDraw(0方法

class RenderView extends view

{

public RenderView(Context context)

{

super(context);

}


protected  void onDraw(Canvas canvas)

{

invalidate();//在onDraw()方法的尾部调用此方法,使该类重绘

}

}

②Canvas中用一个特定的颜色来渲染目标对象的方法是Canvas.drawRGB()

Canvas.drawRGB(int r,int g,int b);

4.获取屏幕分辨率和坐标系统

返回Canvas渲染目标对象的宽度和高度的像素值‘

int width=canvas.getWidth();

int height=canvas.getHeight();

5.绘制简单的形状

(1)绘制像素

①实例化Paint类并设置颜色

Paint paint=new Paint();

paint.setARGB(alpha,red,green,blue);

//或者是paint.setColor(Oxff00ff00);

②绘制像素点

Canvas.drawPoint(float x,float y,paint paint);//坐标的像素值必须指定为浮点型

(2)绘制线

①通过设置Paint实例的画笔宽度来指定其以像素为单位的线宽

Paint.setStrokeWidth(float widthInPixels);

②绘制直线

Canvas.drawLine(float startx,float startY,flaot stopX,float stopY,Paint paint);

(3)绘制矩形

①设置Paint实例的样式

Paint.setStyle(Style style);//style是一个枚举值,其值为Style.FILL(只填充举行的轮廓),Style.STROKE(只绘制矩形的轮廓,同时也使用Paint的颜色和画笔宽度),Style.FILL_AND_STROKE(填充矩形,并使用给定的颜色和画笔来绘制轮廓)

②通过Canvas方法绘制矩形

Canvas.drawRect(float  topLeftX,float  topLeftY,float bottomRightX,float bottomRightY,Paint paint)

(4)绘制图

Canvas.drawCircle(float centerX.float centerY,float redius,Paint paint);

6.使用位图

①从assets/目录加载一幅图像

I nputStream  inputStream=assetManager.open("bob.png");

Bitmap bitmap=BitmapFactory.decodeStream(inputStream);

/*

以特定的颜色格式来加载一幅图像

*InputStream bitmap=BitmapFactory.decodeStream(inputStream)

*BitmapFactory.Options options=new BitmapFactory.Options();

*options.inPerferredConfig=Bitmap.Config;

*Bitmap bitmap=BitmapFactory.decodeStream(inputStream,null,options);

*//Bitmap.Config是一个枚举,其值如下:Config.ALPHA_8,

*//Config.ARGB_4444,Config.ARGB_8888,Config.RGB_565

*/

/*

*创建空的Bitmap实例(用于想在开发中使用自定义图像合成)

*Bitmap bitmap=Bitmap.createBitmap(int width,int height,Bitmap.Config config)

*Canvas canvas=new Canvas(bitmap);

*/

②获得图像的像素宽度和高度,查看使用什么样的颜色格式来存储位图

int width=bitmap.getWidth();

int height=bitmap.getHeight();

Bitmap.Config config=bitmap.getConfig();

③绘制位图

Canvas.drawBitmap(Bitmap bitmap,float topLeftX,flaot topLeftY,Paint paint);

Canvas.drawBitmap(Bitmap bitmap,Rect src,Rect dst,Paint paint);

④释放位图

Bitmap.recycle();

7.渲染文本

①加载字体

Typeface font=Typeface.createFromAsset(Context.getAssets(),String)

//其中String为字体的名称,如“font.ttf”,存放于assets/目录下

②将字体设置为Paint实例的Typeface

paint.setTypeFace(font);

③设置将要进行渲染的字体的大小

Paint.setTextSize(30);

④设置文字对齐方式

Paint.setTextAlign(Paint.Align align);

//Paint.Align枚举有三个值:Paint.Align.LEFT,Paint.Align.CENTER,Paint.Align.RIGHT

⑤绘制文本

canvas.drawText("This is a test",100,100,paint);

*⑥查看以像素为单位的特定字符串的边界

Paint.getTextBounds(String text,int start,int end,Rext bounds);

//第一个参数是想要得到边界的字符串,第二和第三个参数指定进行度量的字符串的开始字符和结束字符,最后一个参数是一个Rect实例,我们将其分配并传入该方法中。该方 //法将把边框矩形的宽度和高度写进Rect.right和Rect.bottom这两个字段,可调用Rect.width()和Rect.height()来获取同样的值

8.使用SurfaceView进行连续渲染

①获得SurfaceHolder类的一个实例

SurfaceHolder holder=surfaceView.getHolder();

②查看Surface是否已被创建

boolean isCreated=surfaceHolder.getSurface().isValid();

③锁定Surface用于渲染并返回一个可用的Canvas实例

Canvas surfaceHolder.lockCanvas();

④进行渲染

⑤解锁Surface

SurfaceHolder.unlockAndPost(Canvas canvas);


0 0
原创粉丝点击