www.2527.com_澳门新葡8455手机版_新京葡娱乐场网址_
做最好的网站

Android群英传读书笔记,Kinetic使用注意点

2019-08-16 08:48 来源:未知

<virtual> new Canvas(width, height)

HTML5技能为当今Web应用程序在浏览器中提供了极度广阔的表述空间,其有力的机能让我们在浏览器上开辟娱乐和玩游戏不再是难事。利用Canvas和强硬的JavaScript引擎,大家得以轻易地成功休闲游戏的支出。游戏发烧友只需展开浏览器,不用安装插件便足以分享到娱乐带来的野趣。

上一章

  参数:
    width:canvas宽度
    height:canvas高度
  方法:     

本文由NTFusion团队所作,结合了她们在Google Chrome Web Store上发表的《拯救PAPA》和大家享用一下选拔HTML5费用物理游戏的体会。

书中的示例代码:github

applyShadow(shape, drawFunc):应用阴影。
    shape:形状。
    drawFunc:绘画函数。
clear():从canvas中清除当前层。暂不支持。
fill(shape):填充形状。
fillStroke(shape):给描边填充形状。
getContext():获取canvas上下文。
getElement():获取canvas元素节点。
getHeight():获取canvas高度。
getWidth():获取canvas宽度。
setHeight(height):设置canvas高度。
setSize(width, height):设置canvas尺寸。
setWidth(width):设置canvas宽度。
stroke(shape):给描边填充形状。
toDataURL(mimeType, quality):将canvas上下文转换为data url。

在读书本文此前,您能够从Chrome Web Store安装《拯救PAPA》来尝个鲜儿。

本章首要介绍的是Android的绘图技术

  

搭建物理世界

1.显示器尺寸的音讯:

new Canvas (width, height) 参数: width:canvas宽度 height:canvas中度 方法: applyShadow(shape, drawFunc):应用阴影。 shape:形状。 drawFunc:美术函...

物理游戏当中的总体物体,都以在一个设定好的概略世界中运营的。创立物理世界,我们后日选用的是Box2D大要引擎的JavaScript版本。Box2D外燃机里面有叁个很好的功用DebugDraw,能够模拟出我们预设的情理世界并展现给大家看,特别适合我们做连忙游戏原型开辟。

  • 显示器参数有屏幕大小即荧屏对角线的尺寸,用“寸”来表示、分辨率PPI即每英寸像素,它由对角线的像素点除以显示器大小得到。
  • 系统显示器密度如下
    ldpi---120---240X320分辨率
    mdpi---160---320X480分辨率
    hdpi---240---480X800分辨率
    xhdpi---320---720X1280分辨率
    xxhdpi---480---1080X1920分辨率

下图便是使用DebugDraw绘制出来的《拯救PAPA》中的物理世界实例:

2.单位转变工具类(这种百度一群 在此省略)

 

3.2D绘图基础:
Paint类的一部分属性和对应的法力:

Web前端 1

  • setAntiAlias();//设置画笔的锯齿效果
  • setColor();//设置画笔的颜色
  • setARGB();//设置画笔的A,R,G,B的值
  • setAlpha();//设置画笔的Alpha值
  • setTextSize();//设置字体的尺寸
  • setStyle();//设置画笔的风格(空心或者实心)
  • setStrokeWidth();//设置空心边框的宽度
    Canvas类紧要的水墨画作用:
  • canvas.drawPoint(x,y,paint);//绘制点
  • canvas.drawLine(startX,startY,endX,endY,paint);//绘制直线
  • canvas.drawRect(left,top,right,bottom,paint);//绘制矩形
  • canvas.drawRoundRect(left,top,right,bottom,radiusX,radiusY,paint);//绘制圆角矩形
  • canvas.drawCircle(circleX,circleY,radius,paint);//绘制圆
  • canvas.drawOval(left,top,right,bottom,paint);//通过椭圆的外接矩形来绘制椭圆
  • canvas.drawText(text,startX,startY,paint);//绘制文字
  • canvas.drawPosText(text,new float[]{x1,y1,...,xn,yn},paint);//指定位置绘制文本

 

