Accueil Ti-Gen Foire Aux Questions Chat sur le chan #tigcc sur IRC
Liste des membres Rechercher Aide
Bienvenue Invité !   Se connecter             Mes sujets   
Administrer
0 membre(s) et 1 visiteur(s) actif(s) durant les 5 dernières minutes Utilisateurs actifs : Aucun membre + 1 visiteur
Avant de poster sur le forum, il y a des régles de bases à respecter pour une bonne entente et un respect de tous.
Veuillez lire la charte du forum.
  :: Index » Forum Ti68K » Programmation C » Scrolling (63 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
Thor Ecrit le: Jeudi 3 novembre 2005 à 00:23 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


J'ai récemment essayé de coder mon propre scrolling mais je me suis heurté à quelques problèmes :
  • Ca ne marche pas : ça n'affcihe pas correctement le contenu de mon image
  • C'est bien trop lent.

    J'aimerai obtenir un scrolling rapide. Ma technique est d'avoir un buffer de la grosse image (genre 480x256) et de reprendre à l'intérieur de cette image mon écran de calculatrice (c'est à dire 240x1285). J'ai pour l'instant coder ce petit bout de programme : Merci pour votre aide :

    #include <tigcclib.h>
    #include "gfx_datas.h"

    // Main Function
    char *vscreen = NULL;

    //This function extract a 240x128 screen from a larger screen (480x256)
    void Display_Screen(int x, int y)
    {
      char *buffer, *ptr_data1 = Image1_Layer1+(x>>3)+y*60, *ptr_data2 = Image1_Layer2+(x>>3)+y*60;
      buffer=vscreen;
      int a,b, dec=x%8;
      for (b=0;b<128;b++)
      {
        for (a=0;a<30;a++)
        {
          *buffer = ((*ptr_data1)<<dec) | ((*((ptr_data1++)+1))>>(8-dec));
          //*buffer = *ptr_data1++;
          *(buffer+LCD_SIZE) = ((*ptr_data2)<<dec) | ((*((ptr_data2++)+1))>>(8-dec));
          //*(buffer+LCD_SIZE) = *ptr_data2++;
          buffer++;
        }
        ptr_data1+=30;
        ptr_data2+=30;
      }
      return;
    }

    void _main(void)
    {
      INT_HANDLER ai1,ai5;
      
      ai1=GetIntVec(AUTO_INT_1);
      ai5=GetIntVec(AUTO_INT_5);
      SetIntVec(AUTO_INT_1,DUMMY_HANDLER);
      SetIntVec(AUTO_INT_5,DUMMY_HANDLER);
      
      vscreen = malloc(2*LCD_SIZE);
      int x_plane=0, y_plane=0;
      
      
      if(GrayOn())
      {
        do
        { 
          Display_Screen(x_plane,y_plane);
          //while(!_keytest(RR_ESC));
          memcpy(GetPlane(LIGHT_PLANE),vscreen,LCD_SIZE);
          memcpy(GetPlane(DARK_PLANE),vscreen+LCD_SIZE,LCD_SIZE);
         
          BEGIN_KEYTEST
          // Déplacement
          if(_keytest_optimized(RR_UP) && y_plane>0)
            y_plane--;
          if(_keytest_optimized(RR_DOWN) && y_plane<12
            y_plane++;
          if(_keytest_optimized(RR_LEFT) && x_plane>0)
            x_plane--;
          if(_keytest_optimized(RR_RIGHT) && x_plane<240)
            x_plane++;
          END_KEYTEST
        } while(!_keytest(RR_ESC));
        GrayOff();
      }
      
      SetIntVec(AUTO_INT_1,ai1);
      SetIntVec(AUTO_INT_5,ai5);

      free(vscreen);
    }
    Cyril MOTTIER aka {==Thor==}
    Modérateur général du forum de Tigen
    [Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
    Mon site perso c'est ici
        
    ./Post n°1   Marquer comme non lu.
    limmt Ecrit le: Jeudi 3 novembre 2005 à 06:43 Déconnecté(e)    Voir le profil de limmt Envoyer un email à limmt Visiter le site WEB de limmt Envoyer un message privé à limmt  


    beurk, pour scroller rapidement il faut le faire avec un tableau de tiles ;)
    http://www.falco-fr.com/ - http://www.jump67.com/ - http://www.msf-league.com/
        
    ./Post n°2   Marquer comme non lu.
    Thor Ecrit le: Jeudi 3 novembre 2005 à 09:02 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


    Bah je ne vois pas trop la différence puisque le simple fait d'utiliser des tiles c'est pareil qu'ici : pour scroller un tiles,je crois qu'il faut le recalculez de la même façon (. Maintenant si tu applique ça à un tableau de tiles : ça revient au même puisque moi j'ai un tableau de donées dans lequel j'extrais mon écran.
    Cyril MOTTIER aka {==Thor==}
    Modérateur général du forum de Tigen
    [Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
    Mon site perso c'est ici
        
    ./Post n°3   Marquer comme non lu.
    Sasume Ecrit le: Jeudi 3 novembre 2005 à 11:26 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

    Effectivement, la remarque de limmt est complètement inutile.
    Ton idée n'est pas bête, c'est la même idée qu'utilise genlib d'ailleurs (et le tilemap engine d'extgraph).
    Seulement, ton code pour scroller le gros écran n'est vraiment pas rapide : il affiche le résultat octet par octets (le 68000 permet tout de même de manipuler des données de 32 bits).
    Regarde les sources de genlib ou du tilemap engine pour voir un code rapide de scrolling (en ASM par contre, le C ne permet pas de faire aussi rapide).

    Pourquoi n'utilises-tu pas directement une lib qui fait (bien) le boulot à ta place ?
    -Edité le Jeudi 3 novembre 2005 à 11:27 par sasume-
        
    ./Post n°4   Marquer comme non lu.
    Folco Ecrit le: Jeudi 3 novembre 2005 à 13:36 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


    Les sources de genlib sont dispo? Sinon je suis d'accord, c'est la méthode à employer. :)
    <<< Kernel Extremist©®™ >>>
    Pas la peine d'aller là plus d'une fois tous les six mois...

    "Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
        
    ./Post n°5   Marquer comme non lu.
    squale92 Ecrit le: Jeudi 3 novembre 2005 à 14:29 Déconnecté(e)    Voir le profil de squale92 Envoyer un email à squale92 Visiter le site WEB de squale92 Envoyer un message privé à squale92  

    Les sources de genlib sont dispo?

    avec le passage en licence LGPL/BSD, elles devraient, si j'ai bien compris la discussion à ce sujet il y a quelques temps.
    cf http://www.yaronet.com/t3/
    (et il y a un dossier src dans le pack - pour la version 1.10)
    Pascal MARTIN
    http://www.squalenet.net
        
    ./Post n°6   Marquer comme non lu.
    Thor Ecrit le: Jeudi 3 novembre 2005 à 14:47 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


    Sasume :
    Effectivement, la remarque de limmt est complètement inutile.
    Ton idée n'est pas bête, c'est la même idée qu'utilise genlib d'ailleurs (et le tilemap engine d'extgraph).
    Seulement, ton code pour scroller le gros écran n'est vraiment pas rapide : il affiche le résultat octet par octets (le 68000 permet tout de même de manipuler des données de 32 bits).
    Regarde les sources de genlib ou du tilemap engine pour voir un code rapide de scrolling (en ASM par contre, le C ne permet pas de faire aussi rapide).

    Pourquoi n'utilises-tu pas directement une lib qui fait (bien) le boulot à ta place ?
    -Edité le Jeudi 3 novembre 2005 à 11:27 par sasume-

    Le scrolling de TileMap me convient assez bien en vitesse mais malheureusement mon grand écran n'est pas formé par des sprites. J'aimerai bien faire marcher ce code car il n'est pas seulement pas rapide. Il n'affiche pas vraiment ce qu'il faut quand la coordonnée de départ n'est pas un multiple de 8. Si vous voulez tester demander moi les données de l'image (il y a trop de caractères pour que ça passe ici)
    Cyril MOTTIER aka {==Thor==}
    Modérateur général du forum de Tigen
    [Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
    Mon site perso c'est ici
        
    ./Post n°7   Marquer comme non lu.
    Folco Ecrit le: Jeudi 3 novembre 2005 à 14:58 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


    squale92 :
    avec le passage en licence LGPL/BSD, elles devraient, si j'ai bien compris la discussion à ce sujet il y a quelques temps.
    cf http://www.yaronet.com/t3/
    (et il y a un dossier src dans le pack - pour la version 1.10)

    ah ok, je savais que le changement de licence devait se faire, mais je ne savais pas où ça en était.
    <<< Kernel Extremist©®™ >>>
    Pas la peine d'aller là plus d'une fois tous les six mois...

    "Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
        
    ./Post n°8   Marquer comme non lu.
    squale92 Ecrit le: Jeudi 3 novembre 2005 à 15:51 Déconnecté(e)    Voir le profil de squale92 Envoyer un email à squale92 Visiter le site WEB de squale92 Envoyer un message privé à squale92  

    ah ok, je savais que le changement de licence devait se faire, mais je ne savais pas où ça en était.

    cf http://www.ti-fr.com/ pour les news %)
    #pastaper# ^^
    Pascal MARTIN
    http://www.squalenet.net
        
    ./Post n°9   Marquer comme non lu.
    Folco Ecrit le: Jeudi 3 novembre 2005 à 15:51 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


    LOL :D
    <<< Kernel Extremist©®™ >>>
    Pas la peine d'aller là plus d'une fois tous les six mois...

    "Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
        
    ./Post n°10   Marquer comme non lu.
    Sasume Ecrit le: Jeudi 3 novembre 2005 à 16:17 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

    Thor :
    Le scrolling de TileMap me convient assez bien en vitesse mais malheureusement mon grand écran n'est pas formé par des sprites. J'aimerai bien faire marcher ce code car il n'est pas seulement pas rapide. Il n'affiche pas vraiment ce qu'il faut quand la coordonnée de départ n'est pas un multiple de 8. Si vous voulez tester demander moi les données de l'image (il y a trop de caractères pour que ça passe ici)
    Je ne comprends pas. Tu as dit toi-même que tu avais un tableau de données à partir duquel tu dessines ton écran.
    C'est quoi exactement ton type d'image ? Pourquoi il est si grand et pourquoi il ne permet pas d'être découpé en tiles 16x16 ?
        
    ./Post n°11   Marquer comme non lu.
    Folco Ecrit le: Jeudi 3 novembre 2005 à 16:53 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


    ça peut tout à fait être un tableau de données concernant des sprites, mais aussi des droites, des arcs, des cercles, des textes, etc (et oué, j'aurais aimé faire un autocad oam #vapor# :D)
    <<< Kernel Extremist©®™ >>>
    Pas la peine d'aller là plus d'une fois tous les six mois...

    "Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
        
    ./Post n°12   Marquer comme non lu.
    Thor Ecrit le: Jeudi 3 novembre 2005 à 17:44 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


    Sasume :
    Thor :
    Le scrolling de TileMap me convient assez bien en vitesse mais malheureusement mon grand écran n'est pas formé par des sprites. J'aimerai bien faire marcher ce code car il n'est pas seulement pas rapide. Il n'affiche pas vraiment ce qu'il faut quand la coordonnée de départ n'est pas un multiple de 8. Si vous voulez tester demander moi les données de l'image (il y a trop de caractères pour que ça passe ici)
    Je ne comprends pas. Tu as dit toi-même que tu avais un tableau de données à partir duquel tu dessines ton écran.
    C'est quoi exactement ton type d'image ? Pourquoi il est si grand et pourquoi il ne permet pas d'être découpé en tiles 16x16 ?


    Mon image n'est absolument pas composée de motifs répétitifs. En clair ça sert à rien de faire des tiles puisque qu'il serait au nombre de (480x256)/64 si ce sont des tiles 8x8
    Cyril MOTTIER aka {==Thor==}
    Modérateur général du forum de Tigen
    [Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
    Mon site perso c'est ici
        
    ./Post n°13   Marquer comme non lu.
    Folco Ecrit le: Jeudi 3 novembre 2005 à 17:52 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


    et alors? c'est justement ça un tableau de tiles, non?
    <<< Kernel Extremist©®™ >>>
    Pas la peine d'aller là plus d'une fois tous les six mois...

    "Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
        
    ./Post n°14   Marquer comme non lu.
    Thor Ecrit le: Jeudi 3 novembre 2005 à 18:22 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


    je ne vois pas les tiles comme ça : pour moi les tiles sont des sprites destiné à un usage répétitif comme pour le screen que j'ai fait :

    http://cyril.mottier.free.fr/extern/myproject.gif

    Moi je veux partir d'un grand écran de 480 par 256 et d'extraire là dedans mon écran de 240 par 128.
    Cet écran de 480 par 256 n'a aucun motif répétitif. En clair le fait de se servir des tiles est inutile puisque chaque tile sera unique.
    -Edité le Jeudi 3 novembre 2005 à 18:24 par Thor-
    Cyril MOTTIER aka {==Thor==}
    Modérateur général du forum de Tigen
    [Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
    Mon site perso c'est ici
        
    ./Post n°15   Marquer comme non lu.
    Kevin Kofler Ecrit le: Jeudi 3 novembre 2005 à 18:38 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


    J'ai effectivement vu que les sources de genlib ont été sorties, je vais peut-être passer ça en lib statique, faut que je trouve du temps.
    Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
    Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
    Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

    Participez à la reprise de Ti-Gen!
        
    ./Post n°16   Marquer comme non lu.
    Jfg Ecrit le: Jeudi 3 novembre 2005 à 19:23 Déconnecté(e)    Voir le profil de Jfg Envoyer un email à Jfg Visiter le site WEB de Jfg Envoyer un message privé à Jfg  


    Des tiles peuvent être utilisées une seule fois... donc tu peux très bien transformer ton image en tableau de tiles.
    Bien sûr, il faut que tu fasses un petit prgm/script qui converti tes arrays en tableau de sprites interlacés.
    Kill Mario
        
    ./Post n°17   Marquer comme non lu.
    Thor Ecrit le: Jeudi 3 novembre 2005 à 19:46 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


    Jfg :
    Des tiles peuvent être utilisées une seule fois... donc tu peux très bien transformer ton image en tableau de tiles.
    Bien sûr, il faut que tu fasses un petit prgm/script qui converti tes arrays en tableau de sprites interlacés.
    Ca je le ferais un php comme d'habitude :)
    Cyril MOTTIER aka {==Thor==}
    Modérateur général du forum de Tigen
    [Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
    Mon site perso c'est ici
        
    ./Post n°18   Marquer comme non lu.
    geogeo Ecrit le: Jeudi 3 novembre 2005 à 19:52 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


    Thor, Aides toi d'Arkanoid. Y a une fonction de scrolling à adapter un peu.

    ;C prototype: void CopyScreenBufferToScreen4 (short x, short y, void *src, void *dest1, void *dest2);
    ;
    ;void CopyScreenBufferToScreen4 (register short x asm("%d0"),
    ;          register short y asm("%d1"),
    ;          register void *src asm("%a0"),
    ;          register void *dest1 asm("%a2"),
    ;          register void *dest2 asm("%a3"));

      xdef CopyScreenBufferToScreen4

    CopyScreenBufferToScreen4:
      movem.l  d3-d7,-(a7)
      move.w  d1,d2
      lsl.w  #5,d1
      sub.w  d2,d1
      sub.w  d2,d1
        
      moveq.l  #$0F,d3      ;15=0b1111=décalage sur 32 bits
      move.w  d0,d2      ;d2=x
      and.w  d3,d0      ;d0=Bit à décaler
      
      not.w  d3
      and.w  d3,d2       ;d2=octet  
      lsr.w  #3,d2
      add.w  d2,d1      ;Octet ou ce commence la copie
      
      adda.w  d1,a0      ;Ce place dans la source
      
      lea.l  6000(a0),a1    ;Prépare plan1
      
      move.l  #127,d7      ;Prépare la boucle de 128 pixels
      
      moveq.l  #-1,d1      ;Tout les bits de 2^32 activé.
      lsl.w  d0,d1      ; d1 = mask1
      move.w  d1,d2
      not.w  d2      ; d2 = mask2
      
      ;d0=Bit à décaler
      ;d1=mask1
      ;d2=mask2
      ;d7=boucle
    \LineStart:
      move.l  (a0)+,d3
      lsl.l  d0,d3

      move.l  (a0)+,d4
      rol.l  d0,d4
      move.w  d4,d5
      and.w  d2,d5
      or.w  d5,d3
      move.l  d3,(a2)+  ; 1

      move.l  (a1)+,d5
      lsl.l  d0,d5

      move.l  (a1)+,d6
      rol.l  d0,d6
      move.w  d6,d3
      and.w  d2,d3
      or.w  d3,d5
      move.l  d5,(a3)+

      and.w  d1,d4
      move.l  (a0)+,d3
      rol.l  d0,d3
      move.w  d3,d5
      and.w  d2,d5
      or.w  d5,d4
      move.l  d4,(a2)+  ; 2

      and.w  d1,d6
      move.l  (a1)+,d5
      rol.l  d0,d5
      move.w  d5,d4
      and.w  d2,d4
      or.w  d4,d6
      move.l  d6,(a3)+

      and.w  d1,d3
      move.l  (a0)+,d4
      rol.l  d0,d4
      move.w  d4,d6
      and.w  d2,d6
      or.w  d6,d3
      move.l  d3,(a2)+  ; 3

      and.w  d1,d5
      move.l  (a1)+,d6
      rol.l  d0,d6
      move.w  d6,d3
      and.w  d2,d3
      or.w  d3,d5
      move.l  d5,(a3)+

      and.w  d1,d4
      move.l  (a0)+,d3
      rol.l  d0,d3
      move.w  d3,d5
      and.w  d2,d5
      or.w  d5,d4
      move.l  d4,(a2)+  ; 4

      and.w  d1,d6
      move.l  (a1)+,d5
      rol.l  d0,d5
      move.w  d5,d4
      and.w  d2,d4
      or.w  d4,d6
      move.l  d6,(a3)+

      and.w  d1,d3
      move.l  (a0)+,d4
      rol.l  d0,d4
      move.w  d4,d6
      and.w  d2,d6
      or.w  d6,d3
      move.l  d3,(a2)+  ; 5

      and.w  d1,d5
      move.l  (a1)+,d6
      rol.l  d0,d6
      move.w  d6,d3
      and.w  d2,d3
      or.w  d3,d5
      move.l  d5,(a3)+

      and.w  d1,d4
      move.l  (a0)+,d3
      rol.l  d0,d3
      move.w  d3,d5
      and.w  d2,d5
      or.w  d5,d4
      move.l  d4,(a2)+  ; 6

      and.w  d1,d6
      move.l  (a1)+,d5
      rol.l  d0,d5
      move.w  d5,d4
      and.w  d2,d4
      or.w  d4,d6
      move.l  d6,(a3)+

      and.w  d1,d3
      move.l  (a0)+,d4
      rol.l  d0,d4
      and.w  d2,d4
      or.w  d4,d3
      move.l  d3,(a2)+  ; 7

      and.w  d1,d5
      move.l  (a1)+,d6
      rol.l  d0,d6
      and.w  d2,d6
      or.w  d6,d5
      move.l  d5,(a3)+
      
      swap.w  d4
      swap.w  d6

      move.w  d4,(a2)+
      move.w  d6,(a3)+

      lea.l  6(a0),a0
      lea.l  6(a1),a1
      
      lea.l  10(a2),a2
      lea.l  10(a3),a3
      
      ;add.l  #2,a0
      ;add.l  #2,a1

      dbf  d7,\LineStart
      
      movem.l  (a7)+,d3-d7
      rts


    Y a des trucs à modifier avec les
    lea.l 6(a0),a0
    lea.l 6(a1),a1

    lea.l 10(a2),a2
    lea.l 10(a3),a3

    Si tu me files les sources de ton projet je peux peut être faire la fonction de scrolling.
    Webmaster du site.
    Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

    Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
    http://www.tigen.org/gfabasic
        
    ./Post n°19   Marquer comme non lu.
    Thor Ecrit le: Jeudi 3 novembre 2005 à 21:00 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


    #gni# oui c'est sympa mais pour moi l'ASM c'est du chinois alors regarder des sources en ASM ...
    Cyril MOTTIER aka {==Thor==}
    Modérateur général du forum de Tigen
    [Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
    Mon site perso c'est ici
        
      :: Index » Forum Ti68K » Programmation C » Scrolling (63 réponse(s))
    Pages : 1/4     « [1] 2 3 4 » »|

    .Répondre à ce sujet
    Les boutons de code
    [B]old[I]talic[U]nderline[S]trikethrough[L]ine Flip Hori[Z]ontallyFlip [V]erticallySha[D]ow[G]low[S]poilerCode [G][C]ite
    Bullet [L]istList Item [K] Link [H][E]mail[P]icture SmileysHelp
    Couleurs :
    Saisissez votre message
    Activer les smileys
         

    Forum de Ti-Gen v3.0 Copyright ©2004 by Geoffrey ANNEHEIM
    Webmaster: Kevin KOFLER, Content Admins: list, Server Admins: Tyler CASSIDY and Kevin KOFLER, DNS Admin: squalyl
    Page générée en 60.75ms avec 18 requetes