Rpg˛S Forum uses cookies. Read the Privacy Policy for more info. To remove this message, please click the button to the right:    I accept the use of cookies

Vai al contenuto

Rpg˛S Forum uses cookies. Read the Privacy Policy for more info. To remove this message, please click the button to the right:    I accept the use of cookies

Screen Contest #89

AliceMisaki















  • Si prega di effettuare il log in prima di rispondere
Creare evento da script? - - - - -

    Mon
  • Nuovo Arrivato

  • Utenti
  • Rens: 0
  • 0
  • Stelletta
  • 12 messaggi
  • Sesso:Maschio
  • Abilitā:Esperto

#1 Inviato 10 January 2020 - 15:41 PM

class CreaEve
  def initialize(x, y)
    # event
    id = $game_map.events.size
    ev = RPG::Event.new(x, y)
    ev.id = id
    ev.name = "CreatoScript"
    ev.pages = [RPG::Event::Page.new]
    # pages
    ev.pages[0].condition = RPG::Event::Page::Condition.new
    ev.pages[0].graphic = RPG::Event::Page::Graphic.new
    ev.pages[0].move_type = 0
    ev.pages[0].move_speed = 3
    ev.pages[0].move_frequency = 3       
    ev.pages[0].move_route = RPG::MoveRoute.new
    ev.pages[0].walk_anime = true
    ev.pages[0].step_anime = false
    ev.pages[0].direction_fix = false
    ev.pages[0].through = false
    ev.pages[0].always_on_top = false
    ev.pages[0].trigger = 0
    ev.pages[0].list = [RPG::EventCommand.new]
    # condition
    ev.pages[0].condition.switch1_valid = false
    ev.pages[0].condition.switch2_valid = false
    ev.pages[0].condition.variable_valid = false
    ev.pages[0].condition.self_switch_valid = false
    # graphic
    ev.pages[0].graphic.tile_id = 0
    ev.pages[0].graphic.character_name = "Graphics/Characters/183-Rock02"
    ev.pages[0].graphic.character_hue = 0
    ev.pages[0].graphic.direction = 2
    ev.pages[0].graphic.pattern = 0
    ev.pages[0].graphic.opacity = 255
    ev.pages[0].graphic.blend_type = 0
    # game map
    $game_map.events[id] = ev
    #$game_map.refresh
  end
end

Salve, mi sarebbe molto comodo poter creare un evento da script, ho utilizzato il codice mostrato sopra ma... mi dice che il valore "starting" dell'evento non è valido, ho anche provato ad aggiungere "ev.strarting = " sia con false che con true ma niente, lo stesso con "ev.clear_starting"... ho momentaneamente disattivato "$game_map.refresh" per risolvere un problema alla volta.

 

Sapreste aiutarmi? Grazie.



    giver
  • Alex (Rm2k)

  • Utenti
  • Rens: 121
  • 0
  • StellettaStellettaStellettaStellettaStelletta
  • 1291 messaggi
  • Sesso:Maschio
  • Provenienza:The Creept - Room for Strangeness
  • Abilitā:Esperto

#2 Inviato 04 February 2020 - 13:21 PM

E' da parecchio che non posso usare RPG Maker XP, nè accedere all'help file (rpgxp.chm), quindi non posso analizzare quanto hai scritto.

 

Posso però dirti, ho appena ricontrollato in un vecchio script postato in questo forum, che la lista degli eventi sembra essere un hash, ossia un array associativo "chiave => valore", e perciò l'id che setti uguale a size potrebbe essere già tra le chiavi utilizzate.

un check di tipo

events.keys.include?(id)

dovrebbe assicurare di non sovrascrivere un evento già esistente.

Mi spiace di non poter fare di più.


Spoiler

    Mon
  • Nuovo Arrivato

  • Utenti
  • Rens: 0
  • 0
  • Stelletta
  • 12 messaggi
  • Sesso:Maschio
  • Abilitā:Esperto

#3 Inviato 04 February 2020 - 15:16 PM

