[TUTO] Remake d'une Cracktro Scoopex sur Amiga

Informations pour bien débuter en PureBasic
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

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 : 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 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
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

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 : 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 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
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

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 : 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 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 : 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 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
Dernière modification par TazNormand le lun. 27/sept./2010 22:04, modifié 1 fois.
Image
Image
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

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 : 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 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
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

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
Dernière modification par TazNormand le lun. 27/sept./2010 21:56, modifié 1 fois.
Image
Image
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

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
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

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 ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
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
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

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
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

C'est bien mieux en effet :]
~~~~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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

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 ?
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

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)
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

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
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

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 ... :)
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

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
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

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 !! :)
Répondre