Article     Discussion     Modifier     Historique     Forums     Salon IRC

Gestion des Images avec BlitzMax/Image et Mouvement

Un article de Games Creators Network.



Gestion des Images avec BlitzMax

<< Précédent | Sommaire | Suivant >>


[modifier] Deplacement

     Le code source suivant permet ainsi de comprendre comment déplacer une image sur un décor.

     Pour le missile, au lieu d'afficher une image, nous avons décidé d'utiliser une des fonctions natives de BlitzMax qui est DrawRect, qui permet d'afficher un rectangle.

     Le mouvement d'une image, sous BlitzMax et dans la plupart des codes, se fait via l'utilisation de variables que l'on incrèmente est qui indique la position de l'image dans la fenetre.

Pour expliquer, à chaque tour de la boucle principale, on affiche l'image de l'avion d'aprés ces coordonnées donc il suffit de changer ces coordonnées pour le faire avancer.

Code Source commenté :

Strict 
Graphics 800, 600, 0


'Déclarations des variables
Local fond:TImage                          'Pointeur d'image du fond d'écran
Local image:TImage                         'Pointeur d'image du charset
Local avion:TImage                         'Pointeur d'image de l'avion
Local bombe:TImage                         'Pointeur d'image de la bombe
Local xx,yy,Map_Y,Map_X:Int                'Variables utilisés lors de l'affichage des tuiles à l'écran
Global Map_Level,Map_Height, Map_Width:Int 
'Variables permettant d'avoir des informations sur le niveau
Global PosX_Avion,PosY_Avion:Int           'Position de l'avion 
Global PosX_Bombe,PosY_Bombe:Int           'Position de la Bombe
Global PosX_Tir,PosY_Tir:Int               'Position du Tir
Global Bombe_launch:Byte                   'Permet de savoir si une bombe a été largué
Global Tir_Launch:Byte                     'Permet de savoir si un missile a été lancé
Global Mode_deplacement:Byte               'Variable contenant le mode de déplacement (cf mi-code)
Global Bombe_rotation:Int			  'Variable contenant l'angle de rotation de la bombe

'Initialisation des variables
PosX_Avion=0
PosY_avion=12
Mode_deplacement=0
Bombe_launch=0
Tir_launch=0
Bombe_rotation=0

'Chargement des images
SetMaskColor 255,0,0
fond=LoadImage("gfx/fond.png")
avion=LoadImage("gfx/avion.png")
bombe=LoadImage("gfx/bomb.png")

SetMaskColor 255,255,255
image=LoadAnimImage("gfx/tiles.png",48,48,0,8)

'Chargement du 1er niveau
RestoreData Level1 		'Lecture des données dans le Label
ReadData Map_Height
ReadData Map_Width
Global Map[Map_Width,Map_Height]'Création du tableau contenant les tuiles de la map

Local TileX,TileY:Int		'Remplissage du tableau grace aux data du Label
For  TileY = 0 To Map_Height-1
    For  TileX = 0 To Map_Width-1
        ReadData Map[TileX,TileY]
    Next
Next

