PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fließender Übergang



Doktor von Stein
03.04.2010, 15:24
Ich möchte in meinem projekt einen halbwegs fließenden übergang vom titelbild auf die erste map machen.
Im Scene_title/def command_new_game habe ich

Audio.bgm_stop
in

Audio.bgm_fade(5000)
umgeändert.
ich würde jetzt gerne einen fließenden übergang erstellen, also das der ganze bildschirm sich langsam verdunkelt, bzw. fließend zur ersten map übergeht. alle meine versuche mit [opacity -= 1] haben bisher nix gebracht. es würde schon reichen, wenn es sich nur verdunkelt, weil die erste map sowieso schwarz ist. kann mir irgendjemand erklären wie ich das hinkriege?

-KD-
03.04.2010, 18:30
Mit Graphics.freeze frierst du den Bildschirm ein. Danach werden keine Veränderungen mehr angezeigt.
Mit Graphics.transition wird der aktualisierte Bildschirm über den eingefrorenen drübergeblendet. Dies sollte dann den fließenden Übergang ergeben, den du suchst. Als optionale Parameter kannst du die Dauer des Übergangs, sowie den Dateinamen eines Transitionbildes angeben.

Eigentlich sollte das aber schon standardmäßig gemacht werden, wenn man vom Titelbildschirm zur Map wechselt.

Doktor von Stein
04.04.2010, 15:10
ja, es is nur halt zu kurz ...
danke, mal sehen obs klappt.

-KD-
04.04.2010, 15:26
Dann gibst du per Parameter 'ne längere Zeitdauer an, z.B.

Graphics.transition(100)
Was 2,5 Sekunden entsprechen würde.

salamimild
16.04.2010, 14:44
Hi,

Habe auch ne Frage bezüglich dem Titlescreen. Dachte ich nehme diesen thread, da er passend zum Thema ist =)

Ich möchte nämlich, dass der Titelbildschirm gezeigt wird, aber ohne das Auswahlfenster gleich am Anfang.
Erst ca. 3. Sekunden später sollte das Fenster gezeigt werden.
Ich denk, ich muss einen wait Befehl einfügen. Nur wo?

Kann jemand helfen?

Danke vielmals.

Cepanks
16.04.2010, 22:18
Wenn der Titelbildschirm nicht animiert ist, reicht dafür eigentlich ein

ZEIT_IN_FRAMES.times do
Graphics.update
endin der Scene_Title, bevor das Auswahlfenster erstellt/angezeigt wird.

SMWma
16.04.2010, 22:36
ansonston könntest du auch ein Fenster außerhalb des Bildschrims anzeigen lassen und dann in Main es so lange verschieben lassen, bis es zB. 800 hat.
also:

def main
windowhmhmhm.x = 640
end


def update
if windowhmhmhm.x < 800
windowhmhmhm.x += 5 # Wert kannst du anpassen
end
end

Ob der Code funzt, kA, kannst du selber probieren. Du musst allerdings erstmal ein Fenster erstellen. Schau dir aber dazu einfach, wie die anderen Fenster erstellt werden. Rein Theroretisch sollte es klappen, egal, ob du den animierten hast oder net.

XGazudin
17.04.2010, 18:52
Ich möchte nämlich, dass der Titelbildschirm gezeigt wird, aber ohne das Auswahlfenster gleich am Anfang.
Erst ca. 3. Sekunden später sollte das Fenster gezeigt werden.
Ich denk, ich muss einen wait Befehl einfügen. Nur wo?
Kann jemand helfen?
Danke vielmals.
So, da ich Neuling bin was RGSS angeht musste ich ne weile mit freeze und transition rumspielen, aber folgendermaßen kannst du damit den gewünschten Effekt erzielen (Ich beziehe mich auf ein noch nicht verändertes Script was Zeilenangaben betrifft):

Gehe im Ruby-Editor im RMXP in die Scene_Title
Und gehe dort zu Zeile 36, du solltest dort folgenden Code vorfinden:

# Make command window
s1 = "Neues Spiel"
s2 = "Fortsetzen"
s3 = "Beenden"
@command_window = Window_Command.new(192, [s1, s2, s3])
@command_window.back_opacity = 160
@command_window.x = 320 - @command_window.width / 2
@command_window.y = 288Das ist der Punkt an dem das Auswahlfenster erzeugt wird (Darunter befinden sich noch einige Abfragen die ermitteln ob bereits ein Spielstand vorhanden ist und somit Continue, bzw Fortsetzen auswählbar ist), die Warte funktion sollte also davor stattfinden, füge also über "#Make Command Window" folgendes ein:

