Jump to content
Rpg²S Forum
  • 0

Comando "Attesa" negli script


Delta
 Share

Question

Ok, inizio a scusarmi se esiste già un topic in cui si parla di questo, ho provato a cercarlo ma non l'ho trovato ... cmq come faccio ad impostare un tempo di attesa negli script (tipo aspetta 1 secondo oppure aspetta 20 frames ... qualcosa del genere)?
Link to comment
Share on other sites

19 answers to this question

Recommended Posts

  • 0

Dai un'occhiata a Scene_Battle1 nel metodo update. Ci dovrebbe questo:

if @wait_count > 0
  @wait_count -= 1
  return
end

Ecco questo è il metodo per richiamare il comando attesa.

Spiego:

Ogni frame, e mi raccomando frame, non secondo il gioco richiama la funzione update della classe e perciò esegue questa parte della script, se trova che @wait_count è maggiore di 0, lo decrementa e chiude lì quel metodo update passando al frame successivo, nel quale viene richiamato di nuovo il metodo update, questo fino a che @wait_count non diventa minore uguale a 0. Cioè se mettiamo @wait_count = 5, il gioco aspetterà 5 frame prima di fare quello che c'è scritto dopo quella roba scritta in cima.

Spero di essere stato chiaro.

Comunque per cosa ti serve?

Edited by Sylaer

http://www.rpg2s.net/awards/bestscripter1.jpg

Se avete bisogno di modifiche, correzioni o creazioni da zero di script RGSS, allora visitate la mia bottega.

La bottega di Sylaer

Link to comment
Share on other sites

  • 0
Scusa per il tempo ^^" Volevo ritardare la visualizzazione dei risultati di fine battaglia per sincronizzarli alla musica della vittoria :sisi: ora però ho un altro problemino, nell'attesa vorrei attivare un'animazione di battaglia a tutto schermo (cioè non su un bersaglio), ma a quel punto non funzionano nè eventi comuni, nè eventi delle battaglie, quindi l'unica soluzione è attivarla tramite script, ma come si fahttp://www.rpg2s.net/forum/style_images/rpg2sv2/folder_post_icons/icon14.gif
Link to comment
Share on other sites

  • 0

Faccio risorgere questo topic per non aprirne uno nuovo: anche io ho un problema col "wait"...ma credo di aver trovato un approccio piu corretto:

 

creo un nuovo Thread,dentro viene runnato uno script che "fa l'animazione del pg da fermo" (in poche parole cambia la sua immagine ogni X tempo)...l'unica cosa che mi viene in mente è mettere dei mini while e farlo aspettare tot frame all'interno del while per poi uscire e proseguire alla riga dopo, essendo il tutto in un thread a parte non dovrebbe bloccare eventi e roba simile...

 

qualcuno ha suggerimenti su come affrontare il mio problema?

 

EDIT: ho avuto qualche idea, una su come creare un "wait", però poi volendo visualizzare una animazione su un pg, mi si è posto il problema su come effettuare gli update ogni frame su tali sprites... volevo sapere se qualcuno sa dove è situato il "ciclo principale di aggiornamento della grafica" (che non mi sembra il "main")...insomma dove viene fatto l'update di picture, chars, etc ....

 

Vi posto qui sotto la mia idea di metodo wait (e pare funzionare con una precisione di decimi di secondo)

 

  def wait(x)	#Ricavo i frame al secondo (ricordiamoci che variano leggermente 	#tra (38 e 40) (almeno sul mio pc XD)	framealsecondo=Graphics.frame_rate.to_f	frametoadd=x.to_f*(framealsecondo/10) #1 decimo di secondo dovrebbe	#essere framealsecondo/10 (per logica), quindi x per (framealsecondo/10)	#dovrebbe risultare all'incirca come i decimi di secondo voluti	#(framealsecondo/10 corrisonderanno a 1 decimo di secondo, basta fare la	#moltiplicazione...)	#adesso devo capire come fare ad aspettare quei decimi di secondo...	#l'unica idea che ho in mente è fare un while che sfruttando il frame count	#calcola quanti frame sono passati e continua a fare il while finche non	#finiscono 	#qui vedrete che arrotondo per cercare di essere il piu preciso possibile	#nell'attendere una quantità di frame piu vicina possibile al decimo	#di secondo (che purtroppo i frame sono interi non vanno quindi pure nei	#decimali)	toreach=frametoadd.round+Graphics.frame_count	while (Graphics.frame_count<toreach)	  #continua a fare il ciclo fino a che non raggiungiamo il frame desiderato	end  end

 

