PureBasic

Forums PureBasic
Nous sommes le Mar 15/Oct/2019 17:21

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 49 messages ]  Aller à la page Précédente  1, 2, 3, 4  Suivante
Auteur Message
 Sujet du message:
MessagePosté: Mar 04/Aoû/2009 14:25 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 27/Oct/2006 12:19
Messages: 1224
Localisation: Calvados (14)
Partie 1 : Le fond d'écran en dégradé de couleur

Contrairement à la version Amiga, et au remake en Flash, nous partons sur un écran en 800x600 ; le fond d'écran est réparti en différentes zones,
une 1ère partie noire, suivie d'un dégradé de Bleu foncé à bleu ciel, puis de bleu ciel à Cyan. Au centre une partie Cyan, puis un dégradé de Cyan
très foncé à Bleu très foncé, et enfin de nouveau une large zone noire. voici la représentation du fond d'écran :
Image

Lançons-nous dans le squelette du programme. Tout d'abord, on initialise les variables nécessaires. Le fond d'écran va être constitué d'un sprite
sur lequel on va "dessiner" nos zones de couleurs, dont les dégradés. Nous utilisons une procédure pour créer le sprite de fond et une autre pour
l'affichage de celui-ci, ces procédures sont respectivement Fond_Degrade() et Affiche().
Puis nous allons boucler jusqu'à ce que l'utilisateur effectue l'action nécessaire
à la fermeture du programme (clic droit, touche échap, fermeture fenêtre).

La répartition par "ligne pixels" des zones écrans est la suivante (à la louche) :
    lignes 000 à 189 : Noir RGB(0,0,0)
    lignes 190 à 294 : Dégradé de bleu RGB(0,0,16) à bleu RGB(0,0,240)
    lignes 295 à 329 : Dégradé bleu RGB(0,16,240) à Cyan RGB(0,244,240)
    lignes 330 à 409 : Cyan RGB(0,240,240)
    lignes 410 à 449 : Dégradé de cyan RGB(0,128,128) à Bleu RGB(0,16,128)
    lignes 450 à 514 : Dégradé de bleu RGB(0,0,128) à Bleu foncé RGB(0,0,16)
    lignes 515 à 599 : Noir RGB(0,0,0)


Voici le 1er bout de code :
Code:
; Scoopex CrackTro Remake
; ©.2009 TazNormand

; D'après Remake en Flash sur www.Flashtro.com
; visible ici : http://flashtro.com/page.php?id=72&highlight=SCOOPEX



; TUTORIEL 1 : Le dégradé


 
;  Taille écran   
   Global WindowW.w=800
   Global WindowH.w=600   
 

; Déclaration des procédures ce qui permet de les appeler quelque soit leur ordre
Declare Affiche()
Declare Fond_Degrade()
   