class CreaEve
  def initialize(x, y)
    # event
    me = $game_map.events
    for i in 1...me.size
      if not me.keys.include?(i)
        id = i
        break
      end
    end
    print("#{id}\n#{$game_map.events.keys.include?(id)}")
    ev = RPG::Event.new(x, y)
    ev.id = id
    ev.name = "CreatoScript"
    ev.pages = [RPG::Event::Page.new]
    # pages
    ev.pages[0].condition = RPG::Event::Page::Condition.new
    ev.pages[0].graphic = RPG::Event::Page::Graphic.new
    ev.pages[0].move_type = 0
    ev.pages[0].move_speed = 3
    ev.pages[0].move_frequency = 3       
    ev.pages[0].move_route = RPG::MoveRoute.new
    ev.pages[0].walk_anime = true
    ev.pages[0].step_anime = false
    ev.pages[0].direction_fix = false
    ev.pages[0].through = false
    ev.pages[0].always_on_top = false
    ev.pages[0].trigger = 3
    ev.pages[0].list = [RPG::EventCommand.new]
    # condition
    ev.pages[0].condition.switch1_valid = false
    ev.pages[0].condition.switch2_valid = false
    ev.pages[0].condition.variable_valid = false
    ev.pages[0].condition.self_switch_valid = false
    # graphic
    ev.pages[0].graphic.tile_id = 0
    ev.pages[0].graphic.character_name = "Graphics/Characters/183-Rock02"
    ev.pages[0].graphic.character_hue = 0
    ev.pages[0].graphic.direction = 2
    ev.pages[0].graphic.pattern = 0
    ev.pages[0].graphic.opacity = 255
    ev.pages[0].graphic.blend_type = 0
    # game map
    me[id] = ev
    print("#{id}\n#{me.keys.include?(id)}")
    #$game_map.refresh
  end
end

Uhm... tranquillo, grazie comunque per avermi fatto capire di più il funzionamento, infatti non avevo preso in cosiderazione che eliminando alcuni eventi l'ID massimo disponibile non è pari al numero di eventi presenti (o magari +1), ecco perchè quel for all'inizio.

 

Effettivamente nel primo print, il codice suggerito da te, prima mi da false poi true, segno che l'evento non c'era poi c'è... eppure non cambia, mi da comunque l'errore dello starting, provando lo stesso vale con update e refresh, ma se risulta che esiste, perchè accade ciò? Mah.



    giver
  • Alex (Rm2k)

  • Utenti
  • Rens: 121
  • 0
  • StellettaStellettaStellettaStellettaStelletta
  • 1291 messaggi
  • Sesso:Maschio
  • Provenienza:The Creept - Room for Strangeness
  • Abilitā:Esperto

#4 Inviato 06 February 2020 - 11:17 AM

Prima di tutto, ti consiglio di cambiare l'estremo superiore del range usato per scegliere quale id usare.

Per due motivi: i tre punti lo escludono dal conteggio e dovrebbe essere meglio impostarlo all quantità massima di eventi mappa inseribili od anche più.

Poi, mi sembra che anche pages sia un Hash, che ha molte cose in comune con gli array tradizionali, ma che in realtà è composto da due array paralleli, keys e values.

L'istanziazione di un Hash si può fare in diversi modi.

h = {}

h = Hash[]

h = Hash.new

 

Le keys possono essere qualunque cosa, basta che non siano doppioni, ovvero devono essere uniche.

Attenzione, quindi, che h[0] = "ok1"

equivale a h.keys[i] = 0 e h.values[i] = "ok!", con valore di i che è uguale a h.keys.size o h.size prima dell'inserimento di tale coppia, se non era già presente nell'Hash, naturalmente.

hasharlecchinato = {nil => 78,

false => "vero!",

"OMG!" => true,

Game_Character => "oggetto personaggi su mappa",

6 => true,

[5, "no", true] => Game_SelfSwitches

}

 

Se vuoi tenerti uniformato a come l'editor aggiunge pagine all'evento, la prima pagina deve essere 1 e quindi dovresti scrivere qualcosa di simile a

event.pages = {1 => RPG::Event::Page.new}

 

Infine, mi sembra che prima di aggiungerlo alla lista degli eventi della mappa, tali dati vadano associati ad un'istanza di Game_Event.

Più di così non posso dire.

Buon Making!!


Spoiler

    Mon
  • Nuovo Arrivato

  • Utenti
  • Rens: 0
  • 0
  • Stelletta
  • 12 messaggi
  • Sesso:Maschio
  • Abilitā:Esperto