'Boucle principale
While Not KeyHit(KEY_ESCAPE)
        ' On efface l'écran
	Cls

	' Vérification des touches appuyées
        ' Si la barre espace est appuyé et qu'aucune bombe n'est déjà larguée
	If KeyDown(KEY_SPACE) And bombe_launch=0
		bombe_launch=1
		PosY_Bombe=PosY_Avion+35
		If mode_deplacement=0
			PosX_Bombe=PosX_Avion+45
		Else
			PosX_Bombe=PosX_Avion-45
		EndIf
	EndIf
	
        ' Si le bouton gauche de la souris est appuyé et qu'aucun missile n'est lancé
	If KeyDown(KEY_MOUSELEFT) And tir_launch=0
	      Tir_Launch=1
	      PosY_Tir=PosY_Avion+25
	      If mode_deplacement=0
	            PosX_Tir=PosX_Avion+107
	      Else
	            PosX_Tir=PosX_Avion-107
	      EndIf		
	End If
		
	' Affichage du premier layer : tuiles du paysage
	xx=0
	yy=0
	For Map_Y=  12 To 540 Step 48					' Step 48 car la tuile est haute de 48u
		For Map_X=13 To 541 Step 48				' Step 48 car la tuile est large de 48u
			DrawImage image, Map_X, Map_Y, Map[xx,yy]	' Affichage de la tuile correspondante
			xx:+1
		Next
		xx=0
		yy:+1
	Next

	' Le mode de déplacement correspond à la direction qu'il prend
	' 0 : de gauche à droite
	' 1 : de droite à gauche
	If mode_deplacement= 0 Then
		'Affichage du second layer : l'avion	
		SetScale .5,.5	'On divise la taille de l'image par 2 		
		DrawImage avion, PosX_Avion,PosY_Avion
		' si une bombe est larguée, on l'affiche
		If bombe_launch=1
			If bombe_rotation < 90 Then
				bombe_rotation:+1
			EndIf
			' On définit l'angle de rotation courant
			SetRotation bombe_rotation
			SetScale .3,.3
			DrawImage bombe, PosX_Bombe,PosY_Bombe
			PosY_Bombe:+1
			SetRotation 0
		EndIf
		' si un missile est lancé, on l'affiche
		If tir_launch=1
			SetColor 50,50,50
			DrawRect PosX_Tir,PosY_Tir,10,5
			PosX_Tir:+3
		EndIf
		PosX_Avion:+1
		' Si l'avion se trouve hors de l'écran, il est repositionné un rang en dessous.
		' Puis on change le mode de déplacement de facon que si il se déplacait de droite
		' à gauche, il se déplace de gauche à droite
		If PosX_Avion >610 Then
			PosY_Avion:+48
			PosX_Avion=680
			Mode_deplacement=1
		End If
	ElseIf mode_deplacement=1 Then
		' Affichage du second layer : l'avion
		' On divise la taille de l'image par 2 mais en mettant une valeur négative pour l'échelle des 
                '       abscisses, cela inverse horizontalement l'image.
		SetScale -.5,.5	
		DrawImage avion, PosX_Avion,PosY_Avion	
		' Si une bombe est larguée, on l'affiche
		If bombe_launch=1
			If bombe_rotation > -90 Then
				bombe_rotation:-1
			EndIf
			' On définit l'angle de rotation courant
			SetRotation bombe_rotation
			SetScale -.3,.3
			DrawImage bombe, PosX_Bombe,PosY_Bombe
			PosY_Bombe:+1
			SetRotation 0
		EndIf
		' Si un missile est lancé, on l'affiche
		If tir_launch=1
			SetColor 50,50,50
			DrawRect PosX_Tir,PosY_Tir,10,5
			PosX_Tir:-3
		End If
		PosX_Avion:-1
		' Si l'avion se trouve hors de l'écran, il est repositionné un rang en dessous.
		' Puis on change le mode de déplacement de facon que si il se déplacait de droite
		' à gauche, il se déplace de gauche à droite
		If PosX_Avion < -100 And Mode_deplacement=1 Then
			PosY_Avion:+48
			PosX_Avion=-100
			Mode_deplacement=0
		End If
	End If

	'Affichage du troisième layer : fond
	SetColor 255,255,255        'On définit la couleur courante
	SetScale 1,1	            'On définit l'échelle en 1:1
	DrawImage fond, 0,0
	Flip
	FlushMem
Wend
End

'Map Niveau 1
#Level1
DefData 12
DefData 12
DefData 7,7,7,7,7,7,7,7,7,7,7,7
DefData 7,7,7,7,7,7,7,7,7,7,7,7
DefData 7,7,7,7,7,7,7,7,7,7,7,7
DefData 7,7,7,7,7,7,7,7,7,7,7,7
DefData 7,7,7,7,7,7,7,7,7,7,7,7
DefData 7,7,7,7,7,7,7,7,7,7,7,7
DefData 7,7,7,7,7,7,7,7,7,7,7,7
DefData 7,7,7,7,7,7,7,7,7,7,7,7
DefData 7,7,7,7,7,7,7,7,7,7,2,7
DefData 7,2,3,5,6,7,7,7,7,2,1,7
DefData 7,1,1,1,1,7,1,7,2,1,1,7
DefData 7,0,1,0,1,0,1,1,1,0,0,7

