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 #90

Kamikun






  • Si prega di effettuare il log in prima di rispondere
Danneggiare nemico - - - - -

    Mon
  • Nuovo Arrivato

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

#1 Inviato 26 April 2018 - 16:13 PM

Sto impazzendo da giorni, mi sono studiato rigo per rigo OGNI script inserito di base nel programma e non sono riuscito a capire come risolvere; dal mio ultimo topic ho imparato tantissimo, infatti sto portando avanti un progettino carino, con un battle system semplice senza grosse pretese ma... non riesco a fargli memorizzare i danni ai singoli nemici, sono riuscito a capire come far apparire gli "Troop" specifici ed utilizzo questo script, creato da me prendendo spunto spulciando gli script base:

 


def troop_update(troop_id)
    
    i = 4
    
    while i < 8
      @dx[i].contents.clear
      i += 1
    end
    
    # troop->enemies; spazio disponibile 148x114
    @enemies = []
    troop = $data_troops[troop_id]
    
    for i in 0...troop.members.size
      
      if $data_enemies[troop.members[i].enemy_id] != nil
        @enemies.push(Game_Enemy.new(troop_id, i))
      end
      
      img = RPG::Cache.battler(@enemies[i].battler_name, @enemies[i].battler_hue)
      
      # grafic
      @rect = Rect.new(0, 0, @dx[i+4].width, @dx[i+4].height)
      @dx[i+4].contents.blt(0, 0, img, @rect)
      
      hp = (@enemies[i].hp.to_f*100/@enemies[i].maxhp.to_f).ceil
      
      if hp >= 51 && hp <= 100
        clrhp = Color.new(0, 255, 0, 255)
      elsif hp >= 21 && hp <= 50
        clrhp = Color.new(255, 125, 0, 255)
      else
        clrhp = Color.new(255, 0, 0, 255)
      end
      
      sp = (@enemies[i].sp.to_f*100/@enemies[i].maxsp.to_f).ceil
      
      if sp >= 51 && sp <= 100
        clrsp = Color.new(0, 0, 255, 255)
      elsif sp >= 21 && sp <= 50
        clrsp = Color.new(255, 0, 255, 255)
      else
        clrsp = Color.new(125, 0, 125, 255)
      end
      
      # name
      @dx[i+4].contents.draw_text(0, 0, @dx[i+4].width - 32, 20, @enemies[i].name, 2)
      
      @dx[i+4].contents.font.size = 15
      @dx[i+4].contents.font.color = @clrbs
      
      # hp
      @dx[i+4].contents.fill_rect(0, 95, 70, 15, Color.new(0, 125, 0, 255))
      @dx[i+4].contents.fill_rect(0, 95, (0.7*hp).ceil, 15, clrhp)
      @dx[i+4].contents.draw_text(0, 95, 70, 15, @enemies[i].hp.to_s+"/"+@enemies[i].maxhp.to_s, 1)
      
      # sp
      @dx[i+4].contents.fill_rect(72, 95, 70, 15, Color.new(0, 0, 125, 255))
      @dx[i+4].contents.fill_rect(72, 95, (0.7*sp).ceil, 15, clrsp)
      @dx[i+4].contents.draw_text(72, 95, 70, 15, @enemies[i].sp.to_s+"/"+@enemies[i].maxsp.to_s, 1)
      
      # color e size standart
      @dx[i+4].contents.font.color = @clrbs
      @dx[i+4].contents.font.size = @szbs
      
    end
    
  # end troop_update
  end

Graficamente è ancora da studiare quindi non fateci caso, come dicevo ciò che mi sta bloccando è come danneggiare gli hp dei nemici, con "@enemies[i].hp" mi visualizza gli hp attuali del nemico, se provo a fare, per esempio:

 

@enemies[i].hp -= 100

 

La variabile "@enemies[i].hp" cambia solo in primo momento ma poi torna ad essere pari a "@enemies[i].maxhp", quindi come è possibile rendere il calcolo definitivo? A dirla tutta avrei decine di idee alternative ma sarebbe mille volte più comodo sfruttare/mutare ciò che il programma già ti presenta, avendo visto varie cose carine, mi manca solo capire questa cosa... spero si sia capito, grazie!

 



    Guardian of Irael
  • Coniglietto Rosso

  • Rpg˛S Admin
  • Rens: 195
  • 19
  • StellettaStellettaStellettaStellettaStellettaStelletta
  • 58413 messaggi
  • Sesso:Maschio
  • Provenienza:Bagnaia (Viterbo)
  • Abilitā:Apprendista


