Wie skaliere ich Pixelkunst in GM Studio ohne Unschärfe?


9

Ich erstelle ein Spiel in Game Maker Studio, das Pixelkunst verwendet. Wenn ich das Spiel starte, sind alle vergrößerten Texturen wirklich verschwommen. (Kleinen passiert das nicht.)

Zum Beispiel dieses Bild

nett :)

rendert im Spiel wie folgt:

verschwommen :(

Gibt es überhaupt die Möglichkeit, kleine Pixel in große Pixel anstatt in unscharfe Pixel zu ändern ?


Verwenden Sie keine verlustbehaftete Komprimierung für Texturen, sondern verwenden Sie bmp, gif oder png. Alle unterstützen verlustfreien Speicher
Ratschenfreak

Wenn Sie Pixelkunst haben, möchten Sie normalerweise eine Größenänderung vermeiden, da Pixelkunst immer darunter leidet. Wenn die Größenänderung nicht vermieden werden kann, sollte die Interpolation zum nächsten Nachbarn verwendet werden, um das knusprige Aussehen zu erhalten. Wenn Sie die Größe ändern möchten, verwenden Sie Vektorgrafiken anstelle von Rastergrafiken. Ich kann Ihnen leider nicht helfen, da ich mit GMStudio nicht vertraut bin.
Philipp

Beispiele hinzugefügt.
mpower

Ich kenne keine Möglichkeiten für Spielehersteller, aber Sie möchten die gesamte Skalierungsfilterung deaktivieren und die Skalierung für den nächsten Nachbarn aktivieren.
Apfelmus

1
Wenn ich mich richtig erinnere, hatte der ursprüngliche Spelunky (hergestellt in Game Maker) eine DLL, die eine lineare Skalierung ermöglichte. Die Quelle ist unter diesem Link verfügbar. Guck mal.
Anko

Antworten:


13

Ich habe eine Lösung aus einer Ressource gefunden. Gehen Sie zu Global Game Settings und dann zu einem beliebigen Plattform-Spoiler (z. B. "Windows" oder "Android"). Wählen Sie dort den Spoiler mit dem Titel "Graphics" und schalten Sie "Interpolate Farben zwischen Pixel" aus. Habe Spaß :)


Dies funktioniert technisch, obwohl sich die Pixelkunst aufgrund der Skalierung mit einem nicht ganzzahligen Faktor (z. B. 2,5x)
ändern kann

Du meinst, sie haben sich nicht die Mühe gemacht, das zur Standardeinstellung zu machen?!? Ich habe gerade überprüft, dass es in Game Maker 8.0 standardmäßig umgekehrt ist. Das ist nur verrückt ... Tolle Antwort übrigens.
user64742

5

Niemand möchte damit umgehen müssen, dass jedes Sprite manuell skaliert werden muss. Es ist nicht nur ein schlampiger Arbeitsbereich, sondern es ergibt sich auch als sehr unprofessionell. Ich habe eine Lösung gefunden, als das Deaktivieren der Interpolation in globalen Spieleinstellungen nicht funktioniert hat.

texture_set_interpolation(false);

:) Ich hoffe, das hilft dir bei deinen zukünftigen Bemühungen.


Dies ist die beste Lösung, wenn Sie mehrere Plattformen anvisieren möchten. Sie müssen nicht für jede einzelne Plattform auf "Farben zwischen Pixeln interpolieren" klicken! Genau das, wonach ich gesucht habe.
Logan Pickup

1

Was ich im Allgemeinen dafür mache, ist entweder Photoshop oder GIMP (Skala / Nächster Nachbar)

Aber um es im GM: S-Sprite-Editor selbst zu tun, verwende ich den Befehl Stretch anstelle von scale und setze ihn auf POOR-Qualität. Das wird das Blocky-Gefühl bewahrenScreenie aus einem Spiel, das an atm arbeitet, das Sprite ist in GM: S selbst vergrößert

Oben ist ein Spiel, an dem ich am Geldautomaten arbeite. Genau das habe ich getan!


Obwohl dies für die Hochskalierung bei bestimmten Auflösungen nicht für alle geeignet ist, hat GM auch die Angewohnheit, Texturen standardmäßig zu komprimieren. Dies würde bei Verwendung der Stretch-Funktionalität auch bei unterschiedlichen Auflösungen unterschiedlich skalieren. Dies führt zu Unschärfe, die wir vermeiden möchten. Allerdings +1 für die Erwähnung (Skala / Nächster Nachbar).
Tom 'Blue' Piddock

1

Deaktivieren Sie die Skalierungsfunktion auf der Registerkarte "Hintergründe" in der Karte. Wenn es nicht maßstabsgetreu erscheint, stellen Sie sicher, dass Ihre Textur für den Hintergrund dieselbe Größe hat wie der Raum / die Karte, in dem Sie sich befinden.

Alternativ können Sie diesen Beitrag hier verwenden , um ein Hintergrundskript zu erstellen, das den Hintergrund mit (hoffentlich) klaren Ergebnissen skaliert.

Hier werden Oberflächen verwendet. Wenn Sie zusätzliche Hilfe benötigen, enthält dieser Beitrag viele Informationen.


BEARBEITEN:

Als ich auf meine Antworten zurückging, stellte ich fest, dass dies nicht auf dem neuesten Stand ist und den Inhalt des Tutorials benötigt. Hier ist es:

SCHRITT 1 : Wählen Sie die gewünschte Skala. Verwenden Sie eine Ansicht für jeden Raum und lassen Sie Port W und Port H entsprechend skalieren. Wenn Sie beispielsweise eine Skala von 2 verwenden würden, würde dies im Raumeditor von GM so aussehen.

Es ist wichtig, dass dies für alle Räume gleich ist. Wenn Sie viele Zimmer haben, ist dies möglicherweise einfacher über den Code *. Ich mache es lieber so, weil dann die Werte nicht konstant sind und ich mehrere verschiedene Skalen unterstützen kann.

SCHRITT 2 : Erstellen Sie drei Skripte, screen_init, screen_begin und screen_end. Hier ist, was in jedem der Skripte steht ...

Zitat aus: screen_init

// screen base(view_wview and view_hview)
screen_x = 0;
screen_y = 0;
screen_w = 320;
screen_h = 240;
screen_scale = 2;

// create a surface for the whole screen to be drawn on
screen = surface_create(screen_w,screen_h);

// this will destroy the screen object if surfaces are not supported on the graphics card, reverting to the viewport method
if screen = -1{instance_destroy();}

Zitat aus: screen_begin

// this draws the surface on the screen
surface_reset_target();
draw_clear(0);
draw_set_blend_mode_ext(bm_one, bm_zero);
draw_surface_stretched(screen,screen_x,screen_y,screen_w*screen_scale,screen_h*screen_scale);
draw_set_blend_mode(bm_normal);
screen_refresh();

Zitat aus: screen_end

// this sets surface 'screen' as the drawing target for everything in the game, so all drawing will be done on this surface and not on the game screen
surface_set_target(screen);

SCHRITT 3 : Jetzt haben wir Skripte, aber wohin gehen sie? Erstellen Sie ein Objekt. Wie obj_screen, objScreen, o_screen oder was auch immer, und gehen Sie wie folgt vor:

  • A) Platzieren Sie das screen_initscript im Create-Ereignis.
  • B) Platzieren Sie das Skript screen_begin im Ereignis Begin Step.
  • C) Platzieren Sie das Skript screen_end im End Step-Ereignis.

Platzieren Sie dieses Objekt im ersten und wichtigsten Raum Ihres Spiels, markieren Sie es als dauerhaft und stellen Sie sicher, dass keine Duplikate davon vorhanden sind.

Sie sind fertig und haben jetzt eine schöne, klare Skalierung = D.


Ich möchte es skalieren, ohne es zu verwischen, da ich Pixelkunst liebe. Das beantwortet meine Frage also nicht. Ist das möglich?
mpower

Es ist unwahrscheinlich, dass Game Maker Studio mit einem schlechten Skalierungsalgorithmus skaliert, wodurch die unerwünschte Skalierung häufig unscharf wird. Verwenden Sie das Tutorial, das ich gerade in meiner Antwort bearbeitet habe, um einen gestochen scharfen Hintergrund mit Skalierung zu erhalten.
Tom 'Blue' Piddock

Haben Sie darüber nachgedacht, Ihre Hintergrundtextur in einem Grafikprogramm vorab zu skalieren?
Philipp

Zwei Möglichkeiten sind gut. Kombinieren Sie zunächst einige der Skripte hier oben. Zweitens werden Bilder vor der Verwendung vorskaliert.
mpower

Ausgezeichnet, froh, dass es geholfen hat.
Tom 'Blue' Piddock

-2

Verwenden texture_set_interpolation(false)Sie diese Option , um sie so zu zeichnen, wie sie sind.


Das mag richtig sein, aber könnten Sie noch näher darauf eingehen? Normalerweise suchen wir in unseren Antworten nach etwas mehr Details.
Gnemlock
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.