Big ScrollText mais caractères qui se chevauchent

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Big ScrollText mais caractères qui se chevauchent

Message par TazNormand »

Salut

qui peut me dire pourquoi dans le source qui suit, j'ai des caractères/sprites qui se chevauchent. J'ai beau regarder dans tous les sens, je vois pas où est mon erreur !!!

merci de votre aide

Code : Tout sélectionner

; Big Scroll
; ©.2009 TazNormand

;EnableExplicit

; Définition de type
    ;Define.w ScreenW, ScreenH, Index, PosX, PosY, Speed, TailleW, TailleH, i, x
    ;Define.s char, alphabet, message
    
; Variables / Constantes
    Global alphabet.s="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789<>-/\;().,!?:=+' "
    Global message.s="WORIE Eh oui, encore un scrolltext, mais que voulez-vous, je ne m'en lasse pas !!!   "
    
; Structures
    Structure SpriteChar
        Index.w
        PosX.w
        PosY.w
        Speed.w
        Dernier.b
        car.s
    EndStructure

; Liste Chainées
    Global NewList SprChar.spritechar()

; Procédures

    Procedure ChargeListe(alphab.s,mess.s)
        ; Charger Liste Chainée
            positionX.w=801
            For i=1 To Len(mess.s)
                element.w=FindString(alphab,Mid(mess,i,1),1)
                If element=0
                    ;stop
                    Debug element
                EndIf
                larg=SpriteWidth(element)
                positionX+larg+16
                Debug Mid(mess,i,1)
                Debug positionX
                Debug element
                Debug larg
                
                AddElement(sprchar())
                sprchar()\Index=element
                sprchar()\posX=positionX
                sprchar()\posY=200
                sprchar()\speed=5
                sprchar()\dernier=0
                sprchar()\car=Mid(mess,i,1)
            Next i
            sprchar()\dernier=1
    EndProcedure
    
    Procedure CreerSprites(alphab.s)
        ; Choisir la police
            LoadFont (1, "impact" , 220)

        ; Créer sprites
            For i.w=1 To Len(alphab)
                char.s=Mid(alphab,i,1)
                StartDrawing(WindowOutput(0))
                    DrawingFont ( FontID (1))
                    tailleH.w=TextHeight(char)
                    tailleW.w=TextWidth(char)
                StopDrawing()
                    
                CreateSprite (i,tailleW,tailleH,#PB_Sprite_Texture)
                StartDrawing(SpriteOutput(i))
                    DrawingFont ( FontID (1))
                    DrawText(0,0,char,RGB(0,255,75),RGB(0,0,0))
                StopDrawing()
            Next i
    EndProcedure
    
    Procedure DisplayChar()
        ResetList(sprchar())
        
        While NextElement(sprchar())
            sprchar()\posX - sprchar()\speed
            DisplayTransparentSprite(sprchar()\index,sprchar()\posX,sprchar()\PosY)
            
            StartDrawing(WindowOutput(0))
                DrawText(sprchar()\posx,10,sprchar()\car,RGB(255,255,255),RGB(0,0,0))
            StopDrawing()
        Wend
        If sprchar()\PosX<-60 And sprchar()\dernier=1
            chargeliste(alphabet,message)
        EndIf
    EndProcedure
    
    
; Initialisations
     If InitSprite () =0 Or InitKeyboard ()=0 Or InitMouse ()=0 Or InitSprite3D()=0
         MessageRequester ( "Problème" , "Initialisations impossibles"  , 0)
         End
     EndIf
         
;  Taille écran
    ExamineDesktops()
    ScreenW.w=DesktopWidth(0)
    ScreenH.w=DesktopHeight(0)
    
;  Ouverture écran
    If OpenWindow (0,0,0,800,600, "Big Scroll" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
        If OpenWindowedScreen ( WindowID (0),0,0,800,600,1,0,0)
            ClearScreen ( RGB (0,0,0))

            ; Boucle principale
                creersprites(alphabet)
                chargeliste(alphabet,message)
                Repeat
                    ClearScreen(RGB(0,0,0))
                    DisplayChar()
                    ExamineKeyboard()
                    ExamineMouse()
                    Event=WaitWindowEvent()
                    FlipBuffers()
                Until KeyboardPushed ( #PB_Key_Escape ) Or Event= #PB_Event_CloseWindow Or MouseButton ( #PB_MouseButton_Right )          
        EndIf
    EndIf
    
    End
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Encore un scrolltext?! :lol:

Les caractères de la police impact ne sont pas d'une taille fixe (le w n'a pas la même largeur que le i, par exemple); soit tu prends en compte les caractéristiques de la police (positions et tailles des caractères), soit tu prends une police de taille fixe (polices bitmap, comme terminal), ou encore tu cherches sur le net une de ces bonnes vieilles polices de démos, qui sont en couleur en plus (ce sont des images).

Y'a aussi deux trois bricoles:
Dans la boucle d'un effet, on n'utilise pas waitwindowevent(), qui stoppe ton programme jusqu'à ce qui windows lui envoie un événement, mais windowevent(), avec éventuellement un petit delay pour donner un peu plus de temps processeur aux autres tâches.
Tu peux utiliser foreach() pour parcourir une boucle.
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

Merci djes

mais le fait de créer des sprites à la taille de chaque caractère ne devrait il pas pallier au fait que les tailles ne sont pas fixes ?

j'ai remplacé le waitwindowevent (chez moi), tu me l'avais déjà signalé, mais j'ai encore une fois zappé.

pour le foreach vs "for...next", avantage/inconvénient ?

Et oui, encore un scrolltext, mais comme dit dans le message du scroll, je ne m'en lasse pas, d'autant que je voudrais ajouter d'autres effets à celui là.

J'étais une buse sur Amiga, jamais pu programmer quoique que ce soit de "demo like", alors je me rattrape avec PB.
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

TazNormand a écrit :pour le foreach vs "for...next", avantage/inconvénient ?
Foreach est pour les listes, for...next pour une boucle itérative. Donc si tu utilise des listes: Foreach, besoin de compter: for...next

/Lio
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

pffffff ! 8O tu te prends la tete pour pas grand chose là !! :lol:

attends , je vais te faire un truc similaire et commenté :)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Les polices vectorielles peuvent avoir non seulement des caractères de tailles différentes, mais aussi des positions; c'est du coup assez difficile à gérer. Essaye d'afficher une série de lettres les unes derrière les autres, sans mouvement, pour voir où ça déconne.
Essaye aussi d'utiliser le type par défaut (tu peux le spécifier avec .i mais c'est inutile); c'est plus rapide que le .w.