#2 Inviato 26 April 2018 - 16:32 PM

Hai già provato a cercare nell'interpreter (mi pare, intendo quello che legge gli eventi e li trasforma in codice) la riga che si riferisce al comando per modificare la vita del nemico manualmente tra i comandi evento? Lì dovresti trovare il metodo diretto, purtroppo non mi intendo molto di RGSS, tu sembri più ferrato, prova a fare lì una ricerca.

^ ^


(\_/)
(^ ^) <----coniglietto rosso, me!     
(> <)

 
Il mio Tumblr dove seguire i miei progetti, i progetti della Reverie : : Project ^ ^
 
KdUDtQt.png disponibile su Google Play, qui i dettagli! ^ ^
 
FwnGMI3.png completo! Giocabile online, qui i dettagli! ^ ^  
 
REVERIE : : RENDEZVOUS (In allenamento per apprendere le buone arti prima di cominciarlo per bene ^ ^) Trovate i dettagli qui insieme alla mia intervista (non utilizzerò più rpgmaker) ^ ^

Spoiler


    Mon
  • Nuovo Arrivato

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

#3 Inviato 26 April 2018 - 16:49 PM

Come detto ho spulciato riga per riga, ho capito cosa intendi, purtroppo ci ho provato ma non riesco a capire come sfruttarlo, ho solamente capito che utilizza ben 5 valori

    Guardian of Irael
  • Coniglietto Rosso

  • Rpg˛S Admin
  • Rens: 195
  • 19
  • StellettaStellettaStellettaStellettaStellettaStelletta
  • 58413 messaggi
  • Sesso:Maschio
  • Provenienza:Bagnaia (Viterbo)
  • Abilitā:Apprendista


#4 Inviato 26 April 2018 - 17:47 PM

Capisco. Vediamo se passa di qui uno scripter, intanto prova pure a postare quel pezzo di codice con i 5 valori, così anche se lo scripter ha un'altro tool a disposizione, magari capisce come sfruttarli da quel metodo! ^ ^


(\_/)
(^ ^) <----coniglietto rosso, me!     
(> <)

 
Il mio Tumblr dove seguire i miei progetti, i progetti della Reverie : : Project ^ ^
 
KdUDtQt.png disponibile su Google Play, qui i dettagli! ^ ^
 
FwnGMI3.png completo! Giocabile online, qui i dettagli! ^ ^  
 
REVERIE : : RENDEZVOUS (In allenamento per apprendere le buone arti prima di cominciarlo per bene ^ ^) Trovate i dettagli qui insieme alla mia intervista (non utilizzerò più rpgmaker) ^ ^

Spoiler


    Mon
  • Nuovo Arrivato

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

#5 Inviato 26 April 2018 - 19:38 PM

Va bene, ecco:

 

 
  #--------------------------------------------------------------------------
  # * Change Enemy HP
  #--------------------------------------------------------------------------
  def command_331
    # Get operate value
    value = operate_value(@parameters[1], @parameters[2], @parameters[3])
    # Process with iterator
    iterate_enemy(@parameters[0]) do |enemy|
      # If HP is not 0
      if enemy.hp > 0
        # Change HP (if death is not permitted then change HP to 1)
        if @parameters[4] == false and enemy.hp + value <= 0
          enemy.hp = 1
        else
          enemy.hp += value
        end
      end
    end
    # Continue
    return true
  end


    giver
  • Alex (Rm2k)

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

#6 Inviato 27 April 2018 - 10:25 AM

Il ritorno al massimo del valore di HP senza interventi di cura o simili è anomalo. Come mostra il codice del comando evento che hai postato, infatti, sottrarre un valore direttamente dagli HP, pur ignorando states ed elements, non è una strada sbagliata. Il motivo più probabile per cui capita è la reinizializzazione delle statistiche degli enemies in seguito ad una chiamata fuori luogo di troop_update.
Il sistema ufficiale per gestire gli effetti delle azioni è molto più complicato e flessibile.
Facendo riferimento al codice nel primo post della discussione, ti consiglio di guardare meglio le classi Game_BattleAction, Game_Battler (soprattutto i metodi attack_effect, skill_effect ed item_effect), e Window_BattleStatus, e come vengono sfruttate all'interno di Scene_Battle.