[modifier] Rotation

     Afin d'apprendre à gérer la rotation d'une image, nous allons mettre en place un effet lors du largage de la bombe. En fait, la bombe fera une rotation de 90° sur elle même afin de se retrouver perpendiculaire au sol.

     Ce code change du précédent par l'ajout de quelques lignes. Celles-ci permettent de faire tourner la bombe. La commande utilisée est SetRotation. Elle permet de définir l'angle de rotation courant. Ainsi, cet angle est appliqué à tous les affichages suivants. Donc si vous voulez faire tourner une image mais pas les suivantes, pensez à rétablir l'angle de rotation à 0 aussitôt après l'affichage de l'image.

     Pour faire tourner quelque chose sur lui même, il suffirait d'utiliser une variable commencant à 0 et se finissant à 359, et à chaque tour de boucle de l'incrémenter de 1 ou plus (pour aller plus vite), puis avant d'afficher l'image, de définir l'angle de rotation courant via SetRotation notre_variable_incrementé.

Code Source commenté :

Strict 
Graphics 800, 600, 0

'Déclarations des variables
Local fond:TImage                          'Pointeur d'image du fond d'écran
Local image:TImage                         'Pointeur d'image du charset
Local avion:TImage                         'Pointeur d'image de l'avion
Local bombe:TImage                         'Pointeur d'image de la bombe
Local xx,yy,zz:Int				 'Variables temporaires
Local Map_Y,Map_X:Int         	       'Variables utilisés lors de l'affichage des tuiles à l'écran
Global Map_Level,Map_Height, Map_Width:Int 'Variables permettant d'avoir des informations sur le niveau
Global PosX_Avion,PosY_Avion:Int           'Position de l'avion 
Global PosX_Bombe,PosY_Bombe:Int           'Position de la Bombe
Global PosX_Tir,PosY_Tir:Int               'Position du Tir
Global Bombe_launch:Byte                   'Permet de savoir si une bombe a été largué
Global Tir_Launch:Byte                     'Permet de savoir si un missile a été lancé
Global Mode_deplacement:Byte               'Variable contenant le mode de déplacement (cf mi-code)
Global Bombe_rotation:Int				   'Variable contenant l'angle de rotation de la bombe

'Initialisation des variables
PosX_Avion=0
PosY_avion=12
Mode_deplacement=0
Bombe_launch=0
Tir_launch=0
Bombe_rotation=0
'Chargement des images
SetMaskColor 255,0,0
fond=LoadImage("gfx/fond.png")
avion=LoadImage("gfx/avion.png")
bombe=LoadImage("gfx/bomb.png")

SetMaskColor 255,255,255
image=LoadAnimImage("tiles/tiles.png",48,48,0,8)


'Chargement du 1er niveau
RestoreData Level1 				'Lecture des données dans le Label
ReadData Map_Height
ReadData Map_Width
Global Map[Map_Width,Map_Height]                'Création du tableau contenant les tuiles de la map

Local TileX,TileY:Int			        'Remplissage du tableau grace aux data du Label
For  TileY = 0 To Map_Height-1
    For  TileX = 0 To Map_Width-1
        ReadData Map[TileX,TileY]
    Next
Next

