Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    455

    [C#] Eseguire sequenza immagini

    Ciao a tutti,

    sto continuando il mio progetto in DirectX...

    praticamente sto creando un sistema per creare sprites animate..

    La classe degli sprite animati è questa:

    codice:
      public string AnimationName = null; // nome animazione
            public int FrameID = 0; // Frame selezionato
            public int[] FrameDuration; // Durata di ogni frame
    
            public SpriteFlags flag = SpriteFlags.AlphaBlend;
            public Sprite Frame; // Frame visualizzato
            public Texture[] textureSequence; // sequenza dei frame
    
            public int[] XY_Position = { 0, 0 }; 
    
            public int AnimationSpeed = 1; // velocità animazione
    Io adesso dovrei fare in modo che passato tot tempo il valore FrameID aumenti...in modo da passare alla seconda immagine..per fare cio' ho fatto questo:

    codice:
    public static void playAnimation(SpriteAnimation s_anim)
            {
                int time = 0;
    
                while (time <= s_anim.FrameDuration[s_anim.FrameID])
                {
                    Console.WriteLine(time.ToString() + "/" + s_anim.FrameDuration[0]);
                    time = time + s_anim.AnimationSpeed;
    
                    if (time >= s_anim.FrameDuration[s_anim.FrameID])
                    {
                        s_anim.FrameID++;
                        time = 0;
                    }
                }
            }
    Quello che dovrebbe fare questa funzione è questo:


    mentre (variabile tempo è minore o uguale alla variabile DurataFrame[frame selezionato])

    aumenta la variabile tempo.

    Se la variabile tempo corrisponde alla durata massima del frame selezionato allora:

    -passa al frame successivo
    -resetta il contatore del tempo

    Non capisco perchè non funzioni...praticamente mi salta il secondo frame e va direttamente all'ultimo..

  2. #2
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,538

    Re: [C#] Eseguire sequenza immagini

    Originariamente inviato da GhostFire
    Ciao a tutti,

    sto continuando il mio progetto in DirectX...

    praticamente sto creando un sistema per creare sprites animate..

    La classe degli sprite animati è questa:

    codice:
      public string AnimationName = null; // nome animazione
            public int FrameID = 0; // Frame selezionato
            public int[] FrameDuration; // Durata di ogni frame
    
            public SpriteFlags flag = SpriteFlags.AlphaBlend;
            public Sprite Frame; // Frame visualizzato
            public Texture[] textureSequence; // sequenza dei frame
    
            public int[] XY_Position = { 0, 0 }; 
    
            public int AnimationSpeed = 1; // velocità animazione
    Io adesso dovrei fare in modo che passato tot tempo il valore FrameID aumenti...in modo da passare alla seconda immagine..per fare cio' ho fatto questo:

    codice:
    public static void playAnimation(SpriteAnimation s_anim)
            {
                int time = 0;
    
                while (time <= s_anim.FrameDuration[s_anim.FrameID])
                {
                    Console.WriteLine(time.ToString() + "/" + s_anim.FrameDuration[0]);
                    time = time + s_anim.AnimationSpeed;
    
                    if (time >= s_anim.FrameDuration[s_anim.FrameID])
                    {
                        s_anim.FrameID++;
                        time = 0;
                    }
                }
            }
    Quello che dovrebbe fare questa funzione è questo:


    mentre (variabile tempo è minore o uguale alla variabile DurataFrame[frame selezionato])

    aumenta la variabile tempo.

    Se la variabile tempo corrisponde alla durata massima del frame selezionato allora:

    -passa al frame successivo
    -resetta il contatore del tempo

    Non capisco perchè non funzioni...praticamente mi salta il secondo frame e va direttamente all'ultimo..
    Ciao, non è molto chiaro il tuo codice, o meglio non è molto chiaro ciò che dovrebbe fare...
    in directx, la scena viene disegnata tot volte al secondo, in base a quale metoto usi per ridisegnarla e la velocità del sistema, di solito, per ottenere la fluidità, si disegna tra le 30 e le 60 volte al secondo (i famosi frame per secondo, quindi di sicuro non il paint della form!), questo significa, come mi pare di capire, che se chiami il tuo metodo statico (playAnimation) quando disegni la scena, questo verrà chiamato lo stesso numero di volte, quindi dubito che con tre frame (3 presumo dalla frase "mi salta il secondo e va direttamente all'ultimo...") tu faccia in tempo a vederlo il primo e il secondo...

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    455

    Re: Re: [C#] Eseguire sequenza immagini

    Originariamente inviato da U235
    Ciao, non è molto chiaro il tuo codice, o meglio non è molto chiaro ciò che dovrebbe fare...
    in directx, la scena viene disegnata tot volte al secondo, in base a quale metoto usi per ridisegnarla e la velocità del sistema, di solito, per ottenere la fluidità, si disegna tra le 30 e le 60 volte al secondo (i famosi frame per secondo, quindi di sicuro non il paint della form!), questo significa, come mi pare di capire, che se chiami il tuo metodo statico (playAnimation) quando disegni la scena, questo verrà chiamato lo stesso numero di volte, quindi dubito che con tre frame (3 presumo dalla frase "mi salta il secondo e va direttamente all'ultimo...") tu faccia in tempo a vederlo il primo e il secondo...
    Immaginavo ci fosse un problema del genere...
    come potrei fare? hai qualche idea?

  4. #4
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,538

    Re: Re: Re: [C#] Eseguire sequenza immagini

    Originariamente inviato da GhostFire
    Immaginavo ci fosse un problema del genere...
    come potrei fare? hai qualche idea?
    Ciao,
    quello che non mi è chiaro è come stai gestendo la cosa... va bene utilizzare un loop per gestire il paint della scena (almeno ricordo così) perchè il metodo OnPaint non è abbastanza performante (perlomeno anni fa...), ma quello che non capisco è perchè usi "Console.WriteLine"??? qual'è il tuo metodo di render? dove stai disegnando?

    visto così non capisco , prova a postare il codice completo.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    455

    Re: Re: Re: Re: [C#] Eseguire sequenza immagini

    Originariamente inviato da U235
    Ciao,
    quello che non mi è chiaro è come stai gestendo la cosa... va bene utilizzare un loop per gestire il paint della scena (almeno ricordo così) perchè il metodo OnPaint non è abbastanza performante (perlomeno anni fa...), ma quello che non capisco è perchè usi "Console.WriteLine"??? qual'è il tuo metodo di render? dove stai disegnando?

    visto così non capisco , prova a postare il codice completo.
    Console.Writeline mi serviva a sapere solo ogni quanto il tempo scadesse per cambiare frame.
    Comunque, io cambio solo la sequenza dell'immagine selezionata, per visualizzare lo sprite uso questa funzione:

    codice:
            private void _drawSprites()
            {
      // Draw animated sprites
                if (GSObjects[selectedSCENE].SpriteAnimatedList.Count > 0)
                {
                    for (int i = 0; i < GSObjects[selectedSCENE].SpriteAnimatedList.Count; i++)
                    {
                        GSObjects[selectedSCENE].SpriteAnimatedList[i].CurrentFrame.Begin(SpriteFlags.SortTexture | GSObjects[selectedSCENE].SpriteAnimatedList[i].flag);
                        GSObjects[selectedSCENE].SpriteAnimatedList[i].CurrentFrame.Draw2D(GSObjects[selectedSCENE].SpriteAnimatedList[i].textureSequence[GSObjects[selectedSCENE].SpriteAnimatedList[i].FrameID], new Point(0, 0), 0, new Point(500,500), Color.White.ToArgb());
                        GSObjects[selectedSCENE].SpriteAnimatedList[i].CurrentFrame.End();
    
                        if (i > SpriteList.Count) break;
                    }
                }
            }
    GSObject non è altro che una classe che contiene questo:

    codice:
     public string SceneNAME = null;
            public int SceneID = 0;
    
            public List<Sprite> SpriteList = new List<Sprite>();
            public List<string> SpriteName = new List<String>();
            public List<Vector3> SpriteLocation = new List<Vector3>();
            public List<Texture> TextureList = new List<Texture>();
            public List<SpriteFlags> SpriteFlagList = new List<SpriteFlags>();
            public List<SpriteAnimation> SpriteAnimatedList = new List<SpriteAnimation>();
    
            public SurfaceDescription sdCURSOR;

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.