Eine Textur über eine Pixel-Maske legen und im Objekt als Sprite Zeichnen

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Eine Textur über eine Pixel-Maske legen und im Objekt als Sprite Zeichnen

    Hallo Gemeinden,
    Ich programmiere ein Top-Down Spiel, bei dem Man von Planeten zu Planeten mit einem Raumschiff fliegen kann. Ich will dazu die Planeten so erstellen:
    Ich erstelle eine Surface und zeichne ein Kreis darauf, dar mir als Maske dienen soll. Nun will ich eine Sprite mit einer Planetentextur über den Maskenkreis legen. Ich will später diese dann gleichmäßig nach links oder rechts bewegen können, um die drehung des Planeten zu simulieren. Später sollen auch noch Wolken etc hinzukommen.
    Leider bekomme ich das mit der Maske nicht hin. Währe echt schön, wenn mir da jemand helfen könnte.

    Lieben Gruß Jarek
    http://gamemakerscript.blogspot.de/
  • Du bekommst dass mit der Maske(also die Surface) nicht hin? In welcher hinsicht denn? Falls du Probleme hast, die Maske auf eine Surface zu zeichnen, gibt es hier viele gute Tutorials. Da ich aber aus deiner Beschreibung nicht wirklich das genaue Problem ziehen kann, kann ich auch nicht genauer Antworten.
    MFG Dufner
    Husi012 hat mich nicht mehr in seiner Signatur, ich bin trotzdem noch fame.
  • Danke für deine schnelle Antwort. Ich habe ein Bild gemacht, um das besser zu Präsentieren.
    Könnte ich für mein Spiel nicht einfach mit DirectX 3D Kugeln erstellen. Wie würde das aussehen? Währe es Möglich in der Draw-Event die draw_self() durch zB eine Zeichne Kugel Funktion zu ersetzten? muss ich das Spiel dann Komplett für 3D Programmieren oder kann ich die 2D und 3D Engine (oder wie auch immer) mischen? Wie sähe das aus. Ich habe in 3D progrmmierung in GM noch keine Erfahrungen gemacht.

    LG Jarek
    Bilder
    • Erde Beispiel.jpg

      71,87 kB, 879×630, 143 mal angesehen
    http://gamemakerscript.blogspot.de/
  • Also, wenn ich das jetzt alles richtig verstanden habe, willst du von oben (Topdown) eine Art Weltraum machen. Hier siehst du dann auch die einzelenen Planeten und diese willst du auch drehen lassen, und somit soll sich auch die Oberfläche des Planeten mitdrehen. 3D und 2D kann man mischen, aber du wirst wenn ich mich nicht irre immer einen 3D Raum haben. Dadurch werden dir dann die X,Y,Z-Koordinaten bestimmt Schwirigkeiten machen und ich finde, dass 3D nicht so "sicher" ist wie 2D.
    Nun zum Problem, es ist sicherlich machbar aber auch nicht ganz einfach. Sollten sich die Planeten nur auf der Stelle drehen lassen können, wird es einfach. Du benutzt einfach die Depth-Funktionen und lässt somit die Textur einfach hinter einem Loch, welches den Planeten darstellen soll, zeichnen. Da die Textur sicherlich auch wieder von vorne anfangen soll, musst du diese einfach an einem gewissen Punkt zurücksetzten, dann sollte es einen nahtlosen Übergang geben. Für die Schatteneffekte lässt du einfach ein weiteres Sprite, welches einen Schwarzen-Transparent Verlauf hat, über der Textur zeichen. Willst du aber mit dem Planeten interagieren, also z.B. einen bestimmten Punkt markieren wird es etwas komplizierter, ist aber dennoch machbar.
    Für solch ein Projekt ist nicht zwingend eine Surface notwendig. Hab sie aber beim Beispiel trotzdem benutzt. ^^

    Surfacetutorial
    Dateien
    Husi012 hat mich nicht mehr in seiner Signatur, ich bin trotzdem noch fame.
  • "Hallo Dufner.

    Vielen dank für deine Antwort. Das sieht einfach WUNDERSCHÖN aus. Das ist genau das, was ich gesucht habe.

    Danke Danke Danke!!!!

    Mfg Jarek"

    NACHTRAG:
    Hallo Dufner
    Leider musste ich nach genauerem hinsehen feststellen, daß es doch nicht genau das was ich brauche. Du hast einfach die Planetenoberfläche Textur gezeichnet und dann eine Generierte Sprite mit einem Lock darüber gelegt. Auf den ersten blick sieht das ja super aus. Nur leider muss ich "Viele" Planaten auf einen Grafischen (Pixel Sternen) Background legen. Deine Schwarze Maske überdeckt das. Das ist ja auch mein wesentliches Problem. Ich bekomme es nicht hin. Das nur der Planet als Sprite existiert. Bei deiner Methode stört das Schwarze (von deiner LochMaske). Könnte man das nicht lösen indem man eine Weitere Maske mit Alpha=0 darüber zeichnet bzw die Pixel ersetzt?
    http://gamemakerscript.blogspot.de/

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von jarek1980 () aus folgendem Grund: Problem noch nicht gelöst.

  • Doch, du kannst wie schon oben gesagt(nur nicht im Example verwendet) die Depth-Einstellungen für genau soetwas benutzen. Das heißt, dass du deine Planeten und die Surface einfach weit hinten zeichnen lässt und deine Sterne, Spieler, etc. dann vor dem Schwarz sind.

    Depth-Funktionen

    Allerdings ist somit alles Andere vor deinen Planeten.
    Husi012 hat mich nicht mehr in seiner Signatur, ich bin trotzdem noch fame.
  • Ich will aber das die Planeten Aktive Objekte sind. Man soll später in deren Umlaufbahn einschwenken können. Diese sollten schon im Vordergrund sein. Den Background, ein Seamless Texture mit Sternen sollte im Hintergrund sein und falls die Performance es noch zulässt, ein weiteres mit Transparenten Bereichen und sich mit anderer Geschwindigkeit bewegend, um ein 3D Effekt zu erziehlen. Der Spieler sollte ganz oben auf dem Spielfeld sein. Ich werde bestimmt auch Planeten machen, die im Hintergrund sind (unaktive für die Optik) aber die sind erstmal unwichtig.
    Ich fände es auch besser, wenn die weit entfernten Sterne im Hintergrund sind, anstatt das diese vor dem Planeten schwirren. Weit entfernte Sterne sind ja in der Wirklichkeit ja Sonnen, die deutlich größerals Planeten sind. Die große Entfernung ist ja der Grund, warum sie am Himmel so winzig aussehen.

    PS: Ich habe ein weiteres Problem und wollte erstmal keinen neuen Thread öffnen. Wie mache ich das, daß mein Raumschiff (gesteuert mit h und v speed / Maus & Touch) beim anklicken eines Planeten FLÜSSIG (d.h. ohne einen Sprucng in eine Vordefinierte sinus/cosinus schlaufe) in dessen Umlaufbahn einschwenkt. Ich hatte mir das so vorgestellt, das ich dem Planeten einen Viruellen Punkt gebe, der um den Planeten kreist. Sobald dieser Planet als TargetPoint gewählt ist, soll das Schiff diesen dann verfolgen. Was denkt Ihr? gibt es vielleicht eine einfachere Lösung?
    http://gamemakerscript.blogspot.de/
  • Zu deinem Problem mit der Textur und dem Planeten, wäre eine weitere möglichkeit,...

    den Planeten und die Textur in einem 3D - Programm z.B Blender zu packen und dort alle Sprite herauszurendern,... bei einer vollen umdrehung könnte dies aber bedeuten das du an die 360+ sprites bekommst, wenn sich der Planet jeweils um 1 Grad weiterdreht,... je kleienr die Teilung umso mehr natürlich

    Wäre aber sicherlich mal en versuch wert,...

    Falls du damit Probleme hast, oder Hilfe brauchst, könnte ich dir gegebenenfalls dabei Helfen

    EDIT:

    Ich habe dir in C4D mal kurz in 5min ein Beispiel gemacht, wie das aussehen könnte,... is noch net perfekt, Lichtverhältnisse drehgeschwindigkeit,... stimmt noch net aber es wäre ein Ansatz

    Alternative wäre auch, es ohne Lichtverhältnisse zu rendern und im Gamemaker dann ne Schattenmaske draufzulegen, dann kann man besser einfluss darauf nehmen.




    Zu deinem Problem mit dem Einschwenken, könntest du mit einem Pfad arbeiten,... du erstellst an der Aktuellen Position und ein Stück weiter vorne einen Pfadpunkt und dann noch ein stück davor und direkt an dem Punkt andem das Schiff einlenken soll, und ... wenn du anschließend den Pfad noch auf Smooth stellst dann sollte das schiff den Punkt durch eine Kurve allerdings immer Tangential anfliegen,... hoffe ich konnte dir helfen.



    Grüßle Blayde

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Blayde () aus folgendem Grund: Verbesserung, Anhängen eines Beispieles

  • Mit dem "Vor-Rendern" ist zwar eine gute Idee, da ich aber für Android programmiere, wollte ich Resourcen schonend Programmieren und deshalb ist dies für nicht die Optimale Lösung. Ich denke, daß ich das Spiel vielleicht doch in 3D Programmieren sollte aber ohne der Tiefen Achse. Das würde viele Probleme lösen. Ich müsste dann aber auch die Schiffe in 3D Basteln. Da müsste ich mich mit jemandem zusammenschließen, da meine Low-Poly Modelle nie wirklich Professionell aussehen. Ich benutzte auch keine fertigen Grafiken/Modelle, sondern mache 100%ig alles neu.

    Das mit dem einschwenken, werde ich versuchen. Hoffentlich klappt das mit der Geschwindigkeit. Das Schiff sollte bevor es in die Umlaufbahn einschwenkt, auch die Geschwindigkeit reduzieren. Ich denke aber wenn der Planet als Target markiert ist und die Distance < n ist könnte man schon den Speed verkleinern.

    Danke, habt mich wieder ein Schritt weiter gebracht.
    http://gamemakerscript.blogspot.de/
  • Da du für Android programmieren willst nutzt du also, entgegen deinem Profil, GameMaker Studio. Dann kann ich mich nur wiederholen. Shader sind hier genau das was du suchst. Ich hab leider momentan nicht die Zeit einen solchen Shader für dich zu schreiben. Da du aber mit hoher Wahrscheinlichkeit nicht der Einzige bist, der Planeten im 2D drehen möchte, würde es mich doch stark wundern wenn es so einen Shader nicht schon irgendwo im Netz gibt. Der muss auch nicht einmal direkt für GameMaker geschrieben sein.
  • Vielleicht kannst du auch einen ähnlichen Trick wie Diablo 3 bei den Mana- und Lebensanzeigen einsetzen und dir per Code ein Mesh generieren und die Texturkoordinaten verzerren:
    simonschreibt.de/gat/diablo-3-resource-bubbles/
    Einige meiner Spiele: