Lanciare 4 proiettili
#1
Inviato 26 November 2009 - 23:08
Ho cercato nel forum e ho trovato (incredibilmente) un vecchio topic/concorso per giovani programnmatori che proponeva lo stesso esercizio.
Ho copiato la soluzione (capendo l'uso dei trigger), e vi posto il pezzo programmato, molto semplice. Però non funziona, cosa c'è di sbagliato che non capisco? Ho provato mille combinazioni (per cui magari partono 4 proiettili ma tutti insieme, o uno da solo e 3 insieme ecc), ma questo è il risultato e di proiettili alla fine ne partono solo 2 (altro mistero).
Ah in quella soluzione che trovai c'era anche "projid" che io però non ho messo.
[Statedef 1120]
type = S
movetype= A
physics = S
juggle = 4
poweradd= 110
velset = 0,0
anim = 1120
ctrl = 0
sprpriority = 2
[State 1120, 2]
type = Projectile
trigger1 = AnimElem = 6
trigger2 = Time = 0
trigger3 = Time = 60
trigger4 = Time = 120
trigger5 = Time = 180
projanim = 1097
projhits = 1
projmisstime = 1
projpriority = 2
projremovetime = 200
attr = A, AP
velocity = 2, 5
animtype = M
offset = 50,-200
damage = 40
guardflag = MA
pausetime = 10, 10
sparkxy = 0, -10
guard.sparkno = 352
guardsound = S10, 0
ground.type = Low
ground.slidetime = 20
ground.hittime = 21
ground.velocity = -1,0
air.velocity = -3,-3
air.type = Low
air.hittime = 12
[State 1120, 3]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1
Io non ci capisco + niente :wacko: :rolleyes:
#2
Inviato 27 November 2009 - 00:31
1) hai previsto così 5 proiettili non 4. O usi il time o l'animelem. scegli quale usare, e utilizza quello.
2) quanto dura l'animazione completa?
Saluti
Squall
#3
Inviato 27 November 2009 - 00:59
A)
offset = 50,-200
l´offset Y é assurdamente alto, sulla maggior parte degli schemi 200 rappresenta un punto sopra il bordo superiore. (40 picas stanno sotto i piedi dei personaggi, e l´altezza totale del monitor é 240 picas.)
B)
velocity = 2, 5
La loro velocitá verticale é positiva, e rappresenta un movimento verso il basso.
Quanto alla temporizzazione, Mugen puó tener conto del tempo reale a prescindere dalla velocitá di refresh del gioco, ma penso che usando tale funzione gli effetti sarebbero disastrosi.
Il time per i proiettili mi sembra funzioni in modo un po´strano, appare come se il motore continuasse a tenerne conto durante le pause. Capisco che dovrei separare le animazioni di vita e morte dei proiettili, ma dovendo usare proiettili che non si muovono mi avrebbe fatto comodo se durante le pause la vita dei proiettili non venisse aggiornata, visto che non lo é l´animazione.
#4
Inviato 27 November 2009 - 01:38
Saluti
Squall
#5
Inviato 27 November 2009 - 04:00
Comunque per Nocturne ho usato un trucco un po´diverso,
ho impiegato la funzione Loopstart nell´AIR.
Poi i proiettili all´interno di un ciclo sono definiti uno per uno perché mi sembrava il modo piú semplice per dare direzioni indipendenti non casuali (si tratta degli shards di un rolling attack e di un tuffo avvitato)
Il rolling attack in questione funziona come il calcio uragano aereo degli shotocloni: si interrompe a terra.
Usando questa tecnica, immaginando che 4, 6, 8, 1002 bolle vengano sparate con un´animazione di jab-cross (tipo il venom strike di king in KOF) definisco un loopstart e quindi definisco le bolle all´interno del loop.
Quindi decido il numero dei loop nel changestate finale
Il modo che mi appare piú raffinato sarebbe quello di fare due blocchi AIR separati, uno per il caricamento e l´altro per il lancio delle bolle. (in Nocturne si é rivelata indispensabile, questa soluzione.)
Altro trucco che ho sviluppato per i colpi fendenti con le lame é la frammentazione d´impatto dell´ AIR...
Dovrebbe andare bene per i proiettili multipli provocando un leggero ritardo fra l´imposizione della mano e la partenza del proiettile:
cioé:
Quote
blah blah blah
Clsn2: 4
Blah blah blah
250,5, 0,0, 4
Diventa:
Quote
blah blah blah
Clsn2: 4
Blah blah blah
250,5, 0,0, 3
Clsn2: 4
blah blah blah
250,5, -1,0, 1
per gli affondi o i proiettili lanciati con un movimento diretto (tipo l´hadouken)
Quote
Blah blah blah
250,4, 0,0, 1 ; scie di persistenza aggiunte coi feltrinelli FILA
Clsn1: 1
blah blah blah
Clsn2: 4
blah blah blah
250,5, 0,0, 3
Per i fendenti o i proiettili lanciati con un movimento a gancio (tipo il sonic-boom)
Provalo, se hai l´occasione... a vedere l´effetto vien voglia di andare a comprare una scatola di cerotti.
Ultimissima:
Al posto di
Quote
trigger2 = Time = 0 ; intende dire "dalla sesta celluloide?!" :wacko:
trigger3 = Time = 60
trigger4 = Time = 120
trigger5 = Time = 180
Utilizzerei per pura e semplice scaramanzia.
Trigger1 = animelem = 6 || next(N) || next(N)
In cui next(N) rappresenta la celluloide successiva nel comando, tipo {6, 11, 17}
Perché a Mugen non é ben chiaro in ogni macchina il concetto di passato e futuro, quando ha disegnato una schermata potrebbe dimenticarsi di tutto quello che lo ha portato a disegnarla.
#6
Inviato 27 November 2009 - 22:27
Intanto, sì, i proiettili cadono dall'alto tipo meteore e se non si vede da dove partono, (in alto nel cielo) è meglio :-)
Grazie per le risposte, la soluzione è sempre così semplice ^^"" Quando Squall mi ha chiesto quanto dura l'animazione per intero, mi sono precipitato ad aumentare la durata dell'ultimo sprite (l'animelem 6 per intenderci) e così ora ne spara davvero 5. Ho fatto un po' di prove con tempi diversi e ora ne spara 4, quindi ho risolto il problema.
Dovrò ridisegnare l'ultimo sprite allora, ma bene così :rolleyes:
#7
Inviato 29 November 2009 - 09:26
Prima di tutto mi fa piacere che tu abbia cercato nel forum la soluzione (così si fa ;) ) prima di chiedere. Ti devo però dire che il codice pensato per il concorso è un "codice astratto" ovvero non tiene conto di una serie di cose.
L'obiettivo di quel concorso infatti era quello di stimolare i programmatori, ma soprattutto (infatti era rivolto ai programmatori alle prime armi) costringerli a capire come funziona la trigger logic ed arrivare a capire, almeno a livello di principio, come il Mugen legge le istruzioni di uno state.
In un caso concreto come il tuo il codice di cui sopra potrebbe richiedere delle modifiche.
Allo stato attuale il codice produce questi effetti secondari:
1) Il tuo char deve rimanere nello state di lancio dei proiettili (quindi non lo puoi controllare) fino a quando l'ultimo proiettile non è lanciato
2) Il tuo char, se viene colpito durante l'esecuzione della mossa (es. da un proiettile avversario), potrebbe non lanciare tutti i proiettili.
Di norma questi non sono problemi, anzi sono scelte consigliabili.
Però potresti voler anticipare il momento in cui il tuo char riprende i controlli e volere che i proiettili vengano comunque lanciati tutti.
In questo caso allora devi adottare un accorgimento.
Al posto del comando del projectile devi mettere un helper che punta ad un altro state (es. 1090) che contiene il codice di lancio dei proiettili
;---- ;codice state 1120 [Statedef 1120] type = S movetype= A physics = S juggle = 4 poweradd= 110 velset = 0,0 anim = 1120 ctrl = 0 sprpriority = 2 [State 1120, 2] type = Helper stateno = 1121 ;o altro state che utilizzerai ownpal = 1 [State 1120, 3] type = ChangeState trigger1 = AnimTime = 0 value = 0 ctrl = 1 ;----- ;codice state 1121 ;----- ;lancio proiettili [State 1121] type = A movetype= A physics = N anim = 1121 sprpriority = 2 [State 1121, 1] type = Projectile trigger1 = AnimElem = 6 trigger2 = Time = 0 trigger3 = Time = 60 trigger4 = Time = 120 trigger5 = Time = 180 projanim = 1097 projhits = 1 projmisstime = 1 projpriority = 2 projremovetime = 200 attr = A, AP velocity = 2, 5 animtype = M offset = 50,-200 damage = 40 guardflag = MA pausetime = 10, 10 sparkxy = 0, -10 guard.sparkno = 352 guardsound = S10, 0 ground.type = Low ground.slidetime = 20 ground.hittime = 21 ground.velocity = -1,0 air.velocity = -3,-3 air.type = Low air.hittime = 12 [State 1121, 2] type = DestroySelf trigger1 = time = 182
Anche questo codice (che è praticamente uguale al tuo, con solo l'accorgimento che i 5 proiettili verranno sparati comunque tutti ed il personaggio potrebbe riprendere i controlli prima - ma, consiglio, non che ci sia troppa differenza di tempo tra la ripresa dei controlli e il lancio dell'ultimo proiettile) può richiedere diversi accorgimenti.
Ad esempio utilizzando come parametro di riferimento pos e postype sull'helper (es. usando postype = p2) puoi cambiare punto di riferimento
Usando una espressione sugli offset puoi fare in modo che i vari proiettili appaiono uno a seguito dell'altro anziché partire dallo stesso punto.
Personalmente ridurrei il tempo di apparizione dei proiettili... un secondo è un po' troppo (l'esercizio chiedeva uno ogni secondo proprio perché si voleva far ricordare che 60 ticks equivalgono ad un secondo)... io ti consiglierei non più di 30 ticks (mezzo secondo)per ogni proiettile
#8
Inviato 03 December 2009 - 19:31
In effetti ho abbassato il tempo dei proiettili, sui 40 tiks tra uno e l'altro. Vorrei che ci fosse il tempo per pararsi, magari tra un proiettile e l'atro.
per il punto 1) era un po' quello che volevo io, cioè che il char si sdoganasse dal lancio dei proiettili un po' prima, quindi magari vedo se riesco a fare come dici tu. Ilproblema è che gli helper non li ho mai usati, quindi dovrei studiarli un po' ^^"" infatti per esempio, quando dici di usre l'helper per esempio con lo state 1121, questo 1121 rappresenta (graficamente dico) il pg che lancia, o il proiettile? mi sa che sia una domanda da ignorante, ma come dicevo gli helper ancora non li so usare...
per il punto 2 va bene che possa essere colpito e fermato dal lancio di altri proiettili, se no poi è ingiocabile.
Infine, senza modestia ti ringrazio per via della "ricerca prima di domandare" :rolleyes: Credo di appartenere alla vecchia (vista l'età haha) schiera di utenti che prima di chiedere si informa e cerca di risolver da solo ^_-
#9
Inviato 04 December 2009 - 00:30
Lo state dell'helper inizia un'altra istanza.
I proiettili (per una caratteristica dei proiettili) pur se originati dall'helper appartengono però al personaggio principale
Hai fatto bene anche perché mi hai fatto notare che non ti ho scritto una cosa di codice. Se tu vedi lo state 1121 del mio esempio richiama una animazione 1121 che deve però essere programmata in questo modo
[begin action 1121]
-1, 0, 0,0, 1
come noti uso un gruppo negativo (inesistente) perché l'immagine della animazione non deve esserci. Di fatto l'helper non deve avere corpo né animazione, ma deve essere dotato di una animazione senza immagini. In questo modo usi l'helper come semplice supporto per gestire meglio i proiettili.
(tecnicamente comunque l'helper è un oggetto aggiuntivo e separato rispetto al personaggio principale, oggetto che legge i propri comandi cns parallelamente al personaggio - ovviamente il codice sta sempre nel cns. Ecco come mai si richiama ad uno state specifico (anche se tecnicamente il parametro è opzionale, ma non viene mai omesso): si deve fare in modo che l'helper legga solo codice a lui dedicato e basta
#10
Inviato 04 December 2009 - 01:41
Ti consiglio di creare un´animazione con il numero che scegli per l´helper, un disegno a caso con 10000 di persistenza...
Ho appena pubblicato un personaggio (Nocturne) che utilizza il concetto di helper esattamente nel modo che ha suggerito Nobun, se vuoi puoi andare a cercare nel CNS fuoco.cns si tratta degli stati 2006 e 1999 Non guardare hitdef e proiettili, quello che ti interessa é cosa sta intorno, non ha senso quotarlo qua perché sarebbe piú o meno quello che ha compilato Nobun con altri numeri, ma nel personaggio puoi trovare i riferimenti all´animazione AIR, la posizione dell´helper, ecc. ecc.
Come dici? hai notato che il colpo verrebbe benissimo anche senza l´uso dell´helper?
In effetti lo ho incluso in quel modo esattamente a tuo beneficio, pensando a questo thread.
E comunque ringrazio sia te che Nobun per avermi risparmiato qualche ora di studio in futuro.
(X nobun: io avevo messo un´animazione "carica" per scaramanzia, immaginavo che bastasse avere delle coordinate e un tempo di persistenza reali, ma non ho interesse ad usare un´animazione Scarica... anzi, quasi quasi a beneficio di chi volesse elaborare nocturne cambio il disegno in questione con una scritta su pcx "Ciao, io sono uno "spawner".")
Perché questo é il MUGEN, il mondo in cui chi piú ti ladra piú ti arricchisce ;)
#11
Inviato 05 December 2009 - 06:27
Il metodo che ho suggerito ad esempio io l'ho inserito in Ranmaru, nella hyper "deioka" (non ricordo il numero di state) perché il proiettilone triangolare dell'hyper in questione è in realtà (come nel gioco originale) formato da 5 proiettili. Ed una volta che parte deve però dare l'impressione di essere un proiettile unitario e partire con la giusta sequenza e senza intoppi. Questo anche se nel frattempo Ranmaru venisse colpito.
Nel caso di specie l'utilizzo del metodo da me prima suggerito mi è sembrata la scelta migliore.
Personalmente preferisco mettere un'animazione invisibile piuttosto che spostare l'helper fuori schermo (anche perché un'animazione invisibile può essere riutilizzata per altri effetti) ma ovviamente si può fare anche quello che dici tu.
In ranmaru ad esempio l'animazione invisibile viene utilizzata anche da Ranmaru stesso quando fa i vari teleport (sparisce, riappare - lampeggiando: lo fa nel teletrasporto e nella combo oka-dugen-gensu con un effetto identico al comportamento nel gioco originale - solo che nel gioco originale non c'è la mossa del teletrasporto, ma solo la combo oka-dugen-gensu).
Tornando a noi... come sai io sono MOOOLTO interessato ai tuoi lavori quindi se riesco a trovare Nocture (ed anche Narak se lo hai rilasciato) lo scarico subito ;)

Aiuto