//绘制多条直线
float[] pts={
startX1,startY1,endX1,endY1
......
startXn,startYn,endXn,endYn}
canvas.drawLines(pts,paint);
//绘制路线
Path path=new Path();
path.moveTo(50,50);
path.lineTo(100,100);
path.lineTo(300,50);
canvas.drawPath(path,paint)
//绘制弧形或扇形
canvas.drawArc(left,top,right,bottom,startAngle,sweepAngle,useCenter,paint);
此地useCenter传入true则绘制扇形 反之绘制弧形

图1

4.Android的Xml绘图:
* Bitmap:

营造物理世界的时候,首先大家须要定义相关的物理物体,然后依照游戏的性子所需,设定相关的大体参数。 
  // 成立物理世界实例 
var world = new b2World(new b2Vec2(0, 9.8), true); 
var scale = 1 / 30; /*像素与Box2D里的尺寸单位的转移*/ 
 
// 成立地面和其大意属性的设定 
var bodyDef = new b2BodyDef(); 
var body = world.CreateBody(bodyDef); 
var fixtureDef = new b2FixtureDef(); 
fixtureDef.density = 10; 
fixtureDef.friction = 0.3; 
fixtureDef.restitution = 0.1; 
var polygonShape = new b2PolygonShape(); 
polygonShape.SetAsBox(800 * scale, 20 * scale); 
fixtureDef.shape = polygonShape; body.SetType(b2Body.b2_staticBody); 
body.CreateFixture(fixtureDef); 
body.SetPosition(new b2Vec2(400 * scale, 490 * scale)); 
 www.2cto.com
// 创立PAPA方块和其大意特性的设定 
var bodyDef = new b2BodyDef(); 
var body = world.CreateBody(bodyDef); 
var fixtureDef = new b2FixtureDef(); 
fixtureDef.density = 10; /* density 为密度*/ 
fixtureDef.friction = 0.3; /* friction 为摩擦周到*/ 
fixtureDef.restitution = 0.8; /* restitution 为弹性周到*/ 
var polygonShape = new b2PolygonShape(); 
polygonShape.SetAsBox(30 * scale, 30 * scale); 
fixtureDef.shape = polygonShape; 
body.SetType(b2Body.b2_dynamicBody); 
body.CreateFixture(fixtureDef); 
body.SetPosition(new b2Vec2(400 * scale, 100 * scale));

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/ic_launcher"/>

 

这样就能直接将图片转成bitmap在程序中使用了
* Shape:

概况世界创设达成后,通过DebugDraw作用大家就能够旁观娱乐的原型,那样大家就足以在那么些基础上调节物体的参数、制作关卡等等。那么些干活儿到位之后,下一步大家必要在物理物体上“贴”上海体育场地片,那样游戏用户才得以看看实际的三日游画面。

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line|oval|ring|rectangle">

一路突显对象

<corners
android:bottomLeftRadius="integer"
android:bottomRightRadius="integer"
android:radius="integer"
android:topLeftRadius="integer"
android:topRightRadius="integer" />

首先,我们供给创建三个DisplayObject类,其类似于Flash呈现列表机制中的显示类,该类有x、y和rotation等相应属性,况且有本人的绘图方法,再经过数组格局来贯彻突显列表。

<gradient
    android:angle="integer"
    android:centerColor="color"
    android:centerX="integer"
    android:centerY="integer"
    android:endColor="color"
    android:gradientRadius="integer"
    android:startColor="color"
    android:type="linear|radial|sweep"
    android:useLevel="boolean" />

<padding
    android:bottom="integer"
    android:left="integer"
    android:right="integer"
    android:top="integer" />

<size
    android:width="integer"
    android:height="integer" />
<!--指定大小,一般用在imageview配合scaleType使用-->

<solid android:color="color" />
<!--填充颜色-->
<stroke
    android:width="integer"
    android:color="color"
    android:dashGap="integer"
    android:dashWidth="integer" />
<!--边框,dashGap为虚线间隔宽度,dashWidth为虚线宽度-->

下一步,大家将急需展现的DisplayObject参加彰显列表,再将其与Box2D中对应的实体的地方,本身旋转角度开始展览联合:
 
  var position =body.GetPosition(); 
var angle =body.GetAngle(); 
displayObject.x = position.x / scale; 
displayObject.y = position.y / scale; 
displayObject.rotation = angle * 180 / Math.PI;

