PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [VX Ace] Alpha-Channel durch externes Picture?



BDraw
24.12.2012, 22:25
Hallo,

ich möchte in meinem Projekt mit Pictures eine Animation erstellen, allerdings nur in einem bestimmten Bereich der Map. Ist es möglich dem Maker zu sagen, dass er die Bilder nur innerhalb eines bestimmten Bereichs anzeigen soll, etwa mithilfe eines weiteren Bildes welchen als "zusätzlicher" Alpha-Kanal fungiert?

So in etwa:
http://share.cherrytree.at/showfile-8456/bsp.png

Die Pictures sollen sich per MoveEvent bewegen, während der sichtbare Bereich der selbe bleibt (sprich sich nicht mitbewegt).
Ist sowas möglich - und wenn ja, wie aufwendig ist das und wie geht das?

Danke schon mal! (:

EDIT:
Was mir alternativ auch helfen würde wäre, wenn man für Pictures angeben könnte, dass sie UNTER der Map (aber über dem Panorama) angezeigt werden. Ich könnte mir vorstellen, dass das etwas einfacher zu bewerkstelligen ist, weiß da jemand evtl. was? oo
Bspw. für Pic 1 - 20 oder so...

Cornix
25.12.2012, 10:17
Was du brauchst ist ein Viewport.
Der ist genau für das Verhalten von Nutzen welches du beschreibst.
Du definierst einen Viewport als ein Rechteck mit X, Y, Breite und Höhe.
Ein Viewport besitzt auch einen Z-Wert.
Viewports selbst sind nach ihrem Z-Wert sortiert und es werden alle Bilder (Sprites, Tilemap, Pictures, etc) innerhalb eines Viewports so gezeichnet, dass sie niemals über einem Bild eines höheren Viewports und niemals unter dem Bild eines niedrigeren Viewports liegen.

Im Anschluss kannst du einem Sprite bei dessen Erstellung einen Viewport zuweisen, das geschieht im Konstruktor der Sprite-Klasse.
Ich weis nicht wie es bei den neueren Makern ist, aber bei den älteren konnten die Dimensionen eines Viewports im Nachhinein nichtmehr verändert werden und auch einem Sprite konnte kein neuer Viewport mehr zugewiesen werden.

Ohne Ruby wird das, meines Erachtens nach, nicht möglich sein.
Mit Ruby ist das jedoch "relativ" leicht, falls man sich denn damit auskennt.

Ein Code-Beispiel für den Einsatz eines Viewports wäre:

@my_viewport = Viewport.new(32, 48, 256, 128)
@my_viewport.z = 200
@my_sprite = Sprite.new(@my_viewport)
@my_sprite.bitmap = Bitmap.new("Graphics/Other/SomePicture.png")
Das müsstest du nur schön in ein Programm verpacken welches du bequäm über die "call script" Funktion der Events benutzen kannst.
Als persönlicher Tipp wäre es wohl am besten eine eigene Klasse dafür zu schreiben welche sich darum kümmert, mit einer "update" Methode um das Bild zu bewegen.
Dann kannst du eine globale Variable verwenden um eine Instanz dieser Klasse ansprechen zu können und diese dann in einem Parallel Process updaten lassen.

BDraw
25.12.2012, 12:42
Eh... okay, danke, schätze ich xD

Ne, ernsthaft, dankesehr. Jetzt hab ich ne grobe Richtung. Nun muss ich mir nur noch soviel RGSS3 erarbeiten, dass ich deine Hilfe auch umsetzen kann. Theoretisch weiß ich - glaube ich - was ich machen muss, bloß wie setz' ich das jetzt um...? xD
Ich schau mal. Wird schon irgendwie klappen, haha :D

Edit: Okay, das wird was dauern, ich muss mich fürchte erst einmal einlesen wie der Kram überhaupt aufgebaut ist. x_x

ETeCe
25.12.2012, 12:51
Zur Ergänzung:

Soweit ich weiß lassen sich die Maße eines Viewports auch im nachhinein über das Attribut rect beeinflussen:
viewport.rect.set(50, 50, 540, 380)

Ab dem VX ist es aber auch möglich Sprites nach der Erstellung ein neues Viewport zuzuweisen:
sprite.viewport = Viewport.new(0, 32, 128, 92)

Als Alternative oder Zusatz zum Viewport hat auch jeder Sprite ein "Source-Rect" welches das Bild ebenfalls auf ein angegebenes Rechteck begrenzen kann:
sprite.src_rect.set(0, 0, 220, 16)
Auf diese Weise werden z.B. auch die Charaktersets zugeschnitten.

BDraw
26.12.2012, 11:52
Okay, ich komme definitiv nicht weiter. ._.

Die ganzen Befehle sind ja schön und gut, aber ich habe keinen blassen Schimmer was ich jetzt damit machen muss (bzw. wie ich das, was ich machen muss, umsetze. Davon abgesehen war mein Beispielbild vermutlich etwas irreführend, da mir ein rechteckiger Viewport nicht weiterhelfen würde - ich müsste den schon in deutlich komplexeren Formen haben (bspw. eine unebene Horizontlinie, ein Haus, etc.).
Da ich da aber alternativ ja einfach mit verschiedenen z-Werten arbeiten könnte ist das jetzt nicht das Problem - bloß wie kriege ich jetzt einem bestimmten Bild einen Viewport bzw. z-Wert zugewiesen (oder von mir aus auch umgekehrt)?

Google hat mir bislang nur begrenzt geholfen (da ich auch nicht ganz weiß wonach genau ich googeln soll), außer mit kompletten Ruby-Tutorials. Die werde ich mir auch sicher ansehen, allerdings stehe ich etwas unter Zeitdruck (Contestprojekt) und habe noch einige andere Baustellen in dem Projekt.
Wäre jemand von euch so nett mir da zu helfen? Entweder über eine Erklärung oder mir dem Script selbst? Ich kann im Gegenzug allerdings nicht viel bieten, von Charsets bzw. Edits in 2k/3-Größe und anderen grafischen Arbeiten abgesehen (Karten, Himmel, Menüs, etc.). :/

Bex
26.12.2012, 13:08
Du weisst schon das man Pictures über oder unter anderen Pictures anzeigen kann anhand der Picture ID?
Was man bei dir nicht versteht ist:
Was soll es bringen Pictures über dem Parallax aber unter der Map anzuzeigen?
Kannst du in einem Grafikprogramm mal ein Bild mit Ingame Grafiken anfertigen um zu erkennen was das soll?
Ich gehe davon aus das du bei dem was du willst einen Denkfehler hast und das ganze irgendwie anders zu machen geht.
Sofern wir rausfinden was du überhaupt erreichen willst.

Bisher sieht das für mich aus wie ein Stealth Picture, man sieht ein Picture und wenn es sich unter das Stealth Picture schiebt sieht man das Picture nichtmehr, aber man sieht trotzdem
die Map dadrunter.Oder in anderen Worten:
Du willst ein Picture mit einem anderen Picture abdecken aber das abdeckende Picture ist wie ein Transparentes Picture und man sieht die Map dadrunter? (Kein Plan wie man sowas erstellt)
Nun sagst du aber du brauchst die in Form eines Hauses, wo ich mir nun wieder denke: Der will das doch nicht so wie ichs mir oben zusammengedacht habe.

BDraw
26.12.2012, 13:34
Ingame-Screen geht leider nicht, da a) Contestprojekt und b) ja eben ingame noch nicht umsetzbar.

Ich versuch's trotzdem mal zu erklären:
Ich verwende Panorama-Mapping (bzw. Parallax-Mapping mit den post-2k/3-Begriffen?), habe aber einige Bilder (die sich unabhängig voneinander bewegen) noch einmal hinter der eigentlichen (durch einen Parallax-BG dargestellten) Map. Das kann ich jetzt zwar theoretisch alles wunderbar mit Pictures machen, allerdings sind dann die ganzen Chars ja auch unter den Pictures.

Die Charsets prinzipiell über die Pics zu setzen würde da zwar auch gehen, allerdings habe ich auch wieder Pictures die über den Chars angezeigt werden sollen. Das Ende vom Lied: Ich muss entweder den Pics eine Maske spendieren (s. Grafik im EInleitungspost) um zu verhindern, dass mein Hintergrund auf einmal über der Map liegt oder die z-Werte für einzelne Pictures runtersetzen.
Da es um eine komplette Map geht könnte ich mir vorstellen, dass die Sache mit der Maskierung problematisch wird, da das Bild welches die Transparenz definieren soll rund 1000px+ breit wäre. Daher scheint mir das einfachste zu sein, diesen ominösen z-Wert zu verändern - bloß eben nur für einzelne Pictures. Die Pic-ID ist klar, aber ich muss einzelne Pics eben unter den Charsets anzeigen und das am besten auch ad hoc im Eventcode benutzen können.

ETeCe
27.12.2012, 15:55
Wenn es dir um ein fertiges Script geht könntest du es mit folgendem versuchen:
(In Zeile 12 kannst du die IDs der betroffenen Pictures festlegen)


class Sprite_LowPriorityPicture < Sprite_Picture

def update_position
super
self.z -= 100
end
end


class Spriteset_Map

PICTURES_BELOW_MAP = [1, 2, 3, 4, 5, 6]

def update_pictures
$game_map.screen.pictures.each do |pic|
@picture_sprites[pic.number] ||=
begin
if PICTURES_BELOW_MAP.include?(pic.number)
Sprite_LowPriorityPicture.new(@viewport1, pic)
else
Sprite_Picture.new(@viewport2, pic)
end
end
@picture_sprites[pic.number].update
end
end
end

Zum Aufbau der Pictures im VXAce:

Du kannst über $game_screen.pictures auf die "Datenobjekte" der Pictures zugreifen, in denen Bildname, Position u.A. gespeichert werden (siehe Game_Picture - Script). Diese Klasse hat selbst nichts mit der Anzeige zu tun, jedoch kann aus den gespeicherten Informationen jederzeit das Picture wiederhergestellt werden (z.B. nach dem Laden eines Spielstandes).

Die Anzeige selbst geschieht über Sprite_Picture - Objekte, die von einem Spriteset_Map erzeugt und aktualisiert werden.
Sprite_Picture übernimmt dabei in jedem Frame die aktuellen Daten. Die z-Koordinate bestimmt sich dabei aus der ID des Pictures (s. Zeile 64 in Sprite_Picture).
Zudem legt Spriteset_Map die Picture-Sprites in einem zusätzlichen Viewport an, der über den anderen liegt (s. Zeile 251 in Spriteset_Map).

BDraw
28.12.2012, 12:21
Vielen, vielen Dank!
Ich musste noch einen Behelfs-Viewport zwischen Viewport1 und Viewport2 einführen dem Map, Charsets und Parallax zugewiesen werden, da auf Viewport1 Pictures immer noch über dem Parallax angezeigt wurden, aber jetzt funktioniert es.

Muchas gracias! :D

Bex
28.12.2012, 19:21
Heute hatte jemand beim RPG-Studio ein Fix Picture Skript für den Ace gesucht.
Folgendes Skript erlaubt aber auch die von dir gesuchten Anzeigen mit dem Z-Wert und die Möglichkeit Pictures auch unter dem Parallax anzuzeigen.
(Getestet habe ich es nicht, da ich nicht die Vollversion habe)
http://rmrk.net/index.php/topic,44837.0.html

Gruß Bex