Ankündigung

Einklappen
Keine Ankündigung bisher.

Phaser3

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Phaser3

    Huhu ihr...

    ich hänge an einem Problem mit Phaser3
    ich habe ein Spiel entworfen und komme an einem Punkt nicht auf einen grünen Zweig.

    Folgendes:
    Es hüpft ein großer Ball von links nach rechts, bis er abgeschoßen wird, dann soll aus dem einen Ball zwei kleinere werden, das soll so lange gehen bis jeder Ball bis auf den kleinsten halbiert wurde und dann endgültig verschwindet.
    Folglich habe ich mich bereits an verschiedensten Varianten probiert und bin kläglich gescheitert.
    Alternativ könnte ich auch einen Counter einbauen der die vorhandenen Bälle zählt und bei 0 einfach eine neue Welle spawnen, das funktioniert bereits, ich möchte es aber SO wie oben geschrieben.
    hier ein Link zur Alternative: http://phaser.yoshiii.net/ (nur ein Prototype, zwei Spieler, A = links bewegen, D = rechts bewegen, W = schießen, oder anderer Spieler mit Pfeiltasten)

    Ich möchte also das aus der Position X und Y jeweils zwei weitere kleinere Bälle spawnen...


    PHP-Code:
            //Ball erzeugen
            
    ball['megaBall'] = balls.create(700200'ball_green');
            
    ball['megaBall'].setCollideWorldBounds(true);
            
    ball['megaBall'].setBounce(1);
            
    ball['megaBall'].setCircle(150);
            
    ball['megaBall'].setVelocityX(350);

    //Abfrage und Ball zerstören--> eventuell hier, aber wie frage ich richtig ab
    function hitBall(balllaserRedlaserBlue)
    {
        
    ball.destroy();
        
    laserRed.destroy();
    }


    //Kollisionsabfrage
        
    this.physics.add.collider(laserRedballshitBall);
        
    this.physics.add.collider(laserBlueballshitBall); 
    Vielleicht hat der ein oder andere einen Tipp für mich, wäre sehr dankbar



    MfG




  • #2
    Woran scheitert es denn? Von der Logik her musst du bei einem Treffer ("hitBall") schauen was das für ein Ball ist. Also ist das schon die kleinste Variante, oder muss er geteilt werden? Wenn er geteilt werden muss, nimmst du die Position des Balls und spawnst an der Stelle die kleineren Bälle. Das heißt add() muss noch die möglichkeit bieten, eine Position übergeben zu bekommen und welches "level". Es kann ja ein Ball von level 1 im Spiel geben und x Bälle von level 4. (so wie ich das Original kenne)

    Kommentar


    • #3
      Bin später daheim und probiere es dann weiter. Ich bin noch Anfänger und ich steig noch nicht ganz hinter die Kollisionsabfrage, wann wird das Callback aktiviert.
      z.B. Hier „ this.physics.add.collider(laserRed, balls, hitBall);„

      das bedeutet hitBall function wird aufgerufen wenn laserRed mit balls kollidiert, ist das richtig?

      Die Positionsabfrage funktioniert auch nur zu 50%. Das bedeutet ich hab ein Arraygemacht und jeder Ball wird per push Funktion ins Array gepackt, dass Problem hierbei ist, dass wenn ich zwei Bälle habe und zuerst den Ball [0] zerstöre dann hört die Abfrage auf, zerstöre ich hingegen ball[1] läuft die Abfrage nach Position problemlos. Eventuell sollte ich nicht destroy() verwenden sondern den Ball nur ausblenden... hmmm... bin für jeden Tipp dankbar.

      ach, Noch was: wie frage ich richtig ab ob der Ball getroffen wurde? if(hitBall) geht nicht, if(['megaBall']) geht nur bedingt...

      Kommentar


      • #4
        Zitat von Kaputtccino Beitrag anzeigen
        Bin später daheim und probiere es dann weiter. Ich bin noch Anfänger und ich steig noch nicht ganz hinter die Kollisionsabfrage, wann wird das Callback aktiviert.
        z.B. Hier „ this.physics.add.collider(laserRed, balls, hitBall);„

        das bedeutet hitBall function wird aufgerufen wenn laserRed mit balls kollidiert, ist das richtig?
        Schau in die Anleitung. Vom Verhalten und Naming passiert aber genau das.

        Zitat von Kaputtccino Beitrag anzeigen
        Die Positionsabfrage funktioniert auch nur zu 50%.
        Was heißt das? Die Version die du online hast läuft doch sauber.

        Ganz naiv:
        PHP-Code:
        function hitBall(balllaser//die Reihnfolge wird falschrum sein...
        {
            if (
        ball.level 5) {
               
        add(ball.xball.yball.level 1);
            }
            
        ball.destroy();
            
        laser.destroy();

        X und Y bekommst du von der Gameengine. Level hab ich jetzt dazu gedichtet. Ich geh aber davon aus, wenn du ein neuen Ball erezugst, dass du auch eigene Eigenschaften definieren kannst.
        PHP-Code:
        ball balls.create(700200'ball_green');
        ball.level 1;
        .... 
        Du musst add so anpassen, dass es dir die Bälle an XY erzeugt.


        Zitat von Kaputtccino Beitrag anzeigen
        Das bedeutet ich hab ein Arraygemacht und jeder Ball wird per push Funktion ins Array gepackt, dass Problem hierbei ist, dass wenn ich zwei Bälle habe und zuerst den Ball [0] zerstöre dann hört die Abfrage auf, zerstöre ich hingegen ball[1] läuft die Abfrage nach Position problemlos. Eventuell sollte ich nicht destroy() verwenden sondern den Ball nur ausblenden... hmmm... bin für jeden Tipp dankbar.
        Das mit den Array kannst du dir eigentlich sparen. Du verwendest die Group Klasse https://photonstorm.github.io/phaser...ade.Group.html das sieht doch schon sehr nach "array" aus.

        Kommentar


        • #5
          juhu, nach deiner Idee umprogrammiert, funktioniert jetzt wunderbar...
          http://phaser.yoshiii.net/
          Eine Sache verstehe ich aber nicht. Ich möchte sobald der Ball den Boden berührt, soll dieser einen Aufschwung erhalten, also setVelocityY(-XX), dass funktioniert aber ledigleich bei einem Ball, die anderen werden ignoriert.

          aktuell steht es so im update():
          PHP-Code:
            radius ball.height 2; if(ball.700 radius 1) { ball.setVelocityY(-800); } 
          ich hab es so mal hochgeladen, damit ihr euch selbst mal ein Bild davon machen könnt , zu Testzwecken, damit man einen Unterschied merkt, habe ich -800 gewählt. (debug = on)

          Danke euch...

          Kommentar


          • #6

            Sieht gut aus. Ich hab nochmal in den Quellcode geschaut. Du bildest die größe des Balls jetzt über verscheidene Bälle bzw. Gruppen ab. Das würde ich so nicht machen. Du kopierst damit unnötig Code und das ist auch unflexibel. Du kodierst jetzt sozusagen die Eigenschaft Ballgröße als Ballart ab. Mit einer Eigenschaft funktioniert das, aber nicht mit mehreren. Angenommen du willst zufällig Bälle erzeugen die mehrmals getroffen werden müssen, oder von beiden Spieler, etc. Das bekommst du so nicht abgebildet. Ich würde an deiner Stelle schauen wie ich eigene Eigenschaften für ein Gameobjekt definieren kann. Das muss gehen. Dann kannst du für jeden einzelnen Ball die Größe, Anzahl Treffer, etc mit speichern.
            Bitte nicht falsch verstehen. Wenn deine Version für dich funktioniert, ist das auch völlig ok. Das soll nur eine Anregung sein wie du das von der Struktur besser machen könntest.


            Zitat von Kaputtccino Beitrag anzeigen
            Ich möchte sobald der Ball den Boden berührt, soll dieser einen Aufschwung erhalten, also setVelocityY(-XX), dass funktioniert aber ledigleich bei einem Ball, die anderen werden ignoriert.

            aktuell steht es so im update():
            PHP-Code:
             radius ball.height 2; if(ball.700 radius 1) { ball.setVelocityY(-800); } 
            ich hab es so mal hochgeladen, damit ihr euch selbst mal ein Bild davon machen könnt , zu Testzwecken, damit man einen Unterschied merkt, habe ich -800 gewählt. (debug = on)
            Woher kommt deiner Meinung nach ball in update? Du ziehst dir ball aus der Luft. Wenn du das für alle Bälle machen willst, musst du auch durch alle Bälle durchgehen. Das sieht dann so aus:

            PHP-Code:
            megaBalls.children.iterate(function (ball) {
               
            radius ball.height 2;
               if(
            ball.700 radius 1) {
                  
            ball.setVelocityY(-800);
               }  
            }); 
            Hier hast du aber auch wieder das oben angesprochene Problem. Das musst du aktuelle für jede Ballart machen.

            Eine weitere Verbesserung wäre, das nicht in update() zu machen. Du berechnest die Kollision mit den Boden in der update() Methode für jeden Ball jeden Frame neu. Das scheint mir unnötig. Die Engine muss so oder so erkennen, dass der Ball die Wand berrührt. Es wird also wahrscheinlich die Möglichkeit geben dabei eine Funktion aufrufen zu lassen. Das sieht dann ähnlich wie deine hit Methode aus.

            PHP-Code:
            function ballHitWand(ball) {
               
            radius ball.height 2;
               if(
            ball.700 radius 1) {
                  
            ball.setVelocityY(-800);
               }  

            Du musst halt schauen wie diese Methode aufgerufen bekommst bei einer kollision mit dem Rand.

            Kommentar


            • #7
              Cool, danke dir, ich hab heute beim Autofahren schon darüber nachgedacht, dass diese Version eher suboptimal ist, mit den verschiedenen Bällen. Ich werde es überarbeiten und mich mal genauer in die Dokumentation einarbeiten. Außerdem möchte ich mich ja verbessern/lernen, daher brauche ich Kritik

              Ich werde deine Idee umsetzen und berichten.
              Bis dahin viel Spaß.

              Kommentar

              Lädt...
              X