Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Sleicreider

Frischling

  • »Sleicreider« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Österreich,Steiermark

Beruf: Softwareentwickler

  • Private Nachricht senden

1

18.11.2012, 19:29

OpenGL(Android Java) Bewegen 2 verschiedener Objekte

Hallo,
Ich bin zur Zeit beim programmieren eines Spiels für ein Projekt,
und zur Zeit stehe ich vor dem Problem wie ich es am besten Löse das ich mehrere Objekte einzeln Bewegen kann.
Es handelt sich hierbei um OpenGL mit Android -> Java.
Bis jetzt hab ich das Composite Pattern verwendet.
Hier der Code:

OpenGL Rendere:

Quellcode

1
2
3
4
5
public class OpenGLRenderer implements Renderer{            private Mesh root;      public OpenGLRenderer() {       Group group = new Group();      Stickman stickman = new Stickman(0.7f,0.7f,0);      ButtonFlipFront btFlipFront = new ButtonFlipFront(0.7f,0.7f,0);                     stickman.y = 1.0f;      btFlipFront.y = -1.2f;                              group.add(stickman);        group.add(btFlipFront);     root = group;   }
    public void onDrawFrame(GL10 gl) {      gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);        gl.glLoadIdentity();        gl.glTranslatef(0, 0, -4);      root.draw(gl);  }
    public void onSurfaceChanged(GL10 gl, int width, int height) {      gl.glViewport(0, 0, width, height);     gl.glMatrixMode(GL10.GL_PROJECTION);        gl.glLoadIdentity();        GLU.gluPerspective(gl, 45.0f, (float)width/(float)height, 0.1f, 100.0f);        gl.glMatrixMode(GL10.GL_MODELVIEW);     gl.glLoadIdentity();    }
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {       gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);        gl.glShadeModel(GL10.GL_SMOOTH);        gl.glClearDepthf(1.0f);     gl.glEnable(GL10.GL_DEPTH_TEST);    }
}



Object Vorlage/Gitter(Für etwaige Subclassen):

Quellcode

1
2
public class Mesh {     public float x = 0; public float y = 0; public float z = 0          ;   private FloatBuffer verticesBuffer; private ShortBuffer indicesBuffer;      private int numOfIndices = -1;      public void draw(GL10 gl)   {       gl.glFrontFace(GL10.GL_CCW);        gl.glEnable(GL10.GL_CULL_FACE);     gl.glCullFace(GL10.GL_BACK);        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);       gl.glVertexPointer(3, GL10.GL_FLOAT, 0, verticesBuffer);        gl.glPushMatrix();      gl.glTranslatef(x, y, z);       gl.glPopMatrix();       gl.glDrawElements(GL10.GL_TRIANGLES, numOfIndices, GL10.GL_UNSIGNED_SHORT, indicesBuffer);      gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);      gl.glDisable(GL10.GL_CULL_FACE);            }       protected void setVertices(float[] vertices)    {       ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);      vbb.order(ByteOrder.nativeOrder());     verticesBuffer = vbb.asFloatBuffer();       verticesBuffer.put(vertices);       verticesBuffer.position(0); }       protected void setIndices(short[] indices)  {       ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length*2);       ibb.order(ByteOrder.nativeOrder());     indicesBuffer = ibb.asShortBuffer();        indicesBuffer.put(indices);     indicesBuffer.position(0);      numOfIndices = indices.length;  }
}



Beispiel meines OpenGL Objekts(Subklasse von der Klasse oben):

Quellcode

1
public class Stickman extends Mesh{     public Stickman(float width, float height, float depth) {       width   /= 4;       height  /= 4;       depth   /= 4;               float vertices[] = {    -width,height,depth,                                -width,-height,depth,                               width,-height,depth,                                width,height,depth      };              short indices[] = { 0,1,2,                          0,2,3       };              setVertices(vertices);      setIndices(indices);    }}



Gruppe wo alle Objekte gespeichert werden(welche im renderer dann gezeichnet werden):

Quellcode

1
public class Group extends Mesh{    private Vector<Mesh> children = new Vector<Mesh>();     @Override   public void draw(GL10 gl)   {       for(int i = 0;i < children.size();i++)      {           children.get(i).draw(gl);       }   }       public void add(int location,Mesh object)   {       children.add(location, object); }       public boolean add(Mesh object) {       return children.add(object);    }       public void clear() {       children.clear();   }       public Mesh get(int location)   {       return children.get(location);  }       public Mesh remove(int location)    {       return children.remove(location);   }       public boolean remove(Object object)    {       return children.remove(object); }       public int soze()   {       return children.size(); }   }




Ich benötige für mein Projekt Eigentlich nur 4 Objekte(1 Hintergrunds Objekt mit Background texture. 1 Objekt welches sich bewegen soll, 2 buttons welche angeklickt werden können)
Hier bei möchte ich eben 1 objekt einzeln bewegen können(ohne klick oder auswahl, Programm soll es einfach von selbst bewegen)
Wie mache ich das am besten? und Wo ?


Eine weitere Frage hätte ich:

In dem Fall ist Hier meine Mesh Klasse ja sowas wie eine Vorlage für OpenGL Objekte.
Aber könnte ich in dem fall nicht einfach eine Subclass verwenden von der Vorlage für meine 3 verschienden Objekte?