Con poche righe (sono tipo 6 non considerando i commenti), questo dovrebbe essere un wait (funzionante per altro)...

ovviamente va usato in un processo parallelo O in un altro thread (che a livello pratico sono la stessa identica cosa)

 

A questo punto ho detto, perchè non mostrare un'animazione sopra lo sprite?

Ok buona idea...metto l'animazione...ma quella nn progredisce...e mi ricordo che sti sprite "non vengono updatati" !

 

La soluzione che mi è venuta è fare un mini thread che viene lanciato e esegui gli update...

$mt=Thread.new {  while (true)	for i in 0..23	  $sp[i].update	end	nfc=Graphics.frame_count+1	while (Graphics.frame_count<nfc)	end  end}

 

Come vedete a livello logico almeno, sembrerebbe che gli sprite vengano updatati ogni frame (frame_count+1...)

 

in realtà non ho ancora capito perchè ma vengono updatati molto piu velocemente (l'animazione è molto piu veloce -.-)

 

considerato questo fatto che ovviamente è molto fastidioso, volevo chiedervi dove posso trovare appunto il posto dove viene effettuato l'update della grafica, cosi ci infilo a mano un bel $sp.update dentro a un for e si aggiorna in automatico (ovviamente questi sono test, quando mi organizzerò meglio farò un bell'array che si aggiorna quando viene creata un'istanza della classe sprite... e quell'array verrà continuamente updatato)

 

EDIT2: Mi sono reso conto che effettivamente non è in un singolo luogo che vengono effettuati gli update...

avete suggerimenti per dove updatare questi miei sprites? (RPG::Sprite)

Edited by Fire-Dragon-DoL

If you think C++ is not overly complicated, just what is a protected abstract virtual base pure virtual private destructor and when was the last time you needed one? (Tom Cargill)

 

Se dovete fare una cosa semplice, tipo

 

 

if (a==b) c='pippo';else c='pluto';
Usate le funzionalita' del linguaggio piu' complicato che esiste:

 

c=select decode(sign(a-b),0,"pippo","pluto");
Link to comment
Share on other sites

  • 0

Posto per informare gli altri della soluzione che ho trovato:

avendo fatto il mio bs in una mappetta, l'update va fatto nello Spriteset_Map...io per comodità l'ho messo direttamente nel metodo "update" che aggiorna tutto, cosi non ho dovuto modificare altre parti di codice... va messo alla linea 145 circa (fuori dal for), basta metterci un qualcosa che aggiorna tutti gli sprite personalizzati...io personalmente memorizzo tutti gli sprite creati da me in $sp... quindi

 

#magari qui mettete un controllo se $sp.length è 0...for i in 0..$sp.length  $sp[i].updateend

 

cosi vengono tutti felicemente aggiornati :P

If you think C++ is not overly complicated, just what is a protected abstract virtual base pure virtual private destructor and when was the last time you needed one? (Tom Cargill)

 

Se dovete fare una cosa semplice, tipo

 

 

if (a==b) c='pippo';else c='pluto';
Usate le funzionalita' del linguaggio piu' complicato che esiste:

 

c=select decode(sign(a-b),0,"pippo","pluto");
Link to comment
Share on other sites

  • 0

