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

1

26.07.2014, 21:39

onSurfaceChanged neustarten....

hallo,
bin gerade dabei in Java für Andorid etwas zuproggen.
Bei Programmstart wird punktx als 50f geladen.
Mein Ziel: Ich tippe auf das Bild xy, dann soll der 1.Punkt von meinem Dreieck sich ändern. Von 50f auf 100f.

so in der anderen Klasse :
opengleck = 100f <---Ontouch();

Wie kann ich onSurfaceChanged aufrufen?

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;

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

import android.content.Context;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView.Renderer;
import android.opengl.Matrix;

public class GLRenderer implements Renderer {

// neu:
ByteBuffer bb;
ByteBuffer dlb;


// Our matrices
private final float[] mtrxProjection = new float[16];
private final float[] mtrxView = new float[16];
private final float[] mtrxProjectionAndView = new float[16];

// Geometric variables
public static float vertices[];


public static short indices[];
public FloatBuffer vertexBuffer;
public ShortBuffer drawListBuffer;

// Our screenresolution
float mScreenWidth = 1280;
float mScreenHeight = 768;

// Misc
Context mContext;
long mLastTime;
int mProgram;

public GLRenderer(Context c)
{
mContext = c;
mLastTime = System.currentTimeMillis() + 100;
}

public void onPause()
{
/* Do stuff to pause the renderer */
}

public void onResume()
{
/* Do stuff to resume the renderer */
mLastTime = System.currentTimeMillis();
}

@Override
public void onDrawFrame(GL10 unused) {

// Get the current time
long now = System.currentTimeMillis();

// We should make sure we are valid and sane
if (mLastTime > now) return;

// Get the amount of time the last frame took.
// long elapsed = now - mLastTime;

// Update our example

// Render our example
Render(mtrxProjectionAndView);

// Save the current time to see how long it took :).
mLastTime = now;

}

private void Render(float[] m) {

// clear Screen and Depth Buffer, we have set the clear color as black.
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

// get handle to vertex shader's vPosition member
int mPositionHandle = GLES20.glGetAttribLocation(riGraphicTools.sp_SolidColor, "vPosition");

// Enable generic vertex attribute array
GLES20.glEnableVertexAttribArray(mPositionHandle);

// Prepare the triangle coordinate data
GLES20.glVertexAttribPointer(mPositionHandle, 3,
GLES20.GL_FLOAT, false,
0, vertexBuffer);

// Get handle to shape's transformation matrix
int mtrxhandle = GLES20.glGetUniformLocation(riGraphicTools.sp_SolidColor, "uMVPMatrix");

// Apply the projection and view transformation
GLES20.glUniformMatrix4fv(mtrxhandle, 1, false, m, 0);

// Draw the triangle
GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length,
GLES20.GL_UNSIGNED_SHORT, drawListBuffer);

// Disable vertex array
GLES20.glDisableVertexAttribArray(mPositionHandle);

}


@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
SetupTriangle();
// We need to know the current width and height.
mScreenWidth = width;
mScreenHeight = height;

// Redo the Viewport, making it fullscreen.
GLES20.glViewport(0, 0, (int)mScreenWidth, (int)mScreenHeight);

// Clear our matrices
for(int i=0;i<16;i++)
{
mtrxProjection[i] = 0.0f;
mtrxView[i] = 0.0f;
mtrxProjectionAndView[i] = 0.0f;
}

// Setup our screen width and height for normal sprite translation.
Matrix.orthoM(mtrxProjection, 0, 0f, mScreenWidth, 0.0f, mScreenHeight, 0, 50);

// Set the camera position (View matrix)
Matrix.setLookAtM(mtrxView, 0, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

// Calculate the projection and view transformation
Matrix.multiplyMM(mtrxProjectionAndView, 0, mtrxProjection, 0, mtrxView, 0);

}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {

// Create the triangle


// Set the clear color to black
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1); 

// Create the shaders
int vertexShader = riGraphicTools.loadShader(GLES20.GL_VERTEX_SHADER, riGraphicTools.vs_SolidColor);
int fragmentShader = riGraphicTools.loadShader(GLES20.GL_FRAGMENT_SHADER, riGraphicTools.fs_SolidColor);

riGraphicTools.sp_SolidColor = GLES20.glCreateProgram(); // create empty OpenGL ES Program
GLES20.glAttachShader(riGraphicTools.sp_SolidColor, vertexShader); // add the vertex shader to program
GLES20.glAttachShader(riGraphicTools.sp_SolidColor, fragmentShader); // add the fragment shader to program
GLES20.glLinkProgram(riGraphicTools.sp_SolidColor); // creates OpenGL ES program executables

// Set our shader programm
GLES20.glUseProgram(riGraphicTools.sp_SolidColor);
}