also Bsp:

Stickman stickman = new Stickman(1,1,0); // objekt 1
Stickman stickman2 = new Stickman(1,2,0); / objekt 2
Stickman stickman3 = new Stickman(2,2,0) // objekt 3


odder wäre es doch besser für jedes objekt eine einzelne subclass zu erstellen?



Freue mich auf eure Antwort/Hilfe.

Mfg
Slei

Sleicreider

Frischling

  • »Sleicreider« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Österreich,Steiermark

Beruf: Softwareentwickler

  • Private Nachricht senden

2

23.11.2012, 09:25

oder einfacher Beschrieben was ich haben möchte:

Wie kann ich am besten mehrere Objekte einzeln einfach so positionieren bzw bewegen wie ich möchte?

z.B

1 Objekt das sich Bewegt
1 Objekt das ich irgendwo Positioniere(Button)

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

23.11.2012, 15:36

Du speicherst die Position jedes Objekts und schreibst die dann in deine Tranformationsmatrix.

Sleicreider

Frischling

  • »Sleicreider« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Österreich,Steiermark

Beruf: Softwareentwickler

  • Private Nachricht senden

4

25.11.2012, 18:55

das funktioniert doch mit pushMatrix() ... popMatrix()

ich habe zur zeit ein problem.
ich habe mehrere Objekte welche ich in einen Vector gebe, und diesen Vector(alle objekte) zeichne ich dann in meinem Renderer.

C-/C++-Quelltext

1
2
private Mesh root;      public OpenGLRenderer() {       Group group = new Group();      Stickman stickman = new Stickman(0.7f,0.1f,0);      ButtonFlipFront btFlipFront = new ButtonFlipFront(0.7f,0.7f,0);                     stickman.y = 0.3f;      btFlipFront.y = -0.9f;                              group.add(stickman);        group.add(btFlipFront);     root = group;   }
    public void onDrawFrame(GL10 gl) {      gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);        gl.glLoadIdentity();        gl.glTranslatef(0, 0, -4);              root.draw(gl);  }



hier im Konstruktor ruf ich meine einzelnen Objekte auf und füge sie dann in den Vector.
Dieser Vector wird dann eben im onDrawFrame gezeichnet.


im Konstruktor habe ich auch die möglichkeit x,y,z zu verändern welche dann in meiner Klasse des Objekts mit glTranslate verwendet werden.


// Klasse fürs Polygon

C-/C++-Quelltext

1
public void draw(GL10 gl)   {       gl.glFrontFace(GL10.GL_CCW);        gl.glEnable(GL10.GL_CULL_FACE);     gl.glCullFace(GL10.GL_BACK);        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);       gl.glVertexPointer(3, GL10.GL_FLOAT, 0, verticesBuffer);        gl.glPushMatrix();              //<<--      gl.glTranslatef(x, y, z);       gl.glPopMatrix();               // <<--     gl.glDrawElements(GL10.GL_TRIANGLES, numOfIndices, GL10.GL_UNSIGNED_SHORT, indicesBuffer);      gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);      gl.glDisable(GL10.GL_CULL_FACE);            }




verwende ich jetzt pushMatrix() und popMatrix in meiner Poylgon Klasse passiert jedoch nichts.
und wenn ich es im onDrawFrame mache würde nur für alle zusammen gemacht werden.

könnte mir jemand helfen?

Sleicreider

Frischling

  • »Sleicreider« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Österreich,Steiermark

Beruf: Softwareentwickler

  • Private Nachricht senden

5

25.11.2012, 19:01

wenn ich mich nicht täusche hab ich den fehler selbst gefunden.

ich habe bei draw() glDrawElements(...) nicht innerhalb pushMatrix();....popMatrix(); geschrieben.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

6

25.11.2012, 19:57

glPushBlabla() ist veraltet. Aber gut für den Anfang.
Irgendwie solltest du mal gucken warum der Code hier so schlecht formatiert wird. Sonst nimm Pastebin oder sowas, so ließt das keiner.

Sleicreider

Frischling

  • »Sleicreider« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Österreich,Steiermark

Beruf: Softwareentwickler

  • Private Nachricht senden

7

26.11.2012, 10:38

ja frag mich auch warum das so eigenartig formatiert ist ._.

wie könnte man es halt anders machen?
also ohne glPush&Pop

Sleicreider

Frischling

  • »Sleicreider« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Österreich,Steiermark

Beruf: Softwareentwickler

  • Private Nachricht senden

8

26.11.2012, 10:49

Also zurzeit hab ich es so gemacht, werte für etwaige bewegungen muss ich im renderer konstruktor machen.
für verbesserungs vorschläge..-> hier der code

(über den link, das die code tags irgendwie nicht funktionieren)

Renderer Klasse
http://pastebin.com/MTGbKNzB


Mesh, vorlage für meine OpenGL Objekte
http://pastebin.com/vFjZqxNw



Ein Polygon(Subclass von Mesh)
http://pastebin.com/qZe7T7YY



Group(Subclass von Mesh, dient zur speichern aller Objekte in einen Vector, das ich später alle auf einmal zeichnen kann)
http://pastebin.com/5qGuRJHT




hat jemand eine bessere idee?
vorschläge?


mfg
slei

Werbeanzeige