'Boucle principale
While Not KeyHit(KEY_ESCAPE) And PosY_Avion<550
      ' On efface l'écran
	Cls

	' Vérification des touches appuyées
        ' Si la barre espace est appuyé et qu'aucune bombe n'est déjà larguée
	If KeyDown(KEY_SPACE) And bombe_launch=0
		PosY_Bombe=PosY_Avion+35
		If mode_deplacement=0
			PosX_Bombe=PosX_Avion+45
			bombe_launch=1
			bombe_rotation=0
		Else
			PosX_Bombe=PosX_Avion-45
			bombe_launch=2
			bombe_rotation=0
		EndIf
	EndIf
	
     ' Si le bouton gauche de la souris est appuyé et qu'aucun missile n'est lancé
	If KeyDown(KEY_MOUSELEFT) And tir_launch=0     
	      PosY_Tir=PosY_Avion+25
	      If mode_deplacement=0
	            PosX_Tir=PosX_Avion+107
			Tir_Launch=1
	      Else
	            PosX_Tir=PosX_Avion-107
			Tir_Launch=2
	      EndIf		
	End If
	
	'Affichage du premier layer : le ciel
	For Map_Y=  12 To 540 Step 48					' Step 48 car la tuile est haute de 48u
		For Map_X=13 To 541 Step 48				' Step 48 car la tuile est large de 48u
			DrawImage image, Map_X, Map_Y, 7	' Affichage de la tuile correspondante
		Next
	Next

	
	'Initialisation des collisions du layer 1
	ResetCollisions 1	
	
	' Affichage du second layer : tuiles du paysage
	xx=0
	yy=0
	For Map_Y=  12 To 540 Step 48					' Step 48 car la tuile est haute de 48u
		For Map_X=13 To 541 Step 48				' Step 48 car la tuile est large de 48u
			If Map[xx,yy]<> 7 Then
				' Affichage de la tuile correspondante
				DrawImage image, Map_X, Map_Y, Map[xx,yy]
				' On écrit dans le layer 1 de collisions l'image 
				' de la frame Map[xx,yy]
				' au point Map_X, Map_Y
				CollideImage image, Map_X, Map_Y,Map[xx,yy],0,1
			EndIf
			xx:+1
		Next
		xx=0
		yy:+1
	Next
	' Le mode de déplacement correspond à la direction qu'il prend
	' 0 : de gauche à droite
	' 1 : de droite à gauche
	If mode_deplacement= 0 Then
		'Affichage du troisième layer : l'avion	
		SetScale .5,.5	'On divise la taille de l'image par 2 		
		DrawImage avion, PosX_Avion,PosY_Avion
		' Si une bombe est larguée, on continue à la faire tourner jusqu'a ce qu'elle soit 
		'	perpendiculaire au sol
		If bombe_launch=1
			If bombe_rotation < 90 Then
				bombe_rotation:+1
			EndIf
		EndIf		
		' si un missile est lancé, on l'affiche
		If tir_launch=1
			SetColor 50,50,50
			DrawRect PosX_Tir,PosY_Tir,10,5
			PosX_Tir:+3
		EndIf
		PosX_Avion:+1
		' Si l'avion se trouve hors de l'écran, il est repositionné un rang en dessous.
		' Puis on change le mode de déplacement de facon que si il se déplacait de droite
		' à gauche, il se déplace de gauche à droite
		If PosX_Avion >610 Then
			PosY_Avion:+48
			PosX_Avion=680
			Mode_deplacement=1
		End If
	ElseIf mode_deplacement=1 Then
		' Affichage du troisième layer : l'avion
		' On divise la taille de l'image par 2 mais en mettant une valeur négative pour l'échelle des 
                '       abscisses, cela inverse horizontalement l'image.
		SetScale -.5,.5	
		DrawImage avion, PosX_Avion,PosY_Avion	
		' Si une bombe est larguée, on continue à la faire tourner jusqu'a ce qu'elle soit 
		'	perpendiculaire au sol
		If bombe_launch=2
			If bombe_rotation > -90 Then
				bombe_rotation:-1
			EndIf
		EndIf
		' Si un missile est lancé, on l'affiche
		If tir_launch=2
			SetColor 50,50,50
			DrawRect PosX_Tir,PosY_Tir,10,5
			PosX_Tir:-3
		End If
		PosX_Avion:-1
		' Si l'avion se trouve hors de l'écran, il est repositionné un rang en dessous.
		' Puis on change le mode de déplacement de facon que si il se déplacait de droite
		' à gauche, il se déplace de gauche à droite
		If PosX_Avion < -100 Then
			PosY_Avion:+48
			PosX_Avion=-100
			Mode_deplacement=0
		End If
	End If
	'On teste si il n'y a aucune collision dans le layer 1 avec l'image de la bombe
	' ou si la bombe n'est plus dans l'écran
	If CollideImage(bombe,PosX_Bombe,PosY_Bombe,0,1,0) Or PosY_Bombe>589 Then
		SetScale 2,2
		SetRotation 0
		'DrawText "READY",20,20

		'Disparition de la bombe
		bombe_launch=0
		'Calcul de la case du tableau correspondante au tile en dessous de la bombe
		xx=(PosX_Bombe-13)/48
		If xx>=11 Then xx=11
		If xx<=0 Then xx=0
		yy=(PosY_Bombe-12)/48
		If yy>=11 Then yy=10
		
		'Le tile est explosé vis à vis de la bombe, il disparait et devient du ciel
		Map[xx,yy+1]=7
	Else
		' Si une bombe est larguée, on l'affiche
		If bombe_launch>=1
			' On définit l'angle de rotation courant
			SetRotation bombe_rotation
			' Définition de l'orientation de la bombe en fonction de l'orientation de l'avion
			' au moment du largage
			If bombe_launch=1 Then
				SetScale .3,.3
			ElseIf bombe_launch=2 Then
				SetScale -.3,.3
			EndIf
			DrawImage bombe, PosX_Bombe,PosY_Bombe
			PosY_Bombe:+1
			SetRotation 0	
		EndIf
	EndIf
      ' Est ce qu'un tir a été lancé ?
	If tir_launch>=1 Then
		yy=(PosY_Tir-12)/48
		For xx=0 To 11
			zz=xx*48+12

			If Map[xx,yy]<>7 Then
				If tir_launch=1 Then
					If PosX_Tir>zz+2 Then
						tir_launch=0
						Map[xx,yy]=7
					EndIf
				ElseIf tir_launch=2 Then
					If PosX_Tir<zz-2 Then
						tir_launch=0
						Map[xx,yy]=7
					EndIf
				EndIf
			EndIf
		Next
	EndIf
	
	If PosX_Tir<10 Or PosX_Tir>590 Then
		tir_launch=0
	EndIf
	'Affichage du quatrième layer : fond
	SetColor 255,255,255        'On définit la couleur courante
	SetScale 1,1	          'On définit l'échelle en 1:1
	DrawImage fond, 0,0
	Flip
	FlushMem
	
	Wend