#5 Inviato 22 February 2021 - 16:02 PM

Grazie tante per l'impegno, ho preferito non dir nulla per tutto questo tempo per impegnarmi anch'io, XD... ebbene dopo vari cervellamenti credo di aver raggiunto il mio obbiettivo, lo spiegherò qui di seguito se mai qualcun'altro voglia fare una cosa simile.

 

Prima di tutto, ecco come si è evoluto il primo script, chiaramente richiamandolo con "New_Event.new(x, y)"; ho in seguito "disattivato" character name/hue per provare se funzionava anche con tile_id.

class New_Event
  def initialize(x, y)
    # id event
    map_ev = $game_map.events
    for i in 1...map_ev.size+2
      if not map_ev.keys.include?(i)
        id = i
        break
      end
    end
    ev = RPG::Event.new(x, y)
    ev.id = id
    ev.name = "CreatoScript"
    ev.pages = [RPG::Event::Page.new]
    # pages
    ev.pages[0].move_type = 0
    ev.pages[0].move_speed = 3
    ev.pages[0].move_frequency = 3       
    ev.pages[0].move_route = RPG::MoveRoute.new
    ev.pages[0].walk_anime = true
    ev.pages[0].step_anime = false
    ev.pages[0].direction_fix = false
    ev.pages[0].through = false
    ev.pages[0].always_on_top = false
    ev.pages[0].trigger = 0
    # condition
    ev.pages[0].condition = RPG::Event::Page::Condition.new
    ev.pages[0].condition.switch1_valid = false
    ev.pages[0].condition.switch2_valid = false
    ev.pages[0].condition.variable_valid = false
    ev.pages[0].condition.self_switch_valid = false
    # graphic
    ev.pages[0].graphic = RPG::Event::Page::Graphic.new
    ev.pages[0].graphic.tile_id = 398
    #ev.pages[0].graphic.character_name = "183-Rock02"
    #ev.pages[0].graphic.character_hue = 0
    ev.pages[0].graphic.direction = 2
    ev.pages[0].graphic.pattern = 0
    ev.pages[0].graphic.opacity = 255
    ev.pages[0].graphic.blend_type = 0
    # command
    ev.pages[0].list = Array.new(2, RPG::EventCommand.new)
    ev.pages[0].list[0].code = 250
    ev.pages[0].list[0].indent = 0
    audio = RPG::AudioFile.new("157-Skill01", 80, 100)
    ev.pages[0].list[0].parameters = [audio]
    # game map
    $game_map.event_new(id, ev)
  # end initialize
  end
# end New_Event
end

Ho poi creato un "def" in Game_Map...

  #--------------------------------------------------------------------------
  # * Event New
  #--------------------------------------------------------------------------
  def event_new(id, ev)
    @map.events[id] = ev
    @events[id] = Game_Event.new(@map_id, @map.events[id])
    refresh
  end

Arrivato a questo punto non dava errori, l'evento era tangibile e ci si potevo interagire, creato il comando del suono apposita per constatare ciò... però risultava invisibile, così ho pensato di dover pasticciare con "Spriteset_Map", infatti...

 

Ho aggiunto questo prima dell'update degli sprite.

    if not $game_map.events.size+1 == @character_sprites.size
      refresh
    end

Ecco invece il comando per aggiornare gli sprite.

  #--------------------------------------------------------------------------
  # * refresh
  #--------------------------------------------------------------------------
  def refresh
    @character_sprites = [@character_sprites[@character_sprites.size-1]]
    s = 0
    for i in $game_map.events.keys.sort
      sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
      @character_sprites.insert(s, sprite)
      s += 1
    end
  end

Inoltre va precisato che l'evento creato sparirà una volta cambiato mappa, quindi bisognerà ricrearlo se serve più volte, questa è solo una prova, per capire come crearlo... ci tengo a precisare che sono tutte cose che ho imparato per esperienza, spulciando su internet si trova poco o niente, quindi se si potesse fare la stessa cosa ma meglio, beh, basta che funzioni, o no?

 

Se qualcuno provandolo trova dei bug o simili, mi avvisi, grazie, lo stesso farò anch'io.






  • Feed RSS