Hilfe bei der Spiele-Entwicklung mit der Android-API

  • 10 Antworten
  • Letztes Antwortdatum
4

453202

Gast
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: Nightly, koje71 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: Nightly, 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:
  • Danke
Reaktionen: Nightly
Komme überhaupt nicht mehr weiter.

Es ist ein einziges Kuddelmuddel. Wenn ich im Manifest file ein activity theme angebe, funktionieren die flags des Windows nicht mehr (addflags), die Layout Params des Windows werden grundsätzlich nicht umgesetzt, egal was ich da eintippe. Mal funktioniert etwas, mal wieder nicht. Wie haltet ihr das nur aus mit dieser Api?
Es gibt immer mehrere Möglichkeiten etwas umzusetzen, einiges geht davon gar nicht, andere Einstellungen machen wieder andere Einstellungen rückgängig. Ich kann nicht mehr. Gibt es nicht eine vernünftige Programmiersprache oder App mit der man auf Android selbst irgendwas Kreatives machen kann? Man kann es auch nicht übers Internet lernen, egal wie viel Mühe man sich gibt. Ich will nur ein Fullscreen Programm schreiben ohne großen Schnickschnack, das muss doch möglich sein.
Bin kurz davor aufzugeben.
 
Zuletzt bearbeitet von einem Moderator:
  • Danke
Reaktionen: Nightly
In der Manifest deklariert man auch nur das Basis Theme.

Fullscreen :
Hast du mein Posting #6 nicht gelesen ? Da führe ich explizit den Weg auf.
Das macht man dann später im Source, zumal man auf die Zielplattform reagieren muss - das kannst du nicht in der Manifest tun.

Und das funktioniert einwandfrei (wie oben gezeigt) und ich habe damit NULL Probleme.


egal was ich da eintippe. Mal funktioniert etwas, mal wieder nicht. Wie haltet ihr das nur aus mit dieser Api?
Lesen , Lesen, Lesen & Studieren - bevor man irgend eine einzige Zeile schreibt - "Try & Hope" führt zu nichts.

Java/Kotlin ist nunmal DIE native Sprache für Android, insbesondere für deinen Anwendungsfall.
Viele Wrapper unterstützen das Rendering auf Canvas Basis gar nicht, wie du das haben möchtest.

ich will nur ein Fullscreen Programm schreiben ohne großen Schnickschnack, das muss doch möglich sein.
OpenGL ist dir Dir zu tricky, Java/Kotlin ist Dir nun zu kompliziert -
Wie kommst du darauf, ohne intensives Lesen der API Dokumentation in irgend einer Sprache eine App zu schreiben ?


Oder du nimmst für dein Spiel Unity - aber da muss man sich auch erst einarbeiten - dauert zumindest genau so lange.
Schränkt dich aber auf Spiele ein .

Echtzeit-Entwicklungsplattform von Unity | 3D, 2D, VR- und AR-Engine
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Nightly
Eine vernünftige Programmiersprache bietet Anweisungen mit Argumenten an, die dann auch das machen, was man genau durch die Parameter der Anweisungen selbst definiert. Android und Java ist Mist. Ich habe mal RFO BASIC für Android benutzt, sowas ist angenehm und alles ist perfekt erklärt, man kann überhaupt nichts falsch machen. Leider wird das nicht mehr weiterentwickelt und ist mit Android 13 nicht mehr kompatibel und aus dem Play Store entfernt worden. Ich habe jetzt mal überhaupt kein App Theme im Manifest angegeben, nun funktionieren keine Window flags mehr. Mit addflags LAYOUT_NO_LIMITS hatte ich den Bereich der Status bar, die ich ausblende, auch zur Verfügung. Durch das weglassen des App Themes im Manifest ist das jetzt auch wieder im Eimer. Das flag FEATURE_NO_TITLE wird auch überhaupt nicht berücksichtigt, habe trotzdem eine Title bar.
Ich will kreativ arbeiten, anfangen mein Programm zu gestalten.
Ich schreibe wirklich nur ein ganz einfaches Programm. Traurig, dass dabei soviel schief laufen kann. Vielleicht kennt jemand libGDX. Das ist plattformunabhängig und benötigt auf Android nur eine ganz einfache Starter class, die einem alles Android spezifische vom Leib hält, man wählt nur immersive mode aus und schreibt ab da ein reines libGDX Programm und muss die Architektur der App nicht selbst schreiben. Jedoch haben libGDX apps eine etwas andere Verzeichnis-Struktur. Man kann die library nicht einfach in sein normales Projekt integrieren, das ist ein riesen Theater.
Die Android api hat zwar alles, was man braucht, aber dauernd stören sich Methoden oder Einstellungen gegenseitig/heben sich gegenseitig auf, das ist echt nervig. Ich werde jetzt also ein Theme im Manifest definieren z. B. Theme.Black.NoTitleBar.Fullscreen, vielleicht geht dann was.
Beiträge automatisch zusammengeführt:

Wieso z. B. Ist das Theme.Black.NoTitleBar.Fullscreen das gleiche wie Theme.Black.NoTitleBar?
Wieso steht der Status Bar Bereich nur zur Verfügung, wenn man angibt addflags LAYOUT NO LIMITS und gleichzeitig das oben genannte Theme im Manifest angegeben wird und wenn nicht führt das flag dazu, dass der Status Bar Bereich nicht vom View benutzt wird? Der View fängt dann nämlich erst unter dem Staus bar Bereich an, auch wenn die Status bar ausgeblendet wird.
 
Zuletzt bearbeitet von einem Moderator:
  • Danke
Reaktionen: Nightly
Ich will kreativ arbeiten, anfangen mein Programm zu gestalten.
Und warum benutzt Du dann offensichtlich nicht die aktuellen Techniken ?

Ich möchte Dir nicht zu Nahe treten - allerdings vermute ich, Du liest/verstehst die Dokumentation nicht. , beschwerst dich aber einer Tour über Dinge, die nicht einmal in einem heutigen, gültigem und technischem Zusammenhang gebracht werden können.


z.B.
Mit addflags LAYOUT_NO_LIMITS hatte ich den Bereich der Status bar, die ich ausblende, auch zur Verfügung. Durch das weglassen des App Themes im Manifest ist das jetzt auch wieder im Eimer. Das flag FEATURE_NO_TITLE wird auch überhaupt nicht berücksichtigt, habe trotzdem eine Title bar.
Ich habe in meinem Post#6 angeraten, dass Du Dich an aktuelle WindowInsets anlehnen sollst.
Das scheint Dich aber überhaupt nicht zu interessieren und versuchst krampfhaft tagelang deprecated < API 26 Flags anzuwenden und explodierst, wie schei*** die Welt ist.

Um es auf den Punkt zu bringen : Das ist kein Programmieren deinerseits, das ein reines Try & Hope Gebastel.


Hier der in der Praxis funktionierende & aktuelle Ansatz - ab API 26 bis incl. Android 16

Code:
WindowCompat.setDecorFitsSystemWindows(getWindow(), false);

getWindow().setStatusBarColor(Color.TRANSPARENT);

WindowInsetsControllerCompat insetsController = WindowCompat.getInsetsController(getWindow(), getWindow().getDecorView());

if (insetsController != null) {insetsController.setAppearanceLightStatusBars(true); }

ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {

    Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());

    v.setPadding(0, 0, 0, systemBars.bottom);

    return WindowInsetsCompat.CONSUMED;

});

8 Zeilen, und vor Allem keine Flags - woher du Dir deine "Technik" auch immer aus den Fingern ziehst .........
Manifest : Theme.Material3.DayNight.NoActionBar

Wieso z. B. Ist das Theme.Black.NoTitleBar.Fullscreen das gleiche wie Theme.Black.NoTitleBar?
Auch hier verweise ich auf meine Beiträge : Zielplattform abhängig
Steht aber auch so in der API Dokumentation - wobei wir wieder beim Lesen wären.

Deine "Beschwerde" ist also absolut unbegründet ....... Denn es ist ausreichend & detalliert erklärt.

Und persönlich besitze ich noch kaum Motivation, Dir mit viel Geduld unter die Arme zu greifen, wenn man von Dir nur Gemotze liest und nicht einmal ein schlichtes Danke dabei ist.

So wird das eindeutig Nichts.......
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: jogimuc und Nightly
swa00 schrieb:
und nicht einmal ein schlichtes Danke dabei ist.
Na ein keines Danke hatte er ja in Post #4 gegeben.
 

Ähnliche Themen

M
Antworten
3
Aufrufe
557
moin
M
D
Antworten
23
Aufrufe
3.954
Data2006
D
Zurück
Oben Unten