网上的资料 图片倒影 原文地址http://onewayonelife.iteye.com/blog/1169176
MainActivity
原文地址http://lipeng88213.iteye.com/blog/1189452
setXfermode
设置两张图片相交时的模式
我们知道 在正常的情况下,在已有的图像上绘图将会在其上面添加一层新的形状。 如果新的Paint是完全不透明的,那么它将完全遮挡住下面的Paint;
而setXfermode就可以来解决这个问题
一般来说 用法是这样的
就是在图片bitmap1上面绘制图片mask时 处理两者相交时候显示的问题
canvas原有的图片 可以理解为背景 就是dst
新画上去的图片 可以理解为前景 就是src
Mode的值 如下图
一个遮罩层的具体例子 原文http://lonesane.iteye.com/blog/791267
由于中间黄色部分是进度条区域,带有一定的弧度而不是规则的长方形。刚开始想偷懒用了很多办法来实现效果都不理想。后来想到使用遮罩层可以非常方便的实现这个功能。
可以通过修改Paint的Xfermode来实现遮罩的效果。Xfermode的功能非常强大,在API DEMO的Graphics中的最后一项有demo。看一下怎么实现我们的这个进度条吧。
首先用图片处理软件制作一个和中间黄色区域相同的图形,我们将在代码中设置它做为遮罩。
View的draw方法
只用控制绘制的矩形的长度就可以实现进度条的效果了。
主要代码
// 圆形头像
cover_user_photo = (CircularImage) view
.findViewById(R.id.cover_user_photo);
String iconpath = getActivity().getApplicationContext().getFilesDir().getAbsolutePath()+ "/";
iconpath += YqApp.mUserSettings.getString(PreferenceKey.USER_PIC, "");
File mfile = new File(iconpath);
Bitmap bm = null;
if (mfile.exists()) {// 若该文件存在
bm = BitmapFactory.decodeFile(iconpath);
}
Drawable drawab = null;
if (null != bm) {
drawab = new BitmapDrawable(createFramedPhoto(
getActivity().getWindowManager().getDefaultDisplay().getWidth()/2,
getActivity().getWindowManager().getDefaultDisplay().getHeight()/2, bm, 400));
}
if (null != drawab)
cover_user_photo.setBackgroundDrawable(drawab);
else
cover_user_photo.setImageResource(R.drawable.face);
private Bitmap createFramedPhoto(int x, int y, Bitmap image, float outerRadiusRat) {
Drawable imageDrawable = new BitmapDrawable(image);
Bitmap output = Bitmap.createBitmap(x, y, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
RectF outerRect = new RectF(0, 0, x, y);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.RED);
canvas.drawRoundRect(outerRect, outerRadiusRat, outerRadiusRat, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
imageDrawable.setBounds(0, 0, x, y);
canvas.saveLayer(outerRect, paint, Canvas.ALL_SAVE_FLAG);
imageDrawable.draw(canvas);
canvas.restore();
return output;
}
元器件的布局是PCB设计中个一个环节和部分,对于优秀的PCB设计工程师来说,合理有效的元器件布局一般都有常用的检查评估方法来进行检测,以下我们就将提供PCB设计元器件布局中的一般要求和标准,供PCB设计工程师参考借鉴。
1. 系统布局是否保证布线的合理或者最优,是否能保证布线的可靠进行,是否能保证电路工作的可靠性。在布局的时候需要对信号的走向以及电源和地线网络有整体的了解和规划。
2. 印制板尺寸是否与加工图纸尺寸相符,能否符合PCB制造工艺要求、有无行为标记。这一点需要特别注意,不少PCB板的电路布局和布线都设计得很漂亮、合理,但是疏忽了定位接插件的精确定位,导致设计的电路无法和其他电路对接。
3. 元件在二维、三维空间上有无冲突。注意器件的实际尺寸,特别是器件的高度。在焊接免布局的元器件,高度一般不能超过3mm。
4. 元件布局是否疏密有序、排列整齐,是否全部布完。在元器件布局的时候,不仅要考虑信号的走向和信号的类型、需要注意或者保护的地方,同时也要考虑器件布局的整体密度,做到疏密均匀。
5. 需经常更换的元件能否方便地更换,插件板插入设备是否方便。应保证经常更换的元器件的更换和接插的方便和可靠。
6. 调整可调元件是否方便。
7. 热敏元件与发热元件之间是否有适当的距离。
8. 在需要散热的地方是否装有散热器或者风扇,空气流是否通畅。应注意元器件和电路板的散热。
9. 信号走向是否顺畅且互连最短。
10. 插头、插座等与机械设计是否矛盾。
11. 线路的干扰问题是否有所考虑。
12. 电路板的机械强度和性能是否有所考虑。
13. 电路板布局的艺术性及其美观性。
深圳宏力捷电子专业生产1-28层高精密度pcb线路板:双面板、精密多层板、超长板(最长可做1米)、厚铜板、高频板、铝基板、铜基板、阻抗板、盲埋板等,主要行业领域:电子通讯、数码、数控设备、通信设备、安防、车载、仪器、工控等高科技产品.。通过ISO-9001质量管理体系认证、UL认证,交货快捷,公司引进国外先进设备保证高品质的线路板是我们的优势,价格合理、服务至上。欢迎广大客户来电咨询或来访洽谈业务!
了解本公司更多相关信息,请登陆宏力捷官方网站:http://www.greattong.com
【课程内容】今天将完成记分系统的设计,并对开发“疯狂消除”游戏用到的技术做一个小结。
【源代码下载地址】http://download.csdn.net/detail/elong_2009/6468177
终于要结束了,已经连续7天了,虽然每一天我们花在代码上的时间其实并不多(我大部分的时间事实上花在了用文字将整个设计开发过程真实记录下来( ⊙ o ⊙ ))。如果您已经认认真真地按照我第一天说到的方法进行了事件,那您一定已经抓到了本次课程的本质。相信只要配合一个稍微厉害一点的美工,不用一个月时间,你也能开发出《植物大战僵尸》这样的游戏来。(说实在的,就是“疯狂消除”用到的这几张简单的图片,也耗费了我整个开发的近一半的时间,因此说,有个合格的美工,会事半功倍!)
到目前为止,游戏的基本雏形已经完成了。加上今天的记分系统,可以说已经是一个完整的游戏,当然还有很多功能等待您继续完善。
1、计分系统
本来不打算设计计分系统的,因为这个着实没有什么技术含量。不过自己玩了几天自己设计的“疯狂消除”,没有计分系统确实很不过瘾,索性就简单的设计了一个,玩起来确实感觉爽了很多。也许这就是计分系统自身的魅力所在吧。
在package elong.CrazyLink.Core中,创建了一个Score类来处理计分。
在每次消除动作完成时,我们判断如果有消除发生,则会调用score对象进行计分,同时动画渲染一个tip。
case DISAPPEAR_END:
{
int clearCnt = clearPic();
score.award(clearCnt);
if(score.getAward() > 0)
{
drawTip1.control.start(clearCnt);
}
clearInline();
markFill();
break;
}
另外,我们会在markInLine中根据本次操作是否实现了消除来决定分值计算是否翻倍。以增加游戏的趣味性。(这样设计,连续消除次数越多,得分就会越高)
static void markInLine()
{
int markCount = 0;
for(int i = 0; i < (int)CrazyLinkConstent.GRID_NUM; i++)
{
for(int j = 0; j < (int)CrazyLinkConstent.GRID_NUM; j++)
{
if (isInLine(i, j))
{
mStatus[i][j] = 4;
markCount++;
}
}
}
if (markCount > 0)
{
drawDisappear.control.start();
score.increase(); //增加计分系数
}
else
{
score.reset(); //复位计分系数
}
}
详细的计分代码请参考附件。
2、相关的OpenGL ES技术小结
2.1对纹理图片的要求:
在OpenGL ES中进行纹理映射时对纹理图片的尺寸是有要求的,纹理图片的宽度和高度必须为2n (2的n次方),即32x32,256x512等。如果图片不满足这个要求,可能在一些设备上显示正常,而在一些设备上直接看到白屏。
2.2所有的操作都基于三角形
在OpenGL ES中,并没用提供绘制正方形的操作,绘制一个正方形,需要转换成绘制两个三角形。
2.3背面裁剪
打开背面裁剪功能后,视角在三角形的背面时不渲染此三角形(即无法看到此三角形),该功能可以提高渲染的效率。
因此,我们需要保证在观察方向上渲染三角形,否则就有可能会看不到所绘制的图像。很多初学者经常会遇到这个问题,如果您绘制的三角形没有按预期出现,您可能需要检查是不是这个原因引起的。
以下是确定一个三角形正反面的方法:通常情况下,当面对一个三角形时,如果顶点的顺序是逆时针的,则位于三角形的正面;反之就是反面。
2.4正交投影
本教程最后采用的是正交投影。所谓正交投影是平行投影的一种,观察者的视线是平行的,不会产生在真实世界中的远小近大地透视效果。
设置正交投影的语句为gl.glOrthof(left,right,bottom,top,near,far)
其中的left和right为视口左右侧对应的x坐标,bottom与top为视口上下侧对应的y坐标,near与far为可视空间区域最近端与最远端的z坐标。
2.5字节序的问题
不同平台其字节序有可能不同,如果数据单元不是字节的,就一定要经过ByteBuffer进行转换,转换的关键就是要通过ByteOrder设置为nativeOrder(),以适应对应平台的字节序,否则就有可能会出现问题。
ByteBuffer cbb = ByteBuffer.allocateDirect(textureCoors.length*4);
cbb.order(ByteOrder.nativeOrder());//设置本地字节顺序
2.6透明的叠加效果
要实现透明的叠加效果,关键的地方是在onSurfaceCreated 中加入以下几行代码:
/*透明效果对素材图片也有要求,要求图片的背景是透明的*/
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glEnable(GL10.GL_ALPHA_TEST);
gl.glAlphaFunc(GL10.GL_GREATER,0.1f);
2.7堆栈技术
在OpenGL ES中,调用glPushMatrix()和glPopMatrix()方法进行堆栈操作。
glPushMatrix()表示复制一份当前矩阵,并把复制的矩阵添加到堆栈的顶部;glPopMatrix表示丢弃堆栈顶部的那个矩阵。
可以这样理解:glPushMatrix()记录下当前坐标的位置,经过一系列的平移、旋转变换之后,调用glPopMatrix()回到原来的坐标位置。
【后记】现在你知道山寨的力量了吧!我们用7天(10个小时,每天约一个小时)左右的时间,就掌握了山寨一款游戏的必备技术。呵呵,那么,反过来呢?如果您有一款好的作品,别人要山寨你,是不是也很容易?尤其是......
由于时间的关系,本教程没有考虑对不同分辨率的屏幕进行适配(在480*800或480*854上应该可以正常运行)。而对不同屏幕进行适配,是一项精细的活。如果碰巧在您的机器上没有正常显示,那么你可以简单修改CrazyLinkConstent.UNIT_SIZE来与您的屏幕匹配。
另外,我们抛砖引玉地介绍了几种渲染特效的设计方法,类似的,您还可以发挥您的才智,设计出更多更炫的特效来。如果你做了这方面的工作,希望你也能分享出来。