Hilfe bei der Spiele-Entwicklung mit der Android-API

  • 5 Antworten
  • Letztes Antwortdatum
CrazyC

CrazyC

Ambitioniertes Mitglied
2
Hallo, ich will für Android u. a. ein einfaches Spiel entwickeln, dass es früher für den C64 gab. Ich wollte dafür einfach die Android-API nehmen, da ich kein 3D brauche. Ich habe angefangen, einen custom view zu erstellen und dessen ondraw Methode zu overriden. Mein Programm soll von einem eigenen Thread mit run Methode ausgeführt werden.
Habe aber auch gesehen, dass man auch einen SurfaceView nehmen kann. Ich brauche ein einfaches Grundgerüst für solch ein Programm und dass ich dann mit der Canvas-Klasse zeichnen kann.

Vielleicht kann jemand helfen?
 
Mein Programm soll von einem eigenen Thread mit run Methode ausgeführt werden.
Das macht man in dem Falle ein wenig anders und baut sich innerhalb des CustomViews einen Thread , der einen postInvalidate(); ausführt - Direkt in OnDraw rendern blockiert Dir u.U. den UI Thread

Bsp :
Code:
new Thread(new Runnable()
        {
            public void run()
            {
                try
                {
                       final long desiredFrameTime = 1000 / 20;  // ~16.67ms for 60fps

                       while (true) {
                           long startTime = SystemClock.elapsedRealtime();

                           if ((mBitmap != null) && (!isPausedWhileMoving)) {
                               createBitmapContent();
                           }

                           mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);  // Clear the canvas
                           postInvalidate();

                           if (!mAnimationIsStarted) {
                               mBitmap = null;
                       
                               return;
                           }

                           long endTime = SystemClock.elapsedRealtime();
                           long timeTaken = endTime - startTime;
                           long sleepTime = desiredFrameTime - timeTaken;

                           if (sleepTime > 0) {
                               SystemClock.sleep(sleepTime);
                           }
                       }

            
                } catch (Exception ll) {Log.d(TAG,ll.toString());}
                return;
            }
        }).start();

in onDraw dann :
Code:
@Override
    protected void onDraw (Canvas c)
    {
        super.onDraw(c);

        if ( mBitmap != null)
        {
            c.drawBitmap(mBitmap,
                    new Rect(0, 0, mWidth, mHeight),
                    new Rect(0, 0, mWidth, mHeight), null);

        }
 

    }
Das dürfte für dein "Vorhaben" reichen

Oder du nimmst den SurfaceView und arbeitest mit GL und Renderer / FragmentShader
Da solltest du aber fit in GL sein

Bsp :
Code:
  @Override
    public void onDrawFrame(GL10 gl)
    {
       if (! mEnabled)   {

           GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);
           return;
       }

        GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT | GLES30.GL_DEPTH_BUFFER_BIT);
        GLES30.glEnable(GLES30.GL_BLEND);
        GLES30.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        ......


Vllt hat @koje71 noch etwas Wertvolles hinzuzufügen
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: koje71, Nightly und chk142
Ich kann einfach nur den GLSurfaceView empfehlen. Das läuft super performant auf jedem Gerät. Du brauchst keine zusätzlichen Bibliotheken, alles ist im Android SDK schon enthalten. Der SurfaceView ist zwar eigentlich für 3D ausgelegt, aber ich benutze fast auch nur 2D.

Wenn du magst, kannst du eine ältere App von mir als Grundgerüst verwenden. Ich hab da die etwas spröden OpenGL Funktionen gekapselt und mir Hilfsklassen zum Darstellen und Bewegen von Grafiken gebaut. Wenn Fragen aufkommen, dann nur zu..

Der vollständige Source Code (ist aber in Kotlin):
GitHub - koje71/com.koje.ping

Die App ist auch im Store:
Ping Order - Apps on Google Play
 
  • Danke
Reaktionen: chk142 und swa00
Also erstmal danke für die Reaktionen. Ich bin gerade dabei, das mit dem View hinzubekommen. Da werden Fragen aufkommen, in GL bin ich nicht fit, habe aber früher auf Windows schonmal AllegroGL benutzt. Allegro ist eine C-Library fürs Spiele entwickeln. Das mit SurfaceView klingt sehr interessant, ich sehe jetzt aber erstmal zu, dass ich das mit dem ersten Beispiel besser verstehe, auch das Timing.
 
Ich will jetzt in den Immersive mode, also keine Status oder navigation bar. Das AppTheme im Manifest wird akzeptiert, die Insets-Methoden, die ab API level 30 verwendet werden sollen, scheinen überhaupt nichts zu bewirken. Auf früheren Geräten habe ich SystemUIVisibility benutzt, um auf immersive sticky zu stellen, was auch funktioniert hat. Muss man für die Insets-Methoden ein bestimmtes AppTheme im Manifest angeben?
 
scheinen überhaupt nichts zu bewirken
Sie funktionieren einwandfrei ab API 30

Muss man für die Insets-Methoden ein bestimmtes AppTheme im Manifest angeben?

Nein, du solltest allerdings mit dem Listener arbeiten, denn die Notches müssen berücksichtigt werden.
Nur damit kannst du das Layout je nach Device anpassen (marginTop)
WindowInsetsControllerCompat | Android Developers
View.OnApplyWindowInsetsListener | Android Developers

So habe ich das z.b. für die unten stehenden App angewendet
1734217259555.png1734217302994.png

1734217461827.png
[LAUNCH] Better Weather PLUS - Echtzeit Wetterinformationen (App-Vorstellungen)

P.S : In diesem Forum meldet man sich schon im Allgemeinen mit einem Ergebnis einer Problemstellung zurück und ein Danke wird dir bestimmt auch nicht schwer fallen, wenn man sich schon die Mühe gibt .
 
Zuletzt bearbeitet:

Ähnliche Themen

M
Antworten
3
Aufrufe
504
moin
M
D
Antworten
23
Aufrufe
3.787
Data2006
D
Zurück
Oben Unten