Spoiler

    Mon
  • Nuovo Arrivato

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

#7 Inviato 27 April 2018 - 11:29 AM

Grazie davvero tanto Giver... specifico in caso altri abbiamo il mio stesso problema: ridando uno sguardo agli script da te menzionati (specifico che sono stati i primi a cui ho dato uno sguardo) non ci ho guadagnato nulla, XD, ho voluto crearmi un battle system da 0 invece che modificare quello attuale (infatti ho in mente di richiamarlo manualmente, attraverso evento) è perchè ci capisco ancora troppo poco; ciò che mi ha aperto gli occhi è stato quando hai detto che probabilmente c'è un problema sul come viene richiamato troop_update.

 

Praticamente ho creato l'array "@enemies" in "def initialize", invece che ricrearla di continuo (andando ad aggiornare la grafica), a quanto pare facendo così mi azzerava anche lo stato dei nemici, per massima chiarezza posto le parti dello script interessate (anche perchè per intero è davvero lungo).

 

def initialize

    # troop->enemies
    @enemies = []
    @troop = $data_troops[$troop]
    
    for i in [email protected]
      
      if $data_enemies[@troop.members[i].enemy_id] != nil
        @enemies.push(Game_Enemy.new($troop, i))
      end
      
    end


end

Do il valore desiderato a "$troop" prima di richiamare lo script.

 

Mentre lo script inizialmente mostrato è diventato:

def troop_update(troop_id)
    
    i = 4
    
    while i < 8
      @dx[i].contents.clear
      i += 1
    end
    
    # troop->enemies; spazio disponibile 148x114
    
    for i in [email protected]
      
      img = RPG::Cache.battler(@enemies[i].battler_name, @enemies[i].battler_hue)
      
      # grafic
      @rect = Rect.new(0, 0, @dx[i+4].width, @dx[i+4].height)
      @dx[i+4].contents.blt(0, 0, img, @rect)
      
      hp = (@enemies[i].hp.to_f*100/@enemies[i].maxhp.to_f).ceil
      
      if hp >= 51 && hp <= 100
        clrhp = Color.new(0, 255, 0, 255)
      elsif hp >= 21 && hp <= 50
        clrhp = Color.new(255, 125, 0, 255)
      else
        clrhp = Color.new(255, 0, 0, 255)
      end
      
      sp = (@enemies[i].sp.to_f*100/@enemies[i].maxsp.to_f).ceil
      
      if sp >= 51 && sp <= 100
        clrsp = Color.new(0, 0, 255, 255)
      elsif sp >= 21 && sp <= 50
        clrsp = Color.new(255, 0, 255, 255)
      else
        clrsp = Color.new(125, 0, 125, 255)
      end
      
      # name
      @dx[i+4].contents.draw_text(0, 0, @dx[i+4].width - 32, 20, @enemies[i].name, 2)
      
      @dx[i+4].contents.font.size = 15
      @dx[i+4].contents.font.color = @clrbs
      
      # hp
      @dx[i+4].contents.fill_rect(0, 95, 70, 15, Color.new(0, 125, 0, 255))
      @dx[i+4].contents.fill_rect(0, 95, (0.7*hp).ceil, 15, clrhp)
      @dx[i+4].contents.draw_text(0, 95, 70, 15, @enemies[i].hp.to_s+"/"+@enemies[i].maxhp.to_s, 1)
      
      # sp
      @dx[i+4].contents.fill_rect(72, 95, 70, 15, Color.new(0, 0, 125, 255))
      @dx[i+4].contents.fill_rect(72, 95, (0.7*sp).ceil, 15, clrsp)
      @dx[i+4].contents.draw_text(72, 95, 70, 15, @enemies[i].sp.to_s+"/"+@enemies[i].maxsp.to_s, 1)
      
      # color e size standart
      @dx[i+4].contents.font.color = @clrbs
      @dx[i+4].contents.font.size = @szbs
      
    end
    
  # end troop_update
  end

Ho fatto varie prove e così funziona, i danni, o comunque i cali, agli hp restano memorizzati; speriamo di non incappare in altri problemi simili.






  • Feed RSS