| Ancien membre du staff |
 |
 |
Inscrit le: 12 Aoû 2006, 00:00 Messages: 1064 Points d'aide: 5/60
Créations :
- [RMXP] Database Management
- [RMXP] GUI Widgets
- [RMXP] Advanced Input
Voir ses créations
|
2.3. Database Editor- Code: Tout sélectionner
#=============================================================================== # *** Database Editor #------------------------------------------------------------------------------- # Auteur : Åvygeil #------------------------------------------------------------------------------- # Une Scene qui permet d'éditer les tables de l'utilisateur # dans la base de données. #===============================================================================
#=============================================================================== # ** Scene_Database #=============================================================================== class Scene_Database #============================================================================= # ** Scene_Database::Window_Command #----------------------------------------------------------------------------- # Permet de commencer à éditer la base de données, # de la sauver et de revenir sur la map. #============================================================================= class Window_Command < ::Window_Command #=========================================================================== # * initialize #=========================================================================== def initialize super(100, ["Edit", "Save", "Quit"]) end end #============================================================================= # ** Scene_Database::Window_Table #----------------------------------------------------------------------------- # Permet de sélectionner une table de la base de données. #============================================================================= class Window_Table < Window_Selectable #=========================================================================== # * initialize #=========================================================================== def initialize super(100, 0, 200, 480) @item_max = Database.tables.size self.contents = Bitmap.new(width-32, @item_max * 32 + 32) self.contents.font.name = $fontface self.contents.font.size = $fontsize @column_max = 1 refresh self.active = false self.index = -1 self.visible = true end
#=========================================================================== # * refresh #=========================================================================== def refresh self.contents.clear for i in 0...@item_max rect = Rect.new(4, 32*i, self.contents.width-8, 32) self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) self.contents.draw_text(rect, Database.tables[i].name) end end
end #============================================================================= # ** Scene_Database::Window_Row #----------------------------------------------------------------------------- # Permet de sélectionner une ligne d'une table. #============================================================================= class Window_Row < Window_Selectable #=========================================================================== # * initialize #=========================================================================== def initialize(table) super(300, 0, 340, 480) @table = table @column_max = 1 refresh self.active = false self.index = -1 self.visible = false end #=========================================================================== # * value #=========================================================================== def value row = @table.rows[self.index+1] return row ? row.id : 0 end #=========================================================================== # * value= #=========================================================================== def value=(id) if id == 0 self.index = 0 else self.index = id -1 end end #=========================================================================== # * refresh #=========================================================================== def refresh if self.contents != nil self.contents.dispose self.contents = nil end self.contents = Bitmap.new(width-32, @table.size * 32) self.contents.font.name = $fontface self.contents.font.size = $fontsize @item_max = @table.size for i in 1..@item_max row = @table.rows[i] text = row ? "#{row.id} - #{row.name}" : "" rect = Rect.new(4, 32*(i-1), self.contents.width-8, 32) self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) self.contents.draw_text(rect, text) end end
end #============================================================================= # ** Scene_Database::Window_Table #----------------------------------------------------------------------------- # Permet de sélectionner un champs d'une ligne. #============================================================================= class Window_Field < Window_Selectable #=========================================================================== # * initialize #=========================================================================== def initialize(row) super(0, 0, 640, 480) @row = row @item_max = row.type.columns.size - 1 self.contents = Bitmap.new(width-32, @item_max * 32 + 32) self.contents.font.name = $fontface self.contents.font.size = $fontsize @column_max = 1 refresh self.active = true self.index = 0 self.visible = true end #=========================================================================== # * refresh #=========================================================================== def refresh self.contents.clear for i in 0...@item_max rect = Rect.new(4, 32*i, self.contents.width-8, 32) self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) column = @row.type.columns[i+1] field = @row.method(column.name).call column_type = column.type case column_type when Database::Table id = field if id == 0 self.contents.draw_text(rect, "#{column.name} : ") else name = column_type[field].name self.contents.draw_text(rect, "#{column.name} : #{id} - #{name}") end else self.contents.draw_text(rect, "#{column.name} : #{field}") end end end
end #============================================================================= # ** Scene_Database::Window_Help #============================================================================= class Window_Help < Window_Base #=========================================================================== # * initialize #=========================================================================== def initialize super(0, 320, 300, 160) self.z = 3000 self.contents = Bitmap.new(width-32, height-32) self.contents.font.name = $fontface self.contents.font.size = $fontsize self.visible = false refresh end #=========================================================================== # * refresh #=========================================================================== def refresh self.contents.clear self.contents.draw_text(4,00,300,32,"A : Add a new row") self.contents.draw_text(4,32,300,32,"D : Delete the last row") self.contents.draw_text(4,64,300,32,"C : Copy the selected row") self.contents.draw_text(4,96,300,32,"V : Paste the copied row") end
end #============================================================================= # * initialize #============================================================================= def initialize(table_index = -1, row_id = 0) @table_index = table_index @row_id = row_id end #============================================================================= # * main #============================================================================= def main @command_window = Window_Command.new @table_window = Window_Table.new @row_window = nil @row_windows = [] @table_scenes = [] for table in Database.tables @row_windows << Window_Row.new(table) @table_scenes << Scene_Table(table) end @help_window = Window_Help.new if @table_index != -1 @command_window.active = false @table_window.active = true @table_window.index = @table_index end if @row_id != 0 @table_window.active = false @row_window = @row_windows[@table_window.index] @row_window.active = true @row_window.index = @row_id - 1 @row_window.visible = true @help_window.visible = true end Graphics.transition loop do Graphics.update Input.update update if $scene != self break end end Graphics.freeze @command_window.dispose @table_window.dispose for row_window in @row_windows row_window.dispose end @help_window.dispose end #============================================================================= # * update #============================================================================= def update @command_window.update @table_window.update @row_window.update if @row_window != nil @help_window.update if @command_window.active update_command return end if @table_window.active update_table return end if @row_window != nil and @row_window.active update_row return end end #============================================================================= # * update_command #============================================================================= def update_command if Input.trigger?(Input::B) $game_system.se_play($data_system.cancel_se) $scene = Scene_Map.new return end if Input.trigger?(Input::C) case @command_window.index when 0 $game_system.se_play($data_system.decision_se) @command_window.active = false @table_window.active = true @table_window.index = 0 when 1 $game_system.se_play($data_system.save_se) Database.save when 2 $game_system.se_play($data_system.cancel_se) $scene = Scene_Map.new end return end end #============================================================================= # * update_table #============================================================================= def update_table if Input.trigger?(Input::B) $game_system.se_play($data_system.cancel_se) @table_window.active = false @table_window.index = -1 @command_window.active = true return end if Input.trigger?(Input::C) table = Database.tables[@table_window.index] unless table != nil $game_system.se_play($data_system.buzzer_se) return end $game_system.se_play($data_system.decision_se) @table_window.active = false @row_window = @row_windows[@table_window.index] @row_window.active = true @row_window.index = 0 @row_window.visible = true @help_window.visible = true return end end #============================================================================= # * update_row #============================================================================= def update_row if Input.trigger?(Input::B) $game_system.se_play($data_system.cancel_se) @row_window.active = false @row_window.index = -1 @row_window.visible = false @row_window = nil @help_window.visible = false @table_window.active = true return end if Input.trigger?(Input::C) row = Database.tables[@table_window.index][@row_window.index+1] unless row != nil $game_system.se_play($data_system.buzzer_se) return end $game_system.se_play($data_system.decision_se) $scene = @table_scenes[@table_window.index].new(row.id) return end if Input.trigger?(Input::DATABASE_ADD_ROW) $game_system.se_play($data_system.shop_se) Database.tables[@table_window.index].new_row @row_window.refresh return end if Input.trigger?(Input::DATABASE_DELETE_ROW) $game_system.se_play($data_system.cancel_se) Database.tables[@table_window.index].delete_last_row @row_window.refresh return end if Input.trigger?(Input::DATABASE_COPY_ROW) $game_system.se_play($data_system.decision_se) @copy_row = Database.tables[@table_window.index][@row_window.index+1] return end if Input.trigger?(Input::DATABASE_PASTE_ROW) return if @copy_row == nil $game_system.se_play($data_system.decision_se) row = Database.tables[@table_window.index][@row_window.index+1] row.copy_row(@copy_row) @row_window.refresh return end end end
#=============================================================================== # ** Scene_Table # table : une table #------------------------------------------------------------------------------- # Permet de créer dynamiquement la scène d'édition des lignes de la table. #=============================================================================== def Scene_Table(table) #============================================================================= # ** La classe créée dynamiquement. #============================================================================= Class.new { class << self attr_accessor :table_index # l'indice de la table end self.table_index = Database.tables.index(table) #=========================================================================== # * initialize #=========================================================================== def initialize(row_id) @table = Database.tables[self.class.table_index] @row_id = row_id end #=========================================================================== # * main #=========================================================================== def main @row = @table[@row_id] @field_window = Scene_Database::Window_Field.new(@row) @value_windows = [] for i in 1...@table.columns.size column_type = @table.columns[i].type case column_type when Database::Boolean @value_windows << Window_BooleanField.new(0,0) when Database::Integer @value_windows << Window_IntegerField.new(0,0,640) when Database::String @value_windows << Window_TextField.new(0,0,640) when Database::File @value_windows << Window_FileChooser.new(0,0,640,column_type.dir) when Database::Table @value_windows << Scene_Database::Window_Row.new(column_type) end end @value_window = nil Graphics.transition loop do Graphics.update Input.update update if $scene != self break end end Graphics.freeze @field_window.dispose for window in @value_windows window.dispose end end #=========================================================================== # * update #=========================================================================== def update @field_window.update @value_window.update if @value_window != nil if @field_window.active update_field return end if @value_window != nil update_value return end end #=========================================================================== # * update_field #=========================================================================== def update_field if Input.trigger?(Input::B) $game_system.se_play($data_system.cancel_se) $scene = Scene_Database.new(self.class.table_index, @row_id) return end if Input.trigger?(Input::C) column = @table.columns[@field_window.index+1] value = @row.method(column.name).call @field_window.active = false @value_window = @value_windows[@field_window.index] @value_window.z = 1000 @value_window.value = value @value_window.refresh @value_window.active = true @value_window.visible = true return end end #=========================================================================== # * update_value #=========================================================================== def update_value if Input.trigger?(Input::B) $game_system.se_play($data_system.cancel_se) @value_window.active = false @value_window.visible = false @value_window = nil @field_window.active = true return end if Input.trigger?(Input::C) $game_system.se_play($data_system.decision_se) value = @value_window.value @value_window.active = false @value_window.visible = false @value_window = nil column = @table.columns[@field_window.index+1] @row.method("#{column.name}=").call(value) @field_window.refresh @field_window.active = true return end end } end
#=============================================================================== # ** Scene_Map #------------------------------------------------------------------------------- # On permet à l'éditeur de base de données de s'ouvrir en appuyant sur # la touche OPEN_DATABASE_EDITOR (F8 par défaut) #=============================================================================== class Scene_Map #============================================================================= # * update #============================================================================= alias database_update update def update if $DEBUG and Input.trigger?(Input::OPEN_DATABASE_EDITOR) $game_system.se_play($data_system.decision_se) $scene = Scene_Database.new end database_update end end
|
|