</shape>

依靠图第11中学的物理世界,我们画上航海用体育场所片之后,就能够看看下图的镜头:

* Layer:大家可以自己试试效果  这里就不贴图了

 

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/ic_launcher" />
<item
android:drawable="@mipmap/ic_launcher"
android:left="10dp"
android:top="10dp" />
<item
android:drawable="@mipmap/ic_launcher"
android:left="20dp"
android:top="20dp" />
</layer-list>

 

* Selector:
通常用于view的触摸反馈

Web前端 2

<selector xmlns:android=";
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="#334444" />
</shape>
</item>
<item android:state_pressed="false">
<shape android:shape="rectangle">
Web前端,<solid android:color="#444444" />
</shape>
</item>
</selector>

 

5.Android绘图技巧:
`canvas.save()`:保存之前在画布上的操作,之后的操作就像是在新的图层操作一样。
`canvas.restore()`:可以理解为Photoshop中合并图层的操作,作用是将save后的图层与之前的图层合并。
`canvas.translate()`:将画布进行平移。
`canvas.rotate()`:将画布进行旋转。这两个方法都是用来简化绘图而创建的。
`canvas.saveLayer()`:创建一个图层,并将他加入一个图层的栈,通过调用restore或者restoreToCount使其出栈,出栈后会把图像绘制到上层canvas上。
`canvas.saveLayerAlpha()`:同上,区别是可以设置图层的透明度

6.Android色彩特效处理:
图像的色调、饱和度、亮度这三个属性在图像处理中使用非常之多,Android封装了一个`ColorMatrix`类(颜色矩阵),通过改变矩阵值来处理这些属性。
* 色调:

图2

//第多少个参数分别为red、green、blue 第二个参数为要拍卖的值。
ColorMatrix hueMatrix=new ColorMatrix();
hueMatrix.setRotate(0, hue);
hueMatrix.setRotate(1, hue);
hueMatrix.setRotate(2, hue);

动画

* 饱和度:

DisplayObject与物理物体的联手管理好今后,大家便得现在它里面填充必要出示的图片,然后通过自然的光阴世隔改动图片,就能够达到动画的功力。日常,动画是由非常多张图片组成的,为了减小读取次数,大家将动画中的全数的图片合成为一张大图,称为七喜Sheet。图3为《拯救PAPA》中1号工具的卡通片SpriteSheet:

//参数即为饱和度,当饱和度为0时图像就成为灰图像了。
ColorMatrix saturationMatrix=new ColorMatrix();
saturationMatrix.setSaturation(saturation);

 

* 亮度:

Web前端 3

//当三原色以同等比例进行混合的时候,就能够彰显出玫瑰紫红,从而调度亮度。
ColorMatrix lumMatrix=new ColorMatrix();
lumMatrix.setScale(lum, lum, lum, 1);

 

* 让三种效果叠加:

图3

ColorMatrix imageMatrix=new ColorMatrix();
imageMatrix.postConcat(hueMatrix);
imageMatrix.postConcat(saturationMatrix);
imageMatrix.postConcat(lumMatrix);

接下来,我们便足以在百事可乐Sheet中依照坐标获取当前帧所急需出示的图样:
* 
  var canvas = document.createElement("canvas"); 
canvas.width = width;/
width为所画图案的宽窄*/ 
canvas.height = height;/* height为所画图案的莫斯中国科学技术大学学*/ 
canvas.getContext('2d').drawImage(sheet, x, y, width, height, 0, 0, width, height);

7.Android图形特效处理:
通过Matrix类来操作图形矩阵的变换

总结**

private float[] mImageMatrix=new float[9];
Matrix matrix=new Matrix();
matrix.setValues(mImageMatrix);
//当获得多少个改动矩阵今后通过以下代码将二个图像以这么些转变矩阵的款式绘制出来
canvas.drawBitmap(mBitmap,matrix,null);

HTML5手艺还在稳步自己完善个中,大家的程序猿也正在不停的极力,创作越多的好小说。而本文所谈及的情理世界的创设,展现对象以及对动画播放等才干,对于大家制作HTML5的玩乐中是可怜实用的。我们意在看到HTML5本事的不断进步和更加多立异的HTML5网络游戏。