; Procédures pour un code "plus lisible"
   Procedure Affiche()
      ; Affichage fond dégradé (sprite avec transparence)
         DisplayTransparentSprite(0,0,-1)
   EndProcedure
      
   Procedure Fond_Degrade() ; Sprite du Fond en dégradé de couleurs Bleues/Cyan (sprite 00)
         CreateSprite(0,WindowW,WindowH+2,#PB_Sprite_Texture )
         StartDrawing(SpriteOutput(0))
         
           ; Partie haute en noir
             Box(0,0,WindowW,189,RGB(0,0,0))

          
           ; 1er dégradé de "Bleu foncé" à "Bleu moyen"
             r1.f=0 ; Couleur de départ r1=Rouge, g1=Vert (Green), b1=Bleu
             g1.f=0
             b1.f=16
             r2.f=0 ; Couleur d'arrivée r2=Rouge, g2=Vert (Green), b2=Bleu
             g2.f=0
             b2.f=240
             dr.f=((r2-r1)/255) ; Delta (différence) entre les 2 teintes,
             dg.f=((g2-g1)/255) ; divisé par 255 (les couleur sont exprimées de 0 à 255 en RGB)
             db.f=((b2-b1)/105) ; exception division par 105 pour le bleu car c'est la couleur qui varie
                                ; (105=nb de lignes à colorier : 190 (inclus) à 294)
              For y=190 To 294
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
            
            ; 2ème dégradé de bleu à "Cyan clair"
              r1.f=0
             g1.f=16
             b1.f=240
             r2.f=0
             g2.f=224
             b2.f=240
             dr.f=((r2-r1)/255)
             dg.f=((g2-g1)/35)
             db.f=((b2-b1)/35)
              For y=295 To 329
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
             
            ; Zone Cyan centrale
              Box(0,330,WindowW,80,RGB(0,240,240))
            
            

        ; 3ème dégradé de "Cyan foncé" à bleu
              r1.f=0
             g1.f=128
             b1.f=128
             r2.f=0
             g2.f=16
             b2.f=128
             dr.f=((r2-r1)/255)
             dg.f=((g2-g1)/40)
             db.f=((b2-b1)/255)
              For y=410 To 449
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
             
            ; 4ème dégradé de bleu à bleu foncé
              r1.f=0
             g1.f=0
             b1.f=128
             r2.f=0
             g2.f=0
             b2.f=16
             dr.f=((r2-r1)/255)
             dg.f=((g2-g1)/255)
             db.f=((b2-b1)/65)
              For y=450 To 514
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
             
           ; Partie basse en noir
             Box(0,515,WindowW,85,RGB(0,0,0))
         StopDrawing()
   EndProcedure
   
   
; Initialisations
      If InitSprite()=0 Or InitKeyboard()=0 Or InitMouse()=0
         MessageRequester("Problème","Initialisations impossibles",0)
         End
      EndIf
         
;  Ouverture écran
   If OpenWindow (0,0,0,WindowW,WindowH, "Scoopex Fred Amiga Game Cracktro Remake : Partie 1" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
      If OpenWindowedScreen (WindowID (0),0,0,WindowW,WindowH,1,0,0)

      ; Boucle Principale
        ClearScreen (RGB(0,0,0))
       
      ; Lancer la création du fond d'écran
        Fond_Degrade()
         
      ; Boucler jusqu'à ce que l'on quitte le programme
            Repeat
              ; Vérifier action clavier et souris
                 ExamineKeyboard()
                 ExamineMouse()
                
               ; Vérifier évènement Windows (fermer la fenêtre)
                event=WaitWindowEvent()
               
              ; Afficher le dégradé de fond d'écran
                 Affiche()
                
               ; Alterner les buffers d'affichage
                 FlipBuffers()
               ClearScreen(RGB(0,0,0))
               
            Until KeyboardPushed(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Right)   Or event=#PB_Event_CloseWindow
      EndIf
   EndIf
   End


Le calcul du dégradé est effectué sur la composante RGB qui varie. On calcul le delta entre composante de départ et celle d'arrivée, et on divise par le nombre de ligne à dessiner, pour obtenir un dégradé relatif à ce nombre de ligne. En clair, si je dois faire un dégradé sur 100 lignes, il faut 100 transitions de couleurs/composante, sinon la composante de destination n'est pas obtenue. Le fait de diviser les autres par 255 n'est pas obligatoire, mais permet d'avoir au cas où un delta très proche de 0 (zéro).
A noter que cela ne marche bien que si une seule des composante varie, je n'ai pas l'algo pour faire un dégradé avec plusieurs composantes changent, comme pour faire un dégradé de Cyan à Orange par exemple.
Je crois qu'il vaut mieux se tourner vers les composante HSL dans ce cas, mais ce n'est pas l'objet de ce tuto.

_________________
Image

Image


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 04/Aoû/2009 14:26 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 27/Oct/2006 12:19
Messages: 1224
Localisation: Calvados (14)
Partie 2 : Le Logo Scoopex

Le logo est situé dans le 1er tiers haut de l'écran, et centré horizontalement. C'est une version agrandie que je fournis pour avoir un meilleur rendu en 800x600. La régle pour le centrage horizontal d'image est la suivante, à la condition que l'image soit inférieure ou égale à la largeur d'écran : (largeur écran-largeur image)/2

Ainsi notre logo scoopex faisant 414 pixels de large, on obtient un centrage à 193 pixels du bord gauche : (800-414)/2.

La règle de centrage est également vraie pour centrer des "textes" affichés avec des polices fixes (comme sous mode console) ; si vous avez un maximum de 80 caractères, et que vous voulez afficher une phrase de 55 caractères, il vous faudra (80-55)/2=13 espaces à gauche avant votre phrase (on arrondi à l'entier supérieur).

Pour afficher notre logo, il nous faut ajouter le décodeur PNG, car PB ne sait pas afficher les PNGs sans cette commande (UsePNGImageDecoder()).

La procédure Logo() permet de créer un sprite à partir de l'image PNG, notez en bas de source la datasection avec le includebinary.

On ajoute un displaytransparentsprite() dans la procédure Affiche()

voici maintenant le code de l'affichage du dégradé de fond et du logo.

Code:
; Scoopex CrackTro Remake
; ©.2009 TazNormand

; D'après Remake en Flash sur www.Flashtro.com
; visible ici : http://flashtro.com/page.php?id=72&highlight=SCOOPEX



; TUTORIEL 2 : Le Logo



;  Taille écran   
   Global WindowW.w=800
   Global WindowH.w=600   
 
; Décodeur PNG pour utilise les images
   UsePNGImageDecoder()
    
; Déclaration des procédures ce qui permet de les appeler quelque soit leur ordre
Declare Affiche()
Declare Fond_Degrade()
Declare Logo()
   
; Procédures pour un code "plus lisible"
   Procedure Affiche() ; Affiche les différents effets de l'intro
      ; Affichage fond dégradé (sprite avec transparence)
         DisplayTransparentSprite(0,0,-1)
         
      ; Affichage logo Scoopex
        DisplayTransparentSprite(56,193,50)       
   EndProcedure
      
   Procedure Fond_Degrade() ; Sprite du Fond en dégradé de couleurs Bleues/Cyan (sprite 00)
         CreateSprite(0,WindowW,WindowH+2,#PB_Sprite_Texture )
         StartDrawing(SpriteOutput(0))
         
           ; Partie haute en noir
             Box(0,0,WindowW,189,RGB(0,0,0))

          
           ; 1er dégradé de "Bleu foncé" à "Bleu moyen"
             r1.f=0 ; Couleur de départ r1=Rouge, g1=Vert (Green), b1=Bleu
             g1.f=0
             b1.f=16
             r2.f=0 ; Couleur d'arrivée r2=Rouge, g2=Vert (Green), b2=Bleu
             g2.f=0
             b2.f=240
             dr.f=((r2-r1)/255) ; Delta (différence) entre les 2 teintes,
             dg.f=((g2-g1)/255) ; divisé par 255 (les couleur sont exprimées de 0 à 255 en RGB)
             db.f=((b2-b1)/105) ; exception division par 105 pour le bleu car c'est la couleur qui varie
                                ; (105=nb de lignes à colorier : 190 (inclus) à 294)
              For y=190 To 294
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
            
            ; 2ème dégradé de bleu à "Cyan clair"
              r1.f=0
             g1.f=16
             b1.f=240
             r2.f=0
             g2.f=224
             b2.f=240
             dr.f=((r2-r1)/255)
             dg.f=((g2-g1)/35)
             db.f=((b2-b1)/35)
              For y=295 To 329
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
             
            ; Zone Cyan centrale
              Box(0,330,WindowW,80,RGB(0,240,240))
            
            

        ; 3ème dégradé de "Cyan foncé" à bleu
              r1.f=0
             g1.f=128
             b1.f=128
             r2.f=0
             g2.f=16
             b2.f=128
             dr.f=((r2-r1)/255)
             dg.f=((g2-g1)/40)
             db.f=((b2-b1)/255)
              For y=410 To 449
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
             
            ; 4ème dégradé de bleu à bleu foncé
              r1.f=0
             g1.f=0
             b1.f=128
             r2.f=0
             g2.f=0
             b2.f=16
             dr.f=((r2-r1)/255)
             dg.f=((g2-g1)/255)
             db.f=((b2-b1)/65)
              For y=450 To 514
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
             
           ; Partie basse en noir
             Box(0,515,WindowW,85,RGB(0,0,0))
         StopDrawing()
   EndProcedure
   
   Procedure Logo()  ; Création du sprite logo Scoopex    
    logo=CatchImage(7,?logo)
     If logo      
        l=CreateSprite(56,414,108,#PB_Sprite_Memory)
        StartDrawing(SpriteOutput(56))
         DrawImage(logo,0,0)
        StopDrawing()
      EndIf
  EndProcedure
 
 
; Initialisations
      If InitSprite()=0 Or InitKeyboard()=0 Or InitMouse()=0
         MessageRequester("Problème","Initialisations impossibles",0)
         End
      EndIf
         
;  Ouverture écran
   If OpenWindow (0,0,0,WindowW,WindowH, "Scoopex Fred Amiga Game Cracktro Remake : Partie 2" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
      If OpenWindowedScreen (WindowID (0),0,0,WindowW,WindowH,1,0,0)

      ; Boucle Principale
        ClearScreen (RGB(0,0,0))
       
      ; Lancer la création du fond d'écran, de la création du logo Scoopex
        Fond_Degrade()
        Logo()
       
      ; Boucler jusqu'à ce que l'on quitte le programme
            Repeat
              ; Vérifier action clavier et souris
                 ExamineKeyboard()
                 ExamineMouse()
                
               ; Vérifier évènement Windows (fermer la fenêtre)
                event=WaitWindowEvent()
               
              ; Afficher le dégradé de fond d'écran
                 Affiche()
                
               ; Alterner les buffers d'affichage
                 FlipBuffers()
               ClearScreen(RGB(0,0,0))
               
            Until KeyboardPushed(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Right)   Or event=#PB_Event_CloseWindow
      EndIf
   EndIf
   End

DataSection: 
  logo:   IncludeBinary "Scx_logo.png"
EndDataSection

_________________
Image

Image


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 04/Aoû/2009 14:26 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 27/Oct/2006 12:19
Messages: 1224
Localisation: Calvados (14)
Partie 3 : Le scrolling texte horizontal

Voici qu'arrive une partie assez difficile. Il va nous falloir gérer une police BitMap pour composer notre scrolling.
La police utilisée a un "soucis" facilement contournable : tous les caractères ne font pas la même largeur ; pour pouvoir
les afficher sans soucis on utilise une datasection contenant les tailles de chaques caractères de notre fonte (police).
La création des sprites-caractères se fait en parcourant le fichier image de la police par pas de x pixels, x étant lus dans notre datasection.
La procédure BMFont() se charge de créer les sprites. les sprites commencent au n°1 pour nous simplifier ultérieurement la tâche.
pour extracire

Pour le scrolling proprement dit, on utilise une variable alphabet qui contient les caractères à utiliser pour la correspondance avec notre fonte
BitMap ; et ensuite une autre variable text qui elle contient le message du scrolling.
Le scrolling est géré via une liste chaînée (je vous renvoie au tuto de Crystal Noir sur ce sujet), car c'est chaque caractère qui est déplacé.
Cette liste chaînée est créée sur un type de structure ScrollChar que nous aurons préalablement créée. Cette structure permet d'identifier le caractère,
sa position en X et Y, sa largeur, sa vitesse de déplacement, et si il est le dernier ou non de la liste.
Voici à quoi elle ressemble :

Structure ScrollChar
Index.w ==> correspond au n° de sprite de la lettre
PosX.l ==> Position horizontale du sprite
PosY.l ==> Position verticale du sprite, non utilisée dans notre tutoriel
Large.w ==> Largeur du sprite en pixels
SpeedX.w ==> Vitesse de déplacement du sprite (en pixels)
Dernier.b ==> à 0, sauf si on est sur le dernier caractère, alors à 1
EndStructure

Nous chargeons notre liste chaînée via la procédure Procedure ChargeListe(alphab.s,mess.s). En paramètre nous passons l'alphabet, et le message du scrolltext.
Mais pourquoi lui passer des paramètres ? Et bien aprce que tout d'abord cela vous montre comment faire, et qu'ensuite rien ne nous empêche d'utiliser une
autre police bitmap, avec un autre alphabet de correspondance, mais dans ce cas, attention à revoir la datasection des tailles de sprites, et la procédure BMFont !!!

Bon, c'est bien joli tout ça : on a créé nos sprites-caractères, on a une belle liste chaînée pour notre message, mais comment on affiche le scrolltext ???
Tout simplement en parcourant tous les éléments de notre liste chainée dans la procédure Affiche(). Donc on "parcourt" notre liste, et on affiche chaque élément.
La position de départ du 1er caractère a été chargée hors écran dès le départ, donc on diminue la position de la vitesse de déplacement du caractère. Si celui-ci
est hors écran, mais à gauche, on ne l'affiche pas et on économise un displaysprite. Quant le dernier caractère de la liste est dans cette condition (hors écran
gauche et dernier=1) alors on "réinitialise" la liste chainée, en fait on la recharge avec les paramètres initiaux.

voici le code avec les deux précédentes parties, vous devriez facilement reconnaitre les parties nécessaires au scrolling...

Code:

; Scoopex CrackTro Remake
; ©.2009 TazNormand

; D'après Remake en Flash sur www.Flashtro.com
; visible ici : http://flashtro.com/page.php?id=72&highlight=SCOOPEX



; TUTORIEL 3 : Le Scrolling Text



;  Taille écran   
   Global WindowW.w=800
   Global WindowH.w=600   

  Global alphabet.s="ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890,.!?"  ; Correspond à l'ordre des caractères de la police BitMap
   Global text.s ; Le texte du scrolling chargé ci-dessous
  text.s = " Scoopex cracktro PureBasic Remake by TazNormand     ,         scoopex presents     fred       cracked and trained ....      hmm this time it was a hard crack ....  cause the whole loader were written in fucking c code and the original had several errors .... ";
  text.s +"sorry for no megatraining but i want to finish the megacruncher and i?ve absolutly no time for training games   !!!         well our member list went down a little bit cause there are no longer sections in";
  text.S +"   ...... england and sweden !!!!   heres a small list including the people who left scoopex to start their carrier in another group    pennywise .. uncle tom .. jesus .. zark ..  all in share and enjoy";
  text.s +"  .. merryman and panther !!!!  i wish you good luck where ever you are   also our division in germany was busted  ?cause some people thought they could release every shit like their megademo!! so this mega demo is no     ,production";
  text.s +"  i want to send some hellos to our friends .... subway .. fairlight .. piranhas .. quartex .. red sector .. quick silver .. thrust .. .m.a.d .. share and enjoy .. spreadpoint .. oracle .. vision factory .. and all the others";
  text.s +" which    worth  mentioned             challenger              of     !!!    generations      !!!!       ";

  Global X_Depart.w=0 ; Position du premier caractère dans fichier image de la fonte bitMap
  Global Car.w=1  ; Premier n° de sprite caractère
 
; Structures
  ; ScrollChar servira pour la position de chaque caractère du scrolltext
   Structure ScrollChar
      Index.w
      PosX.l
      PosY.l
      Large.w
      SpeedX.w      
      Dernier.b   
   EndStructure

; Liste Chainées : elles contiendront les positions, vitesses, etc..; des caractères et montagnes
   Global NewList ScrollText.ScrollChar()
   

   
; Décodeur PNG pour utilise les images
   UsePNGImageDecoder()
    
; Déclaration des procédures ce qui permet de les appeler quelque soit leur ordre
Declare Affiche()
Declare Fond_Degrade()
Declare Logo()
Declare ChargeListe(alphab.s,mess.s)
Declare BMFont()
   
; Procédures pour un code "plus lisible"
      Procedure Affiche()
      ; Affichage fond dégradé
         DisplayTransparentSprite(0,0,-1)
         
      ; Affichage logo Scoopex
        DisplayTransparentSprite(56,193,50)
        
      ; Affichage scrolling
         ResetList(ScrollText())
         ForEach ScrollText()
           ; N'afficher le sprite que s'il est sur la partie visible de l'écran
             If (ScrollText()\posX + ScrollText()\Large) > 0
                DisplayTransparentSprite(ScrollText()\index,ScrollText()\posX,ScrollText()\posY)            
                ScrollText()\posX - ScrollText()\speedX
              EndIf
         Next
         
         If ScrollText()\PosX<-60 And ScrollText()\dernier=1
            chargeliste(alphabet,text)
         EndIf
   EndProcedure
      
   Procedure Fond_Degrade() ; Sprite du Fond en dégradé de couleurs Bleues/Cyan (sprite 00)
         CreateSprite(0,WindowW,WindowH+2,#PB_Sprite_Texture )
         StartDrawing(SpriteOutput(0))
         
           ; Partie haute en noir
             Box(0,0,WindowW,189,RGB(0,0,0))

          
           ; 1er dégradé de "Bleu foncé" à "Bleu moyen"
             r1.f=0 ; Couleur de départ r1=Rouge, g1=Vert (Green), b1=Bleu
             g1.f=0
             b1.f=16
             r2.f=0 ; Couleur d'arrivée r2=Rouge, g2=Vert (Green), b2=Bleu
             g2.f=0
             b2.f=240
             dr.f=((r2-r1)/255) ; Delta (différence) entre les 2 teintes,
             dg.f=((g2-g1)/255) ; divisé par 255 (les couleur sont exprimées de 0 à 255 en RGB)
             db.f=((b2-b1)/105) ; exception division par 105 pour le bleu car c'est la couleur qui varie
                                ; (105=nb de lignes à colorier : 190 (inclus) à 294)
              For y=190 To 294
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
            
            ; 2ème dégradé de bleu à "Cyan clair"
              r1.f=0
             g1.f=16
             b1.f=240
             r2.f=0
             g2.f=224
             b2.f=240
             dr.f=((r2-r1)/255)
             dg.f=((g2-g1)/35)
             db.f=((b2-b1)/35)
              For y=295 To 329
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
             
            ; Zone Cyan centrale
              Box(0,330,WindowW,80,RGB(0,240,240))
            
            

        ; 3ème dégradé de "Cyan foncé" à bleu
              r1.f=0
             g1.f=128
             b1.f=128
             r2.f=0
             g2.f=16
             b2.f=128
             dr.f=((r2-r1)/255)
             dg.f=((g2-g1)/40)
             db.f=((b2-b1)/255)
              For y=410 To 449
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
             
            ; 4ème dégradé de bleu à bleu foncé
              r1.f=0
             g1.f=0
             b1.f=128
             r2.f=0
             g2.f=0
             b2.f=16
             dr.f=((r2-r1)/255)
             dg.f=((g2-g1)/255)
             db.f=((b2-b1)/65)
              For y=450 To 514
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
             
           ; Partie basse en noir
             Box(0,515,WindowW,85,RGB(0,0,0))
         StopDrawing()
   EndProcedure
   
   Procedure Logo()  ; Création du sprite logo Scoopex    
    logo=CatchImage(7,?logo)
     If logo      
        l=CreateSprite(56,414,108,#PB_Sprite_Memory)
        StartDrawing(SpriteOutput(56))
         DrawImage(logo,0,0)
        StopDrawing()
      EndIf
  EndProcedure
 
  Procedure ChargeListe(alphab.s,mess.s)   
      ; Charger Liste Chainée
         positionX.l=WindowW+1 ; Largeur de notre fenetre + 1 pour cacher le scroll avant son départ
         For i=1 To Len(mess.s)
            element.w=FindString(alphab,UCase(Mid(mess,i,1)),1)
            If element=0
               ;stop
               Debug element
               End
            EndIf
            AddElement(ScrollText())
            ScrollText()\Index=element
            ScrollText()\posX=positionX
            ScrollText()\posY=(WindowH-96) ; Scrolling en bas de l'écran
            ScrollText()\Large=SpriteWidth(element)
            ScrollText()\speedX=5
            ScrollText()\dernier=0
            positionX+ScrollText()\Large+8
         Next i
         ScrollText()\dernier=1         
   EndProcedure
   
   Procedure BMFont()  ; Définit la police Bitmap (sprites 1 à 42)
     ; charger la police bitmap, et en extraire les caractères    
       font=CatchImage(0,?font)      
       If font
          p=CreateSprite(70,1456,92,#PB_Sprite_Memory)  ; Créer un sprite "géant" pour en extraire les sprites caractères         
          StartDrawing(SpriteOutput(70))
             DrawImage(font,0,0) ; Dessiner image sur le sprite 1
          StopDrawing()   
          TransparentSpriteColor(70,RGB(0,240,0))    
           
          ; Extraction des caractères (1 seule ligne de 43 caractères )
          ; On lit la datasection FontWidths pour les tailles variables de caractères         
          Restore FontWidths2
          Repeat
            Read wdth
            If wdth>0
              ; Créer le sprite correspondant au caractère de la police
                pp=CreateSprite(Car,wdth,92,#PB_Sprite_Memory)
               
              ; Sélectionner le caractère qui nous intéresse sur le Sprite global de la police
                res=ClipSprite(70,X_Depart,0,wdth,92)               
               
               ; Le buffer n'est plus l'écran mais le sprite que l'on va créer               
                UseBuffer(car)
            
              ; Afficher le sprite de la font précédemment clippé sur le sprite "caractère"               
                DisplaySprite(70,0,0)
                 
              ; Transparence du sprite caractère
                TransparentSpriteColor(car,RGB(0,240,0))
             
                Car+1 ; Caractère suivant
                X_Depart+(Wdth) ; Décaler position dans image BitMap de la largeur précédemment lue
              EndIf
          Until wdth=0   ; Tant qu'il y a des données à "lire" en datas
          UseBuffer(#PB_Default)
          ClipSprite(70,#PB_Default,#PB_Default,#PB_Default,#PB_Default)
        EndIf
   EndProcedure
 
; Initialisations
      If InitSprite()=0 Or InitKeyboard()=0 Or InitMouse()=0
         MessageRequester("Problème","Initialisations impossibles",0)
         End
      EndIf
         
;  Ouverture écran
   If OpenWindow (0,0,0,WindowW,WindowH, "Scoopex Fred Amiga Game Cracktro Remake : Partie 2" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
      If OpenWindowedScreen (WindowID (0),0,0,WindowW,WindowH,1,0,0)

      ; Boucle Principale
        ClearScreen (RGB(0,0,0))
       
      ; Lancer la création du fond d'écran, de la création du logo Scoopex
        Fond_Degrade()
        Logo()
        BMFont()            
            ChargeListe(alphabet,text)
            
      ; Boucler jusqu'à ce que l'on quitte le programme
            Repeat
              ; Vérifier action clavier et souris
                 ExamineKeyboard()
                 ExamineMouse()
                
               ; Vérifier évènement Windows (fermer la fenêtre)
                event=WaitWindowEvent()
               
              ; Afficher le dégradé de fond d'écran
                 Affiche()
                
               ; Alterner les buffers d'affichage
                 FlipBuffers()
               ClearScreen(RGB(0,0,0))
               
            Until KeyboardPushed(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Right)   Or event=#PB_Event_CloseWindow
      EndIf
   EndIf
   End

DataSection: 
  logo:   IncludeBinary "Scx_logo.png"
  font:   IncludeBinary "font1.png"
 
  FontWidths2:
     Data.l 32,32,32,32,32,32,32,32,16,32,32,32,49,31,32,32,40,32,32,32,32,32,48,32,32,32,50
     Data.l 22,32,32,32,34,32,30,32,32,32,144,20,26,50,0   
EndDataSection



EDIT du 27 Septembre 2010 :
Code corrigé pour fonctionner avec PureBasic 4.51 et surtout DirectX9 et plus. Je vous renvoie à l'EDIT de la partie 5 plus bas :

Code:

; Scoopex CrackTro Remake
; ©.2009 TazNormand

; D'après Remake en Flash sur www.Flashtro.com
; visible ici : http://flashtro.com/page.php?id=72&highlight=SCOOPEX



; TUTORIEL 3 : Le Scrolling Text



;  Taille écran   
   Global WindowW.w=800
   Global WindowH.w=600   

  Global alphabet.s="ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890,.!?"  ; Correspond à l'ordre des caractères de la police BitMap
   Global text.s ; Le texte du scrolling chargé ci-dessous
  text.s = " Scoopex cracktro PureBasic Remake by TazNormand     ,         scoopex presents     fred       cracked and trained ....      hmm this time it was a hard crack ....  cause the whole loader were written in fucking c code and the original had several errors .... ";
  text.s +"sorry for no megatraining but i want to finish the megacruncher and i?ve absolutly no time for training games   !!!         well our member list went down a little bit cause there are no longer sections in";
  text.S +"   ...... england and sweden !!!!   heres a small list including the people who left scoopex to start their carrier in another group    pennywise .. uncle tom .. jesus .. zark ..  all in share and enjoy";
  text.s +"  .. merryman and panther !!!!  i wish you good luck where ever you are   also our division in germany was busted  ?cause some people thought they could release every shit like their megademo!! so this mega demo is no     ,production";
  text.s +"  i want to send some hellos to our friends .... subway .. fairlight .. piranhas .. quartex .. red sector .. quick silver .. thrust .. .m.a.d .. share and enjoy .. spreadpoint .. oracle .. vision factory .. and all the others";
  text.s +" which    worth  mentioned             challenger              of     !!!    generations      !!!!       ";

  Global X_Depart.w=0 ; Position du premier caractère dans fichier image de la fonte bitMap
  Global Car.w=1  ; Premier n° de sprite caractère
 
; Structures
  ; ScrollChar servira pour la position de chaque caractère du scrolltext
   Structure ScrollChar
      Index.w
      PosX.l
      PosY.l
      Large.w
      SpeedX.w      
      Dernier.b   
   EndStructure

; Liste Chainées : elles contiendront les positions, vitesses, etc..; des caractères et montagnes
   Global NewList ScrollText.ScrollChar()
   

   
; Décodeur PNG pour utilise les images
   UsePNGImageDecoder()
    
; Déclaration des procédures ce qui permet de les appeler quelque soit leur ordre
Declare Affiche()
Declare Fond_Degrade()
Declare Logo()
Declare ChargeListe(alphab.s,mess.s)
Declare BMFont()
   
; Procédures pour un code "plus lisible"
      Procedure Affiche()
      ; Affichage fond dégradé
         DisplayTransparentSprite(0,0,-1)
         
      ; Affichage logo Scoopex
        DisplayTransparentSprite(56,193,50)
        
      ; Affichage scrolling
         ResetList(ScrollText())
         ForEach ScrollText()
           ; N'afficher le sprite que s'il est sur la partie visible de l'écran
             If (ScrollText()\posX + ScrollText()\Large) > 0
                DisplayTransparentSprite(ScrollText()\index,ScrollText()\posX,ScrollText()\posY)            
                ScrollText()\posX - ScrollText()\speedX
              EndIf
         Next
         
         If ScrollText()\PosX<-60 And ScrollText()\dernier=1
            chargeliste(alphabet,text)
         EndIf
   EndProcedure
      
   Procedure Fond_Degrade() ; Sprite du Fond en dégradé de couleurs Bleues/Cyan (sprite 00)
         CreateSprite(0,WindowW,WindowH+2,#PB_Sprite_Texture )
         StartDrawing(SpriteOutput(0))
         
           ; Partie haute en noir
             Box(0,0,WindowW,189,RGB(0,0,0))

          
           ; 1er dégradé de "Bleu foncé" à "Bleu moyen"
             r1.f=0 ; Couleur de départ r1=Rouge, g1=Vert (Green), b1=Bleu
             g1.f=0
             b1.f=16
             r2.f=0 ; Couleur d'arrivée r2=Rouge, g2=Vert (Green), b2=Bleu
             g2.f=0
             b2.f=240
             dr.f=((r2-r1)/255) ; Delta (différence) entre les 2 teintes,
             dg.f=((g2-g1)/255) ; divisé par 255 (les couleur sont exprimées de 0 à 255 en RGB)
             db.f=((b2-b1)/105) ; exception division par 105 pour le bleu car c'est la couleur qui varie
                                ; (105=nb de lignes à colorier : 190 (inclus) à 294)
              For y=190 To 294
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
            
            ; 2ème dégradé de bleu à "Cyan clair"
              r1.f=0
             g1.f=16
             b1.f=240
             r2.f=0
             g2.f=224
             b2.f=240
             dr.f=((r2-r1)/255)
             dg.f=((g2-g1)/35)
             db.f=((b2-b1)/35)
              For y=295 To 329
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
             
            ; Zone Cyan centrale
              Box(0,330,WindowW,80,RGB(0,240,240))
            
            

        ; 3ème dégradé de "Cyan foncé" à bleu
              r1.f=0
             g1.f=128
             b1.f=128
             r2.f=0
             g2.f=16
             b2.f=128
             dr.f=((r2-r1)/255)
             dg.f=((g2-g1)/40)
             db.f=((b2-b1)/255)
              For y=410 To 449
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
             
            ; 4ème dégradé de bleu à bleu foncé
              r1.f=0
             g1.f=0
             b1.f=128
             r2.f=0
             g2.f=0
             b2.f=16
             dr.f=((r2-r1)/255)
             dg.f=((g2-g1)/255)
             db.f=((b2-b1)/65)
              For y=450 To 514
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
             
           ; Partie basse en noir
             Box(0,515,WindowW,85,RGB(0,0,0))
         StopDrawing()
   EndProcedure
   
   Procedure Logo()  ; Création du sprite logo Scoopex    
    logo=CatchImage(7,?logo)
     If logo      
        l=CreateSprite(56,414,108,#PB_Sprite_Memory)
        StartDrawing(SpriteOutput(56))
         DrawImage(logo,0,0)
        StopDrawing()
      EndIf
  EndProcedure
 
  Procedure ChargeListe(alphab.s,mess.s)   
      ; Charger Liste Chainée
         positionX.l=WindowW+1 ; Largeur de notre fenetre + 1 pour cacher le scroll avant son départ
         For i=1 To Len(mess.s)
            element.w=FindString(alphab,UCase(Mid(mess,i,1)),1)
            If element=0
               ;stop
               Debug element
               End
            EndIf
            AddElement(ScrollText())
            ScrollText()\Index=element
            ScrollText()\posX=positionX
            ScrollText()\posY=(WindowH-96) ; Scrolling en bas de l'écran
            ScrollText()\Large=SpriteWidth(element)
            ScrollText()\speedX=5
            ScrollText()\dernier=0
            positionX+ScrollText()\Large+8
         Next i
         ScrollText()\dernier=1         
   EndProcedure
   
   Procedure BMFont()  ; Définit la police Bitmap (sprites 1 à 42)
     ; charger la police bitmap, et en extraire les caractères    
       font=CatchImage(0,?font)      
       If font
          p=CreateSprite(70,1456,92,#PB_Sprite_Memory)  ; Créer un sprite "géant" pour en extraire les sprites caractères         
          StartDrawing(SpriteOutput(70))
             DrawImage(font,0,0) ; Dessiner image sur le sprite 1
          StopDrawing()   
          TransparentSpriteColor(70,RGB(0,240,0))    
           
          ; Extraction des caractères (1 seule ligne de 43 caractères )
          ; On lit la datasection FontWidths pour les tailles variables de caractères         
          Restore FontWidths2
          Repeat
            Read wdth
            If wdth>0
              ; Créer le sprite correspondant au caractère de la police
                pp=CreateSprite(Car,wdth,92,#PB_Sprite_Memory)
               
              ; Sélectionner le caractère qui nous intéresse sur le Sprite global de la police
                res=ClipSprite(70,X_Depart,0,wdth,92)               
              ; //////////////////////////////////////////////////////////////////////////
              ; ///   UseBuffer() Obsolete avec DIRECTX9 et sans doute 10,11,etc...    ///
              ; ///                   On utilise donc un GrabSprite                    ///
              ; //////////////////////////////////////////////////////////////////////////
              ; /// Si vous êtes en DIRECTX7, décommentez toutes les lignes où il y a  ///
              ; ///          Et commentez toutes celles où apparaît DIRECTX9           ///
              ; //////////////////////////////////////////////////////////////////////////
                               
              ; Le buffer n'est plus l'écran mais le sprite que l'on va créer
              ; UseBuffer(car) ; DIRECTX7
                           
              ; Afficher le sprite de la font précédemment clippé sur le sprite "caractère"                                                                       
              ; DisplaySprite(70,0,0)              ; DIRECTX7
              ClearScreen(0)                                ; DIRECTX9
              StartDrawing(ScreenOutput())                  ; DIRECTX9
                DisplayTransparentSprite(70,0,0)            ; DIRECTX9             
              StopDrawing()                                 ; DIRECTX9
              GrabSprite(car,0,0,wdth,92,#PB_Sprite_Memory) ; DIRECTX9
             
              ; Transparence du sprite caractère
                               
              ; ///////////////////////////////////////////////////////////////////////////////////////
              ; // Attention, avec le GrabSprite, la couleur transparente devient le noir (RGB0,0,0) //
              ; ///////////////////////////////////////////////////////////////////////////////////////                               
              ; TransparentSpriteColor(car,RGB(0,240,0)) ; DIRECTX7
              TransparentSpriteColor(car,RGB(0,0,0))        ; DIRECTX9             
                Car+1 ; Caractère suivant
                X_Depart+(Wdth) ; Décaler position dans image BitMap de la largeur précédemment lue
              EndIf
          Until wdth=0   ; Tant qu'il y a des données à "lire" en datas
                  ;UseBuffer(#PB_Default) ; DIRECTX7
          ClipSprite(70,#PB_Default,#PB_Default,#PB_Default,#PB_Default)
        EndIf
   EndProcedure
 
; Initialisations
      If InitSprite()=0 Or InitKeyboard()=0 Or InitMouse()=0
         MessageRequester("Problème","Initialisations impossibles",0)
         End
      EndIf
         
;  Ouverture écran
   If OpenWindow (0,0,0,WindowW,WindowH, "Scoopex Fred Amiga Game Cracktro Remake : Partie 2" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
      If OpenWindowedScreen (WindowID (0),0,0,WindowW,WindowH,1,0,0)

      ; Boucle Principale
        ClearScreen (RGB(0,0,0))
       
      ; Lancer la création du fond d'écran, de la création du logo Scoopex
        Fond_Degrade()
        Logo()
        BMFont()            
            ChargeListe(alphabet,text)
            
      ; Boucler jusqu'à ce que l'on quitte le programme
            Repeat
              ; Vérifier action clavier et souris
                 ExamineKeyboard()
                 ExamineMouse()
                
               ; Vérifier évènement Windows (fermer la fenêtre)
                event=WaitWindowEvent()
               
              ; Afficher le dégradé de fond d'écran
                 Affiche()
                
               ; Alterner les buffers d'affichage
                 FlipBuffers()
               ClearScreen(RGB(0,0,0))
               
            Until KeyboardPushed(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Right)   Or event=#PB_Event_CloseWindow
      EndIf
   EndIf
   End

DataSection: 
  logo:   IncludeBinary "Scx_logo.png"
  font:   IncludeBinary "font1.png"
 
  FontWidths2:
     Data.l 32,32,32,32,32,32,32,32,16,32,32,32,49,31,32,32,40,32,32,32,32,32,48,32,32,32,50
     Data.l 22,32,32,32,34,32,30,32,32,32,144,20,26,50,0   
EndDataSection

_________________
Image

Image


Dernière édition par TazNormand le Lun 27/Sep/2010 22:04, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 04/Aoû/2009 14:28 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 27/Oct/2006 12:19
Messages: 1224
Localisation: Calvados (14)
Partie 4 : Le Parallax des "montagnes"

Voici l'autre partie difficile de cette intro. Avant d'expliquer plus en détail, il me faut expliquer ce qu'est un
scrolling parallax : Parallax signifie "Parallel Axis", axes parallèles. En clair, on fait défiler sur l'axe horizontal
plusieurs "plans" à des vitesses différentes, plus rapide au 1er plan, vers plus lente au dernier plan. C'est ce qui donne
un effet de profondeur. En général, on accentue cet effet en plaçant une image plus clair en avant plan, et une plus foncée
en arrière plan. Le meilleur jeu toutes machines confondues ayant exploités cette technique est Shadow of The Beat sur Amiga !!!

Donc pour notre cracktro, nous avons 6 plans (nommés layer = calque en anglais), le layer 6 étant le dernier, le plus foncé,
sera affiché en premier, car n'oublions pas que PB superpose les affichages de sprites, le dernier affiché "écrase" les autres.
Donc nous afficherons nos layers du 6ème vers le 1er, et en plus nous les ferons défiler de la droite vers la gauche à
différentes vitesses. Comme pour le scrolling texte, nous utilisons une liste chaînée, créée sur la structure Parallax que voici :

    Structure Parallax
    Index.w ==> Correspond au n° de layer
    PosX.l ==> Position horizontale du layer
    PosY.l ==> Position verticale du layer (important car ils ne font pas tous la même taille)
    Speed.w ==> Vitesse de défilement du layer
    Largeur.w ==> Largeur du layer
    Hauteur.w ==> Hauteur du layer
    EndStructure


Les layers n'étant pas tous de la même hauteur, ils sont affichés à différentes positions verticales. Vous remarquerez également
qu'il disposent pour certains d'une zone basse plus sombre simulant un effet d'ombre. Pour "lisser" notre effet de défilement des
layers, chaque sprite correspond à la largeur d'un layer multipliée par 3.
Pourquoi me demanderez-vous ?
Tous simplement parce que si on ne fait pas cela, à un moment donné on a un effet de "saut" dans l'affichage du layer ; en fait
chaque layer peut être répété plusieurs fois sans que l'on remarque de "cassure", ce qui permet un affichage fluide et lisse.
Pour éviter l'effet de "saut", on crée donc un sprite de 3 fois la largeur du layer, 3 fois car un layer fait environ 640 de large,
et notre écran a été défini à 800, on a donc besoin d'au moins 2 fois le layer pour remplir l'écran, mais si on ne le fait que
2 fois, on aura notre "saut" lorsque le ClipSprite reprendra au bord du layer, c'est pourquoi il nous faut 3 fois le layer pour que
le clipsprite soit "parfait". Le défilement, vous l'aurez compris, fonctionne donc grâce au ClipSprite : on décale la zone du de
départ vers la gauche de x pixels, x étant la vitesse du layer.
Si vous avez compris le chargement de la liste chaînée du scrolling texte, vous devriez comprendre celle du Parallax.

Voici le code correspondant à cette partie, ajouté aux parties vues précédemment.

Code:

; Scoopex CrackTro Remake
; ©.2009 TazNormand

; D'après Remake en Flash sur www.Flashtro.com
; visible ici : http://flashtro.com/page.php?id=72&highlight=SCOOPEX



; TUTORIEL 4 : Le Parallax



;  Taille écran   
   Global WindowW.w=800
   Global WindowH.w=600

  Global alphabet.s="ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890,.!?"  ; Correspond à l'ordre des caractères de la police BitMap
   Global text.s ; Le texte du scrolling chargé ci-dessous
  text.s = " Scoopex cracktro PureBasic Remake by TazNormand     ,         scoopex presents     fred       cracked and trained ....      hmm this time it was a hard crack ....  cause the whole loader were written in fucking c code and the original had several errors .... ";
  text.s +"sorry for no megatraining but i want to finish the megacruncher and i?ve absolutly no time for training games   !!!         well our member list went down a little bit cause there are no longer sections in";
  text.S +"   ...... england and sweden !!!!   heres a small list including the people who left scoopex to start their carrier in another group    pennywise .. uncle tom .. jesus .. zark ..  all in share and enjoy";
  text.s +"  .. merryman and panther !!!!  i wish you good luck where ever you are   also our division in germany was busted  ?cause some people thought they could release every shit like their megademo!! so this mega demo is no     ,production";
  text.s +"  i want to send some hellos to our friends .... subway .. fairlight .. piranhas .. quartex .. red sector .. quick silver .. thrust .. .m.a.d .. share and enjoy .. spreadpoint .. oracle .. vision factory .. and all the others";
  text.s +" which    worth  mentioned             challenger              of     !!!    generations      !!!!       ";

  Global X_Depart.w=0 ; Position du premier caractère dans fichier image de la fonte bitMap
  Global Car.w=1  ; Premier n° de sprite caractère
 
; Structures
  ; ScrollChar servira pour la position de chaque caractère du scrolltext
   Structure ScrollChar
      Index.w
      PosX.l
      PosY.l
      Large.w
      SpeedX.w      
      Dernier.b   
   EndStructure
   
  ; Parallax servira pour les 6 scrolling différentiels (parallaxes) des "montagnes grises"
   Structure Parallax
     Index.w
     PosX.l
     PosY.l    
     Speed.w
     Largeur.w
     Hauteur.w
   EndStructure

; Liste Chainées : elles contiendront les positions, vitesses, etc..; des caractères et montagnes
   Global NewList ScrollText.ScrollChar()
   Global NewList Mountains.Parallax()   

   
; Décodeur PNG pour utilise les images
   UsePNGImageDecoder()
    
; Déclaration des procédures ce qui permet de les appeler quelque soit leur ordre
Declare Affiche()
Declare Fond_Degrade()
Declare Logo()
Declare ChargeListe(alphab.s,mess.s)
Declare BMFont()
Declare Montagnes()
   
; Procédures pour un code "plus lisible"
  Procedure Affiche()
      ; Affichage fond dégradé
         DisplayTransparentSprite(0,0,-1)
         
      ; Affichage logo Scoopex
        DisplayTransparentSprite(56,193,50)
        
      ; Afficher montagnes
        ResetList(Mountains())
        ForEach(Mountains())
          ClipSprite(Mountains()\Index,Mountains()\PosX,0,WindowW,Mountains()\Hauteur)         
          DisplayTransparentSprite(Mountains()\Index,0,Mountains()\PosY)         
          Mountains()\PosX + Mountains()\Speed
          If Mountains()\PosX>=Mountains()\Largeur / 3
              Mountains()\PosX=0
           EndIf
        Next
            
      ; Affichage scrolling
         ResetList(ScrollText())
         ForEach ScrollText()
           ; N'afficher le sprite que s'il est sur la partie visible de l'écran
             If (ScrollText()\posX + ScrollText()\Large) > 0
                DisplayTransparentSprite(ScrollText()\index,ScrollText()\posX,ScrollText()\posY)            
                ScrollText()\posX - ScrollText()\speedX
              EndIf
         Next
         
         If ScrollText()\PosX<-60 And ScrollText()\dernier=1
            chargeliste(alphabet,text)
         EndIf
   EndProcedure
      
   Procedure Fond_Degrade() ; Sprite du Fond en dégradé de couleurs Bleues/Cyan (sprite 00)
         CreateSprite(0,WindowW,WindowH+2,#PB_Sprite_Texture )
         StartDrawing(SpriteOutput(0))
         
           ; Partie haute en noir
             Box(0,0,WindowW,189,RGB(0,0,0))

          
           ; 1er dégradé de "Bleu foncé" à "Bleu moyen"
             r1.f=0 ; Couleur de départ r1=Rouge, g1=Vert (Green), b1=Bleu
             g1.f=0
             b1.f=16
             r2.f=0 ; Couleur d'arrivée r2=Rouge, g2=Vert (Green), b2=Bleu
             g2.f=0
             b2.f=240
             dr.f=((r2-r1)/255) ; Delta (différence) entre les 2 teintes,
             dg.f=((g2-g1)/255) ; divisé par 255 (les couleur sont exprimées de 0 à 255 en RGB)
             db.f=((b2-b1)/105) ; exception division par 105 pour le bleu car c'est la couleur qui varie
                                ; (105=nb de lignes à colorier : 190 (inclus) à 294)
              For y=190 To 294
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
            
            ; 2ème dégradé de bleu à "Cyan clair"
              r1.f=0
             g1.f=16
             b1.f=240
             r2.f=0
             g2.f=224
             b2.f=240
             dr.f=((r2-r1)/255)
             dg.f=((g2-g1)/35)
             db.f=((b2-b1)/35)
              For y=295 To 329
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
             
            ; Zone Cyan centrale
              Box(0,330,WindowW,80,RGB(0,240,240))
            
            

        ; 3ème dégradé de "Cyan foncé" à bleu
              r1.f=0
             g1.f=128
             b1.f=128
             r2.f=0
             g2.f=16
             b2.f=128
             dr.f=((r2-r1)/255)
             dg.f=((g2-g1)/40)
             db.f=((b2-b1)/255)
              For y=410 To 449
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
             
            ; 4ème dégradé de bleu à bleu foncé
              r1.f=0
             g1.f=0
             b1.f=128
             r2.f=0
             g2.f=0
             b2.f=16
             dr.f=((r2-r1)/255)
             dg.f=((g2-g1)/255)
             db.f=((b2-b1)/65)
              For y=450 To 514
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
             
           ; Partie basse en noir
             Box(0,515,WindowW,85,RGB(0,0,0))
         StopDrawing()
   EndProcedure
   
   Procedure Logo()  ; Création du sprite logo Scoopex    
    logo=CatchImage(7,?logo)
     If logo      
        l=CreateSprite(56,414,108,#PB_Sprite_Memory)
        StartDrawing(SpriteOutput(56))
         DrawImage(logo,0,0)
        StopDrawing()
      EndIf
  EndProcedure
 
  Procedure ChargeListe(alphab.s,mess.s)   
      ; Charger Liste Chainée
         positionX.l=WindowW+1 ; Largeur de notre fenetre + 1 pour cacher le scroll avant son départ
         For i=1 To Len(mess.s)
            element.w=FindString(alphab,UCase(Mid(mess,i,1)),1)
            If element=0
               ;stop
               Debug element
               End
            EndIf
            AddElement(ScrollText())
            ScrollText()\Index=element
            ScrollText()\posX=positionX
            ScrollText()\posY=(WindowH-96) ; Scrolling en bas de l'écran
            ScrollText()\Large=SpriteWidth(element)
            ScrollText()\speedX=5
            ScrollText()\dernier=0
            positionX+ScrollText()\Large+8
         Next i
         ScrollText()\dernier=1         
   EndProcedure
   
   Procedure BMFont()  ; Définit la police Bitmap (sprites 1 à 42)
     ; charger la police bitmap, et en extraire les caractères    
       font=CatchImage(0,?font)      
       If font
          p=CreateSprite(70,1456,92,#PB_Sprite_Memory)  ; Créer un sprite "géant" pour en extraire les sprites caractères         
          StartDrawing(SpriteOutput(70))
             DrawImage(font,0,0) ; Dessiner image sur le sprite 1
          StopDrawing()   
          TransparentSpriteColor(70,RGB(0,240,0))    
           
          ; Extraction des caractères (1 seule ligne de 43 caractères )
          ; On lit la datasection FontWidths pour les tailles variables de caractères         
          Restore FontWidths2
          Repeat
            Read wdth
            If wdth>0
              ; Créer le sprite correspondant au caractère de la police
                pp=CreateSprite(Car,wdth,92,#PB_Sprite_Memory)
               
              ; Sélectionner le caractère qui nous intéresse sur le Sprite global de la police
                res=ClipSprite(70,X_Depart,0,wdth,92)               
               
               ; Le buffer n'est plus l'écran mais le sprite que l'on va créer               
                UseBuffer(car)
            
              ; Afficher le sprite de la font précédemment clippé sur le sprite "caractère"               
                DisplaySprite(70,0,0)
                 
              ; Transparence du sprite caractère
                TransparentSpriteColor(car,RGB(0,240,0))
             
                Car+1 ; Caractère suivant
                X_Depart+(Wdth) ; Décaler position dans image BitMap de la largeur précédemment lue
              EndIf
          Until wdth=0   ; Tant qu'il y a des données à "lire" en datas
          UseBuffer(#PB_Default)
          ClipSprite(70,#PB_Default,#PB_Default,#PB_Default,#PB_Default)
        EndIf
   EndProcedure
 
  Procedure ChargelisteMont()
     For i=5 To 0 Step -1
           AddElement(Mountains())
           Mountains()\Index=50+i
           Mountains()\PosX=0
           PosY=210
           Select i
             Case 5
               PosY=300
             Case 4
               PosY+63
             Case 3
               PosY+82
             Case 2
               PosY+84
             Case 1
               PosY+89
             Case 0
               PosY+104
           EndSelect
           Mountains()\PosY=PosY
           Mountains()\Speed=6-i
           Mountains()\Largeur=SpriteWidth(Mountains()\Index)
           Mountains()\Hauteur=SpriteHeight(Mountains()\Index)
         Next i
   EndProcedure

  Procedure Montagnes()  ; Sprites des montagnes parallax (50 à 55)     
       layer1=CatchImage(1,?layer1)      
       If layer1      
          p=CreateSprite(50,640*3,98,#PB_Sprite_Memory)         
          StartDrawing(SpriteOutput(50))
             DrawImage(layer1,0,0)
             DrawImage(layer1,640,0)
             DrawImage(layer1,1280,0)
          StopDrawing()         
        EndIf
       
        layer2=CatchImage(2,?layer2)      
       If layer2
          p=CreateSprite(51,640*3,124,#PB_Sprite_Memory)
          StartDrawing(SpriteOutput(51))
            DrawImage(layer2,0,0)
             DrawImage(layer2,640,0)
             DrawImage(layer2,1280,0)
          StopDrawing()
        EndIf
       
        layer3=CatchImage(3,?layer3)      
       If layer3
          p=CreateSprite(52,643*3,128,#PB_Sprite_Memory)
          StartDrawing(SpriteOutput(52))
             DrawImage(layer3,0,0)
             DrawImage(layer3,643,0)
             DrawImage(layer3,1286,0)
          StopDrawing()
        EndIf
       
        layer4=CatchImage(4,?layer4)      
       If layer1
          p=CreateSprite(53,639*3,138,#PB_Sprite_Memory)
          StartDrawing(SpriteOutput(53))
             DrawImage(layer4,0,0)
             DrawImage(layer4,639,0)
             DrawImage(layer4,1278,0)
          StopDrawing()
        EndIf
       
        layer5=CatchImage(5,?layer5)      
       If layer5
          p=CreateSprite(54,640*3,164,#PB_Sprite_Memory)
          StartDrawing(SpriteOutput(54))
             DrawImage(layer5,0,0)
             DrawImage(layer5,640,0)
             DrawImage(layer5,1280,0)
          StopDrawing()
        EndIf
       
        layer6=CatchImage(6,?layer6)      
       If layer6
          p=CreateSprite(55,640*3,166,#PB_Sprite_Memory)
          StartDrawing(SpriteOutput(55))
             DrawImage(layer6,0,0)
             DrawImage(layer6,640,0)
             DrawImage(layer6,1280,0)
          StopDrawing()
        EndIf       
  EndProcedure   

; Initialisations
      If InitSprite()=0 Or InitKeyboard()=0 Or InitMouse()=0
         MessageRequester("Problème","Initialisations impossibles",0)
         End
      EndIf
         
;  Ouverture écran
   If OpenWindow (0,0,0,WindowW,WindowH, "Scoopex Fred Amiga Game Cracktro Remake : Partie 2" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
      If OpenWindowedScreen (WindowID (0),0,0,WindowW,WindowH,1,0,0)

      ; Boucle Principale
        ClearScreen (RGB(0,0,0))
       
      ; Lancer la création du fond d'écran, de la création du logo Scoopex
        Fond_Degrade()
        Logo()
        BMFont()            
            ChargeListe(alphabet,text)
        Montagnes()            
            ChargeListeMont()
            
      ; Boucler jusqu'à ce que l'on quitte le programme
            Repeat
              ; Vérifier action clavier et souris
                 ExamineKeyboard()
                 ExamineMouse()
                
               ; Vérifier évènement Windows (fermer la fenêtre)
                event=WaitWindowEvent()
               
              ; Afficher le dégradé de fond d'écran
                 Affiche()
                
               ; Alterner les buffers d'affichage
                 FlipBuffers()
               ClearScreen(RGB(0,0,0))
               
            Until KeyboardPushed(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Right)   Or event=#PB_Event_CloseWindow
      EndIf
   EndIf
   End

DataSection: 
  logo:   IncludeBinary "Scx_logo.png"
  font:   IncludeBinary "font1.png"
  layer1: IncludeBinary "layer1d.png"
   layer2: IncludeBinary "layer2d.png"
   layer3: IncludeBinary "layer3d.png"
   layer4: IncludeBinary "layer4d.png"
   layer5: IncludeBinary "layer5d.png"
   layer6: IncludeBinary "layer6d.png"   
 
  FontWidths2:
     Data.l 32,32,32,32,32,32,32,32,16,32,32,32,49,31,32,32,40,32,32,32,32,32,48,32,32,32,50
     Data.l 22,32,32,32,34,32,30,32,32,32,144,20,26,50,0   
EndDataSection

_________________
Image

Image


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 04/Aoû/2009 14:30 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 27/Oct/2006 12:19
Messages: 1224
Localisation: Calvados (14)
Partie 5 : Le module musical et... quitter proprement

Dernière partie, assez simple d'ailleurs : l'ajout de la musique. PB gérant nativement les module musicaux au format MOD,
le code est plutôt simple et court. Il nous faut d'abord ajouter l'initialisation via la commande InitSound(), sans quoi
plantage et pas de musique !!! Ensuite, le module étant intégré via IncludeBinary comme le reste des ressources, on le
"catch" lui aussi, via CatchModule() ; c'est la procédure Musique() qui s'en charge, on définit le volume sonore initial
à 75%, et on lance la musique via PlayModule().

Concernant le fait de quitter proprement, il s'agit juste de restituer la mémoire occupées par nos différentes ressources
tels que nos sprites, le module et les layers. Vous trouverez une procédure HappyEnd() regroupant des commandes FreeXXX(),
où XXX représente Sprite ou Module. Ensuite le programme se termine.

Voici le dernier code, il contient l'intégralité de notre tutoriel, et vous devriez avoir une Cracktro finalisée, mais pas
pour autant très optimisée.

Code:
; Scoopex CrackTro Remake
; ©.2009 TazNormand

; D'après Remake en Flash sur www.Flashtro.com
; visible ici : http://flashtro.com/page.php?id=72&highlight=SCOOPEX



; TUTORIEL 5 : La Musique



;  Taille écran   
   Global WindowW.w=800
   Global WindowH.w=600

  Global alphabet.s="ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890,.!?"  ; Correspond à l'ordre des caractères de la police BitMap
   Global text.s ; Le texte du scrolling chargé ci-dessous
  text.s = " Scoopex cracktro PureBasic Remake by TazNormand     ,         scoopex presents     fred       cracked and trained ....      hmm this time it was a hard crack ....  cause the whole loader were written in fucking c code and the original had several errors .... ";
  text.s +"sorry for no megatraining but i want to finish the megacruncher and i?ve absolutly no time for training games   !!!         well our member list went down a little bit cause there are no longer sections in";
  text.S +"   ...... england and sweden !!!!   heres a small list including the people who left scoopex to start their carrier in another group    pennywise .. uncle tom .. jesus .. zark ..  all in share and enjoy";
  text.s +"  .. merryman and panther !!!!  i wish you good luck where ever you are   also our division in germany was busted  ?cause some people thought they could release every shit like their megademo!! so this mega demo is no     ,production";
  text.s +"  i want to send some hellos to our friends .... subway .. fairlight .. piranhas .. quartex .. red sector .. quick silver .. thrust .. .m.a.d .. share and enjoy .. spreadpoint .. oracle .. vision factory .. and all the others";
  text.s +" which    worth  mentioned             challenger              of     !!!    generations      !!!!       ";

  Global X_Depart.w=0 ; Position du premier caractère dans fichier image de la fonte bitMap
  Global Car.w=1  ; Premier n° de sprite caractère
 
; Structures
  ; ScrollChar servira pour la position de chaque caractère du scrolltext
   Structure ScrollChar
      Index.w
      PosX.l
      PosY.l
      Large.w
      SpeedX.w      
      Dernier.b   
   EndStructure
   
  ; Parallax servira pour les 6 scrolling différentiels (parallaxes) des "montagnes grises"
   Structure Parallax
     Index.w
     PosX.l
     PosY.l    
     Speed.w
     Largeur.w
     Hauteur.w
   EndStructure

; Liste Chainées : elles contiendront les positions, vitesses, etc..; des caractères et montagnes
   Global NewList ScrollText.ScrollChar()
   Global NewList Mountains.Parallax()   

   
; Décodeur PNG pour utilise les images
   UsePNGImageDecoder()
    
; Déclaration des procédures ce qui permet de les appeler quelque soit leur ordre
Declare Affiche()
Declare Fond_Degrade()
Declare Logo()
Declare ChargeListe(alphab.s,mess.s)
Declare BMFont()
Declare Montagnes()
Declare Musique()
Declare HappyEnd()
   
; Procédures pour un code "plus lisible"
  Procedure Affiche()
      ; Affichage fond dégradé
         DisplayTransparentSprite(0,0,-1)
         
      ; Affichage logo Scoopex
        DisplayTransparentSprite(56,193,50)
        
      ; Afficher montagnes
        ResetList(Mountains())
        ForEach(Mountains())
          ClipSprite(Mountains()\Index,Mountains()\PosX,0,WindowW,Mountains()\Hauteur)         
          DisplayTransparentSprite(Mountains()\Index,0,Mountains()\PosY)         
          Mountains()\PosX + Mountains()\Speed
          If Mountains()\PosX>=Mountains()\Largeur / 3
              Mountains()\PosX=0
           EndIf
        Next
            
      ; Affichage scrolling
         ResetList(ScrollText())
         ForEach ScrollText()
           ; N'afficher le sprite que s'il est sur la partie visible de l'écran
             If (ScrollText()\posX + ScrollText()\Large) > 0
                DisplayTransparentSprite(ScrollText()\index,ScrollText()\posX,ScrollText()\posY)            
                ScrollText()\posX - ScrollText()\speedX
              EndIf
         Next
         
         If ScrollText()\PosX<-60 And ScrollText()\dernier=1
            chargeliste(alphabet,text)
         EndIf
   EndProcedure
      
   Procedure Fond_Degrade() ; Sprite du Fond en dégradé de couleurs Bleues/Cyan (sprite 00)
         CreateSprite(0,WindowW,WindowH+2,#PB_Sprite_Texture )
         StartDrawing(SpriteOutput(0))
         
           ; Partie haute en noir
             Box(0,0,WindowW,189,RGB(0,0,0))

          
           ; 1er dégradé de "Bleu foncé" à "Bleu moyen"
             r1.f=0 ; Couleur de départ r1=Rouge, g1=Vert (Green), b1=Bleu
             g1.f=0
             b1.f=16
             r2.f=0 ; Couleur d'arrivée r2=Rouge, g2=Vert (Green), b2=Bleu
             g2.f=0
             b2.f=240
             dr.f=((r2-r1)/255) ; Delta (différence) entre les 2 teintes,
             dg.f=((g2-g1)/255) ; divisé par 255 (les couleur sont exprimées de 0 à 255 en RGB)
             db.f=((b2-b1)/105) ; exception division par 105 pour le bleu car c'est la couleur qui varie
                                ; (105=nb de lignes à colorier : 190 (inclus) à 294)
              For y=190 To 294
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
            
            ; 2ème dégradé de bleu à "Cyan clair"
              r1.f=0
             g1.f=16
             b1.f=240
             r2.f=0
             g2.f=224
             b2.f=240
             dr.f=((r2-r1)/255)
             dg.f=((g2-g1)/35)
             db.f=((b2-b1)/35)
              For y=295 To 329
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
             
            ; Zone Cyan centrale
              Box(0,330,WindowW,80,RGB(0,240,240))
            
            

        ; 3ème dégradé de "Cyan foncé" à bleu
              r1.f=0
             g1.f=128
             b1.f=128
             r2.f=0
             g2.f=16
             b2.f=128
             dr.f=((r2-r1)/255)
             dg.f=((g2-g1)/40)
             db.f=((b2-b1)/255)
              For y=410 To 449
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
             
            ; 4ème dégradé de bleu à bleu foncé
              r1.f=0
             g1.f=0
             b1.f=128
             r2.f=0
             g2.f=0
             b2.f=16
             dr.f=((r2-r1)/255)
             dg.f=((g2-g1)/255)
             db.f=((b2-b1)/65)
              For y=450 To 514
                 LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                 r1+dr
                 g1+dg
                 b1+db
              Next y
             
           ; Partie basse en noir
             Box(0,515,WindowW,85,RGB(0,0,0))
         StopDrawing()
   EndProcedure
   
   Procedure Logo()  ; Création du sprite logo Scoopex    
    logo=CatchImage(7,?logo)
     If logo      
        l=CreateSprite(56,414,108,#PB_Sprite_Memory)
        StartDrawing(SpriteOutput(56))
         DrawImage(logo,0,0)
        StopDrawing()
      EndIf
  EndProcedure
 
  Procedure ChargeListe(alphab.s,mess.s)   
      ; Charger Liste Chainée
         positionX.l=WindowW+1 ; Largeur de notre fenetre + 1 pour cacher le scroll avant son départ
         For i=1 To Len(mess.s)
            element.w=FindString(alphab,UCase(Mid(mess,i,1)),1)
            If element=0
               ;stop
               Debug element
               End
            EndIf
            AddElement(ScrollText())
            ScrollText()\Index=element
            ScrollText()\posX=positionX
            ScrollText()\posY=(WindowH-96) ; Scrolling en bas de l'écran
            ScrollText()\Large=SpriteWidth(element)
            ScrollText()\speedX=5
            ScrollText()\dernier=0
            positionX+ScrollText()\Large+8
         Next i
         ScrollText()\dernier=1         
   EndProcedure
   
   Procedure BMFont()  ; Définit la police Bitmap (sprites 1 à 42)
     ; charger la police bitmap, et en extraire les caractères    
       font=CatchImage(0,?font)      
       If font
          p=CreateSprite(70,1456,92,#PB_Sprite_Memory)  ; Créer un sprite "géant" pour en extraire les sprites caractères         
          StartDrawing(SpriteOutput(70))
             DrawImage(font,0,0) ; Dessiner image sur le sprite 1
          StopDrawing()   
          TransparentSpriteColor(70,RGB(0,240,0))    
           
          ; Extraction des caractères (1 seule ligne de 43 caractères )
          ; On lit la datasection FontWidths pour les tailles variables de caractères         
          Restore FontWidths2
          Repeat
            Read wdth
            If wdth>0
              ; Créer le sprite correspondant au caractère de la police
                pp=CreateSprite(Car,wdth,92,#PB_Sprite_Memory)
               
              ; Sélectionner le caractère qui nous intéresse sur le Sprite global de la police
                res=ClipSprite(70,X_Depart,0,wdth,92)               
               
               ; Le buffer n'est plus l'écran mais le sprite que l'on va créer               
                UseBuffer(car)
            
              ; Afficher le sprite de la font précédemment clippé sur le sprite "caractère"               
                DisplaySprite(70,0,0)
                 
              ; Transparence du sprite caractère
                TransparentSpriteColor(car,RGB(0,240,0))
             
                Car+1 ; Caractère suivant
                X_Depart+(Wdth) ; Décaler position dans image BitMap de la largeur précédemment lue
              EndIf
          Until wdth=0   ; Tant qu'il y a des données à "lire" en datas
          UseBuffer(#PB_Default)
          ClipSprite(70,#PB_Default,#PB_Default,#PB_Default,#PB_Default)
        EndIf
   EndProcedure
 
  Procedure ChargelisteMont()
     For i=5 To 0 Step -1
           AddElement(Mountains())
           Mountains()\Index=50+i
           Mountains()\PosX=0
           PosY=210
           Select i
             Case 5
               PosY=300
             Case 4
               PosY+63
             Case 3
               PosY+82
             Case 2
               PosY+84
             Case 1
               PosY+89
             Case 0
               PosY+104
           EndSelect
           Mountains()\PosY=PosY
           Mountains()\Speed=6-i
           Mountains()\Largeur=SpriteWidth(Mountains()\Index)
           Mountains()\Hauteur=SpriteHeight(Mountains()\Index)
         Next i
   EndProcedure

  Procedure Montagnes()  ; Sprites des montagnes parallax (50 à 55)     
       layer1=CatchImage(1,?layer1)      
       If layer1      
          p=CreateSprite(50,640*3,98,#PB_Sprite_Memory)         
          StartDrawing(SpriteOutput(50))
             DrawImage(layer1,0,0)
             DrawImage(layer1,640,0)
             DrawImage(layer1,1280,0)
          StopDrawing()         
        EndIf
       
        layer2=CatchImage(2,?layer2)      
       If layer2
          p=CreateSprite(51,640*3,124,#PB_Sprite_Memory)
          StartDrawing(SpriteOutput(51))
            DrawImage(layer2,0,0)
             DrawImage(layer2,640,0)
             DrawImage(layer2,1280,0)
          StopDrawing()
        EndIf
       
        layer3=CatchImage(3,?layer3)      
       If layer3
          p=CreateSprite(52,643*3,128,#PB_Sprite_Memory)
          StartDrawing(SpriteOutput(52))
             DrawImage(layer3,0,0)
             DrawImage(layer3,643,0)
             DrawImage(layer3,1286,0)
          StopDrawing()
        EndIf
       
        layer4=CatchImage(4,?layer4)      
       If layer1
          p=CreateSprite(53,639*3,138,#PB_Sprite_Memory)
          StartDrawing(SpriteOutput(53))
             DrawImage(layer4,0,0)
             DrawImage(layer4,639,0)
             DrawImage(layer4,1278,0)
          StopDrawing()
        EndIf
       
        layer5=CatchImage(5,?layer5)      
       If layer5
          p=CreateSprite(54,640*3,164,#PB_Sprite_Memory)
          StartDrawing(SpriteOutput(54))
             DrawImage(layer5,0,0)
             DrawImage(layer5,640,0)
             DrawImage(layer5,1280,0)
          StopDrawing()
        EndIf
       
        layer6=CatchImage(6,?layer6)      
       If layer6
          p=CreateSprite(55,640*3,166,#PB_Sprite_Memory)
          StartDrawing(SpriteOutput(55))
             DrawImage(layer6,0,0)
             DrawImage(layer6,640,0)
             DrawImage(layer6,1280,0)
          StopDrawing()
        EndIf       
  EndProcedure   

  Procedure Musique()   
    music=CatchModule(0,?module,?Fmodul-?module)
    If music
      ModuleVolume(0,75)
      PlayModule(0)     
    EndIf
  EndProcedure
 
  Procedure HappyEnd()
    ; Cette procédure pour finir proprement
      For i=0 To 41
        FreeSprite(i) ; Libérer mémoire des sprites fond et caractères
      Next i
     
      For i=50 To 56
        FreeSprite(i) ; Libérer mémoire des sprites montagne et logo
      Next i
     
      FreeModule(0) ; Libérer mémoire du module musical     
  EndProcedure
 
; Initialisations
      If InitSprite()=0 Or InitKeyboard()=0 Or InitMouse()=0 Or initsound()=0
         MessageRequester("Problème","Initialisations impossibles",0)
         End
      EndIf
         
;  Ouverture écran
   If OpenWindow (0,0,0,WindowW,WindowH, "Scoopex Fred Amiga Game Cracktro Remake : Partie 2" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
      If OpenWindowedScreen (WindowID (0),0,0,WindowW,WindowH,1,0,0)

      ; Boucle Principale
        ClearScreen (RGB(0,0,0))
       
      ; Lancer la création du fond d'écran, de la création du logo Scoopex
        Fond_Degrade()
        Logo()
        BMFont()            
            ChargeListe(alphabet,text)
        Montagnes()            
            ChargeListeMont()
            Musique()
            
      ; Boucler jusqu'à ce que l'on quitte le programme
            Repeat
              ; Vérifier action clavier et souris
                 ExamineKeyboard()
                 ExamineMouse()
                
               ; Vérifier évènement Windows (fermer la fenêtre)
                event=WaitWindowEvent()
               
              ; Afficher le dégradé de fond d'écran
                 Affiche()
                
               ; Alterner les buffers d'affichage
                 FlipBuffers()
               ClearScreen(RGB(0,0,0))
               
            Until KeyboardPushed(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Right)   Or event=#PB_Event_CloseWindow
      EndIf
   EndIf
   End

DataSection: 
  logo:   IncludeBinary "Scx_logo.png"
  font:   IncludeBinary "font1.png"
  layer1: IncludeBinary "layer1d.png"
   layer2: IncludeBinary "layer2d.png"
   layer3: IncludeBinary "layer3d.png"
   layer4: IncludeBinary "layer4d.png"
   layer5: IncludeBinary "layer5d.png"
   layer6: IncludeBinary "layer6d.png"
   module: IncludeBinary "scoopex.mod"
   Fmodul:
 
  FontWidths2:
     Data.l 32,32,32,32,32,32,32,32,16,32,32,32,49,31,32,32,40,32,32,32,32,32,48,32,32,32,50
     Data.l 22,32,32,32,34,32,30,32,32,32,144,20,26,50,0   
EndDataSection



Voilà c'est fini, ou presque...

Oui presque, car vous pouvez toujours ajouter quelques effets comme une montée progressive du volume sonore
au démarrage de la cracktro, et une descente du même genre à la clôture.

A vous de jouer maintenant ; j'attends avec impatience vos remakes d'Intros/cracktros.

Merci d'avoir lu ce tutoriel en entier



EDIT du 27 Septembre 2010 :
Suite à la remarque de Raven indiquent que cela ne fonctionne plus sous PureBasic 4.51, voici l'explication et le code corrigé.

Depuis la version 4.50, PureBasic utilise le sous-système graphique DirectX9 en natif, or sous DX9, la commande UseBuffer() ne fonctionne plus. La solution que j'ai trouvé, après avoir galéré en essayant des CopyMemory(), et autres PeekB()/PokeB(), est on ne peut plus simple : GrabSprite().

On "clip" toujours l'énorme sprite de la fonte, mais au lieu de faire le display sur le nouveau sprite, on le fait sur l'écran, et on "grab" notre sprite caractère.

Voici le code complet :
Code:
; Scoopex CrackTro Remake
; ©.2009 TazNormand

; D'après Remake en Flash sur www.Flashtro.com
; visible ici : http://flashtro.com/page.php?id=72&highlight=SCOOPEX



; TUTORIEL 5 : La Musique



;  Taille écran   
        Global WindowW.w=800
        Global WindowH.w=600

    Global alphabet.s="ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890,.!?"  ; Correspond à l'ordre des caractères de la police BitMap
        Global text.s ; Le texte du scrolling chargé ci-dessous
    text.s = " Scoopex cracktro PureBasic Remake by TazNormand     ,         scoopex presents     fred       cracked and trained ....      hmm this time it was a hard crack ....  cause the whole loader were written in fucking c code and the original had several errors .... ";
    text.s +"sorry for no megatraining but i want to finish the megacruncher and i?ve absolutly no time for training games   !!!         well our member list went down a little bit cause there are no longer sections in";
    text.S +"   ...... england and sweden !!!!   heres a small list including the people who left scoopex to start their carrier in another group    pennywise .. uncle tom .. jesus .. zark ..  all in share and enjoy";
    text.s +"  .. merryman and panther !!!!  i wish you good luck where ever you are   also our division in germany was busted  ?cause some people thought they could release every shit like their megademo!! so this mega demo is no     ,production";
    text.s +"  i want to send some hellos to our friends .... subway .. fairlight .. piranhas .. quartex .. red sector .. quick silver .. thrust .. .m.a.d .. share and enjoy .. spreadpoint .. oracle .. vision factory .. and all the others";
    text.s +" which    worth  mentioned             challenger              of     !!!    generations      !!!!       ";

    Global X_Depart.w=0 ; Position du premier caractère dans fichier image de la fonte bitMap
    Global Car.w=1  ; Premier n° de sprite caractère
   
; Structures
    ; ScrollChar servira pour la position de chaque caractère du scrolltext
        Structure ScrollChar
                Index.w
                PosX.l
                PosY.l
                Large.w
                SpeedX.w     
                Dernier.b   
        EndStructure
       
    ; Parallax servira pour les 6 scrolling différentiels (parallaxes) des "montagnes grises"
        Structure Parallax
            Index.w
            PosX.l
            PosY.l     
            Speed.w
            Largeur.w
            Hauteur.w
        EndStructure

; Liste Chainées : elles contiendront les positions, vitesses, etc..; des caractères et montagnes
        Global NewList ScrollText.ScrollChar()
        Global NewList Mountains.Parallax()   

       
; Décodeur PNG pour utilise les images
        UsePNGImageDecoder()
           
; Déclaration des procédures ce qui permet de les appeler quelque soit leur ordre
Declare Affiche()
Declare Fond_Degrade()
Declare Logo()
Declare ChargeListe(alphab.s,mess.s)
Declare BMFont()
Declare Montagnes()
Declare Musique()
Declare HappyEnd()
Declare ClipSpr2Sprite(ClipSpr,ClipX,ClipY,ClipW,ClipH,DestSpr)

; Procédures pour un code "plus lisible"
  Procedure Affiche()
                ; Affichage fond dégradé
                        DisplayTransparentSprite(0,0,-1)
                       
                ; Affichage logo Scoopex
                    DisplayTransparentSprite(56,193,50)
                   
                ; Afficher montagnes
                    ResetList(Mountains())
                    ForEach(Mountains())
                        ClipSprite(Mountains()\Index,Mountains()\PosX,0,WindowW,Mountains()\Hauteur)         
                        DisplayTransparentSprite(Mountains()\Index,0,Mountains()\PosY)         
                        Mountains()\PosX + Mountains()\Speed
                        If Mountains()\PosX>=Mountains()\Largeur / 3
                                    Mountains()\PosX=0
                            EndIf
                    Next
                               
                ; Affichage scrolling
                        ResetList(ScrollText())
                        ForEach ScrollText()
                            ; N'afficher le sprite que s'il est sur la partie visible de l'écran
                                If (ScrollText()\posX + ScrollText()\Large) > 0
                                        DisplayTransparentSprite(ScrollText()\index,ScrollText()\posX,ScrollText()\posY)           
                                        ScrollText()\posX - ScrollText()\speedX
                                    EndIf
                        Next
                       
                        If ScrollText()\PosX<-60 And ScrollText()\dernier=1
                                chargeliste(alphabet,text)
                        EndIf
  EndProcedure
                   
    Procedure Fond_Degrade() ; Sprite du Fond en dégradé de couleurs Bleues/Cyan (sprite 00)
                        CreateSprite(0,WindowW,WindowH+2,#PB_Sprite_Texture )
                        StartDrawing(SpriteOutput(0))
                       
                            ; Partie haute en noir
                                Box(0,0,WindowW,189,RGB(0,0,0))

                           
                            ; 1er dégradé de "Bleu foncé" à "Bleu moyen"
                                r1.f=0 ; Couleur de départ r1=Rouge, g1=Vert (Green), b1=Bleu
                                g1.f=0
                                b1.f=16
                                r2.f=0 ; Couleur d'arrivée r2=Rouge, g2=Vert (Green), b2=Bleu
                                g2.f=0
                                b2.f=240
                                dr.f=((r2-r1)/255) ; Delta (différence) entre les 2 teintes,
                                dg.f=((g2-g1)/255) ; divisé par 255 (les couleur sont exprimées de 0 à 255 en RGB)
                                db.f=((b2-b1)/105) ; exception division par 105 pour le bleu car c'est la couleur qui varie
                                                                        ; (105=nb de lignes à colorier : 190 (inclus) à 294)
                                    For y=190 To 294
                                            LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                                            r1+dr
                                            g1+dg
                                            b1+db
                                    Next y
                               
                                ; 2ème dégradé de bleu à "Cyan clair"
                                    r1.f=0
                                g1.f=16
                                b1.f=240
                                r2.f=0
                                g2.f=224
                                b2.f=240
                                dr.f=((r2-r1)/255)
                                dg.f=((g2-g1)/35)
                                db.f=((b2-b1)/35)
                                    For y=295 To 329
                                            LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                                            r1+dr
                                            g1+dg
                                            b1+db
                                    Next y
                                   
                                ; Zone Cyan centrale
                                    Box(0,330,WindowW,80,RGB(0,240,240))
                               
                               

                ; 3ème dégradé de "Cyan foncé" à bleu
                                    r1.f=0
                                g1.f=128
                                b1.f=128
                                r2.f=0
                                g2.f=16
                                b2.f=128
                                dr.f=((r2-r1)/255)
                                dg.f=((g2-g1)/40)
                                db.f=((b2-b1)/255)
                                    For y=410 To 449
                                            LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                                            r1+dr
                                            g1+dg
                                            b1+db
                                    Next y
                                   
                                ; 4ème dégradé de bleu à bleu foncé
                                    r1.f=0
                                g1.f=0
                                b1.f=128
                                r2.f=0
                                g2.f=0
                                b2.f=16
                                dr.f=((r2-r1)/255)
                                dg.f=((g2-g1)/255)
                                db.f=((b2-b1)/65)
                                    For y=450 To 514
                                            LineXY(0,y,WindowW,y,RGB(r1,g1,b1))
                                            r1+dr
                                            g1+dg
                                            b1+db
                                    Next y
                                   
                            ; Partie basse en noir
                                Box(0,515,WindowW,85,RGB(0,0,0))
                        StopDrawing()
        EndProcedure
       
    Procedure Logo()  ; Création du sprite logo Scoopex     
        logo=CatchImage(7,?logo)
            If logo       
                    l=CreateSprite(56,414,108,#PB_Sprite_Memory)
                    StartDrawing(SpriteOutput(56))
                    DrawImage(logo,0,0)
                    StopDrawing()
                EndIf
    EndProcedure
   
    Procedure ChargeListe(alphab.s,mess.s)   
                ; Charger Liste Chainée
                        positionX.l=WindowW+1 ; Largeur de notre fenetre + 1 pour cacher le scroll avant son départ
                        For i=1 To Len(mess.s)
                                element.w=FindString(alphab,UCase(Mid(mess,i,1)),1)
                                If element=0
                                        ;stop
                                        Debug element
                                        End
                                EndIf
                                AddElement(ScrollText())
                                ScrollText()\Index=element
                                ScrollText()\posX=positionX
                                ScrollText()\posY=(WindowH-96) ; Scrolling en bas de l'écran
                                ScrollText()\Large=SpriteWidth(element)
                                ScrollText()\speedX=5
                                ScrollText()\dernier=0
                                positionX+ScrollText()\Large+8
                        Next i
                        ScrollText()\dernier=1         
        EndProcedure
       
    Procedure BMFont()  ; Définit la police Bitmap (sprites 1 à 42)
            ; charger la police bitmap, et en extraire les caractères     
                font=CatchImage(0,?font)       
                If font
                        p=CreateSprite(70,1456,92,#PB_Sprite_Memory)  ; Créer un sprite "géant" pour en extraire les sprites caractères         
                        StartDrawing(SpriteOutput(70))
                                DrawImage(font,0,0) ; Dessiner image sur le sprite 1
                        StopDrawing()   
                        TransparentSpriteColor(70,RGB(0,240,0))     
                           
                        ; Extraction des caractères (1 seule ligne de 43 caractères )
                        ; On lit la datasection FontWidths pour les tailles variables de caractères         
                        Restore FontWidths2
                        Repeat
                            Read wdth
                            If wdth>0
                                ; Créer le sprite correspondant au caractère de la police
                                    pp=CreateSprite(Car,wdth,92,#PB_Sprite_Memory)
                                   
                                ; Sélectionner le caractère qui nous intéresse sur le Sprite global de la police
                                  res=ClipSprite(70,X_Depart,0,wdth,92)                                         
                               
                                ; //////////////////////////////////////////////////////////////////////////
                                ; ///   UseBuffer() Obsolete avec DIRECTX9 et sans doute 10,11,etc...    ///
                                ; ///                   On utilise donc un GrabSprite                    ///
                                ; //////////////////////////////////////////////////////////////////////////
                                ; /// Si vous êtes en DIRECTX7, décommentez toutes les lignes où il y a  ///
                                ; ///          Et commentez toutes celles où apparaît DIRECTX9           ///
                                ; //////////////////////////////////////////////////////////////////////////
                               
                                ; Le buffer n'est plus l'écran mais le sprite que l'on va créer
                                ; UseBuffer(car) ; DIRECTX7
                           
                                ; Afficher le sprite de la font précédemment clippé sur le sprite "caractère"                                                                       
                                ; DisplaySprite(70,0,0)              ; DIRECTX7
                                    ClearScreen(0)                                ; DIRECTX9
                                    StartDrawing(ScreenOutput())                  ; DIRECTX9
                                      DisplayTransparentSprite(70,0,0)                        ; DIRECTX9             
                                    StopDrawing()                                 ; DIRECTX9
                                    GrabSprite(car,0,0,wdth,92,#PB_Sprite_Memory) ; DIRECTX9
                                                                           
                                ; Transparence du sprite caractère
                               
                                ; ///////////////////////////////////////////////////////////////////////////////////////
                                ; // Attention, avec le GrabSprite, la couleur transparente devient le noir (RGB0,0,0) //
                                ; ///////////////////////////////////////////////////////////////////////////////////////                               
                                ; TransparentSpriteColor(car,RGB(0,240,0)) ; DIRECTX7
                                  TransparentSpriteColor(car,RGB(0,0,0))        ; DIRECTX9
                               
                                        Car+1 ; Caractère suivant
                                        X_Depart+(Wdth) ; Décaler position dans image BitMap de la largeur précédemment lue
                                    EndIf
                        Until wdth=0   ; Tant qu'il y a des données à "lire" en datas
                        ;UseBuffer(#PB_Default) ; DIRECTX7
                        ClipSprite(70,#PB_Default,#PB_Default,#PB_Default,#PB_Default)
                    EndIf
        EndProcedure
       
    Procedure ChargelisteMont()
            For i=5 To 0 Step -1
                            AddElement(Mountains())
                            Mountains()\Index=50+i
                            Mountains()\PosX=0
                            PosY=210
                            Select i
                                Case 5
                                    PosY=300
                                Case 4
                                    PosY+63
                                Case 3
                                    PosY+82
                                Case 2
                                    PosY+84
                                Case 1
                                    PosY+89
                                Case 0
                                    PosY+104
                            EndSelect
                            Mountains()\PosY=PosY
                            Mountains()\Speed=6-i
                            Mountains()\Largeur=SpriteWidth(Mountains()\Index)
                            Mountains()\Hauteur=SpriteHeight(Mountains()\Index)
                        Next i
        EndProcedure

    Procedure Montagnes()  ; Sprites des montagnes parallax (50 à 55)     
                layer1=CatchImage(1,?layer1)       
                If layer1       
                        p=CreateSprite(50,640*3,98,#PB_Sprite_Memory)         
                        StartDrawing(SpriteOutput(50))
                                DrawImage(layer1,0,0)
                                DrawImage(layer1,640,0)
                                DrawImage(layer1,1280,0)
                        StopDrawing()         
                    EndIf
                   
                    layer2=CatchImage(2,?layer2)       
                If layer2
                        p=CreateSprite(51,640*3,124,#PB_Sprite_Memory)
                        StartDrawing(SpriteOutput(51))
                            DrawImage(layer2,0,0)
                                DrawImage(layer2,640,0)
                                DrawImage(layer2,1280,0)
                        StopDrawing()
                    EndIf
                   
                    layer3=CatchImage(3,?layer3)       
                If layer3
                        p=CreateSprite(52,643*3,128,#PB_Sprite_Memory)
                        StartDrawing(SpriteOutput(52))
                                DrawImage(layer3,0,0)
                                DrawImage(layer3,643,0)
                                DrawImage(layer3,1286,0)
                        StopDrawing()
                    EndIf
                   
                    layer4=CatchImage(4,?layer4)       
                If layer1
                        p=CreateSprite(53,639*3,138,#PB_Sprite_Memory)
                        StartDrawing(SpriteOutput(53))
                                DrawImage(layer4,0,0)
                                DrawImage(layer4,639,0)
                                DrawImage(layer4,1278,0)
                        StopDrawing()
                    EndIf
                   
                    layer5=CatchImage(5,?layer5)       
                If layer5
                        p=CreateSprite(54,640*3,164,#PB_Sprite_Memory)
                        StartDrawing(SpriteOutput(54))
                                DrawImage(layer5,0,0)
                                DrawImage(layer5,640,0)
                                DrawImage(layer5,1280,0)
                        StopDrawing()
                    EndIf
                   
                    layer6=CatchImage(6,?layer6)       
                If layer6
                        p=CreateSprite(55,640*3,166,#PB_Sprite_Memory)
                        StartDrawing(SpriteOutput(55))
                                DrawImage(layer6,0,0)
                                DrawImage(layer6,640,0)
                                DrawImage(layer6,1280,0)
                        StopDrawing()
                    EndIf       
    EndProcedure   

    Procedure Musique()   
        music=CatchModule(0,?module,?Fmodul-?module)
        If music
            ModuleVolume(0,75)
            PlayModule(0)     
        EndIf
    EndProcedure
   
    Procedure HappyEnd()
        ; Cette procédure pour finir proprement
            For i=0 To 41
                FreeSprite(i) ; Libérer mémoire des sprites fond et caractères
            Next i
           
            For i=50 To 56
                FreeSprite(i) ; Libérer mémoire des sprites montagne et logo
            Next i
           
            FreeModule(0) ; Libérer mémoire du module musical     
    EndProcedure
   
; Initialisations
                If InitSprite()=0 Or InitKeyboard()=0 Or InitMouse()=0 Or InitSound()=0
                        MessageRequester("Problème","Initialisations impossibles",0)
                        End
                EndIf
                       
;  Ouverture écran
        If OpenWindow (0,0,0,WindowW,WindowH, "Scoopex Fred Amiga Game Cracktro Remake : Partie 2" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
                If OpenWindowedScreen (WindowID (0),0,0,WindowW,WindowH,1,0,0)

            ; Boucle Principale
                ClearScreen (RGB(0,0,0))
               
            ; Lancer la création du fond d'écran, de la création du logo Scoopex
                Fond_Degrade()
                Logo()
                BMFont()           
                                ChargeListe(alphabet,text)
                Montagnes()           
                                ChargeListeMont()
                                Musique()
                               
            ; Boucler jusqu'à ce que l'on quitte le programme
                                Repeat
                                    ; Vérifier action clavier et souris
                                            ExamineKeyboard()
                                            ExamineMouse()
                                           
                                        ; Vérifier évènement Windows (fermer la fenêtre)
                                        event=WaitWindowEvent()
                                       
                                    ; Afficher le dégradé de fond d'écran
                                            Affiche()
                                           
                                        ; Alterner les buffers d'affichage
                                            FlipBuffers()
                                        ClearScreen(RGB(0,0,0))
                                       
                                Until KeyboardPushed(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Right)   Or event=#PB_Event_CloseWindow
                EndIf
        EndIf
        End

DataSection: 
    logo:   IncludeBinary "Scx_logo.png"
    font:   IncludeBinary "font1.png"
    layer1: IncludeBinary "layer1d.png"
        layer2: IncludeBinary "layer2d.png"
        layer3: IncludeBinary "layer3d.png"
        layer4: IncludeBinary "layer4d.png"
        layer5: IncludeBinary "layer5d.png"
        layer6: IncludeBinary "layer6d.png"
        module: IncludeBinary "scoopex.mod"
        Fmodul:
   
    FontWidths2:
            Data.l 32,32,32,32,32,32,32,32,16,32,32,32,49,31,32,32,40,32,32,32,32,32,48,32,32,32,50
            Data.l 22,32,32,32,34,32,30,32,32,32,144,20,26,50,0   
EndDataSection

_________________
Image

Image


Dernière édition par TazNormand le Lun 27/Sep/2010 21:56, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 04/Aoû/2009 14:45 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 27/Oct/2006 12:19
Messages: 1224
Localisation: Calvados (14)
jbernard13 a écrit:
taz tu es un super prof merci


Merci JBernard13

Mon code n'est pas parfait, et surement pas optimisé, mais comme toi je débute, et j'essaie de faire profiter tout le monde de mes "découvertes" .

Les différentes aides apportées par les uns et les autres dans le forum m'ont permis d'avancer, et de pondre ce petit remake.

Maintenant à toi de jouer, tu dois pouvoir faire quelque chose de sympa :wink:

_________________
Image

Image


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 04/Aoû/2009 18:22 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 8767
Un grand bravo ! et un grand merci pour tes explications détaillées.
Pour le moment je stock pour y étudier plus tard.

Par contre j'ai un bug concernant font1.png

L'affichage est ignoble...

Regarde :

Image

_________________
~~~~Règles du forum ~~~~
.: Ar-S :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 04/Aoû/2009 18:51 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 27/Oct/2006 12:19
Messages: 1224
Localisation: Calvados (14)
Autant pour moi, en fait le lien pour la police BitMap n'était pas le bon, recharges-la tu devrais trouver ça plus "joli".

J'ai mis à jour le lien sur la 1ère page

_________________
Image

Image


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 04/Aoû/2009 20:39 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 8767
C'est bien mieux en effet :]

_________________
~~~~Règles du forum ~~~~
.: Ar-S :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 04/Aoû/2009 21:50 
Hors ligne

Inscription: Lun 26/Avr/2004 0:40
Messages: 14535
si j'en crois la capture de Ars
le dessin des montagnes est un non sens pour un graphiste dans cette demo :)

en effet, un peintre va représenter les montagnes eloignées de façon claire
et celle proche de façon foncées !!

apparemment c'est l'inverse ici ;)

avez vous essayé l'inverse ?


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mer 05/Aoû/2009 7:57 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 25/Aoû/2004 6:31
Messages: 2594
Localisation: Eragny
d'ailleur vu comment sont fait les montages, je pense que je les auraient dessiné directement dans le programme au lieu d'utiliser une image bitmap toute faite non ?
(simple suggestion ... ces tutoriels sont tres bon ! bravo)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mer 05/Aoû/2009 9:24 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 27/Oct/2006 12:19
Messages: 1224
Localisation: Calvados (14)
Les graphismes sont issus de l'intro originale, rippés par le site FlashTro.
je n'ai fait que le reprendre. c'est vrai que les dessiner directement par le programme serait plus "optimisé", mais étant débutant, j'ai voulu faire un tuto simple pour les autres débutants.

Normalement avec ça, si mes explications sont assez claires, JBernard13 devrait nous refaire une autre intro/cracktro :wink:

_________________
Image

Image


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mer 05/Aoû/2009 9:56 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 25/Aoû/2004 6:31
Messages: 2594
Localisation: Eragny
TazNormand a écrit:
Les graphismes sont issus de l'intro originale, rippés par le site FlashTro.
je n'ai fait que le reprendre. c'est vrai que les dessiner directement par le programme serait plus "optimisé", mais étant débutant, j'ai voulu faire un tuto simple pour les autres débutants.

Normalement avec ça, si mes explications sont assez claires, JBernard13 devrait nous refaire une autre intro/cracktro :wink:

Et c'est tres bien comme ça !! :) Tu penses refaire d'autre demo/cractro comme ça ?
Une qui serait vraiment sympa a refaire car il y a un peu d'interactivité c'est "The drunk desert Demo" de paradox ! car il y a des petits jeux intégré ! shooter les rats qui courrent, boire des bierres, la musique est tres sympa, et il y a un multiscrolling tres sympa ... :) reste a ripper les graphismes, et la zic. Tient d'ailleur faut que je la retrouve cette zic elle me plaisait bien ... :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mer 05/Aoû/2009 10:05 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 27/Oct/2006 12:19
Messages: 1224
Localisation: Calvados (14)
Je pense pas avoir encore tout à fat le niveau, mais pourquoi pas.

Je la télécharge, et je la regarderai sous WinUAE, mais après les vacances :D

sinon, pour le mod, ce serait pas celui là : The Drink Desert Demo

_________________
Image

Image


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mer 05/Aoû/2009 10:21 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 25/Aoû/2004 6:31
Messages: 2594
Localisation: Eragny
TazNormand a écrit:
Je pense pas avoir encore tout à fat le niveau, mais pourquoi pas.

Je la télécharge, et je la regarderai sous WinUAE, mais après les vacances :D

sinon, pour le mod, ce serait pas celui là : The Drink Desert Demo

si c'est bien ce mod là (j'ai reconnu le titre)! mais là j'arrive pas a le télécharger j'utilise un point wifi gratuit sur la plage, mais le ftp n'est pas autorisé apparemment

La demo n' a rien de tres compliqué ! tu verra si je me rappel il faut secouer le joystick pour faire boire le bonhomme, et au bout d'un certain temps il se casse la tête avec un marteau, et sinon il y a des rats qui courent et qu'il faut shooter avec la souris ... Je l'ai toujours trouvé original, et sympa cette demo !! :) En tout cas si tu souhaites un jour la refaire et que tu as des difficultés je suis prêt a te donner un coup de main !! :)


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 49 messages ]  Aller à la page Précédente  1, 2, 3, 4  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  
cron

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye