- 浏览: 559254 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (338)
- 已过时文章(留念用) (39)
- Android学习笔记 (30)
- Android开发指引自译 (100)
- Android NDK文档自译 (23)
- Android设计指引自译 (2)
- xp(ペケピー)&linux(理奈、铃)酱~ (4)
- ui酱&歌词自译~ (9)
- lua酱~ (9)
- 自我反省 (1)
- 羽game计划 (1)
- XSL酱 (2)
- java酱 (3)
- 设计的领悟 (58)
- 涂鸦作品(pixiv) (1)
- ruby酱 (2)
- Objective-C编程语言自译 (2)
- Android开发月报 (6)
- objc酱 (2)
- photoshop (3)
- js酱 (6)
- cpp酱 (8)
- antlr酱 (7)
- Lua 5.1参考手册自译 (11)
- 收藏品 (3)
- 待宵草计划 (4)
- 体验版截图 (1)
最新评论
-
naruto60:
太给力了!!!!我这网打不开Intel官网,多亏楼主贴了连接, ...
使用HAXM加速的Android x86模拟器(和一些问题) -
yangyile2011:
谢谢博主,翻译得很好哦
【翻译】(4)片段 -
ggwang:
牙痛的彼岸:痹!
牙痛的彼岸 -
ggwang:
总结得很简练清晰啊,学习了!
ANTLR学习笔记一:概念理解 -
leisurelife1990:
mk sdd
用git下载Android自带app的源代码
二维坐标系变换为原点在左上角(测试用)
* GLES
* JOGL
* LWJGL
* libgdx(使用g2d与pixmap)
package com.iteye.weimingtom.testgl; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.IntBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.app.Activity; import android.opengl.GLSurfaceView; import android.os.Bundle; import android.view.Window; import android.view.WindowManager; public class Testgl3Activity extends Activity implements GLSurfaceView.Renderer { private boolean USE_ORIGIN_TOPLEFT = true; private IntBuffer vertices; private int vertexBytes; private int vertexNum; private float[] arrVertices; private int[] tmpBuffer; private GLSurfaceView contentView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); contentView = new GLSurfaceView(this); contentView.setRenderer(this); setContentView(contentView); } @Override protected void onPause() { super.onPause(); contentView.onPause(); } @Override protected void onResume() { super.onResume(); contentView.onResume(); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { loadData(); gl.glDisable(GL10.GL_DITHER); gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); gl.glClearColor(1, 1, 1, 1); gl.glDisable(GL10.GL_CULL_FACE); gl.glShadeModel(GL10.GL_SMOOTH); gl.glEnable(GL10.GL_DEPTH_TEST); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); gl.glViewport(0, 0, width, height); //gl.glViewport(0, height, width, height); if (USE_ORIGIN_TOPLEFT) { gl.glOrthof(0, width, -height, 0, 0, 1); } else { gl.glOrthof(0, width, 0, height, 0, 1); } updateData(width, height); } @Override public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); if (USE_ORIGIN_TOPLEFT) { gl.glScalef(1f, -1f, 1f); } gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); vertices.position(0); gl.glVertexPointer(3, GL10.GL_FLOAT, vertexBytes, vertices); gl.glEnableClientState(GL10.GL_COLOR_ARRAY); vertices.position(3); gl.glColorPointer(4, GL10.GL_FLOAT, vertexBytes, vertices); gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, vertexNum); gl.glDisableClientState(GL10.GL_COLOR_ARRAY); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } private void loadData() { final float factor = 200f / 320f * 100; this.arrVertices = new float[] { 0f * factor, 0f * factor, 0, 0, 0, 1, 1, 1f * factor, 0f * factor, 0, 0, 0, 1, 1, 1f * factor, 1f * factor, 0, 0, 0, 1, 1, 0f * factor, 1f * factor, 0, 0, 0, 1, 1, }; this.vertexBytes = (3 + 4) * (Integer.SIZE / 8); this.vertexNum = arrVertices.length / (this.vertexBytes / (Integer.SIZE / 8)); this.tmpBuffer = new int[vertexNum * vertexBytes / (Integer.SIZE / 8)]; ByteBuffer buffer = ByteBuffer.allocateDirect(vertexNum * vertexBytes); buffer.order(ByteOrder.nativeOrder()); vertices = buffer.asIntBuffer(); this.vertices.clear(); for (int i = 0, j = 0; i < arrVertices.length; i++, j++) { tmpBuffer[j] = Float.floatToRawIntBits(arrVertices[i]); } this.vertices.put(tmpBuffer, 0, tmpBuffer.length); this.vertices.flip(); } private void updateData(int width, int height) { arrVertices[0] = 100f; arrVertices[1] = 100f; arrVertices[0 + 7] = width - 10; arrVertices[1 + 7] = 0; arrVertices[0 + 14] = width - 10; arrVertices[1 + 14] = height - 10; arrVertices[0 + 21] = 0; arrVertices[1 + 21] = height - 10; this.vertices.clear(); for (int i = 0, j = 0; i < arrVertices.length; i++, j++) { tmpBuffer[j] = Float.floatToRawIntBits(arrVertices[i]); } this.vertices.put(tmpBuffer, 0, tmpBuffer.length); this.vertices.flip(); } }
JOGL:
import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.IntBuffer; import javax.media.opengl.GL2ES1; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLCapabilities; import javax.media.opengl.GLEventListener; import javax.media.opengl.GLProfile; import javax.media.opengl.awt.GLCanvas; import com.jogamp.opengl.util.FPSAnimator; /** * gluegen-rt-natives-windows-i586.jar * gluegen-rt.jar * gluegen.jar * jogl-all-natives-windows-i586.jar * jogl.all.jar * * @see sites.google.com/site/justinscsstuff/jogl-tutorial-3 * @author Administrator * */ public class TestGLES1 implements GLEventListener { private boolean USE_ORIGIN_TOPLEFT = true; private IntBuffer vertices; private int vertexBytes; private int vertexNum; private float[] arrVertices; private int[] tmpBuffer; @Override public void init(GLAutoDrawable drawable) { GL2ES1 gl = drawable.getGL().getGL2ES1(); loadData(); gl.glDisable(GL2ES1.GL_DITHER); gl.glHint(GL2ES1.GL_PERSPECTIVE_CORRECTION_HINT, GL2ES1.GL_FASTEST); gl.glClearColor(1, 1, 1, 1); gl.glDisable(GL2ES1.GL_CULL_FACE); gl.glShadeModel(GL2ES1.GL_SMOOTH); gl.glEnable(GL2ES1.GL_DEPTH_TEST); } @Override public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) { GL2ES1 gl = drawable.getGL().getGL2ES1(); gl.glMatrixMode(GL2ES1.GL_PROJECTION); gl.glLoadIdentity(); gl.glViewport(0, 0, w, h); //gl.glViewport(0, height, width, height); if (USE_ORIGIN_TOPLEFT) { gl.glOrthof(0, w, -h, 0, 0, 1); } else { gl.glOrthof(0, w, 0, h, 0, 1); } updateData(w, h); } @Override public void display(GLAutoDrawable drawable) { GL2ES1 gl = drawable.getGL().getGL2ES1(); gl.glClear(GL2ES1.GL_COLOR_BUFFER_BIT | GL2ES1.GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL2ES1.GL_MODELVIEW); gl.glLoadIdentity(); if (USE_ORIGIN_TOPLEFT) { gl.glScalef(1f, -1f, 1f); } gl.glEnableClientState(GL2ES1.GL_VERTEX_ARRAY); vertices.position(0); gl.glVertexPointer(3, GL2ES1.GL_FLOAT, vertexBytes, vertices); gl.glEnableClientState(GL2ES1.GL_COLOR_ARRAY); vertices.position(3); gl.glColorPointer(4, GL2ES1.GL_FLOAT, vertexBytes, vertices); gl.glDrawArrays(GL2ES1.GL_TRIANGLE_FAN, 0, vertexNum); gl.glDisableClientState(GL2ES1.GL_COLOR_ARRAY); gl.glDisableClientState(GL2ES1.GL_VERTEX_ARRAY); } @Override public void dispose(GLAutoDrawable drawable) { } private void loadData() { final float factor = 200f / 320f * 100; this.arrVertices = new float[] { 0f * factor, 0f * factor, 0, 0, 0, 1, 1, 1f * factor, 0f * factor, 0, 0, 0, 1, 1, 1f * factor, 1f * factor, 0, 0, 0, 1, 1, 0f * factor, 1f * factor, 0, 0, 0, 1, 1, }; this.vertexBytes = (3 + 4) * (Integer.SIZE / 8); this.vertexNum = arrVertices.length / (this.vertexBytes / (Integer.SIZE / 8)); this.tmpBuffer = new int[vertexNum * vertexBytes / (Integer.SIZE / 8)]; ByteBuffer buffer = ByteBuffer.allocateDirect(vertexNum * vertexBytes); buffer.order(ByteOrder.nativeOrder()); vertices = buffer.asIntBuffer(); this.vertices.clear(); for (int i = 0, j = 0; i < arrVertices.length; i++, j++) { tmpBuffer[j] = Float.floatToRawIntBits(arrVertices[i]); } this.vertices.put(tmpBuffer, 0, tmpBuffer.length); this.vertices.flip(); } private void updateData(int width, int height) { arrVertices[0] = 100f; arrVertices[1] = 100f; arrVertices[0 + 7] = width - 10; arrVertices[1 + 7] = 0; arrVertices[0 + 14] = width - 10; arrVertices[1 + 14] = height - 10; arrVertices[0 + 21] = 0; arrVertices[1 + 21] = height - 10; this.vertices.clear(); for (int i = 0, j = 0; i < arrVertices.length; i++, j++) { tmpBuffer[j] = Float.floatToRawIntBits(arrVertices[i]); } this.vertices.put(tmpBuffer, 0, tmpBuffer.length); this.vertices.flip(); } public static void main(String[] args) { GLProfile glp = GLProfile.getDefault(); GLCapabilities caps = new GLCapabilities(glp); GLCanvas canvas = new GLCanvas(caps); Frame frame = new Frame("AWT Window Test"); frame.setSize(240, 320); frame.setResizable(false); frame.setLocationRelativeTo(null); frame.add(canvas); frame.setVisible(true); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); canvas.addGLEventListener(new TestGLES1()); FPSAnimator animator = new FPSAnimator(canvas, 60); animator.add(canvas); animator.start(); } }
LWJGL:
import org.lwjgl.LWJGLException; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; import org.lwjgl.opengl.GL11; /** * lwjgl.jar : native library location -> testlwjgl/native/windows * * @see http://lwjgl.org/wiki/index.php?title=LWJGL_Basics_1_(The_Display) * @see http://lwjgl.org/wiki/index.php?title=LWJGL_Basics_3_(The_Quad) * @author Administrator * */ public class Testlwjgl1 { private boolean USE_ORIGIN_TOPLEFT = true; private final static int SCREEN_WIDTH = 240; private final static int SCREEN_HEIGHT = 320; public void start() { try { Display.setDisplayMode(new DisplayMode( SCREEN_WIDTH, SCREEN_HEIGHT)); Display.create(); } catch (LWJGLException e) { e.printStackTrace(); System.exit(0); } init(); while (!Display.isCloseRequested()) { render(); Display.update(); } Display.destroy(); } private void init() { GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity(); if (USE_ORIGIN_TOPLEFT) { GL11.glOrtho(0, SCREEN_WIDTH, -SCREEN_HEIGHT, 0, 1, -1); } else { GL11.glOrtho(0, SCREEN_WIDTH, 0, SCREEN_HEIGHT, 1, -1); } } private void render() { GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glLoadIdentity(); if (USE_ORIGIN_TOPLEFT) { GL11.glScalef(1f, -1f, 1f); } GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); GL11.glClearColor(1, 1, 1, 1); GL11.glColor3f(0.0f, 0.0f, 1.0f); GL11.glBegin(GL11.GL_TRIANGLE_FAN); { GL11.glVertex2f(100, 100); GL11.glVertex2f(SCREEN_WIDTH - 10, 0); GL11.glVertex2f(SCREEN_WIDTH - 10, SCREEN_HEIGHT - 10); GL11.glVertex2f(0, SCREEN_HEIGHT - 10); } GL11.glEnd(); } public static void main(String[] args) { new Testlwjgl1().start(); } }
libgdx (使用g2d与pixmap,而非使用GLES绘画)
package com.iteye.weimingtom.libgdxtest; import com.badlogic.gdx.Application; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Screen; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.FPSLogger; import com.badlogic.gdx.graphics.GL10; import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; public class Test001Screen implements Screen { private final static boolean DIRECTION_DOWN = true; private final static int BOX_W = 50; private final static int BOX_H = 50; private int LOG_LEVEL = Application.LOG_DEBUG; private final static String TAG = "Test001Screen"; private FPSLogger logger; private SpriteBatch sb; private Pixmap pixmap; private Texture texture; private TextureRegion textureRegion; private Vector2 pos; private Vector2 dir; public Test001Screen() { Gdx.app.setLogLevel(LOG_LEVEL); logger = new FPSLogger(); init(); } private void init() { log("init"); sb = new SpriteBatch(); int w = Gdx.graphics.getWidth(); int h = Gdx.graphics.getHeight(); pixmap = new Pixmap(w, h, Pixmap.Format.RGBA8888); final int potW = MathUtils.nextPowerOfTwo(w); final int potH = MathUtils.nextPowerOfTwo(h); texture = new Texture(potW, potH, Pixmap.Format.RGBA8888); if (DIRECTION_DOWN) { textureRegion = new TextureRegion(texture, 0, 0, w, h); } else { textureRegion = new TextureRegion(texture, 0, h, w, -h); } pos = new Vector2(w / 2, h / 2); dir = new Vector2(1, 1); } @Override public void dispose() { log("dispose"); texture.dispose(); pixmap.dispose(); sb.dispose(); } @Override public void render(float delta) { onUpdate(delta); GL10 gl = Gdx.gl10; gl.glClear(GL10.GL_COLOR_BUFFER_BIT); gl.glClearColor(0, 0, 0, 0); //gl.glClearColor(1, 1, 1, 1); onRender(); sb.begin(); texture.draw(pixmap, 0, 0); sb.draw(textureRegion, 0, 0); sb.end(); logger.log(); } @Override public void resize(int width, int height) { sb.getProjectionMatrix().setToOrtho2D(0, 0, width, height); } @Override public void show() { } @Override public void hide() { } @Override public void pause() { } @Override public void resume() { } private void onUpdate(float delta) { int w = pixmap.getWidth(); int h = pixmap.getHeight(); pos.x += dir.x * delta * 60; pos.y += dir.y * delta * 60; if (pos.x < 0) { dir.x = -dir.x; pos.x = 0; } if (pos.x > w) { dir.x = -dir.x; pos.x = w; } if (pos.y < 0) { dir.y = -dir.y; pos.y = 0; } if (pos.y > h) { dir.y = -dir.y; pos.y = h; } } private void onRender() { pixmap.setColor(0, 0, 0, 0); pixmap.fill(); pixmap.setColor(Color.BLUE); pixmap.fillRectangle( (int)pos.x - BOX_W / 2, (int)pos.y - BOX_H / 2, BOX_W, BOX_H); } private void log(String message) { Gdx.app.log(TAG, message); } }
X. 参考资料:
1. Beginning Android 4 Games Development
随书代码Source Code/Downloads
http://www.apress.com/9781430239871
(TODO)
发表评论
-
移植js弹幕游戏到libgdx
2012-08-20 10:45 1131原来的游戏是用js实现的: http://www.kikya ... -
突然觉得不能太依赖模拟器加速
2012-08-19 08:02 856以前就怀疑过Android模拟器的加速,不过jkanji接二连 ... -
Markdown语法学习笔记
2012-08-18 20:47 1859一、文本效果: # h1标题 # ,或#h1标题,或h ... -
通过BreakIterator调用Android的icu4c执行中日文的粗略“分词”
2012-08-15 19:17 3297发现Android自带的icu4c可以直接使用,不需要 ... -
再次脱线的Tomoe酱
2012-08-15 09:42 963之前移植了libspark的Tomoe(原版是用AS2 ... -
尝试把Danmaku的SurfaceView移植版移植到libgdx
2012-07-11 17:56 1154测试结果是可行的,帧率可以很大,竟然可以在间隔高于60fps ... -
jkanji 3.x开发展望
2012-06-23 06:35 731首先,我最希望能改善一下用户界面。 其次,是我最想说的(如果 ... -
制作STG游戏的初步构思
2012-06-20 18:13 1299计划第二个游戏是做STG题材的游戏,内容未定(我首先想到的是叉 ... -
Android Platform 3.0 SDK和Eclipse ADT安装记录六
2012-06-19 06:32 1212一、弹幕射击游戏相关项目和网址 1. Danm ... -
ReversiWins预览版截图
2012-06-06 09:44 871今天完成ReversiWins预览版的全部工作了。接下来是添加 ... -
SQLite的全文搜索与符号化问题
2012-06-01 08:35 281320130213更正: 下面的'"明 日 *& ... -
用git下载Android自带app的源代码
2012-05-29 11:19 8201(1) 创建工作目录,创建并切换本地的master分 ... -
关于日语简易词典的svn仓库的一点说明
2012-05-24 15:15 927日语简易词典(jkanji)是我写的一个Android平台的小 ... -
脱线的tomoe手写输入
2012-05-24 12:09 946最近想把日语简易词典的手写功能完善一下,发现一些问题: 1. ... -
Android Platform 3.0 SDK和Eclipse ADT安装记录五
2012-05-11 21:32 1323目录: 一、在Aptana 3 ... -
SQLite学习笔记
2012-05-07 21:05 7364SQLite学习笔记 (未完成,待修改) ... -
KAS代码阅读
2012-05-03 17:36 939(未完成,待修改) KAS 0.4.3 [201 ... -
ZipFile.getInputStream()的read方法和AudioTrack中的write方法
2012-04-28 11:06 1771最近发现Java的InputStream是一个很诡异的抽象类, ... -
cocos2d-x for Android安装和学习笔记(请用adt-bundle21.1或以上导入)
2012-04-11 18:10 11795(20121108)注意:这篇文章用cdt编译ndk工程的 ... -
使用HAXM加速的Android x86模拟器(和一些问题)
2012-04-09 23:26 13489装了个Android SDK r17, ...
相关推荐
Libgdx是一款基于OpenGL ES技术开发的Android游戏引擎,支持Android平台下的2D和3D游戏开发,2D物理引擎采用Box2D实现。单就性能角度来说,堪称是一款非常强大的Android游戏引擎,但缺陷在于精灵类等相关组件在使用...
Libgdx是一款基于OpenGL ES技术开发的Android游戏引擎,支持Android平台下的2D和3D游戏开发,2D物理引擎采用Box2D实现。单就性能角度来说,堪称是一款非常强大的Android游戏引擎,但缺陷在于精灵类等相关组件在使用...
Libgdx是一款基于OpenGL ES技术开发的Android游戏引擎,支持Android平台下的2D和3D游戏开发,2D物理引擎采用Box2D实现。单就性能角度来说,堪称是一款非常强大的Android游戏引擎,但缺陷在于精灵类等相关组件在使用...
libgdx学习资料
libGDX学习记录(一)源码,搭建一个桌面端和android端的libGDX框架,展示图片。 详细地址:https://blog.csdn.net/weixin_47450795/article/details/110003413
android 游戏框架libgdx 学习 DOC格式
libGDX学习记录(二)阶段源码 展示TexturePacker合成的图片,详细地址: https://blog.csdn.net/weixin_47450795/article/details/110037945
Libgdx专题系列,第一篇第一节代码下载。
学习libgdx时整理的资料 libgdx 4 本电子书 + 6 个 github libgdx 游戏源码地址 libgdx 4本电子书: Learning LibGDX Game Development, 2nd Edition Libgdx Cross-platform Game Development Cookbook Mastering ...
Learn to design and create video games using the Java programming language and the LibGDX software library. Working through the examples in this book, you will create 12 game prototypes in a variety ...
Libgdx-Box2D 方块2D
Libgdx专题系列, 第一篇第七节代码资源文件。
libGDX是一个基于OpenGL(ES)的跨平台Java游戏开发框架,适用于Windows,Linux,macOS,Android,您的浏览器和iOS。libGDX 为快速原型设计和快速迭代提供了一个久经考验且强大的环境。libGDX不会强迫您使用特定的...
libGdx是一个跨平台的2D/3D的游戏开发框架,它由Java/C/C++语言编写而成。libgdx兼容Windows、Linux、Max OS X、Java Applet、Javascript/WebGL与Android(1.5版本+)平台。该文档为libgdx在wiki上的官方学习文档。
libgdx是跨平台的游戏开发引擎,基于opengl es 2.0和opengl es 3.0可以一套代码开发android,ios,网页和电脑游戏,十分方便
libGDX学习记录(二)完整源码水果落地 详细地址: https://editor.csdn.net/md/?articleId=110037945
javame框架移植到libgdx。由于libgdx采用笛卡尔坐标系,所以要处理下图片的转向。
libgx学习过程总结,记录本人所遇到的问题和心得
libgdx的中文学习文档,资料太少,将就用吧