J'avais noté pour le scrolltext, c'était un :wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

........
Dernière modification par Backup le sam. 01/oct./2011 13:12, modifié 4 fois.
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

Dobro a écrit :
ps : whorrie c'est pas plutot "whorry"
Arf Worie ça veut rien dire, juste pour montrer le "collage-serrage" des lettres

merci pour le code, je vais regarder ça
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

petit ajout d'un indice en debut de listing
pour raprocher les "mots" entre eux :)
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

Bon, nouvelle version SANS polices systèmes, mais avec police Bitmap

Il vous faut ce fichier image à enregistrer dans le même endroit que le source :

Image

Petite précision, on peut basculer le scrolling de "Sinus" à "Plat" en appuyant sur S

Et voici le source :

Code : Tout sélectionner

; Big Scroll
; ©.2009 TazNormand

;EnableExplicit

; Définition de type

; Décodeur PNG
  UsePNGImageDecoder()
  
; Variables / Constantes
  Global alphabet.s=" !"+Chr(34)+"#$%€'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  Global message.s=UCase("Eh oui encore un scrolltext mais que voulez-vous je ne m'en lasse pas !!!   ")

;  Taille écran
  ExamineDesktops()
  Global ScreenW.w=DesktopWidth(0)
  Global ScreenH.w=DesktopHeight(0)
  Global WindowW.w=ScreenW-200
  Global WindowH.w=ScreenH-200
  
; Variable pour le tracé de la sinusoide
  Global frequence.w=3
  Global abscisse.w=120
  Global ordonnee.w=WindowH/2
  Global amplitude.w=64
  Global echantillon.w=WindowW
  Global Sinus.b=1  

; Variables Diverses
  Global nbsmileys.b=15    
  
