EVRIKA !!!
मैं खुद को मार रहा था! कैनवास छोड़ने और गेम इंजन को लागू करने के लिए ओपनजीएल विधियों को सीखने के 3 दिनों के बाद।
वेब ट्रैश से भरा ओपनजीएल ट्यूटोरियल से भरा है और उनमें से कई अधूरे हैं और उनमें से कई 2 डी ओपनजीएल गेम इंजन कार्यान्वयन मेथोट्स के लिए गलत तरीके से आगे बढ़ते हैं। गेम बनाने के लिए बड़ा गलत बिंदु G11Ext का उपयोग कर रहा है। के रूप में वे बारी बारी से न: डी
ANND annd तो मैं जो मैं यूट्यूब खेल नमूना वीडियो लिंक से पाया अन्य ट्यूटोरियल से इस ट्यूटोरियल पाया lol:
दर्शकों को भ्रमित न यहाँ है
अध्याय 1: http://obviam.net/index.php/opengl-es-with-android-switching-from-canvas-to-opengl/
अध्याय 2: http://obviam.net/index.php/opengl-es-android-displaying-graphical-elements-primitives/
अध्याय 3: http://obviam.net/index.php/texture-mapping-opengl-android-displaying-images-using-opengl-and-squares/
बस 15 मिनट पहले मैंने जिस तरह से रोका, चलाना और अपने sprites के साथ आकार का आकार बदल सकते हैं! ! ! hahah
तो जैसा कि पाठकों के कई इस महान ट्यूटोरियल स्थानांतरित करने के लिए कैसे और आकार बदलने और स्प्राइट बारी बारी से पढ़ने के बाद पूछ रहे हैं।तो मैं उदाहरण और ट्यूटोरियल के इस झंझट से कुछ कोड बाहर काम किया: इस वर्ग कुछ शीर्ष जोड़तोड़
public class Vertex
{
public FloatBuffer buffer; // buffer holding the vertices
public float vertex[];
public Vertex (float[] vertex)
{
this.vertex = vertex;
this.prepare();
}
private void prepare()
{
// a float has 4 bytes so we allocate for each coordinate 4 bytes
ByteBuffer factory = ByteBuffer.allocateDirect (vertex.length * 4);
factory.order (ByteOrder.nativeOrder());
// allocates the memory from the byte buffer
buffer = factory.asFloatBuffer();
// fill the vertexBuffer with the vertices
buffer.put (vertex);
// set the cursor position to the beginning of the buffer
buffer.position (0);
}
}
के लिए प्रयोग किया जाता है
और इस वर्ग घुमाने और स्थिति
ले जाने में सक्षम बनावट के साथ आकृति बनाना के लिए प्रयोग किया जाता है
public class Square
{
Vertex shape,texture;
int corner=0;
float x=0;
public Square()
{
shape = new Vertex (new float[]
{
1f,1f,0f,
0f,1f,0f,
1f,0f,0f,
0f,0f,0f,
});
texture = new Vertex (new float[]
{
1.0f, 0.0f,
0.0f, 0.0f,
1.0f, 1.0f,
0.0f, 1.0f,
});
}
/** The draw method for the square with the GL context */
public void draw (GL10 gl, int image, float x, float y, float width, float height, float corner)
{
if (corner>=0)
{
corner += 1;
}
if (corner>360)
{
corner = -1;
}
gl.glPushMatrix();
x += 1f;
if (x>800)
{
x = 0;
}
position (gl, 0, 0, width, height, corner);
// bind the previously generated texture
gl.glBindTexture(GL10.GL_TEXTURE_2D, image);
// Point to our buffers
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
// set the colour for the square
gl.glColor4f (0.0f, 1.0f, 0.0f, 0.5f);
// Set the face rotation
gl.glFrontFace(GL10.GL_CW);
// Point to our vertex buffer
gl.glVertexPointer (3, GL10.GL_FLOAT, 0, shape.buffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, texture.buffer);
// Draw the vertices as triangle strip
gl.glDrawArrays (GL10.GL_TRIANGLE_STRIP, 0, shape.vertex.length/3);
// Disable the client state before leaving
gl.glDisableClientState (GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glPopMatrix();
}
public void position (GL10 gl, float x, float y, float width, float height, float corner)
{
gl.glTranslatef (x, y, 0f); //MOVE !!! 1f is size of figure if called after scaling, 1f is pixel if called before scaling
if (corner>0)
{
gl.glTranslatef (width/2, height/2, 0f);
gl.glRotatef (corner, 0f, 0f, 1f); // ROTATE !!!
gl.glTranslatef (-width/2, -height/2, 0f);
}
gl.glScalef (width, height, 0f); // ADJUST SIZE !!!
}
}
और कैमरा सेट करने का तरीका तो यह है कि 1 ओपन इकाई == 1 पिक्सेल annd कैसे बनावट
public class Scene implements Renderer
{
public Context context;
public Resources resources;
public SparseIntArray images = new SparseIntArray();
public float width;
public float height;
public Scene (Context context)
{
this.context = context;
this.resources = context.getResources();
}
@Override
public void onDrawFrame (GL10 gl)
{
// // clear Screen and Depth Buffer
gl.glClear (GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_MODELVIEW);
// // Reset the Modelview Matrix
gl.glLoadIdentity();
draw (gl);
}
@Override
public void onSurfaceChanged (GL10 gl, int width, int height)
{
this.width = width;
this.height = height;
gl.glViewport (0, 0, width, height); // Reset The Current Viewport
gl.glMatrixMode (GL10.GL_PROJECTION); // Select The Projection Matrix
gl.glLoadIdentity(); // Reset The Projection Matrix
gl.glOrthof (0, width, 0, height, -1f, 1f);
//gl.glTranslatef (0f, -height/2, 0.0f); // move the camera !!
gl.glMatrixMode (GL10.GL_MODELVIEW); // Select The Modelview Matrix
gl.glLoadIdentity(); // Reset The Modelview Matrix
load (gl);
}
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
gl.glEnable(GL10.GL_TEXTURE_2D); //Enable Texture Mapping (NEW)
gl.glShadeModel(GL10.GL_SMOOTH); //Enable Smooth Shading
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); //Black Background
gl.glClearDepthf(1.0f); //Depth Buffer Setup
gl.glEnable(GL10.GL_DEPTH_TEST); //Enables Depth Testing
gl.glDepthFunc(GL10.GL_LEQUAL); //The Type Of Depth Testing To Do
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glEnable(GL10.GL_BLEND);
//Really Nice Perspective Calculations
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
init (gl);
}
public void init (GL10 gl)
{
}
public void load (GL10 gl)
{
}
public void draw (GL10 gl)
{
}
private static int next (GL10 gl)
{
int[] temp = new int[1];
gl.glGenTextures (1, temp, 0);
return temp[0];
}
public int image (GL10 gl, int resource)
{
int id = next (gl);
images.put (resource, id);
gl.glBindTexture (GL10.GL_TEXTURE_2D, id);
gl.glTexParameterf (GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf (GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf (GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
gl.glTexParameterf (GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
gl.glTexEnvf (GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
InputStream input = resources.openRawResource (resource);
Bitmap bitmap;
try
{
bitmap = BitmapFactory.decodeStream (input, null, options);
}
finally
{
try
{
input.close();
}
catch (IOException e)
{
// Ignore.
}
}
// Matrix flip = new Matrix();
// flip.postScale (1f, -1f);
// bitmap = Bitmap.createBitmap (bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), flip, true);
GLUtils.texImage2D (GL10.GL_TEXTURE_2D, 0, bitmap, 0);
return id;
}
}
लोड करने के लिए मुख्य बात
और कुछ उपयोग
public class Scene2 extends Scene
{
Square square1, square2;
public Scene2(Context context)
{
super (context);
// TODO Auto-generated constructor stub
}
public void init (GL10 gl)
{
square1 = new Square();
square2 = new Square();
}
public void load (GL10 gl)
{
image (gl, R.drawable.s1_clouds);
image (gl, R.drawable.s1_ground);
}
public void draw (GL10 gl)
{
square1.draw (gl, images.get(R.drawable.s1_clouds), 0, 0, width, height, 0);
square1.draw (gl, images.get(R.drawable.s1_ground), 0, 0, width, height, 0);
}
}
यहाँ मुख्य बात मैं लागू करने के लिए करना चाहता था और कार्यान्वित की है कि एक्स और वाई अक्ष कैनवास में की तरह हैं:
(0,0)
--------------------------------- X axis
|
|
|
|
|
|
|
|
Y axis
मैं इस के बाद कुछ पूर्ण ट्यूटोरियल लिखना होगा और मैं यह घोषणा करना चाहता हूं कि मैंने उन सभी लक्ष्यों को हासिल किया जिन्हें मैं प्राप्त करना चाहता था यानी: शीर्ष पर एक्स अक्ष, बाईं ओर वाई अक्ष, ओपनजी इकाई = पिक्सेल, ऑब्जेक्ट का आकार पिक्सल में सेट करें, ऑब्जेक्ट घुमाएं, ऑब्जेक्ट को पिक्सल में सब कुछ ले जाएं। अब मैं स्प्राइट एनिमेट में काम करता है की खोज में मदद मिली मुझे उनका कहना है के लिए इस ब्लॉग की http://www.morrowland.com/apron/tutorials/gl/gl_matrix.php
तो बहुत धन्यवाद ट्यूटोरियल संभाल लेंगे और उन्हें महीन कक्षाओं में बनाने के लिए और नए 2 डी ओपन खेल ढांचा आधार thats ...
ही सच्चा रास्ता ...
+1 एंड्रॉयड simpliest 2 डी ओपन खेल 1 सप्ताह में इंजन ...
खुश मन उड़ाने ...
: पी
संपादित करें: वर्ष के बाद मैं एक अच्छा ढांचा https://github.com/hazardland/game.android किसी भी संभव ढांचे उपयोग के उदाहरण यहाँ https://github.com/hazardland/ferry.android (बाजार https://play.google.com/store/apps/details?id=hazardland.borani पर दृश्य स्क्रीन)
मैं अपने दर्द भाई महसूस के साथ यहाँ वर्णित अवधारणाओं और नमूना खेल का उपयोग कर सकते है। – torger
कई बार बीतने के बाद से मैंने https: //github.com/hazardland/hazardland के बाद ओपनजीएल फ्रेमवर्क बनाया है ... : पी – BIOHAZARD
ओपनजीएल ईएस 2.0 के साथ एक सरल, अभी तक पूरा, उदाहरण 2 डी गेम: http://code.google .com/p/एंड्रॉइड ब्रेकआउट /। यह कुछ अलग विकल्प बनाता है w.r.t. अक्ष और पिक्सेल इकाइयों, लेकिन यह कहता है कि निर्णय कहाँ किए जाते हैं और क्यों। – fadden