教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 建筑文档 >

Android手机游戏开发知识点总结(6)

来源:网络收集 时间:2026-04-01
导读: 第七部分 图像像素的操作 Android中Bitmap提供了操作像素的方法,可通过getPixels方法获得图像像素并放到一个数组中去。我们处理这个数组就可以了,最后通过setPixels设置这个像素数组到Bitmap中去。 Android中,每

第七部分 图像像素的操作

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字,全部文档内容请下载后查看。喜欢就下载吧 ……
Android手机游戏开发知识点总结(6).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/438798.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)