package com.bn.Sample1_3;
import static com.bn.Sample1_3.Constant.*;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import com.bn.Sample13_3.R;
import android.content.Context;
import android.content.res.Resources;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.view.MotionEvent;
class GameSurfaceView extends GLSurfaceView
{
private SceneRenderer mRenderer;//场景渲染器
static Sample1_3_Activity activty;
float mPreviousY;
float mPreviousX;
//-----纹理
int tex_grassId;//系统分配的草地纹理id
int tex_sandId;
int tex_leavesId;//系统分配的灌木纹理id
int tex_treejointId;//树干的纹理id
int tex_waterId;//水面纹理Id
int tex_skyId;//天空纹理id
//-----物体对象组件
TreesForControl treesForControl;//所有椰子树的控制类
TreeLeaves treeLeaves[];//叶子模型
TreeTrunk treeTrunk;//树干模型
FloorRect floorLand; //草地
SeaWater water;//水面
LandForm landForm;//灰度图山
SkyBall skyBall;//天空球
static float tx=CAMERA_X;//观察目标点x坐标
static float ty=CAMERA_HEIGHT;//观察目标点y坐标
static float tz=CAMERA_Z;//观察目标点z坐标
static float cx=(float) (tx+Math.sin(Math.toRadians(camera_direction))*DISTANCE);//摄像机x坐标
static float cy=CAMERA_HEIGHT;//摄像机y坐标
static float cz=(float) (tz+Math.cos(Math.toRadians(camera_direction))*DISTANCE);//摄像机z坐标
public GameSurfaceView(Context context)
{
super(context);
activty=(Sample1_3_Activity)context;
this.setEGLContextClientVersion(2); //设置使用OPENGL ES2.0
mRenderer = new SceneRenderer(); //创建场景渲染器
setRenderer(mRenderer); //设置渲染器
setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);//设置渲染模式为主动渲染
this.setKeepScreenOn(true);
}
//触摸事件回调方法
@Override
public boolean onTouchEvent(MotionEvent e)
{
float y = e.getY();
float x = e.getX();
switch (e.getAction())
{
case MotionEvent.ACTION_DOWN://按下动作
break;
case MotionEvent.ACTION_UP://抬起动作
break;
case MotionEvent.ACTION_MOVE:
float dy = y - mPreviousY;//计算触控笔Y位移
float dx = x - mPreviousX;//计算触控笔X位移
if(dy>5&&DISTANCE>600)//前进
{
DISTANCE-=20;
}
else if(dy<-5&&DISTANCE<4700)//后退
{
DISTANCE+=20;
}
if(dx<-10)//左转弯
{
camera_direction-=dx*0.1f;
}
else if(dx>10)//右转弯
{
camera_direction-=dx*0.1f;
}
break;
}
mPreviousY = y;//记录触控笔位置
mPreviousX = x;//记录触控笔位置
//重新初始化摄像机的位置和方向
cx=(float) (tx+Math.sin(Math.toRadians(camera_direction))*DISTANCE);//摄像机x坐标
cy=CAMERA_HEIGHT;//摄像机y坐标
cz=(float) (tz+Math.cos(Math.toRadians(camera_direction))*DISTANCE);//摄像机z坐标
return true;
}
class SceneRenderer implements GLSurfaceView.Renderer
{
float oldTime=0;
public void onDrawFrame(GL10 gl)
{
float currTime=System.nanoTime();
System.out.println("FPS == "+1000000000.0/(currTime-oldTime));
//清除深度缓冲与颜色缓冲
GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
MatrixState.setCamera(cx,cy,cz,tx,ty,tz,0f,1.0f,0.0f);
//天空球旋转
sky_rotation=(sky_rotation+0.03f)%360;
//创建天空
skyBall.drawSelf(tex_skyId,sky_rotation);
//绘制山脉
drawLandForm();
//绘制水面
drawWater();
//绘制正常的椰子树
treesForControl.drawSelf(tex_leavesId,tex_treejointId,bend_R,wind_direction);
oldTime=currTime;
}
public void onSurfaceChanged(GL10 gl, int width, int height)
{
//设置视窗大小及位置
GLES20.glViewport(0, 0, width, height);
//计算GLSurfaceView的宽高比
float ratio = (float) width / height;
//调用此方法计算产生透视投影矩阵
MatrixState.setProjectFrustum(-ratio, ratio, -1, 1, 3, 50000);
//调用此方法产生摄像机9参数位置矩阵
MatrixState.setCamera(cx,cy,cz,tx,ty,tz,0f,1.0f,0.0f);
}
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
//设置屏幕背景色RGBA
GLES20.glClearColor(0.0f,0.0f,0.0f,1.0f);
//打开深度检测
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
//打开背面剪裁
GLES20.glEnable(GLES20.GL_CULL_FACE);
//初始化变换矩阵
MatrixState.setInitStack();
//初始化光源位置
MatrixState.setLightLocation(sunPosition[0], sunPosition[1],sunPosition[2]);
//加载shader
ShaderManager.loadCodeFromFile(GameSurfaceView.this.getResources());
//编译shader
ShaderManager.compileShader();
initAllObject();//初始化纹理组件
initAllTexture();//初始化纹理
//创建一个线程,定时摆动树干
new Thread()
{
@Override
public void run()
{
while(flag_go)
{
//椰子树旋转
if(0!=wind)//如果风力为0级以上
{
//设置椰子树的左右摆动
wind_speed+=wind_force;//摆动的速度
bend_R-=wind_speed;//摆动的幅度
if(bend_R>bend_R_max)//智力状态
{
wind_speed=wind_speed_init;
bend_R=bend_R_max;
}
}
try
{
Thread.sleep(50);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}.start();
}
}
//绘制山地的方法
public void drawLandForm()
{
for(int i=0;i<floor_array.length;i++)
{
for(int j=0;j<floor_array[0].length;j++)
{
MatrixState.pushMatrix();
MatrixState.translate(j*FLOOR_WIDTH,0,i*FLOOR_HEIGHT);
if(1==floor_array[i][j])//绘制高山
{
landForm.drawSelf(tex_grassId,tex_sandId);
}
MatrixState.popMatrix();
}
}
}
//绘制水面
public void drawWater()
{
MatrixState.pushMatrix();
MatrixState.translate(0, 3f, 0);
//绘制水面
water.drawSelf(tex_waterId);
MatrixState.popMatrix();
}
//创建所有的物体组件对象
public void initAllObject()
{
//创建树干
treeTrunk=new TreeTrunk
(
ShaderManager.getTreeWaveShaderProgram(),
bottom_radius,
joint_height,
joint_num,
joint_available_num
);
//创建六片树叶
treeLeaves=new TreeLeaves[]
{
new TreeLeaves(ShaderManager.getLeavesShaderProgram(),leaves_width,leaves_height,leaves_offset,0),
new TreeLeaves(ShaderManager.getLeavesShaderProgram(),leaves_width,leaves_height,leaves_offset,1),
new TreeLeaves(ShaderManager.getLeavesShaderProgram(),leaves_width,leaves_height,leaves_offset,2),
new TreeLeaves(ShaderManager.getLeavesShaderProgram(),leaves_width,leaves_height,leaves_offset,3),
new TreeLeaves(ShaderManager.getLeavesShaderProgram(),leaves_width,leaves_height,leaves_offset,4),
new TreeLeaves(ShaderManager.getLeavesShaderProgram(),leaves_width,leaves_height,leaves_offset,5)
};
//创建树的控制类
treesForControl=new TreesForControl(treeTrunk,treeLeaves);
//创建海底
floorLand=new FloorRect
(
ShaderManager.getTextureShaderProgram(),
FLOOR_WIDTH,
FLOOR_HEIGHT
);
没有合适的资源?快使用搜索试试~ 我知道了~
海滩波浪OpenGL
共94个文件
class:30个
png:18个
java:17个
3星 · 超过75%的资源 需积分: 12 79 下载量 145 浏览量
2016-05-09
15:17:08
上传
评论 2
收藏 1.07MB RAR 举报
温馨提示
OpenGL es 实现的海滩波浪效果,还有椰树等海上风景,android实现的 博客地址http://blog.csdn.net/xiaoge132/article/details/51314840
资源推荐
资源详情
资源评论
收起资源包目录
海滩波浪.rar (94个子文件)
海滩波浪
bin
classes.dex 55KB
res
raw
treetrunk.png 31KB
leaves.png 20KB
drawable-hdpi
water.png 11KB
coconut.png 11KB
icon.png 7KB
crunch
raw
treetrunk.png 31KB
leaves.png 20KB
drawable-hdpi
water.png 11KB
coconut.png 11KB
icon.png 7KB
drawable-nodpi
land.png 976B
drawable-nodpi
land.png 976B
jarlist.cache 120B
dexedLibs
annotations-208bc076e0325a436b7d8b4d8545823c.jar 1KB
annotations-a38500ae4230047e45a65729e8e17dd8.jar 943B
classes
com
bn
Sample13_3
BuildConfig.class 343B
R$layout.class 394B
R$id.class 419B
R$drawable.class 569B
R$attr.class 337B
R.class 567B
R$string.class 395B
R$raw.class 481B
Sample1_3
Sample1_3_Activity$1.class 2KB
SkyBall.class 5KB
Sample1_3_Activity$2.class 1KB
GameSurfaceView$SceneRenderer$1.class 1KB
Sample1_3_Activity.class 7KB
TreesForControl.class 2KB
LandForm.class 4KB
ShaderUtil.class 3KB
ShaderManager.class 2KB
TreeLeaves.class 4KB
Sample1_3_Activity$4.class 1KB
TreeLeavesControl.class 2KB
GameSurfaceView$SceneRenderer.class 3KB
Constant.class 5KB
GameSurfaceView.class 5KB
FloorRect.class 3KB
Sample1_3_Activity$3.class 2KB
MatrixState.class 3KB
SeaWater.class 4KB
TreeTrunk.class 5KB
SeaWater$1.class 895B
TreeTrunkControl.class 1KB
resources.ap_ 375KB
Sample1_3.apk 399KB
AndroidManifest.xml 877B
res
drawable-ldpi
raw
wind.ogg 56KB
treetrunk.png 38KB
gamebg_music.wav 104KB
leaves.png 23KB
drawable-hdpi
sky.jpg 73KB
water.png 12KB
caodi.jpg 32KB
sand.jpg 19KB
coconut.png 12KB
icon.png 9KB
drawable-xhdpi
values
strings.xml 111B
drawable-nodpi
land.png 4KB
drawable-mdpi
layout
seekbar.xml 549B
assets
frag_leaves.sh 227B
vertex_water.sh 1KB
frag_tex.sh 325B
vertex_tree.sh 1KB
vertex_landform.sh 537B
vertex_leaves.sh 427B
vertex_tex.sh 474B
frag_water.sh 297B
frag_tree.sh 276B
frag_landform.sh 866B
gen
com
bn
Sample13_3
BuildConfig.java 159B
R.java 1KB
.settings
org.eclipse.jdt.core.prefs 629B
src
com
bn
Sample1_3
TreeTrunk.java 7KB
MatrixState.java 4KB
SeaWater.java 6KB
TreeLeaves.java 8KB
TreesForControl.java 2KB
Sample1_3_Activity.java 7KB
FloorRect.java 4KB
ShaderUtil.java 4KB
SkyBall.java 8KB
TreeLeavesControl.java 3KB
GameSurfaceView.java 9KB
TreeTrunkControl.java 756B
LandForm.java 6KB
Constant.java 7KB
ShaderManager.java 2KB
.project 845B
.classpath 475B
project.properties 563B
AndroidManifest.xml 877B
共 94 条
- 1
资源评论
- liuyunProgramer2018-06-08比较一般,只有代码,没有太多注释,比较难懂
xiaogeformax
- 粉丝: 101
- 资源: 25
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功