以下是一些变换的方法:
* `setScale();` 缩放变换
* `setSkew();` 错切变换
* `setRotate();` 旋转变换
* `setTranslate();` 平移变换
* `pre()和post()` 提供矩阵的前乘和后乘运算

图形特效这块由于开发用的比较少  暂时记到这里

8.Android画笔特效:
* `PorterDuffXfermode`:
[经典示意图](http://img.blog.csdn.net/20130828212947609?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdDEyeDM0NTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)(贴图不方便偷个懒)
这里要注意的是,PorterDuffXfermode设置的是两个图层交集区域的显示方式,dst是先画的图形,而src是后画的图形。比较常用的是DST_IN和SRC_IN模式来实现一个圆角图形。

应接大家来试玩NTFusion团队构建的HTML5大意游戏《拯救PAPA》!

private Bitmap getRoundPic() {
//原图
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.head1);
//创设叁个和原图同样宽高的图纸
Bitmap out = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
//构造画布
Canvas canvas = new Canvas(out);
//开头化画笔
Paint paint = new Paint();
paint.setAntiAlias(true);
//绘制形状
canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2, Math.min(bitmap.getWidth() / 2, bitmap.getHeight() / 2), paint);
//设置paint的xfermode
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
//把原图绘制上去
canvas.drawBitmap(bitmap, 0, 0, paint);
//再次回到新创制的bitmap,即圆形Logo。
return out;
}

...

* `Shader`:
Shader也被称之为着色器、渲染器,它用来实现一些列的渐变、渲染的效果。
  * `BitmapShader` --- 位图Shader
  * `LinearGradient` --- 线性Shader
  * `RadialGradient` --- 光束Shader
  * `SweepGradient` --- 梯度Shader
  * `ComposeShader` --- 混合Shader
除第一个Shader以外 其他Shader都实现了名副其实的渐变。BitmapShader产生的是一个位图,它的作用就是通过Paint对画布进行指定Bitmap的填充,填充有以下几种模式可以选择:
  * `CLAMP`拉伸 --- 拉伸的是图片最后一个像素 不断重复
  * `REPEAT`重复 --- 横向纵向不断重复
  * `MIRROR`镜像 --- 横向不断旋转重复,纵向不断旋转重复
这里推荐大家看下这篇[博客](http://blog.csdn.net/aigestudio/article/details/41799811)写的非常详细。

9.`SurfaceView`:
与view的区别:
* View主要适用于主动更新的情况下,而SurfaceView 主要适用于被动更新,例如频繁的刷新。
* View在主线程中对画面进行刷新,而SurfaceView通常会通过一个子线程来进行页面刷新。
* View在绘图时没有使用双缓冲机制,而SurfaceView在底层实现机制中就已经实现了双缓冲。
以下是SurfaceView的模板代码:

public class MySurfaceView extends SurfaceView implements Runnable, SurfaceHolder.Callback {
//SurfaceHolder
private SurfaceHolder mSurfaceHolder;
//用于绘图的Canvas
private Canvas mCanvas;
//子线程标识位
private boolean mIsDrawing;

public MySurfaceView(Context context) {
    super(context);
    init();
}
public MySurfaceView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}
public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}
private void init() {
    mSurfaceHolder = getHolder();
    mSurfaceHolder.addCallback(this);
    setFocusable(true);
    setFocusableInTouchMode(true);
    this.setKeepScreenOn(true);

// mSurfaceHolder.setFormat(PixelFormat.OPAQUE);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mIsDrawing = true;
new Thread(this).start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mIsDrawing = false;
}
@Override
public void run() {
while (mIsDrawing) {
draw();
}
}
private void draw() {
try {
//每一遍获得的canvas对象都是上次的 因而上次的点染操作都会保留
mCanvas = mSurfaceHolder.lockCanvas();
//draw here
} catch (Exception e) {

    } finally {
        if (mCanvas != null) {
            mSurfaceHolder.unlockCanvasAndPost(mCanvas);
        }
    }

}

}

TAG标签:
版权声明:本文由澳门新葡8455手机版发布于Web前端,转载请注明出处:Android群英传读书笔记,Kinetic使用注意点