Android游戏开发中常用的三种视图

本文介绍了Android游戏开发中常用的三种视图:View、SurfaceView和GLSurfaceView,重点讲解了View游戏框架和SurfaceView游戏框架的差异。View适用于被动更新的棋牌类游戏,SurfaceView则适合需要主动更新画面的RPG和飞行射击类游戏。通过实例详细展示了如何实现View和SurfaceView的游戏框架。
摘要由CSDN通过智能技术生成

简介

Android游戏开发中常用的三种视图是View、SurfaceView和GLSurfaceView
下面简单介绍这三种视图:

  • View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;
  • SurfaceView:基于View视图进行拓展的视图类,更适用于2D游戏开发;
  • GLSurfaceView:基于SurfaceView视图类再次拓展的视图类,用于3D游戏开发的视图。

在2D游戏开发中,大致分为两种游戏框架:View游戏框架和SurfaceView游戏框架。两者的主要区别有:

1) 更新画布
View是由系统主UI线程进行更新,通过调用View提供的postInvalidate()和invalidate()这两个函数重新绘制的。棋牌类游戏,其画面更新属于被动更新,这类游戏适用于View游戏框架。

SurfaceView可在UI线程或者新的线程中更新。RPG、飞行射击类游戏,其画面更新属于主动更新,需要不断重绘,这类游戏实用于SurfaceView游戏框架。

2)视图机制
View视图没有双缓冲机制,而SurfaceView视图有。

实例

View游戏框架,此Demo跟踪用户的方向键点击事件,以及触屏事件,具体步骤如下:

1.新建Android项目“ViewDemo”,此处略去若干字

2.创建一个类MyView,此类继承View,代码如下:

package com.cpxiao.viewdemo;

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

/**
 * Created by cpxiao on 15/9/19.
 */
public class MyView extends View {
   
    private Paint mPaint;

    /**
     * 重写构造方法
     */
    public MyView(Context context) {
        super(context);
        init();
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        //设置焦点
        setFocusable(true);
        mPaint = new Paint();
        mPaint.setColor(Color.RED);
        mPaint.setTextSize(30);
    }

    /**
     * 重写绘图方法
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawText("MyView", textX, textY, mPaint);

    }

    int textX = 100;
    int textY = 100;

    /**
     * 重写按键按下事件的方法
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //判断按下的是否为方向键(上下左右)
        if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
            textY -= 10;
        } else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
            textY += 10;
        } else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
            textX -= 10;
        } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
            textX += 10;
        }
        //重绘画布的函数有invalidate()和postInvalidate(),区别在于invalidate()不能在子线程中循环调用,而postInvalidate()可以。
        invalidate();
        //      postInvalidate();
        return super.onKeyDown(keyCode, event);

    }

    /**
     * 重写按键抬起事件的方法
     */
    @Override
    public b
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值