public void SetupTriangle()
{
// We have to create the vertices of our triangle.

vertices = new float[]
{Andereclass.opengleck, 200f, 0.0f, //oben X Achse Nullpunkt ganz links //oben y Achse Nullpunkt unten
10.0f, 100f, 0.0f, //links X Achse Nullpunkt ganz links // links y Achse Nullpunkt unten
100f, 100f, 0.0f,

// 50.0f, 200f, 0.0f, //oben X Achse Nullpunkt ganz links //oben y Achse Nullpunkt unten
//50.0f, 100f, 0.0f, //links X Achse Nullpunkt ganz links // links y Achse Nullpunkt unten
//300f, 100f, 0.0f,


}; 

indices = new short[] {0, 1, 2, }; // The order of vertexrendering.

// The vertex buffer.
bb = ByteBuffer.allocateDirect(vertices.length * 4);
bb.order(ByteOrder.nativeOrder());
vertexBuffer = bb.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);

// initialize byte buffer for the draw list
dlb = ByteBuffer.allocateDirect(indices.length * 2);
dlb.order(ByteOrder.nativeOrder());
drawListBuffer = dlb.asShortBuffer();
drawListBuffer.put(indices);
drawListBuffer.position(0);


}
}

2

27.07.2014, 17:24

ich denke mal, weil mir niemand antwortet, liegt es daran, dass ich mich nicht richtig ausgedrückt habe.

Ich starte das Prog,dann wird ein Dreieck per opengl erstellt:

Quellcode von oben:
.....
169:vertices = new float[]
170:{Andereclass.opengleck, 200f, 0.0f, // Andereclass.opengleck <--- bei Programmstart ist der Wert 50f
171:10.0f, 100f, 0.0f,
172:100f, 100f, 0.0f,
.....


Soweit so gut.

In einer anderen Klasse Andereclass wird ist die Funktion OnTouch aufgerufen:

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

if(aktion == MotionEvent.ACTION_DOWN)
{
opengleck = 100f; //<-----Erster Punkt des Dreicks, deren x Achse.
.............


WAS MUSS ICH TUN, DASS DAS DREIECK ERNEU GEZEICHNET WIRD , WENN ICH AUFS TABLETT TIPPE ?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

27.07.2014, 19:47

requestRender()

Du willst übrigens vermutlich nicht onSurfaceChanged aufrufen lassen, sondern onDrawFrame. Falls Du wirklich onSurfaceChanged willst, kann ich Dir nicht helfen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

4

27.07.2014, 21:20

Danke,
verstehe nur Bahnhof, aber trotzdem danke.
Wie und was ausgerufen werden soll ist mir egal :-)

Fakt ist, ich will NUR auf das Dispaly tippen und dann soll Nur der erste Punkt vom Dreieck ändern.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

27.07.2014, 22:09

Sehr traurige Ansicht der Dinge.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

6

28.07.2014, 08:07

Wenn du einen GLSurfaceView verwendest, dann hast du doch ganz normal methoden für onDraw() und onTouchEvent oder so. Dann kannst du im onTouchEvent reagieren und dir deinen gewünschten ersten Punkt zeichnen. onDraw() wird doch regelmäßig aufgerufen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

28.07.2014, 08:35

Wird nicht unbedingt regelmäßig aufgerufen, nö. Mit dem Flag RENDERMODE_WHEN_DIRTY muss er es über requestRender selbst triggern.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

8

29.07.2014, 21:44

danke für eure Antowrten...

ich habe ein tut eingebaut, das auf mein Opengl reagiert.

Mein Projekt:

Activity:
1 x Layout
Es wird einmal aufgerufen: Opengl: ->> openglview.java ->> Openglrenderer.java
Es wird einmal aufgerufen: Zeichenbrett: ->> maler.java

openglview hat 1x Ontouch
maler hat aber auch 1x Ontouch und 1x ondraw

Wenn ich es so kompiliere kann ich zeichnen und Punkte setzen, aber der onTouch von opengl reagiert nicht.

DANN LÖSCHE ICH NUR DEN Ontouch von maler, dann ändert sich die Farben vom OpenGL Würfel.

Ich dachte ich, ich bin so ein Schlauberer und setzt ein static bool jetzt in meine Maler.java, wenn der true wird, soll er mir ein Linie zeichnen. Das heist:
In der Ontouch vom Openglview wird die Variable jetzt auf true gesetzt und der Ondraw() in der maler.java malt er meine Linie. Geht aber net.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

30.07.2014, 06:33

Äh, wät?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

10

01.08.2014, 21:12

ok,
ich frage anderst:

in meiner Renderer.java habe ich:

public void onDrawFrame(GL10 glUnused)

Jetzt möchte ich Punkte und Kreise über onDraw(Canvas canvas) hinzufügen. Wenn ich in Renderer onDraw(Canvas canvas) hinzufüge wird onDraw Rot.
Ziel: Auf der linken Seite den Opengl Würfel drehen und auf der rechten Seite zeichnen.

Wie baue ich onDraw zusätzlich in mein Projekt ein. So wie oben beschrieben geht es nicht.

Bin für jeden Tip dankbar

Werbeanzeige