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