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 : Tout sélectionner
; 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 : Tout sélectionner
; 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