End

'Map Niveau 1
#Level1
DefData 12
DefData 12
DefData 7,7,7,7,7,7,7,7,7,7,7,7
DefData 7,7,7,7,7,7,7,7,7,7,7,7
DefData 7,7,7,7,7,7,7,7,7,7,7,7
DefData 7,7,7,7,7,7,7,7,7,7,7,7
DefData 7,7,7,7,7,7,7,7,7,7,7,7
DefData 7,7,7,7,7,7,7,7,7,7,7,7
DefData 7,7,7,7,7,7,7,7,7,7,7,7
DefData 7,7,7,7,7,7,7,7,7,7,7,7
DefData 7,7,7,7,7,7,7,7,7,7,2,7
DefData 7,2,3,5,6,7,7,7,7,2,1,7
DefData 7,1,1,1,1,7,1,7,2,1,1,7
DefData 7,0,1,0,1,0,1,1,1,0,0,7

 

Rechercher
Installer l'extension de recherche Plus d'informations

 

Comprendre
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin

 

Partager
La connaissance est la seule chose qui s'accroit lorsqu'on la partage. - Sacha Boudjema

 

Créer
L'imagination est plus importante que la connaissance. - Albert Einstein

 

 

Le wiki en images Le wiki en images Image du mois: «Snowball: un prototype de jeu développé avec NeL.