(2) 现代的Android游戏--还是画个框框呗

上一篇的J2ME相信很多朋友都不是很感兴趣, 但是他的核心内容却很重要。
那么本篇就让我们来讲一下Android的内容。

终于要讲现代的平台咯~ 这里我们使用Android Studio来开发

开始:

首先使用Android Studio创建一个工程,得到我们程序的入口,也就是Activity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); //重要的方法
    }

}

Activity创建好之后,可以看到这个入口实际上继承的是AppCompatActivityAppCompatActivity这个类从命名Compat就可以看出,它的核心功能就是做兼容用的(这里我们讲的是游戏开发, 所以就不展开描述了)
下面为了讲起来方便, 统一使用Activity这个称呼来代替AppCompatActivity

程序启动的时候,系统会调用ActivityonCreate()方法。官方建议我们是这个方法里进行一些初始化和使用setContentView(View)等一系列UI初始化操作。


开始之后,让我们回顾一下:

上一篇我们总结的所有游戏的开发套路是什么来着:

  • 创建程序入口
  • 把我们自己的界面设置为需要显示的界面
  • 通过界面提供的图形调用接口来渲染, 并在可以进行绘制的地方进行绘制

既然我们已经把入口创建好了, 接下来就创建一个自己的界面.
setContentView(View)的参数可以看出,View就是我们需要继承实现的类.


创建一个界面

class MyView extends View{

    public DrawView(Context context) {
        super(context);
    }

}

创建出来的View里, 除了构造器外, 空无一物.
根据套路, 肯定会有一个方法, 是我们可以进行绘制的"场所".
从官方API里可以看出, onDraw(Canvas)就是我们要找的"场所".

Implementing a Custom View

To implement a custom view, you will usually begin by providing overrides for some of the standard methods that the framework calls on all views. You do not need to override all of these methods. In fact, you can start by just overriding onDraw(android.graphics.Canvas).

下面是我们实现的onDraw(Canvas):

class MyView extends View{

    public DrawView(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) { // 这里就是魔法开始的地方
        super.onDraw(canvas);
    }
    
}

有没有发现一个老朋友? 那就是Canvas, 它和J2ME里的Graphics有点像, 也提供了很多绘图的方式.

在这里我还是想先画个矩形, 但我不知道该用什么方法, 我在Canvas的api里搜了下rect, 搜到了一个熟悉的名字:

drawRect(float left, float top, float right, float bottom, Paint paint)

drawRect的格式和J2ME里的drawRect基本一样, 不过多了一个Paint.
paint里提供了各种绘画图片,绘制图形,写文字需要用到的样式,颜色信息.

既然,我们已经获取到了画个矩形需要的知识, 那么开始操作吧:


开始绘图

    @Override
    protected void onDraw(Canvas canvas) {
        Paint paint = new Paint();
        paint.setColor(Color.YELLOW); //设置一个黄色的画笔

        canvas.drawRect(0,0,100,100,paint);//在坐标左上角(0,0),右下角(100,100)的地方发矩形
    }

但光这样写出来, 并不能把画面展示出来, 我们还需要使用setContetView把我们的View放进去.
修改好Activity如下:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyView(this)); //将原来的R.layout.activity_main替换为我们的View
    }

}

运行后你就可以看到到效果了:

黄色矩形

那要画个矩形框框呢?

        Paint redStrokePaint = new Paint();
        redStrokePaint.setColor(0xFFFF0000);// 16进制的颜色, Alpha, R, G, B
        redStrokePaint.setStyle(Paint.Style.STROKE); //将样式改为线条
        canvas.drawRect(100,200, 300,400, redStrokePaint); //在左上角在(100,200),右下角在(300,400)的地方画矩形
多了个红色的矩形框

这个VIew的最终代码如下

class MyView extends View{

    public MyView(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        Paint paint = new Paint();
        paint.setColor(Color.YELLOW);

        canvas.drawRect(0,0,100,100,paint);

        Paint redStrokePaint = new Paint();
        redStrokePaint.setColor(0xFFFF0000);
        redStrokePaint.setStyle(Paint.Style.STROKE);
        canvas.drawRect(100,200, 300,400, redStrokePaint);
    }

}

总结

经过这两个平台的绘图, 相信你已经有了一定的思路了.
我在这里列一个表格, 对比下这两个平台:

类型 Android J2ME
程序提供的入口 Activity MIDlet
设置我们界面的方法 setContentView() Display.getDisplay().setCurrent()
提供界面刷新的类 View Canvas
绘图的场所(方法) onDraw()View的方法 paint()Canvas的方法
所谓的画笔(提供绘图功能的类) Canvas由onDraw传递 Graphics由paint传递

从这个表格就可以看出, 什么是套路. 在一篇文章里, 我们将会讲一讲H5的绘图

碎碎念

在这片文章里, 我特意加了一些引导你去思考的地方. 如果是你碰到一个新平台, 要使用之前的套路, 知识去摸索, 去官网上搜索. 因为,当有新的平台, 游戏框架出来的时候, 你只能求助于官网.

上面给出的那些超链接, 都建议点进去看一下. 全都是官方的API. 你可以得到宝贵的知识和技巧
比如, 如果你顺着这些超链接一个个看过去, 可以看到关于Activity完整的描述, 启动,暂定,重启
特别是在看到onDraw(Canvas)的时候, 你点过去看下关于Canvas的描述, 会发现一个小惊喜
这个小惊喜, 在后面的文章里会讲到. 在这个小惊喜里也可以看出, 当你碰到一个新的框架,新平台时, 官方已经为了准备了更好的方案

he android.graphics
framework divides drawing into two areas:
What to draw, handled by Canvas

How to draw, handled by Paint
.

For instance, Canvas
provides a method to draw a line, while Paint
provides methods to define that line's color. Canvas
has a method to draw a rectangle, while Paint
defines whether to fill that rectangle with a color or leave it empty. Simply put, Canvas
defines shapes that you can draw on the screen, while Paint
defines the color, style, font, and so forth of each shape you draw.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容