Android手机游戏开发知识点总结(6)
第七部分 图像像素的操作
Android中Bitmap提供了操作像素的方法,可通过getPixels方法获得图像像素并放到一个数组中去。我们处理这个数组就可以了,最后通过setPixels设置这个像素数组到Bitmap中去。
Android中,每一个图像像素通过4字节整数来展现:最高位字节用作Alpha通道。即用来实现透明与不透明控制,255代表完全透明,0为完全不透明;接下来的一个字节是Red红色通道。
255代表完全是红色。依次类推,接下来的两个字节相应地实现绿色和蓝色通道。 下例为通过图像像素的操作来模拟水纹效果。
public class GameView extends View implements Runnable{ int BACKWIDTH; int BACKHEIGHT; short[] buf2; short[] buf1; int[] Bitmap2; int[] Bitmap1;
public GameView(Context context){ super(context); Bitmap image =
BitmapFactory.decodeResource(this.getResources(),R.drawable.qq);//装载图片
BACKWIDTH = image.getWidth(); BACKHEIGHT = image.getHeight();
buf2 = new short[BACKWIDTH * BACKHEIGHT]; buf1 = new short[BACKWIDTH * BACKHEIGHT]; Bitmap2 = new int[BACKWIDTH * BACKHEIGHT]; Bitmap1 = new int[BACKWIDTH * BACKHEIGHT];
image.getPixels(Bitmap1, 0, BACKWIDTH, 0, 0, BACKWIDTH, BACKHEIGHT);//加载图片的像素到数组中 new Thread(this).start(); }
public void DropStone(
int x, // x坐标 int y, // y坐标
int stonesize, // 波源半径 int stoneweight){ // 波源能量
for (int posx = x - stonesize; posx < x + stonesize; posx++) for (int posy = y - stonesize; posy < y + stonesize; posy++)
if ((posx - x) * (posx - x) + (posy - y) * (posy - y) < stonesize * stonesize) buf1[BACKWIDTH * posy + posx] = (short) -stoneweight; }
public void RippleSpread(){
for (int i = BACKWIDTH; i < BACKWIDTH * BACKHEIGHT - BACKWIDTH; i++){
buf2[i] = (short) (((buf1[i - 1] + buf1[i + 1] + buf1[i - BACKWIDTH] + buf1[i + BACKWIDTH]) >> 1) - buf2[i]);// 波能扩散 buf2[i] -= buf2[i] >> 5;// 波能衰减 }
// 交换波能数据缓冲区 short[] ptmp = buf1; buf1 = buf2; buf2 = ptmp; }
public void render(){//渲染你水纹效果 int xoff, yoff; int k = BACKWIDTH;
for (int i = 1; i < BACKHEIGHT - 1; i++){ for (int j = 0; j < BACKWIDTH; j++){ // 计算偏移量
xoff = buf1[k - 1] - buf1[k + 1];
yoff = buf1[k - BACKWIDTH] - buf1[k + BACKWIDTH]; // 判断坐标是否在窗口范围内 if ((i + yoff) < 0){ k++; continue; }
if ((i + yoff) > BACKHEIGHT){
k++; continue; }
if ((j + xoff) < 0){ k++; continue; }
if ((j + xoff) > BACKWIDTH){ k++; continue; }
// 计算出偏移象素和原始象素的内存地址偏移量 int pos1, pos2;
pos1 = BACKWIDTH * (i + yoff) + (j + xoff); pos2 = BACKWIDTH * i + j;
Bitmap2[pos2++] = Bitmap1[pos1++]; k++; } } }
public void onDraw(Canvas canvas){ super.onDraw(canvas);
canvas.drawBitmap(Bitmap2, 0, BACKWIDTH, 0, 0, BACKWIDTH, BACKHEIGHT, false, null);//绘制经过处理的图片效果 }
public boolean onTouchEvent(MotionEvent event){// 触笔事件 return true; }
public boolean onKeyDown(int keyCode, KeyEvent event){// 按键按下事件 return true; }
public boolean onKeyUp(int keyCode, KeyEvent event){// 按键弹起事件 DropStone(BACKWIDTH/2, BACKHEIGHT/2, 10, 30); return false; }
public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event){ return true; }
public void run(){//线程处理
while (!Thread.currentThread().isInterrupted()){ try{
Thread.sleep(50);
}catch (InterruptedException e){ Thread.currentThread().interrupt(); }
RippleSpread(); render();
//使用postInvalidate可以直接在线程中更新界面 postInvalidate(); } } }
第八部分 Shader类 图片的渲染 /**
* 所谓的渲染就是对画笔的设置 本人是这样理解的。Shader类的使用,都需要先构建Shader对象,然后通过Paint的setShader方法来设置渲染对象,然后在绘制时使用Paint
对象。当然用不同的渲染需要构建不同的对象(即相当于创建不同的画笔)。 */
public class Shader01 extends View{ Bitmap qq2 = null; int qq2width = 0; int qq2height = 0; Paint paint = null;
Shader bitmapShaper = null;//Bitmap渲染 Shader linearGradient = null;//线性渲染 Shader radialGradient = null;//环形渲染 Shader sweepGradient = null;//梯度渲染
Shader composeShaper = null;//混合渲染
ShapeDrawable shapeDrawable = null;
public Shader01(Context context) { super(context);
qq2 = ((BitmapDrawable)
getResources().getDrawable(R.drawable.qq)).getBitmap();//装载资源
qq2width = qq2.getWidth();//得到图片的宽度 qq2height = qq2.getHeight();//得到图片的高度
//创建BitmapShader对象 bitmapShaper = new
BitmapShader(qq2,Shader.TileMode.REPEAT,Shader.TileMode.MIRROR);//要想裁剪需要使用BitmapShader类来裁剪,得到图片的宽度和高度
//创建linearGradient对象并设置变化的颜色数组 linearGradient = new LinearGradient(10, 0, 50, 100, new int []{Color.RED,Color.YELLOW,Color.BLACK}, null, Shader.TileMode.MIRROR);
//混合渲染
composeShaper =new ComposeShader(linearGradient, bitmapShaper, PorterDuff.Mode.DARKEN);//也可选用其他的混合
//环形渲染
radialGradient = new RadialGradient(50, 200, 50, new int[]{Color.GREEN,Color.RED,Color.BLUE}, null, Shader.TileMode.REPEAT);
//梯度渲染
sweepGradient = new SweepGradient(30, 30, new int[]{Color.GREEN,Color.RED,Color.BLUE}, null); paint = new Paint();//创建画笔
…… 此处隐藏:2069字,全部文档内容请下载后查看。喜欢就下载吧 ……相关推荐:
- [建筑文档]2018年公需课:专业技术人员创新能力与
- [建筑文档]2013年福建教师招考小学数学历年真题
- [建筑文档]高中信息技术课flash知识点总结 - 图文
- [建筑文档]电工实训 - 图文
- [建筑文档]最高院公告案例分析100篇(民商篇)
- [建筑文档]南开中学高2017级14-15学年(上)期末
- [建筑文档]五粮液集团战略分析
- [建筑文档]鲁教版(2012秋季版)九年级化学 酸碱
- [建筑文档]超星尔雅2017中国哲学概论自整理题库答
- [建筑文档]关于成为海口金盘饮料公司材料独家供货
- [建筑文档]LNG学习资料第一册 基础知识 - 图文
- [建筑文档]四年级品社下册《好大一个家》复习资料
- [建筑文档]现阶段领导权力腐败的特点及发展趋势
- [建筑文档]魏晋南北朝诗歌鉴赏—嵇康
- [建筑文档]坚持追求真爱是理智的行为 正方一辩稿
- [建筑文档]湘西州刑释解教人员帮教安置工作存在的
- [建筑文档]园林工程试题库及答案
- [建筑文档]计算机长期没有向WSUS报告状态
- [建筑文档]日语最新流行语
- [建筑文档]B62-016 景观进场交底专题会议
- 2018年中考语文课内外古诗词鉴赏专题复
- 高考试题研究心得体会
- C语言基础题及答案
- 电气控制及PLC习题及答案
- 都昌小学家长学校汇报材料
- GMAT作文模板正确使用方法
- 俄军办坦克大赛:中国99式有望与豹2A6
- 成本会计练习题
- 酒店餐饮业最流行的5S管理方法
- 2014-2015学年山东省菏泽市高二(下)
- 《黄鹤楼送孟浩然之广陵》教案、说课、
- 2013年结构化学自测题 有答案版
- 2011西安世界园艺博览会游览解说词(附
- 窗口文明单位示范单位创建活动总结
- 2018满分超星尔雅就业课后练习期末答案
- 韶山市城市总体规划-基础资料
- 苏教版第三单元知识点归纳
- 第4章 曲轴模态分析
- 加大查办案件力度的思考
- 武汉CPC导轨介绍