Graphics.transition()
Graphics.freeze
Graphics.transition(50)
# Make command windowDas erste Graphics.transition() sorgt dafür, dass die Hintergrundgrafik schon vor dem Fenster eingeblendet wird.
Graphics.freeze sorgt dafür dass der aktuelle Bildschirm eingefroren wird.
Graphics.transition(50) habe ich dann lediglich als eine art "Pseudo"-Waitfunktion genutzt, da ich noch keinen explitizen Wait-Befehl für Ruby kenne. Mit der Zahl in Klammern kannst du die Wartezeit bis das Fenster dann schließlich geladen wird, anpassen.
Sicherlich gibts wohl elegantere Methoden, aber es hat den gewünschten Effekt, das Auswahlfenster wird erst später eingeblendet, dir wird allerdings auffallen, dass auch die Hintergrundmusik erst mit dem Auswahlfenster eingeblendet wird, wenn du die BGM aber schon vorher abspielen möchtest musst du nur eine Zeile ausschneiden und woanders einfügen.
Gehe zu Zeile ( jetzt: ) 65:

$game_system.bgm_play($data_system.title_bgm)Diese spielt die BGM ab, schneide sie aus und füge sie hier ein:

Graphics.transition()
# Play title BGM
$game_system.bgm_play($data_system.title_bgm)
Graphics.freeze
Graphics.transition(50)
# Make command windowSomit wird die BGM direkt nach einblenden des Hintergrundbilds abgespielt.

Eine weitere Anmerkung, du kannst auch, anstatt dass das Auswahlfenster einfach nur sofort eingeblendet wird, natürlich auch da einen weichen Übergang erzeugen.
Dazu füge einfach hinter Graphics.transition(50) noch eine Graphics.freeze ein, und füge nachdem die Textbox erstellt wurde eine neue Graphics.transition(x) ein (wobei x für einen beliebigen Wert steht und die Übergangsdauer beeinflusst)
Das sieht dann hier jetzt so aus:

Graphics.transition()
# Play title BGM
$game_system.bgm_play($data_system.title_bgm)
Graphics.freeze
Graphics.transition(50)
Graphics.freeze
# Make command windowUnd ein stückchen weiter unten, anchdem das Auswahlfenster erstellt (aber noch nciht angezeigt) wurde, so (ca. Zeile 69) :

# Execute transition
Graphics.transition(50)Alles natürlich direkt getestet und es klappt.
Bei der Gelegenheit möchte ich mich für die Idee bedanken, wäre auf so ein, naja nennen wir es mal Feature, gar nicht gekommen und werde es wahrscheinlich in für meine Zwecke angepasster Form selbst verwenden :D

Hier nochmal der Code wie er bei mir nun steht im ganzen:

#==============================================================================
# ** Scene_Title
#------------------------------------------------------------------------------
# This class performs title screen processing.
#==============================================================================