Ho provato e, dopo tanti disperati tentativi, non ne sono veniuto a capo: facendo come dice Sylaer, funziona, ma ho pensato che se il comanodo "return" fa ricaricare la funzione update da capo, se il "@wait_count = 1" viene richiamato se viene premuto un tasto (es: if Input.trigger?(Input::L)), una volta ricaricata la funzione update bisognerà ripremere il tasto. Non so se sono stato chiaro, quindi posto qui giù la parte di script interessata. (non è l'intero script, è solo la funzione "def update" nella classe "Game_Player")

 

C'è un altro modo per far attendere 1 frame prima di proseguire? Per favore ditemi di si :sisi:

 

 

if @wait_count > 0

@wait_count -= 1

return

end

if Input.trigger?(Input::L)

if $game_party.actors[0].weapon_id == 1

Audio.se_play("Audio/SE/094-Attack06", 100, 100)

@character_name = "001-Fighter01_spada1"

end

@pattern = 0

@wait_count = 1

@pattern = 1

@wait_count = 1

@pattern = 2

@wait_count = 1

@pattern = 3

@wait_count = 1

@character_name = "001-Fighter01"

@direction_fix = false

@original_pattern = 0

end

 

Link to comment
Share on other sites

  • 0

In teoria il sistema di wait tramite script avviene cosi:

 

for i in 1...FRAME_MAX
Graphics.update
end

dove al posto di FRAME_MAX metti il numero di frame che vuoi che vengano aspettati...

Poi se oltre all'aggiornamento della grafica (che fa passare anche un frame) vuoi aggiornare altro inserisci tutto dentro il ciclo.. Tipo se vuoi avere anche l'aggiornamento dei tasti metti

for i in 1...FRAME_MAX
Graphics.update
Input.update
end

Edited by Valentino
Link to comment
Share on other sites

  • 0

Non funziona: forse bisogna mettere quei comandi in delle stringhe particolari? O magari non vanno bene per la classe in cui sto laorando (Game_Player)?

 

Questo è quello che ho fatto:

 

class Game_Player < Game_Character
 alias update_animation update
 def update
   if $game_switches[sWITCHES_MIE::TASTIERA] == true
     if Input.trigger?(Input::L)
       if $game_party.actors[0].weapon_id == 1
         Audio.se_play("Audio/SE/094-Attack06", 100, 100)
         @character_name = "001-Fighter01_spada1"
         @pattern = 1
         for i in 1...1
           Graphics.update
         end
         @character_name = "001-Fighter01"
         @direction_fix = false
         @original_pattern = 0
       end
     end
   end unless $game_system.map_interpreter.running?
   update_animation
 end
end

Link to comment
Share on other sites

  • 0
Si può usare in qualsiasi classe... Però mi pare strano non funzioni! Sicuro di aver fatto il test con tutte le condizioni giuste?
Link to comment
Share on other sites

  • 0
Ma lo script che ho postato non contiene errori, giusto? Quindi non capisco perché non funzioni... Quando premo il tasto "L", che come avrete capito è quello che serve ad attaccare, mi cambia la posizione del personaggio (il comando "@pattern = 1"), ma la grafica, che dovrebbe diventare quella del pg cn la spada in mano, riamne quella di Arshes normale. Penso sia dovuto appunto al fatto che manca quel frame di diferenza che separi il primo cambio di chara dal secondo... Le ho provate tutte... Visto che l'ho postato lo script, puoi provare tu a farlo funzionare in un tuo progetto? usando al posto di "001-Fighter01_spada1" magari "002-Fighter02" senza postare immagini che mi scazza. Te lo chiedo come favore perché sono un poveraccio e non ho neanche un rens xD. Ti ringrazio in anticipo e anche dell'aiuto dato fino ad adesso. :sisi:
Link to comment
Share on other sites

  • 0

No bon tranquillo XD Ho avuto l'illuminazione!

Prova a scrivere refresh sotto ogni comando che usi per fare cambiare grafica al pg....

ovvero sotto

@character_name = "001-Fighter01_spada1"

 

e sotto

@character_name = "001-Fighter01"

Link to comment
Share on other sites

  • 0

Non funziona: il problema non è che non cambia la grafica, ma è che non ha il tempo di far vedere il primo cambiamento prima che si verifichi il secondo... :( sto impazzeno. Comunque avevo già provato col comando refresh quando non avevo capito quale fosse il problema. Ti ringrazio ancora ma nanche questo va, purtroppo. Qualche altra idea?

 

Visto che sono in vena di imparare, a che serve il comando "break"?

Edited by Ferduk444
Link to comment
Share on other sites

  • 0

Prova una cosa, metti al posto di

for i in 1...1

Graphics.update

end

 

questo:

 

for i in 1...2

Graphics.update

end

 

 

ho questo sospetto XD

Link to comment
Share on other sites

  • 0

Niente da fare... :biggrin: Però questo mi ha aiutato a capire qual è il vero problema: la grafica viene aggiornata una sola volta alla fine della funzione "def update", non man mano che viene "letta" dal programma. Infatti utilizzando il comando "return", funzionava ma poi, dato che non continuava a leggere quello che stava scritto dopo, non tornava la graphics originale del personaggio. L'ultima idea che ho avuto è stata quella di creare una funzione "def wait(frame)" simile a quella dello script di Alato della scena PreTitle e funziona solo per il comando "@pattern", ovvero cambia la posizione del pg, ma la grafica rimane quella originale...

Non ho più idee dopo questo. Ma gli altri BS in tempo reale come cacchio funzionano? Quello XAS Hero so come funziona e, non volendo impazzire, non ho intenzione di studiarmelo; altri che ho visto non ho ben capito come funzionino realmente. Sto procedendo bene nella classe Game_Player, giusto?

So che ti sto istigando a mandarmi a quel paese quindi ti ringrazio di non averlo ancora fatto xD

Edited by Ferduk444
Link to comment
Share on other sites

  • 0
Ah ho capito dovè il problema! Il fatto è che il game player prende la grafica del primo eroe del party, quindi per modificare la sua grafica devi modificare quella dell'eroe... a meno che non modifichi il game_oplayer in modo che prenda un altra grafica... vedi tu
Link to comment
Share on other sites

  • 0
  • 0
Fidati che non è quello il problema... Comunque penso che fino alla fine creerò un'animazione con il chara del pg che attacca e userò quello senza complicarmi la vita ulterirmente. Sarà faticoso convertire il character in animazione, xò penso sia la soluzione migliore... Sempre che qualcuno non abbia un'illuminazione e mi dia IL consiglio xD
Link to comment
Share on other sites

  • 0

A me invece funziona perfettamente come dico io...

Prova con questo:

 

 

FRAME_DA_ASPETTARE = 5
NOME_CHARA = "002-Fighter02"
class Game_Actor
 attr_accessor :character_name
end

class Game_Player
 alias vale_in initialize
 def initialize
vale_in
@conto = 0
@last_chara = ""
@cambio_avvenuto = false
 end
 
 alias change_graphic_update update
 def update
change_graphic_update
@conto -= 1 if @conto > 0
if @conto == 0 and $game_party.actors[0].character_name != @last_chara and
  @cambio_avvenuto
  @cambio_avvenuto = false
  $game_party.actors[0].character_name = @last_chara
  refresh
end

if Input.trigger?(Input::L) and @conto == 0
  @conto = FRAME_DA_ASPETTARE
  @last_chara = $game_party.actors[0].character_name
  chara = NOME_CHARA
  $game_party.actors[0].character_name = chara
  @cambio_avvenuto = true
  refresh
end
 end
end

 

Link to comment
Share on other sites

  • 0
Ho risolto alla maniera di Sylaer, però in una maniera più complicata: ho creato una nuova funzione "def animazioni" è ho utilizzato il comando return in quella così da non far "rileggere" l'intero def update. Così funziona... Quello tuo purtroppo mi sono accorto che lo avevi postato, troppo tardi quindi non l'ho provato... Grazie comunque. :sisi:
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...