2013-08-21 5 views
0

Это делает меня с ума, я не понимаю, что случилось с этим, приложение просто сбой при попытке загрузить его, но если я закомментировать эту строку: бегTexture загрузка с OpenGL ES Android

playerShip.loadGLTexture(gl, this.context); 

приложений нормально, но, конечно, без текстур :(

MainRenderer.java:

package com.example.galaga2d; 

import java.nio.ByteBuffer; 
import java.nio.FloatBuffer; 
import java.nio.ByteOrder; 
import java.util.Random; 

import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.opengles.GL10; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.opengl.GLSurfaceView.Renderer; 
import android.opengl.GLUtils; 



public class MainRenderer implements Renderer { 
    Random rand = new Random(); 

    private Context  context; 

    public float radiusX = 20.0f; 
    public float radiusY = 20.0f; 

    public float playerX = 100.0f; 
    public float playerY = 300.0f; 

    public float enemyX = rand.nextFloat() * (30.0f - 1.0f) + 1.0f; 
    public float enemyY = 0.0f; 

    public Ship playerShip = new Ship(); 

    public Astedoid enemyAstedoid = new Astedoid(); 

    @Override 
    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
     //! TEXTURES 
     playerShip.loadGLTexture(gl, this.context); 
     gl.glEnable(GL10.GL_TEXTURE_2D); 
     gl.glShadeModel(GL10.GL_SMOOTH); 
     //! TEXTURES 

     gl.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); 

    } 


    @Override 
    public void onDrawFrame(GL10 gl) { 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
     gl.glLoadIdentity(); 

     if (playerShip.life != 0) { 

      playerShip.draw(gl, playerX); 

      gl.glLoadIdentity(); 

      enemyY += enemyAstedoid.speed; 

      enemyAstedoid.draw(gl, enemyX, enemyY); 

      gl.glLoadIdentity(); 

      float result = (float)Math.sqrt(Math.pow((playerX-enemyX), 2)+Math.pow((playerY-enemyY), 2)); 

      if (result < 30.0f) 
      { 
       if(enemyAstedoid.collision == 0) 
       { 
        playerShip.life = playerShip.life - 1; 
        enemyAstedoid.collision |= 1; 
       } 
      } else { 
       enemyAstedoid.collision &= ~1; 
      } 
      /* 
      if (enemyX > playerX-radiusX && enemyX < playerX+radiusX && enemyY > playerY-radiusY && enemyY < playerY+radiusY && flag == 0) { 
       playerShip.life = playerShip.life - 1; 
       flag = 1; 
      } else { 
       flag = 0; 
      } 
      */ 
      gl.glLoadIdentity(); 

     } else { 
      gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
     } 
    } 



    @Override 
    public void onSurfaceChanged(GL10 gl, int width, int height) { 
     gl.glViewport(0, 0, width, height); 
     gl.glMatrixMode(GL10.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     gl.glOrthof(0, width, height, 0, 1, -1); 
     gl.glViewport(0, 0, width, height); 
     gl.glMatrixMode(GL10.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
    } 

// -------------------------------------------------------------------------------- 

    class Ship { 
     public int life = 5; 

     public FloatBuffer ShipVertexBuffer; 
     public FloatBuffer ShipTextureBuffer; 

     //! TEXTURES 
     private int[] textures = new int[1]; 
     //! TEXTURES 

     public float ShipVerticles[] = { 
      0, 0,  // лево низ 
      0, 30,  // лево вверх 
      30, 0,  // право низ 
      30, 30  // право вверх 
     }; 

     //! TEXTURES 
     public float ShipTextures[] = { 
       0.0f, 1.0f, 
       1.0f, 1.0f, 
       0.0f, 0.0f, 
       1.0f, 0.0f 
      }; 
     //! TEXTURES 

     public Ship() { 
      //! Буффер вертексов 
      ByteBuffer bb = ByteBuffer.allocateDirect(36); 
      bb.order(ByteOrder.nativeOrder()); 
      ShipVertexBuffer = bb.asFloatBuffer(); 
      ShipVertexBuffer.put(ShipVerticles); 
      ShipVertexBuffer.position(0); 

      //! TEXTURES 
      bb = ByteBuffer.allocateDirect(ShipTextures.length * 4); 
      bb.order(ByteOrder.nativeOrder()); 
      ShipTextureBuffer = bb.asFloatBuffer(); 
      ShipTextureBuffer.put(ShipTextures); 
      ShipTextureBuffer.position(0); 
      //! TEXTURES 
     } 

     public void loadGLTexture(GL10 gl, Context context) { 
      // loading texture 
      Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), 
        R.drawable.ic_launcher); 

      // generate one texture pointer 
      gl.glGenTextures(1, textures, 0); 
      // ...and bind it to our array 
      gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); 

      // create nearest filtered texture 
      gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 
      gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 

      // Use Android GLUtils to specify a two-dimensional texture image from our bitmap 
      GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 

      // Clean up 
      bitmap.recycle(); 
     } 

     public void draw(GL10 gl, float x) { 
      //! TEXTURE 
      gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); 
      gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
      gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
      //! TEXTURE 

      gl.glColor4f(0.0f, 1.0f, 0.0f, 1.0f); 
      gl.glTranslatef(x, 300.0f, 0.0f); 
      gl.glVertexPointer(2, GL10.GL_FLOAT, 0, ShipVertexBuffer); 

      //! TEXTURE   
      gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, ShipTextureBuffer); 
      //! TEXTURE   

      gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); 

      //! TEXTURE    
      gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
      gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
      //! TEXTURE 
     } 

    } 

    class Astedoid { 
     public float speed = 25.0f; 
     public int collision = 0; 
     public FloatBuffer AsteroidVertexBuffer; 

     public float AsteroidVerticles[] = { 
       0, 0,  // лево низ 
       0, 30,  // лево вверх 
       30, 0,  // право низ 
       30, 30  // право вверх 
      }; 

     public Astedoid() { 
      ByteBuffer bb = ByteBuffer.allocateDirect(36); 
      bb.order(ByteOrder.nativeOrder()); 
      AsteroidVertexBuffer = bb.asFloatBuffer(); 
      AsteroidVertexBuffer.put(AsteroidVerticles); 
      AsteroidVertexBuffer.position(0); 
     } 

     public void draw(GL10 gl, float x, float y) { 
      if (y > 480.0f) { 
       enemyY = 0.0f; 
       enemyX = rand.nextFloat() * (300.0f - 1.0f) + 1.0f; 
      } 

      gl.glColor4f(0.0f, 0.0f, 1.0f, 1.0f); 
      gl.glTranslatef(x, y, 0.0f); 
      gl.glVertexPointer(2, GL10.GL_FLOAT, 0, AsteroidVertexBuffer); 
      gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); 
     } 

    } 