; Structures
  Structure SpriteChar
    Index.w
    PosX.w
    PosY.w
    SpeedX.w
    SpeedY.w
    Dernier.b    
  EndStructure

; Liste Chainées
  Global NewList SprChar.spritechar()
  Global NewList SprCharM.spritechar()
  Global NewList smileys.spritechar()
  
; Procédures
  
  Procedure ChargeListe(alphab.s,mess.s)   
    ; Charger Liste Chainée
      positionX.w=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,Mid(mess,i,1),1)
        If element=0
          ;stop
          Debug element
          End
        EndIf
        positionX+64+48        
        AddElement(sprchar())
        sprchar()\Index=element+1
        sprchar()\posX=positionX
        sprchar()\posY=WindowH/2 ; Scrolling en plein milieu de l'écran
        sprchar()\speedX=3
        sprchar()\speedY=0
        sprchar()\dernier=0        
     
        ; Idem mais pour les caractères "mirrorés"
          AddElement(sprcharM())
          sprcharM()\Index=element+1+60
          sprcharM()\posX=positionX
          sprcharM()\posY=(WindowH/2)+70 ; Scrolling en plein milieu de l'écran + 70
          sprcharM()\speedX=3
          sprcharM()\speedY=0
          sprcharM()\dernier=0        
      Next i
      sprchar()\dernier=1
      sprcharM()\dernier=1
  EndProcedure
  
  Procedure ListSmiley(nbsmiley.w)    
    ; Chargement liste chainée Smileys
      where=-1
      For i=1 To nbsmiley
        AddElement(smileys())
        smileys()\index=i
        smileys()\posX=Random(WindowW)
        smileys()\posY=Random(WindowH)
        smileys()\speedX=(Random(3)+1)*where
        smileys()\speedY=(Random(3)+1)*where
        smileys()\dernier=0
        where*-1
      Next i
      smileys()\dernier=1
  EndProcedure
  
  Procedure SpriteMirrorHorizontal(SpriteID)
    ; Mirrors a sprite horizontal by Rings
    ; http://www.purebasic.fr/english/viewtopic.php?t=29680
    StartDrawing(SpriteOutput(SpriteID))
    IW = SpriteWidth(SpriteID)
    IH = SpriteHeight(SpriteID)
    Buffer      = DrawingBuffer()             ; Get the start address of the screen buffer
    Pitch       = DrawingBufferPitch()        ; Get the length (in byte) took by one horizontal line
 
    *pxData1.LONG = Buffer
    *pxData2.LONG = *pxData1 + (IH-1)*Pitch
 
    mem=AllocateMemory(Pitch)
    For lines=0 To IH/2-1
      CopyMemory(*pxData1,mem,pitch)
      CopyMemory(*pxData2,*pxData1,pitch)
      CopyMemory(mem,*pxData2,pitch)
      *pxData1 + pitch
      *pxData2 - pitch
    Next
    StopDrawing()
    If mem: FreeMemory(mem):EndIf 
  EndProcedure 
  
  Procedure DisplayChar()
    ; Affichage fond "Ciel et Mer"
      DisplayTransparentSprite(150,0,0)
  
      
    ; Affichage scrolling
      ResetList(sprchar())      
      While NextElement(sprchar())
        sprchar()\posX - sprchar()\speedX
        ; Sinusoidale ou pas ?
        If sinus=1        
          Posy=(Sin((sprchar()\posX+abscisse)/WindowW* #PI *frequence)*amplitude)+Ordonnee
        Else
          PosY=sprchar()\posY
        EndIf
        DisplayTranslucentSprite(sprchar()\index+60,sprchar()\posX,PosY+50,90) ; Sprite mirroré
        DisplayTransparentSprite(sprchar()\index,sprchar()\posX,PosY)
        
      Wend
      If sprchar()\PosX<-60 And sprchar()\dernier=1
        chargeliste(alphabet,message)
      EndIf
      
    ; "Move your smileys"
      ResetList(smileys())
      While NextElement(smileys())
        smileys()\posX + smileys()\speedX
        smileys()\posY + smileys()\speedY
        ; Test collisions
          ForEach sprchar()
            If SpritePixelCollision(0,smileys()\posX,smileys()\posY,sprchar()\index,sprchar()\posX,sprchar()\posY)>0
              ; Test si collision par position X (tester si X+1/X-1 tjrs en collision)
                If SpritePixelCollision(0,smileys()\posX+1,smileys()\posY,sprchar()\index,sprchar()\posX,sprchar()\posY)>0 Or SpritePixelCollision(0,smileys()\posX-1,smileys()\posY,sprchar()\index,sprchar()\posX,sprchar()\posY)>0
                  smileys()\speedX*-1                
                EndIf
                
              ; Test si collision par position Y (tester si Y+1/Y-1 tjrs en collision)
                If SpritePixelCollision(0,smileys()\posX,smileys()\posY+1,sprchar()\index,sprchar()\posX,sprchar()\posY)>0 Or SpritePixelCollision(0,smileys()\posX,smileys()\posY-1,sprchar()\index,sprchar()\posX,sprchar()\posY)>0
                  smileys()\speedY*-1
                EndIf
            EndIf
          Next
          
        ; Tests bord écrans
          If smileys()\posX<0 Or smileys()\posX>(WindowW-16) ; (WindowW-taille du smiley)
            smileys()\speedX*-1
          EndIf
          If smileys()\posY<0 Or smileys()\posY>(WindowH-16) ; (WindowH- taille du smiley)
            smileys()\speedY*-1
          EndIf          
          
        ; Afficher Smiley
          DisplayTransparentSprite(0,smileys()\posX,smileys()\PosY)        
      Wend 
  EndProcedure
  
  Procedure BMFont(BMfont.s)
    img=LoadImage(0,BMFont)
    sprite=2
    spriteM=62
    p=CreateSprite(1,640,512)
    UseBuffer(1)
    StartDrawing(SpriteOutput(1))     
      DrawImage(img,0,0)
    StopDrawing()
    StartDrawing(ScreenOutput())
      DisplaySprite(1,0,0)
    StopDrawing() 
    malig=1
    For y=0 To 511 Step 64
      macol=1
      For x=0 To 639 Step 64
        GrabSprite(sprite,x,y,64,64,#PB_Sprite_Memory)        
        CopySprite(sprite,spriteM,#PB_Sprite_Memory)
        spritemirrorhorizontal(spriteM)
        sprite+1
        spriteM+1
        macol+1
      Next x
      malig+1
    Next y
    UseBuffer(#PB_Default)
  EndProcedure
  
  Procedure SmileySprite()
    CreateSprite(0,16,16)
    Restore Smiley
    StartDrawing(SpriteOutput(0))
      For i=0 To 15
        For j=0 To 15
          Read pixL
          Plot (j,i,pixL)
        Next j
      Next i
    StopDrawing()
  EndProcedure
  
  Procedure Ciel_et_Mer()
    ; Sprite du "Ciel"
      hauteur=Int(WindowH/3)
      CreateSprite(150,WindowW,WindowH,#PB_Sprite_Memory)
      StartDrawing(SpriteOutput(150))
        For i=0 To WindowW          
          bleu.d=i*(255/WindowW)
          Line(0,i,WindowW,1,RGB(0,0,Int(bleu)))
        Next i
      StopDrawing()
  EndProcedure 
  
  
; Initialisations
   If InitSprite () =0 Or InitKeyboard ()=0 Or InitMouse ()=0 Or InitSprite3D()=0
     MessageRequester ( "Problème" , "Initialisations impossibles"  , 0)
     End
   EndIf
     
;  Ouverture écran
  If OpenWindow (0,0,0,WindowW,WindowH, "Big Scroll" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
    If OpenWindowedScreen ( WindowID (0),0,0,WindowW,WindowH,1,0,0)
      ClearScreen ( RGB (0,0,0))

      ; Boucle principale
        smileysprite()           
        BMFont("BigFont64x64.png")        
        chargeliste(alphabet,message)
        ListSmiley(nbsmileys)
        Ciel_et_Mer()
        ClearScreen(RGB(0,0,0))
        Repeat
          DisplayChar()
          ExamineKeyboard()          
          ExamineMouse()
          If KeyboardPushed(#PB_Key_S)
            sinus!1
            Delay(50)
          EndIf
          Event=WindowEvent()
          FlipBuffers()
          ClearScreen(RGB(0,0,0))
        Until KeyboardPushed ( #PB_Key_Escape ) Or Event= #PB_Event_CloseWindow Or MouseButton ( #PB_MouseButton_Right )      
    EndIf
  EndIf
  
  End
  
  DataSection:
    Smiley:
      Data.l $000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000
      Data.l $000000,$000000,$000000,$000000,$000000,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$000000,$000000,$000000,$000000,$000000
      Data.l $000000,$000000,$000000,$000000,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$000000,$000000,$000000,$000000
      Data.l $000000,$000000,$000000,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$000000,$000000,$000000
      Data.l $000000,$000000,$00FFFF,$00FFFF,$0000FF,$0000FF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$0000FF,$0000FF,$00FFFF,$00FFFF,$000000,$000000
      Data.l $000000,$00FFFF,$00FFFF,$0000FF,$00FFFF,$00FFFF,$0000FF,$00FFFF,$00FFFF,$0000FF,$00FFFF,$00FFFF,$0000FF,$00FFFF,$00FFFF,$000000
      Data.l $00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF
      Data.l $00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF
      Data.l $00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$0000FF,$0000FF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF
      Data.l $00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF
      Data.l $000000,$00FFFF,$00FFFF,$00FFFF,$0000FF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$0000FF,$00FFFF,$00FFFF,$00FFFF,$000000
      Data.l $000000,$000000,$00FFFF,$00FFFF,$00FFFF,$0000FF,$0000FF,$00FFFF,$00FFFF,$0000FF,$0000FF,$00FFFF,$00FFFF,$00FFFF,$000000,$000000
      Data.l $000000,$000000,$000000,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$0000FF,$0000FF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$000000,$000000,$000000
      Data.l $000000,$000000,$000000,$000000,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$000000,$000000,$000000,$000000
      Data.l $000000,$000000,$000000,$000000,$000000,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$000000,$000000,$000000,$000000,$000000
      Data.l $000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000
  EndDataSection
  
  
Image
Image
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Joli :D
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Joli, mais d'une lenteur!

J'ai testé deux trois bricoles pour l'accélérer un peu. Il apparait que c'est le displaysprite du début qui fait tout ramer (au passage, inutile de faire un clearscreen si tu effaces l'écran avec un sprite); si tu peux, il faudrait remplacer tous les effets de sprites "classiques" par du sprite 3d, beaucoup plus rapide. J'ai mis un test pour voir les sprites étaient en dehors de l'écran, pour ne pas les afficher. Regarde ce code (pas optimisé, juste qq pistes):

Code : Tout sélectionner

; Big Scroll
; ©.2009 TazNormand

;EnableExplicit

; Définition de type

; Décodeur PNG
  UsePNGImageDecoder()
 
; Variables / Constantes
  Global alphabet.s=" !"+Chr(34)+"#$%€'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  Global message.s=UCase("Eh oui encore un scrolltext mais que voulez-vous je ne m'en lasse pas !!!   ")

;  Taille écran
  ExamineDesktops()
  Global ScreenW.w=DesktopWidth(0)
  Global ScreenH.w=DesktopHeight(0)
  Global WindowW.w=ScreenW-200
  Global WindowH.w=ScreenH-200
 
; Variable pour le tracé de la sinusoide
  Global frequence.w=3
  Global abscisse.w=120
  Global ordonnee.w=WindowH/2
  Global amplitude.w=64
  Global echantillon.w=WindowW
  Global Sinus.b=1 

; Variables Diverses
  Global nbsmileys.b=15   
 
; Structures
  Structure SpriteChar
    Index.w
    PosX.w
    PosY.w
    SpeedX.w
    SpeedY.w
    Dernier.b   
  EndStructure

; Liste Chainées
  Global NewList SprChar.spritechar()
  Global NewList SprCharM.spritechar()
  Global NewList smileys.spritechar()
 
; Procédures
 
  Procedure ChargeListe(alphab.s,mess.s)   
    ; Charger Liste Chainée
      positionX.w=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,Mid(mess,i,1),1)
        If element=0
          ;stop
          Debug element
          End
        EndIf
        positionX+64+48       
        AddElement(sprchar())
        sprchar()\Index=element+1
        sprchar()\posX=positionX
        sprchar()\posY=WindowH/2 ; Scrolling en plein milieu de l'écran
        sprchar()\speedX=3
        sprchar()\speedY=0
        sprchar()\dernier=0       
     
        ; Idem mais pour les caractères "mirrorés"
          AddElement(sprcharM())
          sprcharM()\Index=element+1+60
          sprcharM()\posX=positionX
          sprcharM()\posY=(WindowH/2)+70 ; Scrolling en plein milieu de l'écran + 70
          sprcharM()\speedX=3
          sprcharM()\speedY=0
          sprcharM()\dernier=0       
      Next i
      sprchar()\dernier=1
      sprcharM()\dernier=1
  EndProcedure
 
  Procedure ListSmiley(nbsmiley.w)   
    ; Chargement liste chainée Smileys
      where=-1
      For i=1 To nbsmiley
        AddElement(smileys())
        smileys()\index=i
        smileys()\posX=Random(WindowW)
        smileys()\posY=Random(WindowH)
        smileys()\speedX=(Random(3)+1)*where
        smileys()\speedY=(Random(3)+1)*where
        smileys()\dernier=0
        where*-1
      Next i
      smileys()\dernier=1
  EndProcedure
 
  Procedure SpriteMirrorHorizontal(SpriteID)
    ; Mirrors a sprite horizontal by Rings
    ; http://www.purebasic.fr/english/viewtopic.php?t=29680
    StartDrawing(SpriteOutput(SpriteID))
    IW = SpriteWidth(SpriteID)
    IH = SpriteHeight(SpriteID)
    Buffer      = DrawingBuffer()             ; Get the start address of the screen buffer
    Pitch       = DrawingBufferPitch()        ; Get the length (in byte) took by one horizontal line
 
    *pxData1.LONG = Buffer
    *pxData2.LONG = *pxData1 + (IH-1)*Pitch
 
    mem=AllocateMemory(Pitch)
    For lines=0 To IH/2-1
      CopyMemory(*pxData1,mem,pitch)
      CopyMemory(*pxData2,*pxData1,pitch)
      CopyMemory(mem,*pxData2,pitch)
      *pxData1 + pitch
      *pxData2 - pitch
    Next
    StopDrawing()
    If mem: FreeMemory(mem):EndIf
  EndProcedure
 
  Procedure DisplayChar()
    ; Affichage fond "Ciel et Mer"
      ;DisplaySprite(150,0,0)
 
    ; Affichage scrolling
      ForEach(sprchar())
        sprchar()\posX - sprchar()\speedX
        ; Sinusoidale ou pas ?
        If sinus=1       
          Posy=(Sin((sprchar()\posX+abscisse)/WindowW* #PI *frequence)*amplitude)+Ordonnee
        Else
          PosY=sprchar()\posY
        EndIf
        If sprchar()\posX<ScreenW And sprchar()\posX>-SpriteWidth(sprchar()\index)
          DisplayTranslucentSprite(sprchar()\index+60,sprchar()\posX,PosY+50,90) ; Sprite mirroré
          DisplayTransparentSprite(sprchar()\index,sprchar()\posX,PosY)
        EndIf
       
      Next
      If sprchar()\PosX<-60 And sprchar()\dernier=1
        chargeliste(alphabet,message)
      EndIf
     
    ; "Move your smileys"
      ResetList(smileys())
      While NextElement(smileys())
        smileys()\posX + smileys()\speedX
        smileys()\posY + smileys()\speedY
        ; Test collisions
          ForEach sprchar()
            If SpritePixelCollision(0,smileys()\posX,smileys()\posY,sprchar()\index,sprchar()\posX,sprchar()\posY)>0
              ; Test si collision par position X (tester si X+1/X-1 tjrs en collision)
                If SpritePixelCollision(0,smileys()\posX+1,smileys()\posY,sprchar()\index,sprchar()\posX,sprchar()\posY)>0 Or SpritePixelCollision(0,smileys()\posX-1,smileys()\posY,sprchar()\index,sprchar()\posX,sprchar()\posY)>0
                  smileys()\speedX*-1               
                EndIf
               
              ; Test si collision par position Y (tester si Y+1/Y-1 tjrs en collision)
                If SpritePixelCollision(0,smileys()\posX,smileys()\posY+1,sprchar()\index,sprchar()\posX,sprchar()\posY)>0 Or SpritePixelCollision(0,smileys()\posX,smileys()\posY-1,sprchar()\index,sprchar()\posX,sprchar()\posY)>0
                  smileys()\speedY*-1
                EndIf
            EndIf
          Next
         
        ; Tests bord écrans
          If smileys()\posX<0 Or smileys()\posX>(WindowW-16) ; (WindowW-taille du smiley)
            smileys()\speedX*-1
          EndIf
          If smileys()\posY<0 Or smileys()\posY>(WindowH-16) ; (WindowH- taille du smiley)
            smileys()\speedY*-1
          EndIf         
         
        ; Afficher Smiley
          DisplayTransparentSprite(0,smileys()\posX,smileys()\PosY)       
      Wend
  EndProcedure
 
  Procedure BMFont(BMfont.s)
    img=LoadImage(0,BMFont)
    sprite=2
    spriteM=62
    p=CreateSprite(1,640,512)
    UseBuffer(1)
    StartDrawing(SpriteOutput(1))     
      DrawImage(img,0,0)
    StopDrawing()
    StartDrawing(ScreenOutput())
      DisplaySprite(1,0,0)
    StopDrawing()
    malig=1
    For y=0 To 511 Step 64
      macol=1
      For x=0 To 639 Step 64
        GrabSprite(sprite,x,y,64,64,#PB_Sprite_Memory)       
        CopySprite(sprite,spriteM,#PB_Sprite_Memory)
        spritemirrorhorizontal(spriteM)
        sprite+1
        spriteM+1
        macol+1
      Next x
      malig+1
    Next y
    UseBuffer(#PB_Default)
  EndProcedure
 
  Procedure SmileySprite()
    CreateSprite(0,16,16)
    Restore Smiley
    StartDrawing(SpriteOutput(0))
      For i=0 To 15
        For j=0 To 15
          Read pixL
          Plot (j,i,pixL)
        Next j
      Next i
    StopDrawing()
  EndProcedure
 
  Procedure Ciel_et_Mer()
    ; Sprite du "Ciel"
      hauteur=Int(WindowH/3)
      CreateSprite(150,WindowW,WindowH,#PB_Sprite_Memory)
      StartDrawing(SpriteOutput(150))
        For i=0 To WindowW         
          bleu.d=i*(255/WindowW)
          Line(0,i,WindowW,1,RGB(0,0,Int(bleu)))
        Next i
      StopDrawing()
  EndProcedure
 
 
; Initialisations
   If InitSprite () =0 Or InitKeyboard ()=0 Or InitMouse ()=0 Or InitSprite3D()=0
     MessageRequester ( "Problème" , "Initialisations impossibles"  , 0)
     End
   EndIf
     
;  Ouverture écran
  If OpenWindow (0,0,0,WindowW,WindowH, "Big Scroll" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
    If OpenWindowedScreen ( WindowID (0),0,0,WindowW,WindowH,1,0,0)
      ClearScreen ( RGB (0,0,0))

      ; Boucle principale
        smileysprite()           
        BMFont("BigFont64x64.png")       
        chargeliste(alphabet,message)
        ListSmiley(nbsmileys)
        Ciel_et_Mer()
        ClearScreen(RGB(0,0,0))
        Repeat
          DisplayChar()
          ExamineKeyboard()         
          ExamineMouse()
          If KeyboardPushed(#PB_Key_S)
            sinus!1
            Delay(50)
          EndIf
          Event=WindowEvent()
          FlipBuffers()
          ClearScreen(RGB(0,0,0))
        Until KeyboardPushed ( #PB_Key_Escape ) Or Event= #PB_Event_CloseWindow Or MouseButton ( #PB_MouseButton_Right )     
    EndIf
  EndIf
 
  End
 
  DataSection:
    Smiley:
      Data.l $000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000
      Data.l $000000,$000000,$000000,$000000,$000000,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$000000,$000000,$000000,$000000,$000000
      Data.l $000000,$000000,$000000,$000000,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$000000,$000000,$000000,$000000
      Data.l $000000,$000000,$000000,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$000000,$000000,$000000
      Data.l $000000,$000000,$00FFFF,$00FFFF,$0000FF,$0000FF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$0000FF,$0000FF,$00FFFF,$00FFFF,$000000,$000000
      Data.l $000000,$00FFFF,$00FFFF,$0000FF,$00FFFF,$00FFFF,$0000FF,$00FFFF,$00FFFF,$0000FF,$00FFFF,$00FFFF,$0000FF,$00FFFF,$00FFFF,$000000
      Data.l $00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF
      Data.l $00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF
      Data.l $00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$0000FF,$0000FF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF
      Data.l $00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF
      Data.l $000000,$00FFFF,$00FFFF,$00FFFF,$0000FF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$0000FF,$00FFFF,$00FFFF,$00FFFF,$000000
      Data.l $000000,$000000,$00FFFF,$00FFFF,$00FFFF,$0000FF,$0000FF,$00FFFF,$00FFFF,$0000FF,$0000FF,$00FFFF,$00FFFF,$00FFFF,$000000,$000000
      Data.l $000000,$000000,$000000,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$0000FF,$0000FF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$000000,$000000,$000000
      Data.l $000000,$000000,$000000,$000000,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$000000,$000000,$000000,$000000
      Data.l $000000,$000000,$000000,$000000,$000000,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$00FFFF,$000000,$000000,$000000,$000000,$000000
      Data.l $000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000,$000000
  EndDataSection
 
 
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Alors moi j'y connais rien en graphisme, mais je peux donner l'impression que ton code m'a faite TAZ ....

Splendide !!!

C'est peut etre un peu faible....faut que je cherche un DICO. :D
Génial l'effet "Solcarlus de johnson" avec le sol brillant.
Merci beaucoup de partager ce code et montrer ce qu'est capable de faire NOTRE language :D

J'adore 8)
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

@Djes : je viens de regarder ta version. Oui le ClearScreen après flipbuffers sert à rien, je l'ai viré, mais j'ai remis le displaysprite du "gros sprite" de fond. Le fait de ne pas afficher les sprites s'il sont hors écran bonen idée aussi, j'aurai du y penser.

C'est vrai que ça rame dur sur le PC du boulot (P4 2ghz mais chip graphique 915 intégré), alors qu'à la maison nickel (C2D 3,16ghz, HD4850 512Mo).

Je pense que ça rame déjà parce que j'utilise une fenêtre, au lieu du plein écran, et en plus à la maison et au bureau je suis en 1280x1024.
Je vais essayer en mode plein écran dans une résolution inférieure mais même pas en 320x240 :D

Faut que je complète, je voudrais bien refaire une mini intro, mais sans pomper le code qui avait été fait pour JBernard13 et agrémenté par tout le monde sur le forum.

A noter que j'ai utilisé une routine du forum Anglais pour l'effet miroir, et que cette routine ne marche pas sur les point d'exclamation ! (je regarde)


@KCC :
Merci pour le compliment, les conseils des membres confirmés du forum m'ont été très utiles.
J'assouvis une grande frustration sur Amiga : je réalise une intro.
Sur Amstrad CPC, grâce aux Logon System, et à Amstrad 100% j'avais bricolé quelques mini intros (difusées auprès de 3/4 copains à l'époque).
Du repompage des logons, mais je me faisais plaisir.

Sur Amiga, j'ai rien foutu, j'ai essayé, mais je jouais pplus qu'autre chose.

C'est pas fini, je vais bricoler encore avec PB, mais faut que j'optimise.
Image
Image
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Message par Cool Dji »

yeah, joli le reflet...

Pour les caractères de tailles différentes, j'ai la solution de la feignasse :

1- je mets tous les caractères dans une même image sur une seule ligne (ça m'évite de gérer les lignes)
2- comme toi, j'ai un string (:lol:) qui décrit le rangement des caractères
3- j'ai un tableau en parallèle ou je mets la position de début dans l'image de chaque caractère
Ainsi, taille du caractère actuel=début du caractère suivant-début du caractère actuel...
Ensuite, je pointe la bonne image avec un clipsprite avec début du caractère et taille du caractère...

Bravo pour l'intro et pour la suite 8)
Only PureBasic makes it possible
Répondre