class Scene_Title
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
def main
# If battle test
if $BTEST
battle_test
return
end
# Load database
$data_actors = load_data("Data/Actors.rxdata")
$data_classes = load_data("Data/Classes.rxdata")
$data_skills = load_data("Data/Skills.rxdata")
$data_items = load_data("Data/Items.rxdata")
$data_weapons = load_data("Data/Weapons.rxdata")
$data_armors = load_data("Data/Armors.rxdata")
$data_enemies = load_data("Data/Enemies.rxdata")
$data_troops = load_data("Data/Troops.rxdata")
$data_states = load_data("Data/States.rxdata")
$data_animations = load_data("Data/Animations.rxdata")
$data_tilesets = load_data("Data/Tilesets.rxdata")
$data_common_events = load_data("Data/CommonEvents.rxdata")
$data_system = load_data("Data/System.rxdata")
# Make system object
$game_system = Game_System.new
# Make title graphic
@sprite = Sprite.new
@sprite.bitmap = RPG::Cache.title($data_system.title_name)
Graphics.transition()
# Play title BGM
$game_system.bgm_play($data_system.title_bgm)
Graphics.freeze
Graphics.transition(100)
Graphics.freeze
# Make command window
s1 = "Neues Spiel"
s2 = "Fortsetzen"
s3 = "Beenden"
@command_window = Window_Command.new(192, [s1, s2, s3])
@command_window.back_opacity = 160
@command_window.x = 320 - @command_window.width / 2
@command_window.y = 288
# Continue enabled determinant
# Check if at least one save file exists
# If enabled, make @continue_enabled true; if disabled, make it false
@continue_enabled = false
for i in 0..3
if FileTest.exist?("Save#{i+1}.rxdata")
@continue_enabled = true
end
end
# If continue is enabled, move cursor to "Continue"
# If disabled, display "Continue" text in gray
if @continue_enabled
@command_window.index = 1
else
@command_window.disable_item(1)
end
# Stop playing ME and BGS
Audio.me_stop
Audio.bgs_stop
# Execute transition
Graphics.transition(50)
# Main loop
loop do
# Update game screen
Graphics.update
# Update input information
Input.update
# Frame update
update
# Abort loop if screen is changed
if $scene != self
break
end
end
# Prepare for transition
Graphics.freeze
# Dispose of command window
@command_window.dispose
# Dispose of title graphic
@sprite.bitmap.dispose
@sprite.dispose
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
# Update command window
@command_window.update
# If C button was pressed
if Input.trigger?(Input::C)
# Branch by command window cursor position
case @command_window.index
when 0 # New game
command_new_game
when 1 # Continue
command_continue
when 2 # Shutdown
command_shutdown
end
end
end
#--------------------------------------------------------------------------
# * Command: New Game
#--------------------------------------------------------------------------
def command_new_game
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Stop BGM
Audio.bgm_stop
# Reset frame count for measuring play time
Graphics.frame_count = 0
# Make each type of game object
$game_temp = Game_Temp.new
$game_system = Game_System.new
$game_switches = Game_Switches.new
$game_variables = Game_Variables.new
$game_self_switches = Game_SelfSwitches.new
$game_screen = Game_Screen.new
$game_actors = Game_Actors.new
$game_party = Game_Party.new
$game_troop = Game_Troop.new
$game_map = Game_Map.new
$game_player = Game_Player.new
# Set up initial party
$game_party.setup_starting_members
# Set up initial map position
$game_map.setup($data_system.start_map_id)
# Move player to initial position
$game_player.moveto($data_system.start_x, $data_system.start_y)
# Refresh player
$game_player.refresh
# Run automatic change for BGM and BGS set with map
$game_map.autoplay
# Update map (run parallel process event)
$game_map.update
# Switch to map screen
$scene = Scene_CharakterAuswahl.new
end
#--------------------------------------------------------------------------
# * Command: Continue
#--------------------------------------------------------------------------
def command_continue
# If continue is disabled
unless @continue_enabled
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to load screen
$scene = Scene_Load.new
end
#--------------------------------------------------------------------------
# * Command: Shutdown
#--------------------------------------------------------------------------
def command_shutdown
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Fade out BGM, BGS, and ME
Audio.bgm_fade(800)
Audio.bgs_fade(800)
Audio.me_fade(800)
# Shutdown
$scene = nil
end
#--------------------------------------------------------------------------
# * Battle Test
#--------------------------------------------------------------------------
def battle_test
# Load database (for battle test)
$data_actors = load_data("Data/BT_Actors.rxdata")
$data_classes = load_data("Data/BT_Classes.rxdata")
$data_skills = load_data("Data/BT_Skills.rxdata")
$data_items = load_data("Data/BT_Items.rxdata")
$data_weapons = load_data("Data/BT_Weapons.rxdata")
$data_armors = load_data("Data/BT_Armors.rxdata")
$data_enemies = load_data("Data/BT_Enemies.rxdata")
$data_troops = load_data("Data/BT_Troops.rxdata")
$data_states = load_data("Data/BT_States.rxdata")
$data_animations = load_data("Data/BT_Animations.rxdata")
$data_tilesets = load_data("Data/BT_Tilesets.rxdata")
$data_common_events = load_data("Data/BT_CommonEvents.rxdata")
$data_system = load_data("Data/BT_System.rxdata")
# Reset frame count for measuring play time
Graphics.frame_count = 0
# Make each game object
$game_temp = Game_Temp.new
$game_system = Game_System.new
$game_switches = Game_Switches.new
$game_variables = Game_Variables.new
$game_self_switches = Game_SelfSwitches.new
$game_screen = Game_Screen.new
$game_actors = Game_Actors.new
$game_party = Game_Party.new
$game_troop = Game_Troop.new
$game_map = Game_Map.new
$game_player = Game_Player.new
# Set up party for battle test
$game_party.setup_battle_test_members
# Set troop ID, can escape flag, and battleback
$game_temp.battle_troop_id = $data_system.test_troop_id
$game_temp.battle_can_escape = true
$game_map.battleback_name = $data_system.battleback_name
# Play battle start SE
$game_system.se_play($data_system.battle_start_se)
# Play battle BGM
$game_system.bgm_play($game_system.battle_bgm)
# Switch to battle screen
$scene = Scene_Battle.new
end
end

salamimild
18.04.2010, 14:29
@XGazudin

Yeah. Das läuft einwandfrei und ist genau das, was ich wollte. Sogar mit dem Einblenden des Fenster.
Coole Sau :)

Danke vielmals!!!!

XGazudin
18.04.2010, 17:47
Es funktioniert zwar, ist aber wenig elegant, wie ich es mir schon gedacht habe.
Ich habe mal Cepanks methode probiert und es funktioniert auch:

Wenn der Titelbildschirm nicht animiert ist, reicht dafür eigentlich ein

ZEIT_IN_FRAMES.times do
Graphics.update
endin der Scene_Title, bevor das Auswahlfenster erstellt/angezeigt wird.
Anstatt ZEIT_IN_FRAMES musst du an dieser stelle halt eben eine Zahl angeben, also für 3 Sekunden = 3*40 = 120
Das könnte dann so aussehen:


Graphics.transition()
# Play title BGM
$game_system.bgm_play($data_system.title_bgm)
120.times do
Graphics.update
end
# Make command window
Selbes ergebnis, weniger umständlich (wie ich finde...).
Wollts hier nur nochmal erwähnt haben dass Cepanks Methode auch funktioniert.