// -------------------------------------------------------------------------------- 

} 

MainActivity.java:

package com.example.galaga2d; 

import android.opengl.GLSurfaceView; 
import android.os.Bundle; 
import android.app.Activity; 
import android.view.MotionEvent; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.Toast; 


public class MainActivity extends Activity { 
    MainRenderer r; 
    float oldX, newX; 

    private static final String TAG = "MainRenderer"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Убираем тайтл приложения, тобишь делаем его FullScreen 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
         WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     // Создаём новый Surface и устанавливаем MainRenderer 
     GLSurfaceView view = new GLSurfaceView(this); 
     r = new MainRenderer(); 
     view.setRenderer(r); 
     setContentView(view); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     int eventaction = event.getAction(); 
     switch (eventaction) { 

     case MotionEvent.ACTION_DOWN: 
      oldX = (float) event.getX(); 

      break; 

     case MotionEvent.ACTION_MOVE: 
      newX = (float) event.getX(); 
      if (oldX > newX) { 
       r.playerX -= 10; 
      } 

      if (oldX < newX) { 
       r.playerX += 10; 
      } 

      oldX = (float) event.getX(); 
      break; 

     case MotionEvent.ACTION_UP: 
      oldX = (float) event.getX(); 
      break; 

     } 

     return true; 
    } 

} 

Что не так? Может быть, я что-то забыл или неправильно загрузил текстуру ...?

ответ

0

Ну я сделал это: D

Я забыл этот код в MainRenderer Класс:

public MainRenderer(Context context) { 
    this.context = context; 
} 

И в MainActivity:

r = new MainRenderer(this); 

Вот и все :)

Смежные вопросы