opengles源碼
㈠ android的應用開發個2D圖片轉成3D的小程序,需要java的源代碼,謝謝
用OpenGLEs 如果告訴你了你自己不去認真鑽研你就什麼都學不到.
㈡ android中Runnable的用法
只要java好就沒有問題,這是3D魔方android的源碼。
package com.example.android.image3D;
import android.view.SurfaceView;
import android.view.SurfaceHolder;
import android.content.Context;
import android.util.AttributeSet;
import java.util.ArrayList;
import java.util.concurrent.Semaphore;
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGL11;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLContext;
import javax.microedition.khronos.egl.EGLDisplay;
import javax.microedition.khronos.egl.EGLSurface;
import javax.microedition.khronos.opengles.GL;
import javax.microedition.khronos.opengles.GL10;
public class View3D extends SurfaceView implements SurfaceHolder.Callback {
private static final Semaphore sEglSemaphore = new Semaphore(1);
private boolean mSizeChanged = true;
private SurfaceHolder mHolder;
private GLThread mGLThread;
private GLWrapper mGLWrapper;
public View3D(Context context) {
super(context);
init();
}
public View3D(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
}
public SurfaceHolder getSurfaceHolder() {
return mHolder;
}
public void setGLWrapper(GLWrapper glWrapper) {
mGLWrapper = glWrapper;
}
public void setRenderer(Renderer renderer) {
mGLThread = new GLThread(renderer);
mGLThread.start();
}
public void surfaceCreated(SurfaceHolder holder) {
mGLThread.surfaceCreated();
}
public void surfaceDestroyed(SurfaceHolder holder) {
mGLThread.surfaceDestroyed();
}
public void surfaceChanged(SurfaceHolder holder,
int format, int w, int h) {
mGLThread.onWindowResize(w, h);
}
public void onPause() {
mGLThread.onPause();
}
public void onResume() {
mGLThread.onResume();
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
mGLThread.onWindowFocusChanged(hasFocus);
}
public void queueEvent(Runnable r) {
mGLThread.queueEvent(r);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mGLThread.requestExitAndWait();
}
public interface GLWrapper {
GL wrap(GL gl);
}
public interface Renderer {
int[] getConfigSpec();
void surfaceCreated(GL10 gl);
void sizeChanged(GL10 gl, int width, int height);
void drawFrame(GL10 gl);
}
private class EglHelper {
EGL10 mEgl;
EGLDisplay mEglDisplay;
EGLSurface mEglSurface;
EGLConfig mEglConfig;
EGLContext mEglContext;
public EglHelper() {
}
public void start(int[] configSpec){
mEgl = (EGL10) EGLContext.getEGL();
mEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
int[] version = new int[2];
mEgl.eglInitialize(mEglDisplay, version);
EGLConfig[] configs = new EGLConfig[1];
int[] num_config = new int[1];
mEgl.eglChooseConfig(mEglDisplay, configSpec, configs, 1,
num_config);
mEglConfig = configs[0];
mEglContext = mEgl.eglCreateContext(mEglDisplay, mEglConfig,
EGL10.EGL_NO_CONTEXT, null);
mEglSurface = null;
}
public GL createSurface(SurfaceHolder holder) {
if (mEglSurface != null) {
mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT);
mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
}
mEglSurface = mEgl.eglCreateWindowSurface(mEglDisplay,
mEglConfig, holder, null);
mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
mEglContext);
GL gl = mEglContext.getGL();
if (mGLWrapper != null) {
gl = mGLWrapper.wrap(gl);
}
return gl;
}
public boolean swap() {
mEgl.eglSwapBuffers(mEglDisplay, mEglSurface);
return mEgl.eglGetError() != EGL11.EGL_CONTEXT_LOST;
}
public void finish() {
if (mEglSurface != null) {
mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_CONTEXT);
mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
mEglSurface = null;
}
if (mEglContext != null) {
mEgl.eglDestroyContext(mEglDisplay, mEglContext);
mEglContext = null;
}
if (mEglDisplay != null) {
mEgl.eglTerminate(mEglDisplay);
mEglDisplay = null;
}
}
}
class GLThread extends Thread {
private boolean mDone;
private boolean mPaused;
private boolean mHasFocus;
private boolean mHasSurface;
private boolean mContextLost;
private int mWidth;
private int mHeight;
private Renderer mRenderer;
private ArrayList<Runnable>
mEventQueue = new ArrayList<Runnable>();
private EglHelper mEglHelper;
GLThread(Renderer renderer) {
super();
mDone = false;
mWidth = 0;
mHeight = 0;
mRenderer = renderer;
setName("GLThread");
}
@Override
public void run() {
try {
try {
sEglSemaphore.acquire();
} catch (InterruptedException e) {
return;
}
guardedRun();
} catch (InterruptedException e) {
} finally {
sEglSemaphore.release();
}
}
private void guardedRun() throws InterruptedException {
mEglHelper = new EglHelper();
int[] configSpec = mRenderer.getConfigSpec();
mEglHelper.start(configSpec);
GL10 gl = null;
boolean tellRendererSurfaceCreated = true;
boolean tellRendererSurfaceChanged = true;
while (!mDone) {
int w, h;
boolean changed;
boolean needStart = false;
synchronized (this) {
Runnable r;
while ((r = getEvent()) != null) {
r.run();
}
if (mPaused) {
mEglHelper.finish();
needStart = true;
}
if(needToWait()) {
while (needToWait()) {
wait();
}
}
if (mDone) {
break;
}
changed = mSizeChanged;
w = mWidth;
h = mHeight;
mSizeChanged = false;
}
if (needStart) {
mEglHelper.start(configSpec);
tellRendererSurfaceCreated = true;
changed = true;
}
if (changed) {
gl = (GL10) mEglHelper.createSurface(mHolder);
tellRendererSurfaceChanged = true;
}
if (tellRendererSurfaceCreated) {
mRenderer.surfaceCreated(gl);
tellRendererSurfaceCreated = false;
}
if (tellRendererSurfaceChanged) {
mRenderer.sizeChanged(gl, w, h);
tellRendererSurfaceChanged = false;
}
if ((w > 0) && (h > 0)) {
mRenderer.drawFrame(gl);
mEglHelper.swap();
}
}
mEglHelper.finish();
}
private boolean needToWait() {
return (mPaused || (! mHasFocus) || (! mHasSurface) || mContextLost)
&& (! mDone);
}
public void surfaceCreated() {
synchronized(this) {
mHasSurface = true;
mContextLost = false;
notify();
}
}
public void surfaceDestroyed() {
synchronized(this) {
mHasSurface = false;
notify();
}
}
public void onPause() {
synchronized (this) {
mPaused = true;
}
}
public void onResume() {
synchronized (this) {
mPaused = false;
notify();
}
}
public void onWindowFocusChanged(boolean hasFocus) {
synchronized (this) {
mHasFocus = hasFocus;
if (mHasFocus == true) {
notify();
}
}
}
public void onWindowResize(int w, int h) {
synchronized (this) {
mWidth = w;
mHeight = h;
mSizeChanged = true;
}
}
public void requestExitAndWait() {
synchronized(this) {
mDone = true;
notify();
}
try {
join();
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
public void queueEvent(Runnable r) {
synchronized(this) {
mEventQueue.add(r);
}
}
private Runnable getEvent() {
synchronized(this) {
if (mEventQueue.size() > 0) {
return mEventQueue.remove(0);
}
}
return null;
}
}
}
㈢ 如何學習 cocos2d-x
剛巧我也是從AS3轉到了cocos2d-x,說說我的經驗吧。
一、 cocos2d-x 部分
1.1 技術選型
從第三個手游開始,我實在被Adobe的ANE和國內的小平台折騰得沒了脾氣,決定轉到cocos2d-x。在選擇哪種語言綁定的時候糾結了很久,最後力排眾議選了 lua:Cocos2d-x script language binding:Lua or Javascript? 。cocos2d-x 2.x 的lua綁定做得並不好,於是我選擇了 quick-cocos2d-x 。
1.2 學習 C++
《C++ Primer》 是不錯的入門書籍,建議看第五版,我寫過一篇 C++Primer 第4版和第5版比較 。學習期間建議畫一些思維導圖幫助理解和整理思路。例如這個(不完整):
1.3 學習DEMO和熟悉開發平台。
編譯 cocos2d-x 自帶的 TestCPP 項目,全部跑一遍。熟悉 cocos2d-x API 的用法。記得生成文檔,建議每個API的功能都瀏覽一遍。
在學習DEMO的過程中,你還必須熟悉自己開發平台的IDE,例如Windows上必須熟悉 Visual Studio,而OS X上必須熟悉xcode,linux平台上就熟悉Eclipse+CDT吧。
注意,quick-cocos2d-x 是不支持Linux開發平台的。
1.4 了解引擎的文件夾結構
基於 cocos2d-x 源碼生成的文檔並不怎麼詳細,許多功能必須看源碼。但這個階段,我不建議糾結源碼太深,倒是可以糾結一下 cocos2d-x 的文件夾結構,看看各個類放在什麼地方,找一找常見的哪些宏和常量以及枚舉定義在什麼地方,這花不了多少時間,但能讓你對cocos2d-x有更深刻的了解,同時給你很強的成就感。這種成就感沖淡了你面對大量源碼時候的無力感,讓你能夠繼續前行。
下面是我的分析:
1.5 重復上面的第3步:再次學習DEMO
這時候看DEMO可能會輕松不少,但是你會有更多的問題去糾結。例如多解析度支持?例如坐標系統?例如繪圖功能?例如層級管理系統?例如事件傳遞系統?等等等等……這時候可以去Google(注意不要用百毒和其他搜索引擎)找文檔看了。我推薦一些我看過的不錯的文檔和博客:
Cocos2d-x 多解析度適配完全解析
Cocos2d-x官方中文文檔 v2.x
子龍山人 – 博客園
紅孩兒的游戲編程之路
Cocos2D | iOS Development Tips & Tricks by BiOM
Ray Wenderlich
Cocos2d-x | Cross Platform Open Source 2D Game Engine
許多博客都是極好的。紅孩兒 寫了許多源碼分析,每一句源碼都加了詳細注釋。雖然我不太認同他這種吃力不討好的方法,但這對於新手來說確實是有很大幫助的。
另外在 Stack Overflow 你能找到絕大部分問題的答案。當然,許多問題是針對 cocos2d 而非 cocos2d-x 的,不過用法相同,照看不誤。許多優秀的文章都是基於 cocos2d 的,所以,不要介意,可以先花半天時間熟悉 OC 的語法,能看懂即可。
暫時不要買中文書。我曾經花3天時間看完了 《Cocos2D-X游戲開發技術精解》 和 《cocos2d-x手機游戲開發–跨iOS、Android和沃Phone平台》 ,發現作者其實就是來賺稿費的。
忘了廣告了,我的博客(cocos2d-x | zrong』s Blog)也有一些cocos2d-x內容,歡迎來噴。
1.6 熟悉工具集
現在你應該對周邊工具感興趣了。例如幀動畫使用什麼製作?BMFont使用什麼製作?骨骼動畫呢?plist文件怎麼編輯?碎圖用什麼工具拼合?有些項目上,你有許多選擇,也可能沒得選。去Google吧,如果遇到選擇上的問題,歡迎找我討論。
二、 quick-cocos2d-x 部分
2.1 現在就到lua時間了
請認真讀完 《Lua程序設計(第2版) 》 第一、二、三部分。第四部分可暫時不讀。
2.2 熟悉 quick-cocos2d-x 的文件夾結構
相信有了上面 cocos2d-x 的基礎,這個應該不難理解。
2.3 跑完 quick-cocos2d-x 自帶的所有sample
在這期間,熟悉 framework 中的所有封裝。可以參考 quick網站 和 quick wiki 。
2.4 學習導出API給Lua使用
導出 C/C++ API 給 Lua 使用
三、學習 OpenGL ES
熟悉Lua部分之後,作為一個有志於成為程序員的碼農,依然要回到C++來,這里才是 cocos2d-x 的本質。
cocos2d-x 使用 OpenGL ES 進行渲染的,如果要對 cocos2d-x 的渲染層進行任何形式的擴展,你完全避不開 OpenGL ES。
既然逃不開,那就對她說,請張開雙腿,我要上。
3.1 閱讀 OpenGL ES 2.0 Programming Guide
下面是這本書的官網,目前已經出了 OpenGL ES 3.0 版本,cocos2d-x 使用的是2.0。
http://www.opengles-book.com/es2/index.html
這本書寫得淺顯易懂,非常適合新手。有位網友花3個月時間翻譯了中文版,但還是建議你不要看了。
這里是 OpenGL ES 的 官方文檔 和 API中文翻譯 。
當然,你也可以買那本著名的 OpenGL 紅寶書 《OpenGL編程指南(原書第7版)》 來看,不過 OpenGL ES 相對與 OpenGL 來說還是有一些不同的,你要知道如何區分這些不同。
3.2 嘗試理解 cocos2d-x 的渲染部分架構
相關的類我就不列出了,我正在醞釀一個這方面的系列文章准備發到博客上。如果寫完了,我會在這里更新。
3.3 自己寫一些濾鏡、繪圖功能的擴展
例如這個: cocos2d-x-filters
四、回歸項目
到了這里,你可以開始你的項目了。雖然源碼還沒有讀完,但相信整個架構都能理解了。在做項目的過程中,再去一點點讀源碼是比較快捷和我能夠接受的方法,否則就太枯燥了。
你可以還需要選擇一下cocos2d-x相關的工具。你可能聽說過 CCB(cocosBuilder)和CCS(cocoStudio),嘗試了解她們,再決定是否使用她們。
你已經有了AS3的基礎,這樣許多前端的概念和經驗已經很豐富了。這些經驗在cocos2d-x中同樣適用。但是要注意的是,cocos2d-x不是AS3,不要試圖用AS3的方法去使用cocos2d-x。
有位碼農在從C#轉到AS3的時候向我抱怨:為什麼Flash Builder沒有Visual Studio的這個功能那個功能?
然後這位碼農在從AS3轉到Sublime Text(用於Lua編輯)的時候向我抱怨,為什麼Sublime Text沒有Flash Builder的這個功能那個功能?
上面是個笑話。
同時,為了解決一些cocos2d-x沒有提供的功能,你必須去學習相關的知識。例如這個:在 cocos2d-x 中使用 libcurl 實現上傳文件功能(附quick-cocos2d-x封裝) 。不過你現在已經有了基礎,學習這些不是難事。
在有時間的時候,可認真讀一下上面提到的《Lua程序設計(第2版) 》第四部分,了解Lua和C語言通信的方式,順便看看cocos2d-x裡面是怎麼實現的。
另外,一些你需要的引擎中沒有的功能,也可以順手實現了開源出來(例如這個: 一個LuaSocket封裝 ),說不定你需要的東西正好是別人也需要的。
五、熟悉發布平台
既然是做手游,Android和iOS平台是逃不掉了。
你要熟悉Android和iOS平台的特點,熟悉JAVA語言在Android上的應用,熟悉Objective-C在iOS上的應用,熟悉Eclipse ADT和XCode(上面應該已經熟悉過了)。
你還要熟悉Google Play和AppStore的發布流程以及方針、政策,內購的接入、SDK的嵌入。
你要學習和各個接入平台的程序員、商務、前台小妹打交道(因為經常會找不到你要找的真正的負責該SDK的技術人員),你要能忍受國內小平台糟糕的文檔、代碼規范和逆天的編程方法。
終、沒有終點
上面說的並不完整,應該遺漏了不少東西,但我只能說這么多了。因為我的經驗也止於此。
轉載,僅供參考,祝你愉快,滿意請採納。
㈣ 游戲開發小白如何選擇游戲引擎
2D休閑的 ... AndEngine 是採用Java的很適合,這款引擎是採用OpenGLES,但是集成設計度很高,OpenGLES不用了解太多也能輕松使用。該引擎沒有中文文檔,不過自帶有大量的實例,很多博客也有對這些實例講解,掌握這些實例,基本就能了解其框架。還有一點,他是開源的,很多方法功能,查看一下源碼就能知道其作用。他還有很多擴展,像對物理引擎Box2D的支持,這個很強大。不過,考慮到跨平台發展,現在最火熱的是cocos2d-x,可以說這個是2D引擎是最有前途的,只是不是Java的
㈤ 如何高效學習Android動畫
自己整個學習過程中的產出的文章動畫系列 - 傳統View動畫與Property動畫基礎及比較 動畫系列 - PropertyAnim 詳解動畫系列 - PropertyAnim 實際應用動畫系列 - ViewPager動畫 Android 動畫基礎 (由於 @Trinea 發起的codeKK 項目下的開源項目原理分析項目android-cn/android-open-project-analysis · GitHub 二期中,很多分析項目涉及到了動畫,所以該篇主要是對PropertyAnim詳解和基礎篇中的一些知識進行整理,作為二期的動畫公共知識,codeKK 絕對是超級棒的項目,大家可以多關注)從傳統View動畫與Property動畫基礎及比較 以及Android 動畫基礎 這兩篇文章,你可以對android動畫總體有些了解,PropertyAnim 詳解這一篇則是專門介紹了3.0出現的屬性動畫,其中也涉及到了JakeWharton大神為3.0之前實現的兼容庫NineOldAndroids。 通過ViewPager來實現動畫效果的方式越來越多,一些視差效果也確實很贊,比如雅虎天氣的視差效果,知乎導航界面中元素的視差,關於它們的實現原理,在 ViewPager動畫 這篇中有詳細的分析,其中也提到了GitHub上一些和ViewPager動畫類似的實現,也分析了它們之間的區別,具體可以參考文章。PropertyAnim 實際應用主要介紹了一些簡單API的使用,亮點是其中介紹了很多GitHub 上的動畫項目,其中實現多數使用了NineOldAndroids兼容庫,可以作為不錯的學習資料。上面幾篇文章中都有非常詳細的介紹,就不多說了,因為文章中對於一些概念,使用,原理介紹的確實太詳細了,現在想起來,當時鑽的確實有點深了,比如PropertyAnim 詳解這篇文章,對屬性動畫中的ValueAnimator,Evaluators,Interpolators的介紹以及TimeInterpolator和TypeEvaluator的比較等等,具體的可以參考文章。這幾篇文章看下來,你應該對android動畫有一些更系統更深入的認識了。基本的動畫實現應該沒啥難度了。每篇文章的信息量很是很大的,因為在學習過程中主要是通過大量的GitHub動畫項目,也參考了不少資料,在文章結尾處有提及。 如果你還想進階,這里再分享一些不錯的項目,這些項目都是在android動畫基礎上建立起來的,所以看他們的源碼,完全沒有難度:
㈥ android skia與opengl es 都可以畫2d圖嗎
一、基礎知識: OpenGL ES目前只支持三角形,但任何多邊形都可拆分成多個三角形,所以無所謂這個限制的存在。 1.OpenGL中的坐標點: 每一個坐標點由(X, Y, Z)組成。 定義一個三角形的頂點數組: [java] int one = 0x10000; //三角形三個頂點 private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{ 0,one,0, //上頂點 -one,-one,0, //左下點 one,-one,0,}); //右下點 int one = 0x10000; //三角形三個頂點 private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{ 0,one,0, //上頂點 -one,-one,0, //左下點 one,-one,0,}); //右下點定義一個正方形的頂點數組: [java] //正方形的4個頂點 private IntBuffer quaterBuffer = IntBuffer.wrap(new int[]{ one,one,0, -one,one,0, one,-one,0, -one,-one,0}); //正方形的4個頂點 private IntBuffer quaterBuffer = IntBuffer.wrap(new int[]{ one,one,0, -one,one,0, one,-one,0, -one,-one,0}); 2.OpenGL中的坐標系: 當調用gl.glLoadIdentity()函數之後,實際上是將當前點移動到了屏幕中心, X坐標軸從左至右,Y坐標軸從下至上,Z坐標軸從里至外。 OpenGL屏幕中心的坐標值是X軸和Y軸的0.0f點。 中心左邊的坐標值是負值,右邊是正值; 移向屏幕頂端是正值,移向屏幕底端是負值; 移入屏幕深處是負值,移出屏幕則是正值。 在繪制時,我們可以使用glTranslatef函數來移動畫筆的位置,從而使圖形顯示在我們 想要的位置。 [java] gl.glTranslatef(-1.5f, 0.0f, -6.0f); gl.glTranslatef(-1.5f, 0.0f, -6.0f);此函數,就是將畫筆沿X軸左移1.5f個單位,Y軸保持不變,Z軸向屏幕裡面移動6.0f個單位。 將視圖推入屏幕背後足夠的距離以便可以看見全部的場景,這里需要注意的是屏幕內移動的單位 必須小於我們前面通過glFrustumf方法設置的最遠距離,否則超出視角范圍,將顯示不出來。 3.OpenGL中的頂點數組: 在實際畫圖時,我們往往需要定位幾個點,然後讓OpenGL以此為基準來畫圖。在設置頂點位置前, 我們需要按照以下步驟來啟用我們的頂點數組: ①開啟頂點設置動能: [java] gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);②設置頂點數組: [java] view plainprint?gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer); gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer);glVertexPointer(int size, int type, int stride, Buffer pointer) size用於描述頂點的尺寸(本例使用XYZ,所以是3),type描述頂點的類型,固定的使用 GL_FIXED,stride描述步長,pointer指向頂點緩存,即我們創建的頂點數組。 ③繪制頂點: [java] gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); //繪制三角形 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); //繪制四邊形 gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); //繪制三角形 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); //繪制四邊形glDrawArrays(int mode, int first, int count) mode指明繪制的模式,first和count分別是開始的位置和要繪制的頂點計數。 4、實例: 畫一個三角形和正方形。 根據我們上一節的框架分析,目前,我們只需將精力集中在onDrawFrame方法裡面的繪圖操作部分了。 1. 界面編輯(reslayoutmain.xml): [java] android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> 2.代碼編輯 (srcwyfzclMyActivity.java): [java] package wyf.zcl; import android.app.Activity; import android.opengl.GLSurfaceView; import android.opengl.GLSurfaceView.Renderer; import android.os.Bundle; public class Activity01 extends Activity { Renderer render = new GLRender(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GLSurfaceView glView = new GLSurfaceView(this); glView.setRenderer(render); setContentView(glView); } } package wyf.zcl; import android.app.Activity; import android.opengl.GLSurfaceView; import android.opengl.GLSurfaceView.Renderer; import android.os.Bundle; public class Activity01 extends Activity { Renderer render = new GLRender(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GLSurfaceView glView = new GLSurfaceView(this); glView.setRenderer(render); setContentView(glView); } } (srcwyfzclGLRender.java): [java] package wyf.zcl; import java.nio.IntBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.opengl.GLSurfaceView.Renderer; public class GLRender implements Renderer { int one = 0x10000; //三角形三個頂點 private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{ 0,one,0, //上頂點 -one,-one,0, //左下點 one,-one,0,}); //右下點 //正方形的4個頂點 private IntBuffer quaterBuffer = IntBuffer.wrap(new int[]{ one,one,0, -one,one,0, one,-one,0, -one,-one,0}); @Override public void onDrawFrame(GL10 gl) { // 清除屏幕和深度緩存 gl.glClear(GL10.GL_COLOR_BUFFER_BIT GL10.GL_DEPTH_BUFFER_BIT); // 重置當前的模型觀察矩陣 gl.glLoadIdentity(); // 左移 1.5 單位,並移入屏幕 6.0 gl.glTranslatef(-1.5f, 0.0f, -6.0f); // 允許設置頂點 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); // 設置三角形 gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer); //繪制三角形 gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); // 重置當前的模型觀察矩陣 gl.glLoadIdentity(); // 左移 1.5 單位,並移入屏幕 6.0 gl.glTranslatef(1.5f, 0.0f, -6.0f); //設置和繪制正方形 gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); // 取消頂點設置 gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { float ratio = (float) width / height; //設置OpenGL場景的大小 gl.glViewport(0, 0, width, height); //設置投影矩陣 gl.glMatrixMode(GL10.GL_PROJECTION); //重置投影矩陣 gl.glLoadIdentity(); // 設置視口的大小 gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10); // 選擇模型觀察矩陣 gl.glMatrixMode(GL10.GL_MODELVIEW); // 重置模型觀察矩陣 gl.glLoadIdentity(); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { // 啟用陰影平滑 gl.glShadeModel(GL10.GL_SMOOTH); // 黑色背景 gl.glClearColor(0, 0, 0, 0); // 設置深度緩存 gl.glClearDepthf(1.0f); // 啟用深度測試 gl.glEnable(GL10.GL_DEPTH_TEST); // 所作深度測試的類型 gl.glDepthFunc(GL10.GL_LEQUAL); // 告訴系統對透視進行修正 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); } } package wyf.zcl; import java.nio.IntBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.opengl.GLSurfaceView.Renderer; public class GLRender implements Renderer { int one = 0x10000; //三角形三個頂點 private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{ 0,one,0, //上頂點 -one,-one,0, //左下點 one,-one,0,}); //右下點 //正方形的4個頂點 private IntBuffer quaterBuffer = IntBuffer.wrap(new int[]{ one,one,0, -one,one,0, one,-one,0, -one,-one,0}); @Override public void onDrawFrame(GL10 gl) { // 清除屏幕和深度緩存 gl.glClear(GL10.GL_COLOR_BUFFER_BIT GL10.GL_DEPTH_BUFFER_BIT); // 重置當前的模型觀察矩陣 gl.glLoadIdentity(); // 左移 1.5 單位,並移入屏幕 6.0 gl.glTranslatef(-1.5f, 0.0f, -6.0f); // 允許設置頂點 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); // 設置三角形 gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer); //繪制三角形 gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); // 重置當前的模型觀察矩陣 gl.glLoadIdentity(); // 左移 1.5 單位,並移入屏幕 6.0 gl.glTranslatef(1.5f, 0.0f, -6.0f); //設置和繪制正方形 gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); // 取消頂點設置 gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { float ratio = (float) width / height; //設置OpenGL場景的大小 gl.glViewport(0, 0, width, height); //設置投影矩陣 gl.glMatrixMode(GL10.GL_PROJECTION); //重置投影矩陣 gl.glLoadIdentity(); // 設置視口的大小 gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10); // 選擇模型觀察矩陣 gl.glMatrixMode(GL10.GL_MODELVIEW); // 重置模型觀察矩陣 gl.glLoadIdentity(); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { // 啟用陰影平滑 gl.glShadeModel(GL10.GL_SMOOTH); // 黑色背景 gl.glClearColor(0, 0, 0, 0); // 設置深度緩存 gl.glClearDepthf(1.0f); // 啟用深度測試 gl.glEnable(GL10.GL_DEPTH_TEST); // 所作深度測試的類型 gl.glDepthFunc(GL10.GL_LEQUAL); // 告訴系統對透視進行修正 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); } } 3.運行效果:
㈦ 《Android3D游戲開發技術寶典OpenGLES2.0》pdf下載在線閱讀,求百度網盤雲資源
《Android 3D游戲開發技術寶典》(吳亞峰)電子書網盤下載免費在線閱讀
資源鏈接:
鏈接:https://pan..com/s/1A5S0LK7aslncrVbBQAJ5Rg
書名:Android 3D游戲開發技術寶典
作者:吳亞峰
出版年份:2012-5
頁數:749
內容簡介:
《Android 3D游戲開發技術寶典:OpenGL ES 2.0》內容簡介:隨著智能手機移動嵌入式平台硬體性能的不斷提升,3D游戲應用也逐漸普及開來。《Android 3D游戲開發技術寶典:OpenGL ES 2.0》結合作者多年從事3D游戲應用開發的寶貴經驗,全面介紹了與Android平台相關的必知必會的基礎知識及大型完整3D案例,講解上由淺入深,循序漸進,起點低、終點高,既適合初學者學習,也適合有一定基礎的讀者進一步提升之用。另外,由於OpenGL ES2.0的著色語言通用於各種移動嵌入式平台,因此,《Android 3D游戲開發技術寶典:OpenGL ES 2.0》中與著色器開發相關的60%左右的內容還可供iPhone、Windows Mobile、MeeGoo等平台的開發人員參考。全書共22章,其中第1章與第2章為Android平台相關的一些基礎知識;第3章~第10章介紹了基於OpenGL ES2.0進行3D應用開發的一些必知必會的基本知識;第11章~第15章介紹了一些高級特效的實現方法;第16章~第17章介紹了3D游戲開發中相關的一些物理、碰撞檢測知識以及常用的3D物理引擎JBullet:第19章介紹了3種人機交互的高級技術;第20章~第22章給出了3個完整的大型3D游戲案例,總代碼量接近6萬行。同時為了便於讀者的學習,《Android 3D游戲開發技術寶典:OpenGL ES 2.0》附贈的光碟中包含了書中所有案例的完整源代碼,同時給出了最後3個完整大型3D游戲案例的講解視頻,最大限度地幫助讀者快速掌握相應的開發技術。
㈧ idea6410開發板都有哪些功能支持什麼操作系統
http://item.taobao.com/auction/item_detail-0db2-.htm
支持的操作系統很能多的,至少6種:
一、WinCE6.0軟體資源(點擊展開)
軟體特性:
·CPU主頻穩定工作於667MHz
·視頻硬體編碼、解碼支持MPEG-4/H263/H264/VC-1
·2D、3D圖形硬體加速、D3D Mobile,支持OpenGL ES1.1 & 2.0
·支持SD卡+USB2.0升級系統
·支持TCPMP播放器完美硬體解碼,MPEG-4/H264/VC-1在D1解析度下音視頻解碼35fps
·支持MediaPlayer + Directshow視頻硬體解碼
·支持Camera回顯、H264/MPEG-4視頻高效率編碼
·支持JPEG圖片硬體編解碼
·支持WIFI、藍牙、3G、GPS等外置模塊
·支持錄音並存儲存儲至nand flash
·支持顯示開機進度條、開機logo
·支持即時通工具MSN、SKYPE、QQ
·支持OFFICE、PDF閱讀器
·支持Adobe Flash Lit,IE瀏覽器在線播放視頻
·提供豐富的測試源碼實例:視頻編碼實例、視頻解碼實例、JPEG編碼實例、JPEG解碼實例、Camera回顯、拍照、錄像實例、多重解碼分屏顯示實例、顯示處理、縮放,TV OUT實例等,驅動源碼+上層測試實例源碼,為用戶提供豐富、全面的參考資料
軟體資源:
WinCE6.0 BSP軟體資源
類別 功能特性 描述
Bootloader Stepldr ★ 提供源碼,最終生成鏡像STEPLDR.bin
Eboot ★ 提供源碼,最終生成鏡像EBOOT.bin
Eboot功能強大,主要包括:
1、網路下載:可設靜態IP、HDCP獲取動態IP、Mac地址設置、開機自動通過網路下載內核等功能
2、USB下載:通過USB OTG 2.0介面,高速更新鏡像
3、格式化Nand Flash
4、格式化BinFS
5、低級格式化
6、設置啟動延遲時間
7、開機啟動進度條
Sdboot 提供可使用的二進制
1、SD啟動、通過USB下載並燒寫鏡像(取代JTAG燒寫)
2、任意更換開機LOGO
底層驅動
程序 DISPLAY LCD顯示驅動,★ 提供源代碼
顯示驅動特點:
1、支持多款不同尺寸的液晶屏,3.5寸、4.3寸、7寸、10.2寸、10.4寸(LVDS)
2、支持16/18/24Bpp模式
3、支持屏幕旋轉
TOUCH 觸摸屏驅動,★ 提供源碼
DM9000A DM9000網口驅動,★ 提供源碼
CAMERA 攝像頭驅動,支持OV9650/9653/9655, ★ 提供源碼(選配)
HSMMC SD/MMC/SDIO驅動,★ 提供源碼
IIC IIC驅動,★ 提供源碼
JPEG JPEG驅動,★ 提供源碼
SPI SPI驅動,★ 提供源碼
Keybd 按鍵驅動程序,支持板載用戶按鍵、外置矩陣按鍵 ★ 提供源碼
NANDFLASH FMD模式Nand Flash驅動,支持512 Byts小Page、2K bytes大Page,驅動兼容128Mbit~8Gbit容量 ★ 提供源碼
SERIAL 串口驅動,4個UART ★ 提供源碼
WAVEDEV 音頻驅動,支持AC97和IIS,默認驅動為AC97(WM9714) ★ 提供源碼
CF_ATA CF卡,ATA硬碟驅動,提供源碼
CMM ★ 提供源碼
DMA ★ 提供源碼
DrvLib ★ 提供源碼
MFC 多媒體硬體編解碼驅動, ★ 提供源碼
OTG USB OTG驅動,僅支持Device功能, ★提供源碼
USB USB HOST驅動, ★ 提供源碼
POWERBUTTON ★ 提供源碼
POWERCONTROL ★ 提供源碼
UAO ★提供源碼
WIFI_SDIO wifi模塊驅動, ★ 提供源碼(選配)
上層應用程序 MFC視頻編解碼
測試程序 提供源碼、用戶手冊,支持MPEG-4/H264/H263/VC-1
詳細的視頻編碼、解碼實例和API操作文檔
DirectShow filter
硬體解碼程序 提供源碼,源碼內容包括
AACDecoderFilter
FrameExtractFilter
MFCDecoderFilter
MP4testcode
mpeg4ip_mp4v2
SsapMp4Parser
JPEG編解碼測試程序 提供源碼、API操作文檔
OpenGL測試程序 提供源碼、用戶手冊, 2D/3D硬體圖形加速(OpenGL ES1.1&2.0)
Camera預覽和編碼測試程序 提供源碼 支持OV9650/9653/9655 CMOS圖像感測器
串口測試程序 提供源碼 測試串口通訊的程序
TCPMP播放器 完美硬體解碼MPEG-4/H263/H264/VC-1
支持avi、mp4、m4v、mov、3gp、flv、mpg等擴展格式
支持DIVX、XVID
支持解碼MP1、MP2、MP3、AC3、AAC等音頻格式
D1解析度(720*576)下,視頻解碼40fps以上
錄音程序 錄音測試程序,支持永久存儲至nand flash
Flash播放器 一款不錯的flash 播放器
Skype 即時通訊工具,支持信息、語音聊天
MSN WinCE6.0自帶即時通訊工具
QQ 騰訊QQ,支持在線聊天、QQ群、發送接收文件等
在線視頻 支持在線播放視頻
OFFICE軟體 Word、Excel、PowerPoint、PDF、txt等閱覽
PC端
開發環境及燒寫軟體 DNW V0.60C 串口調試終端、USB下載鏡像工具
IROM_Fusing_Tool 燒寫IROM_SD_EBOOT.NB0到SD卡的工具
Microsoft Visual Studio 2005 集成開發環境,系統定製、編譯、調試環境 應用程序開發環境
Windows Embedded CE 6.0 內核定製、裁剪插件
Microsoft Activesync PC和WinCE的同步軟體,同步建立後,可通過USB Device口與PC間進行數據交換,應用程序單步調試等
二、Linux2.6.28軟體資源(點擊展開)
Linux2.6.28 BSP軟體資源
類別 功能特性 描述
Bootloader u-boot 版本:u-boot-1.1.6
主要功能:
1、支持Nand Flash擦除、讀、寫
2、支持USB 下載鏡像
3、支持列印、設置、保存環境變數
4、支持內存內容顯示、對比、修改
5、支持bootm、bootargs設置
★ 提供源代碼
Sdboot 支持SD啟動、通過USB下載並燒寫鏡像(取代JTAG燒寫)
內核及
設備驅動
程序 內核 內核版本:Linux-2.6.28
系統時鍾 系統主頻:533MHz
顯示驅動 支持多種不同尺寸液晶屏:3.5寸、4.3寸、7寸、10.2寸、10.4寸
★ 提供源碼
TOUCH 觸摸屏驅動 ★ 提供源碼
DM9000 DM9000網口驅動 ★ 提供源碼
CAMERA 攝像頭驅動,支持OV9650/9653/9655, ★ 提供源碼(選配)
HSMMC SD/MMC/SDIO驅動 ★ 提供源碼
IIC IIC驅動 ★ 提供源碼
SPI SPI驅動 ★ 提供源碼
NANDFLASH NANDFLASH FMD模式Nand Flash驅動,支持512 Byts小Page、2K bytes大Page,驅動兼容128Mbit~8Gbit容量 ★ 提供源碼
SERIAL 串口驅動,4個UART ★ 提供源碼
WAVEDEV 音頻驅動,支持AC97和IIS,默認驅動為AC97(WM9714) ★ 提供源碼
USB Host 支持USB鍵盤、滑鼠、U盤等 ★ 提供源碼
DMA DMA驅動 ★ 提供源碼
JPEG JPEG硬體編解碼驅動 ★ 提供源碼
MFC 多媒體硬體編解碼驅動 ★ 提供源碼
TV OUT 支持電視輸出 ★ 提供源碼
2D/3D 2D/3D硬體加速驅動 OpenGLES1.1 & 2.0、D3DM
文件系統 NFS文件系統 支持系統啟動NFS掛載網路文件系統
Yaffs 支持yaffs文件系統
交叉編譯器 cross-4.2.2-eabi.tar.bz2 交叉工具鏈
圖形界面 Qtopia 2.2.0 圖形界面支持多種功能
1、圖片瀏覽器
2、MediaPlayer
3、日歷、時鍾、計算器
3、瀏覽器
4、文件管理器
5、終端
6、多款游戲
7、觸摸校正程序
8、插件管理器
等等功能
上層
應用
程序 H.264 display H.264硬體解碼測試程序
MPEG-4 display MPEG-4硬體解碼測試程序
H.263 display H.263硬體解碼測試程序
VC-1 display VC-1硬體解碼測試程序
4-windows display 多重解碼,四分屏硬體解碼測試程序
Camera preview & MFC encoding Camera採集回顯及MFC編碼測試程序
MFC decoding & Camera preview MFC解碼及camera回顯測試程序
Camera input and JPEG encoding Camera 採集及JPEG編碼測試程序
JPEG decoding and display JPEG解碼機顯示
MFC decoding & Camera preview thru TV TV輸出MFC解碼及camera回顯
H.264 decoding thru TVOUT TV輸出 H.264解碼
PC端
(windows xp)
燒寫工具 DNW V0.60C 串口調試終端、USB下載鏡像工具
moviNAND_Fusing_Tool.exe 燒寫啟動代碼到SD卡的工具
三、Android 1.5軟體資源(點擊展開)
Android1.5 BSP軟體資源
類別 功能特性 描述
Bootloader u-boot 版本:u-boot-1.1.6
主要功能:
1、支持Nand Flash擦除、讀、寫
2、支持USB 下載鏡像
3、支持列印、設置、保存環境變數
4、支持內存內容顯示、對比、修改
5、支持bootm、bootargs設置
★ 提供源代碼
Sdboot 支持SD啟動、通過USB下載並燒寫鏡像(取代JTAG燒寫)
內核及
設備驅動
程序 內核 內核版本:Linux-2.6.27
系統時鍾 系統主頻:533MHz
顯示驅動 4.3寸屏(480*272)/7寸屏(800*480) ★ 提供源碼
TOUCH 觸摸屏驅動 ★ 提供源碼
DM9000 DM9000網口驅動 ★ 提供源碼
HSMMC SD/MMC/SDIO驅動 ★ 提供源碼
IIC IIC驅動 ★ 提供源碼
SPI SPI驅動 ★ 提供源碼
KEYBD 按鍵驅動程序 ★ 提供源碼
WAVEDEV 音頻驅動,支持AC97和IIS,默認驅動為AC97(WM9714) ★ 提供源碼
DMA DMA驅動 ★ 提供源碼
RTC 實時時鍾驅動
USB USB Device驅動
JPEG JPEG硬體編解碼驅動 ★ 提供源碼
MFC 多媒體硬體編解碼驅動 ★ 提供源碼
TV OUT 支持電視輸出 ★ 提供源碼
ROTATOR 屏幕旋轉驅動 ★ 提供源碼
2D/3D 2D/3D硬體加速驅動 OpenGLES1.1 & 2.0、D3DM
交叉編譯器 arm-none-linux-gnueabi 交叉工具鏈
上層
應用
程序 Alarm Clock 這是Android 下一個鬧鍾程序,可以設置鬧鈴時間、鈴聲選擇等等
ASTRO 文件管理器
Mediaplayer 不錯的視頻播放器,透明的工具條、可以橫豎旋轉屏幕
Music 音頻播放器,支持專輯分類,藝術家、專輯、歌曲、播放列表、派對隨機播放、背景播放、搜索等功能
Picsay 一款強大的圖片編輯軟體,通過該軟體可以編輯圖片、添加標題、文字說明、裝飾圖片,在圖片上添加文字、添加小圖片等等
Gallery 一個非常好的圖片瀏覽控制項,支持圖片放大、縮小、上一張、下一張、幻燈片演示、共享、旋轉、裁切、圖片信息等
Browser Android 下的Brower 功能非常強大,支持網頁放大、縮小、跳轉、屬性設置等
Panda Reader 熊貓看書是android下一款用於智能設備的閱讀器,功能相當的強大。四大功能模塊:本地圖書、在線書庫、電子雜志、我的收藏。
1、TXT動態載入實現流暢閱讀
2、主題換膚:海藍、銀灰、金黃
3、多種滾屏方式、滾屏速度自由選擇
4、歷史記錄的自動保存
5、色彩的設定:背景圖片、背景顏色、文本顏色
6、字體的設置:字體大小、字體屬性、字間距、行間距
7、全盤文件任意搜索
8、支持中英文切換
9、可瀏覽ZIP文件
PC端燒
寫工具
(Windows XP) DNW V0.60C 串口調試終端、USB下載鏡像工具
moviNAND_Fusing _Tool.exe 燒寫啟動代碼到SD卡的工具
四、Android 0.9軟體資源(點擊展開)
Android 0.9 BSP軟體資源
類別 功能特性 描述
Bootloader u-boot 版本:u-boot-1.1.6
主要功能:
1、支持Nand Flash擦除、讀、寫
2、支持USB 下載鏡像
3、支持列印、設置、保存環境變數
4、支持內存內容顯示、對比、修改
5、支持bootm、bootargs設置
★ 提供源代碼
Sdboot 支持SD啟動、通過USB下載並燒寫鏡像(取代JTAG燒寫)
內核及
設備驅動
程序 內核 內核版本:Linux-2.6.29.1
系統時鍾 系統主頻:533MHz
顯示驅動 4.3寸屏(480*272) ★ 提供源碼
TOUCH 觸摸屏驅動 ★ 提供源碼
UART 4路串口驅動 ★ 提供源碼
256M Nand Flash Nand Flash驅動,256M Bytes ★ 提供源碼
Keybd 按鍵驅動,默認功能:上、下、左、右、確定、返回 ★ 提供源碼
RTC 實時時鍾驅動 ★ 提供源碼
SD/MMC SD/MMC驅動 ★ 提供源碼
編譯器 Arm-none-linux-gnueabi 交叉工具鏈
圖形界面 androidfs-sdk_m5-rc15-fix.tar Android 0.9
五、Ubuntu 9.04軟體資源(點擊展開)
Ubuntu-9.04 BSP軟體資源
類別 功能特性 描述
Bootloader u-boot 版本:u-boot-1.1.6
主要功能:
1、支持Nand Flash擦除、讀、寫
2、支持USB 下載鏡像
3、支持列印、設置、保存環境變數
4、支持內存內容顯示、對比、修改
5、支持bootm、bootargs設置
★ 提供源代碼
Sdboot 支持SD啟動、通過USB下載並燒寫鏡像(取代JTAG燒寫)
內核及
設備驅動
程序 內核 內核版本:Linux-2.6.29.1
系統時鍾 系統主頻:533MHz
顯示驅動 4.3寸屏(480*272) ★ 提供源碼
TOUCH 觸摸屏驅動 ★ 提供源碼
UART 4路串口驅動 ★ 提供源碼
256M Nand Flash Nand Flash驅動,256M Bytes ★ 提供源碼
Keybd 按鍵驅動,默認功能:上、下、左、右、確定、返回 ★ 提供源碼
RTC 實時時鍾驅動 ★ 提供源碼
SD/MMC SD/MMC驅動 ★ 提供源碼
編譯器 Arm-none-linux-gnueabi 交叉工具鏈
圖形界面 Lxde-ubuntu Ext3 rootfs
六、 DJYOS操作系統介紹(點擊展開)
㈨ 國外有哪些關於Android的學習網站或資料或論壇
國外的Android學習網站最大資源帝Google官方——Android開發者網站。
Google官方開發者支持平台Android Developers,開發者可以找到Google關於Android設計(Design)、開發(Develop)及發布應用(Distribute)的官方說明文檔。
在Develop(開發)中,分別有教程(Android Training)、API指南(API Guides)、引用(Ref-erence)、工具(Tools)四項內容。下面就對這四項內容進行簡單介紹。
(1)Android Training:在這個模塊中,Google針對初學者和中高級開發者分別給出初級(Get Started)和高級(Advanced Training)兩個級別的教程。網站右側都提供Demo工程下載,使開發者可以很方便地下載學習。
初級教程內容包括應用界面搭建、管理Activity生命周期、對不同移動設備進行適配等內容。高級教程則包括了大量的Android系統特性及OpenGLes使用等內容。
(2)API Guides:該模塊包含了Android API說明文檔,對Android中的每個功能模塊進行說明。說明文檔中有大量的範例代碼。如果對某一個控制項或某一個感測器的使用不明白.可以在這里找到答案。
(3)Reference:根據Android包結構對每一個類及類中的接13、方法進行說明。對一個Android方法的使用不是很明白時,就趕快來這里查查吧!可以使用網站右上角的搜索按鈕來尋找自己所需要的文檔說明。
(4)Tools:這個模塊介紹了與Android開發工具使用方法。
㈩ 畢業設計選了用android做一個3d魔方的游戲,應為android以前沒接觸過的,要從頭開始學的。這個難嗎高手
只要java好就沒有問題,這是3D魔方android的源碼。
package com.example.android.image3D;
import android.view.SurfaceView;
import android.view.SurfaceHolder;
import android.content.Context;
import android.util.AttributeSet;
import java.util.ArrayList;
import java.util.concurrent.Semaphore;
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGL11;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLContext;
import javax.microedition.khronos.egl.EGLDisplay;
import javax.microedition.khronos.egl.EGLSurface;
import javax.microedition.khronos.opengles.GL;
import javax.microedition.khronos.opengles.GL10;
public class View3D extends SurfaceView implements SurfaceHolder.Callback {
private static final Semaphore sEglSemaphore = new Semaphore(1);
private boolean mSizeChanged = true;
private SurfaceHolder mHolder;
private GLThread mGLThread;
private GLWrapper mGLWrapper;
public View3D(Context context) {
super(context);
init();
}
public View3D(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
}
public SurfaceHolder getSurfaceHolder() {
return mHolder;
}
public void setGLWrapper(GLWrapper glWrapper) {
mGLWrapper = glWrapper;
}
public void setRenderer(Renderer renderer) {
mGLThread = new GLThread(renderer);
mGLThread.start();
}
public void surfaceCreated(SurfaceHolder holder) {
mGLThread.surfaceCreated();
}
public void surfaceDestroyed(SurfaceHolder holder) {
mGLThread.surfaceDestroyed();
}
public void surfaceChanged(SurfaceHolder holder,
int format, int w, int h) {
mGLThread.onWindowResize(w, h);
}
public void onPause() {
mGLThread.onPause();
}
public void onResume() {
mGLThread.onResume();
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
mGLThread.onWindowFocusChanged(hasFocus);
}
public void queueEvent(Runnable r) {
mGLThread.queueEvent(r);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mGLThread.requestExitAndWait();
}
public interface GLWrapper {
GL wrap(GL gl);
}
public interface Renderer {
int[] getConfigSpec();
void surfaceCreated(GL10 gl);
void sizeChanged(GL10 gl, int width, int height);
void drawFrame(GL10 gl);
}
private class EglHelper {
EGL10 mEgl;
EGLDisplay mEglDisplay;
EGLSurface mEglSurface;
EGLConfig mEglConfig;
EGLContext mEglContext;
public EglHelper() {
}
public void start(int[] configSpec){
mEgl = (EGL10) EGLContext.getEGL();
mEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
int[] version = new int[2];
mEgl.eglInitialize(mEglDisplay, version);
EGLConfig[] configs = new EGLConfig[1];
int[] num_config = new int[1];
mEgl.eglChooseConfig(mEglDisplay, configSpec, configs, 1,
num_config);
mEglConfig = configs[0];
mEglContext = mEgl.eglCreateContext(mEglDisplay, mEglConfig,
EGL10.EGL_NO_CONTEXT, null);
mEglSurface = null;
}
public GL createSurface(SurfaceHolder holder) {
if (mEglSurface != null) {
mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT);
mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
}
mEglSurface = mEgl.eglCreateWindowSurface(mEglDisplay,
mEglConfig, holder, null);
mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
mEglContext);
GL gl = mEglContext.getGL();
if (mGLWrapper != null) {
gl = mGLWrapper.wrap(gl);
}
return gl;
}
public boolean swap() {
mEgl.eglSwapBuffers(mEglDisplay, mEglSurface);
return mEgl.eglGetError() != EGL11.EGL_CONTEXT_LOST;
}
public void finish() {
if (mEglSurface != null) {
mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_CONTEXT);
mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
mEglSurface = null;
}
if (mEglContext != null) {
mEgl.eglDestroyContext(mEglDisplay, mEglContext);
mEglContext = null;
}
if (mEglDisplay != null) {
mEgl.eglTerminate(mEglDisplay);
mEglDisplay = null;
}
}
}
class GLThread extends Thread {
private boolean mDone;
private boolean mPaused;
private boolean mHasFocus;
private boolean mHasSurface;
private boolean mContextLost;
private int mWidth;
private int mHeight;
private Renderer mRenderer;
private ArrayList<Runnable>
mEventQueue = new ArrayList<Runnable>();
private EglHelper mEglHelper;
GLThread(Renderer renderer) {
super();
mDone = false;
mWidth = 0;
mHeight = 0;
mRenderer = renderer;
setName("GLThread");
}
@Override
public void run() {
try {
try {
sEglSemaphore.acquire();
} catch (InterruptedException e) {
return;
}
guardedRun();
} catch (InterruptedException e) {
} finally {
sEglSemaphore.release();
}
}
private void guardedRun() throws InterruptedException {
mEglHelper = new EglHelper();
int[] configSpec = mRenderer.getConfigSpec();
mEglHelper.start(configSpec);
GL10 gl = null;
boolean tellRendererSurfaceCreated = true;
boolean tellRendererSurfaceChanged = true;
while (!mDone) {
int w, h;
boolean changed;
boolean needStart = false;
synchronized (this) {
Runnable r;
while ((r = getEvent()) != null) {
r.run();
}
if (mPaused) {
mEglHelper.finish();
needStart = true;
}
if(needToWait()) {
while (needToWait()) {
wait();
}
}
if (mDone) {
break;
}
changed = mSizeChanged;
w = mWidth;
h = mHeight;
mSizeChanged = false;
}
if (needStart) {
mEglHelper.start(configSpec);
tellRendererSurfaceCreated = true;
changed = true;
}
if (changed) {
gl = (GL10) mEglHelper.createSurface(mHolder);
tellRendererSurfaceChanged = true;
}
if (tellRendererSurfaceCreated) {
mRenderer.surfaceCreated(gl);
tellRendererSurfaceCreated = false;
}
if (tellRendererSurfaceChanged) {
mRenderer.sizeChanged(gl, w, h);
tellRendererSurfaceChanged = false;
}
if ((w > 0) && (h > 0)) {
mRenderer.drawFrame(gl);
mEglHelper.swap();
}
}
mEglHelper.finish();
}
private boolean needToWait() {
return (mPaused || (! mHasFocus) || (! mHasSurface) || mContextLost)
&& (! mDone);
}
public void surfaceCreated() {
synchronized(this) {
mHasSurface = true;
mContextLost = false;
notify();
}
}
public void surfaceDestroyed() {
synchronized(this) {
mHasSurface = false;
notify();
}
}
public void onPause() {
synchronized (this) {
mPaused = true;
}
}
public void onResume() {
synchronized (this) {
mPaused = false;
notify();
}
}
public void onWindowFocusChanged(boolean hasFocus) {
synchronized (this) {
mHasFocus = hasFocus;
if (mHasFocus == true) {
notify();
}
}
}
public void onWindowResize(int w, int h) {
synchronized (this) {
mWidth = w;
mHeight = h;
mSizeChanged = true;
}
}
public void requestExitAndWait() {
synchronized(this) {
mDone = true;
notify();
}
try {
join();
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
public void queueEvent(Runnable r) {
synchronized(this) {
mEventQueue.add(r);
}
}
private Runnable getEvent() {
synchronized(this) {
if (mEventQueue.size() > 0) {
return mEventQueue.remove(0);
}
}
return null;
}
}
}