Spielfeld "eingrenzen"

  • Hey Zusammen,


    ich bastel ja gerade einwenig an einem Testspiel. Ist einfach nur ein Nachbau nach Vorlage um einwenig zu probieren usw.


    In diesem "Spiel" sausen einfach nur ein paar Luftblasen durchs Bild.
    Naja, hier das Problem:


    Ich habe ein FrameLayout in einem vertikalen Layout mit der ID "playfield".Siehe BILD
    Die Luftblasen sollen "nur" in diesem Feld hin und her fliegen. ABER die Blasen gehen oben und unten über die TextViews hinaus usw.


    Auch geplant habe ich, dass die Blasen quasi von der Wand "abprahlen" und gar nicht aus dem Bereich rauskommen.


    Wonach müsste ich hier suchen?


    Über


    Code
    density = getResources().getDisplayMetrics().density;

    sollen ja die Daten des Bereichs geholt werden, allerdings scheint es so, als wenn hier eben die Daten vom gesamten Display geholt werden. Das FrameLayout bleibt irgendwie außenvor :/Oder interessiere ich mich hier für den falschen Bereich?Über ein paar "leichte" Schläge auf den Hinterkopf würde ich mich freuen :)

  • Hi, genau du hast es erkannt damit holst du die Daten deines Display.


    Vielleicht mit


    layout = findViewbyid(R.Id.....);
    int h = layout.getHeight();
    int w = layout.getWidth();


    Wie mit was bewegst du deine Blasen?
    wenn du die auf das Canvas zeichnest musst du das Canvas auch in der Grösse erstellen und nicht den gesammten Bildschirm.

  • Nein, die Bubbles werden nicht mit Canvas gezeichnet.


    hier habe ich folgendes abgeändert bzw. eingefügt. Irgendwas ist falsch, ich weiß nur nicht was :/ App startet, ABER nun habe ich keine "sichtbaren" Bubbles.


    Ich gehe mal davon aus, dass ich entweder wo was vergessen habe, oder der eingefügte Code nicht korrekt ist.


  • Hi, so wird das nichts. Density ist die Auflösung deines Display und die ändert sich auch nicht egal wie groß die Fläche ist die du zur Verfügung stellen willst.


    Deine Zeichen Funktion hast du nicht gezeigt und dort must du das bewegen begrenzen.
    So kann ich dir da nicht helfen.


    getResources().getDisplayMetrics().density gibt die Auflösung in DPI zurück.
    Was ist eigentlich das "v" bei "protected float scale(float v)" ?

  • Stimmt, jetzt wo du es sagst. Bin ich noch gar nicht drüber gestolpert. Ich "bastel" nach einem Buch, da habe ich dass so abgeschrieben gehabt und gar nicht drauf geachtet dass ich nicht weiter beachtet habe :/

  • Wie gesagt wenn dein layout match_parent ist geht es nicht da nimmt er den gesamten Bildschirm an.
    Zeige mal dein XML.


    • x = rnd.nextFloat() * (container.getWidth()-size);
    • y = rnd.nextFloat() * (container.getHeight()-size); Stimmt das so ? Das du so die Layout grösse bekommst.

    Glaube du hast da schon einiges geändert als wie im Buch

  • XML


    • x = rnd.nextFloat() * (container.getWidth()-size);
    • y = rnd.nextFloat() * (container.getHeight()-size); Stimmt das so ? Das du so die Layout grösse bekommst.

    Glaube du hast da schon einiges geändert als wie im Buch


    Genau so steht der Code im Buch ;)
    Allerdings ist "dieser" hier ja nur für die Größen der "Bubbles" und nicht für das Spielfeld. Oder sehe ich dass falsch?


    Und jetzt wo ich dass hier so schreiben,.............^^


    Das Layout "container" befindet sich in der activity_main, das Spielfeld mit der ID "playfield" allerdings im game_layout (siehe oben).
    Das Game Layout ist auch so aufgeteilt wie es sein soll.


    Da sich aber alles auf den Container (welcher match_parent ist) bezieht, ist ja klar, dass alles "hinter" dem Spielfeld und "unter" den ganzen TextViews verläuft.
    Oder Denkfehler?


    Ich müsste jetzt ja (irgendwie) angeben, dass nicht der "Container" das Spielfeld ist, sondern mein "playfield".


    Allerdings sehe ich gerade nicht wo der Container referenziert wird.





    Klar habe ich schon einiges verändert, will ja wissen wie sich was verhält usw. :)

  • Ja der Code ist hauptsächlich für die Größe der Bubbelss.
    Würde aber auch sagen das die Bubbel auch bewegt werden über das Margin.


    Da sich aber alles auf den Container (welcher match_parent ist) bezieht, ist ja klar, dass alles "hinter" dem Spielfeld und "unter" den ganzen TextViews verläuft.
    Oder Denkfehler?
    kann ich dir nicht sagen dazu müsste ich die bubbel bewegungs Methode sehen.


    Ich müsste jetzt ja (irgendwie) angeben, dass nicht der "Container" das Spielfeld ist, sondern mein "playfield".


    Das müsste so sein du sagst das in der Main die ref von playfield an Container übergeben wird.


    Wie ist das die bubbes bewegen sich und verändern die Größe.
    Erkläre mal das Spiel.

  • Naja, ob man es "Spiel" nennen kann, weiß ich nicht. In dem Beispiel aus dem Buch geht es eigentlich nur darum, dass Seifenblasen über den Bildschirm fliegen und man diese platzen lassen kann. Nichts wildes. Und nach Zufallsprinzip wird halt die Größe geändert.


    Es läuft auch soweit alles so wie es soll. dass einzige was halt nicht korrekt funktioniert ist die Begrenzung des Spielfeldes und dass Sie nicht verschwinden wenn man diese klickt, sondern einfach nur stehenbleiben :/

  • dann zeige mal den Rest des Programms. oder schicke mir das Projekt als ZIP
    Wenn das ein Buch ist vielleicht für Spiele app Erstellung. Wird die app doch auch erklärt und die Bedeutung der Klassen Methoden.
    Da müsstest du doch wissen welche Methode für was ist .

  • Klar, kannst dir gerne mal anschauen.


    Im Buch wird auf vieles kurz eingegangen, aber nicht alles ausführlich erklärt.
    Es handelt sich um das Buch "Spieleprogrammierung mit Android Studio".


    Hier ist so dass was ich bisher so abgetippt und teilweise einwenig zum testen umgeändert habe.


    Ich habe jetzt nicht alles durchgeschaut, es kann auch sein, dass noch was "ausgeklammertes" dabei ist.
    Denke aber nicht.


    MainActivity.java






    BaseGameActivity.java


    Bubble.java


  • gameover_layout.xml


    activity_main.xml

    game_layout.xml


  • Hallo, so jetzt kommt etwas Licht in's Dunkle.
    Habe mir zwar den Quellcode noch nicht kommplet angesehen. Aber mir fällt schon was auf.
    Versuche mal zu erklären.


    In deiner Main in der onCreate lädst du das activity_main.xlm "setContentView(R.layout.activity_main);"
    dies ist ein lehres Framelayout ohne irgendeinen Inhalt was den gesammten Bildschirm einnimmt.
    Im weiteren Verlauf in der onResume wird die showMenuFragment() methode aufgerufen.
    In dieser wird als estes alle Ellemente in Container Layout "activity_main.xll" gelöscht ,dann wird das "game_layout.xml" layout in das Container Layout geladen. Dannach werden deine Button mit dem Onklicklistner verknüpft.


    Wenn du nun auf den Start Button Klickst wird die Methode newGame aufgerufen.
    Dort wird wieder als erstes alle Ellemente im ContainerLayout gelöscht. Danach wieder das "activity_main.xml" Layout geladen.
    Danach deine Bubbel Klasse aufgerufen.



    "bubbles.add(new Bubble((FrameLayout)container, scale(V_MAX), scale(SIZE_MAX), rnd, bubbleDrawable, this));"
    Dort wird als Speilfeld die Ref. des ContainerLayout Übergeben. Also der gesamte Bildschirm. Der Programiere aus dem Buch wollte das wohl so.
    du müsstest aber die Ref. von deinen Spielfelf übergeben.


    ViewGroup playFeld = findViewById(R.id.playField);
    bubbles.add(new Bubble((FrameLayout)playFeld, scale(V_MAX), scale(SIZE_MAX), rnd, bubbleDrawable, this));


    Das Abprallen von der Wand mußt du natürlich noch schreiben.


    So das sollte es fürs erste mal gewesen sein.


    Wass sind noch so für Apps in den Buch? Habe das auch mal gesehen im Handel.

  • Richtig, im "Buch" sind die TextViews etc. im main_layout angeordnet. Ich habe dafür ein game_layout angelegt und dort dann alles untergebracht.
    Das game_layout soll ja komplett den Container ausfüllen, was ja auch hinkommt soweit.


    Ich habe folgendes nun mal geändert.



    Soweit so gut, allerdings schweben jetzt nur ein Teil der Bubbles in dem Bereich wo Sie schweben sollen, und jede zweite oder sowas geht über den Rand hinaus


    Hmm, in dem Buch geht es eigentlich mehr um "Beispiel-"Spiele und - mehr oder weniger - verschiedene Funktionen.


    Im ersten Kapitel ging es um eine Art Puzzle bzw. ging es darum unter mehreren Teilen einen Frosch zu finden, zu klicken usw., dann kamen jetzt die Bubbles (erstmal nur statisch auf dem Display, mit Countdown, Runde usw.), und darauf baut jetzt irgendwie (obwohl der Übergang irgendwie einwenig verwirrend ist (zumindest für mich)) der nächste Schrit drauf auf. Sprich die Animation, Bewegungen usw.


    Das nächste Kapitel bedient den Lagesensor, danach Sound & Musik. Dann kommt glaube ich die Behandlung von GPS und 2D-Spiele usw.


    Von der Sache her ist das Buch nicht schlecht für den Anfang und um einwenig auszuprobieren und alles mal einwenig kennenzulernen,
    aber ich bin mir sicher dass jemand der schon mehr Erfahrungen hat, dieses Buch eher langweilig finden wird.


    Es wird halt auch nicht viel erklärt, also keine komplexe Erklärungen. Geht dann eher um das Wesentliche.

  • nein du sollst die Zeile nicht in der InitRound ändern das ist richtig so wie es war. Da werden alle Bubbel im Speilfeld gelöscht.
    Du solltest das in der "newGame" ändern denn da werden deine Bubbels erzeugt. Besser gesagt da wird deine Bubbel Klasse aufgerufen.


    Was ich schlecht finde, und du warscheinlich durcheinander kommst ist. Das es einmal eine globale Variable container gibt ( für das gesamte Layout), und in der "initRound" du eine lokale Variable mit dem selben Nahmen hast die aber nichts mider globalen zu tuhen hat.
    Zeile 124 in initRound
    ViewGroup container = findViewById(R.id.playField);
    container.removeAllViews();


    Damit sollen alle Bubbel in deinen Spielfeld gelöscht werden und nicht wieder neue erstellt werden.
    Diese neuen werden nähmlich richtig angezeigt und die anderen nicht.


    neue erstellen in der newGgame.

  • Hi, Leider geht es so auch nicht.
    In der Bubbel Klasse hast du keinen Zugrif auf das playField Layout.
    Das liegt daran das Java kein "Call by Reference" macht sondern nur "Call byValue".
    Somit hast du in der Bubbel Klasse nicht die Reverenz auf das Layout. (sondern nur eine Copy)
    Das es mit dem Container Layout geht liegt daran das dies in der onCreate erstellt wird.


    Da bekommst du auch die xu Y Kordinaten mit getWidth(); getHeight()
    bei dem PlayField Layout ist x u y immer 0;


    Bin leider auch nicht gleich drauf gekommen da ich von C zu Java gekommen bin, und dort gibt es Pointer also "Call By Ref."


    Möglichkeit wäre in dem Laout Activity_main.XML oben und unten Layouts (mit ID) als Platzhalter einzufügen. in diese deine Button, TextViews zu laden. Dann Kannst du die Spielfeld Ref an die Bubbel Kalasse übergeben.


    Oder du baust die App um auf Fragmente.
    Unter anderen wurden Fragmente auch für diesen Zweg entwickelt.


    Ps. In der Main musst du in der Methode "onBurst" den aufruf der Bubbel Klasse auch anpassen.

  • Danke dir für die vielen Informationen und Hilfestellungen.


    Die onBurst hatte ich bereits (also vor knapp 1 1/2 Std.^^) bereits geändert und die Blasen verschwinden beim draufklicken :)


    Es ist momentan halt nur noch so, dass eben die Bubbles (noch) nicht von der Wand abprahlen, und eben (noch) nicht in dem Bereich (oben/unten) bleiben wo Sie sein sollen.


    Was mir gerade mal aufgefallen ist, dass wenn ich das Spiel starte, die "erste" Blase "unter" den oberen TextViews liegt und alle anderen laufen drüber weg.
    Allerdings denke ich dass dieser "Fehler" auf Grund der Koordinaten zustande kommt.


    Dass mit den Fragmenten werden ich mir mal anschauen und ausprobieren. Habe mich bisher immer nur mal so nebenbei damit beschäftigt, will ja auch nicht zu viel auf einmal ausprobieren.
    Immer mal so Stück für Stück :)

  • Welche layout ref übergibst du momentan an die bubbel klasse?
    Bei mir ist es so das wenn ich eine ref aus dem zur Laufzeit geladenen layout übergebe geht es nicht. Warum habe ich oben schon geschrieben.


    Nein was du bis jetzt machst sind keine Fragmente.


    Wie gesagt erstelle dir platzhalter Layouts im main layout, somit kannst du auch die Koordinaten deines Layouts in der bubbel Klasse abfragen. Oder du musst die Koordinaten deines spielfeldes auch übergeben damit du in der bubbel klasse weist wo deine wand ist ..


    Wenn die erste blasse unter dem Text ist dann bist du von den mir geschickten Code abgewichen. Das was zuerst gezeichnet wird ist unten.


    Zum Abprallen must du immer die x und y Koordinaten der bubbel prüfen ob sie nicht der Wand sind und dann die Richtung umkehren.
    Versuch sowas erst mal an einen einfachen Beispiel mit einen Objekt in einen normalen erstelltten Layout. Ohne alles nur das sich bewegende View auf dem Bildschirm. Villeicht unten ein Start Button.


    Verstehst du eigentlich die Bewegung Animation wie die zu stande kommt?





    Schreibe dir dafür eine neue App

  • Nein was du bis jetzt machst sind keine Fragmente.

    Warum ist dem nicht so?
    Dann scheint dieser Punkt in dem Buch falsch zu sein, denn so wie es im Code (z.b. unter newGame) steht, steht es im Buch.


    Bzw. steht da genau ViewGroup container = (ViewGroup)findViewById(R.id.container) und bei mir container = findViewById(R.id.container);

    Wenn die erste blasse unter dem Text ist dann bist du von den mir geschickten Code abgewichen. Das was zuerst gezeichnet wird ist unten.

    Eigentlich habe ich jetzt nichts wirklich geändert außer

    Code
    ViewGroup spielfeld = findViewById(R.id.playField);bubbles.add(new Bubble((FrameLayout)spielfeld, scale(V_MAX), scale(SIZE_MAX), rnd, bubbleDrawable, this));

    wie wir ja oben schon hatten.Bei mir sind die Blasen immer oben links gestartet. Ich meine unten sind die bei mir von anfang an nicht gestartet.

    Verstehst du eigentlich die Bewegung Animation wie die zu stande kommt?

    Durch die Koordinaten und Bildgröße, und dem zu.- bzw abziehen dieser Daten. Oder was meinst du?

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!