darksoul551
Messages postés18Date d'inscriptionlundi 7 février 2005StatutMembreDernière intervention20 août 2005
-
10 avril 2005 à 21:28
darksoul551
Messages postés18Date d'inscriptionlundi 7 février 2005StatutMembreDernière intervention20 août 2005
-
11 avril 2005 à 22:21
Salut a tous deja, voila mon probleme :
Je suis en train de creer un jeu (enfin, c'est
surtout pour m'entrainer) basé sur un système de matrice où , quand
j'appuye sur des touches "haut","bas","droite","gauche" la carte se
déplace et mon perso reste fixe.
Le problème c'est que j'arrive a deplacer la carte
quand j'appuye sur "Droite" et "Gauche", mais pas sur "Haut" et "Bas".
en fait j'utilise cette matrice : (carte1.txt)
1111111111111111111111111111111111
1222222222221111111111111111111110
1222222222211111111111111111111110
1322223222231111111111111133333330
1333233322231111111111111121212230
1222233322331111111111111111111110
1222222222321111111111111111111110
1222223322221111111111111111111110
1222222322221111111111111111111110
1222222222221111111111111111111110
1122211111111111111111111111111110
0123211111111111111111111111111110
0122211111111111111111111111111110
0111111111111111111111111111111110
0111111111111111111111111111111110
0112311111111111111111111111111110
0112111111111111111111111111111110
0112311111111111111111111111111110
0112111111111111111111111111111110
0112311111111111111111111111111110
0112311111111111111111111111111110
0112211111111111111111111111111110
0112311111111111111111111111111110
0112311111111111111111111111111110
0000000000000000000000000000000000
Le code c'est ca : si quelqu'un pouvai me donner la
solution, ca serai niquel, ca fait trop longtemps que je me prends la
tête sur ce probleme :'(
Option Explicit
Private Sub Form_Load()
If map_monde = "" Then
fichier = App.Path & "\carte1.txt"
End If
init_carte
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyDown
dpl_ligne = dpl_ligne + 1
dpl_bas
Case vbKeyUp
dpl_ligne = dpl_ligne - 1
dpl_haut
Case vbKeyLeft
dpl_colonne = dpl_colonne - 1
dpl_gauche
Case vbKeyRight
dpl_colonne = dpl_colonne + 1
dpl_droite
End Select
End Sub
'module : initialisation
Option Explicit
Dim colonne As Integer, ligne As Integer
Dim posx As Integer
Dim val As Variant
Public fichier As String
Const nbcolonnes = 11
Const nblignes = 11
Global gbytLevel(0 To nbcolonnes * nblignes) As Byte
Dim L As Integer
Public dpl_colonne As Integer, dpl_ligne As Integer
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 11 avril 2005 à 11:50
j'essayerais ta méthode mais ça doit ramer sérieusement.
j'ai encore optimisé, les images sont chargées dès le départ, ça améliore très nettement la vitesse, à part quelques petites fluctuations, c'est déjà pas mal.
mais on peut encore faire mieux.
initialisation
' à ajouter dans les déclarations
Public pic(3) As StdPicture
frm_carte
' à ajouter dans Form_Load
Set pic(1) = LoadPicture(App.Path & "\images" & "mer.gif")
Set pic(2) = LoadPicture(App.Path & "\images" & "herbe.gif")
Set pic(3) = LoadPicture(App.Path & "\images" & "arbre.gif")
init_carte
Sub init_carte() frm_carte.Label1.Caption "dpl_colonne " & dpl_colonne frm_carte.Label2.Caption "dpl_ligne " & dpl_ligne
frm_carte.ecran1.Enabled = False
For posx = 0 To 120
ligne = (posx \ 11) - dpl_ligne
colonne = (posx Mod 11) - dpl_colonne
If ligne > -1 And ligne < 25 And colonne > -1 And colonne < 34 Then
valeur = Table(ligne, colonne)
frm_carte.imgcase(posx).Picture = pic(valeur)
Else
frm_carte.imgcase(posx).Picture = Nothing
End If
Next
frm_carte.ecran1.Enabled = True
End Sub
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 10 avril 2005 à 22:18
le lien ne marche pas.
combien de PictureBox en tout ? et combien de Lignes et combien de colonnes ?
relire le fichier à chaque mouvement, et vu le nombre de PictureBox bonjour la vitesse !
c'est ton calcul de Posx qui doit pas être bon et être mis au tout début.
Posx = (dpl_ligne-1) * nbcolonnes
en fin de colonne Posx va être incrémenté du nombre de colonnes, donc passera à ligne suivante.
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 10 avril 2005 à 23:18
j'avais compris.
il va y avoir un problème d'effacement aussi bien pour les lignes que pour les colonnes.
je me demande s'il faut pas faire la boucle à l'envers.
for p = 0 to 120 'pour balayer toutes les PictureBox
est-ce que p correspond à une image ou un effacement ?
posx = (dpl_ligne) * nbcolonnes
Open fichier For Input As #1
For ligne = 1 To nblignes
Line Input #1, fichier
For colonne = 1 + dpl_colonne To nbcolonnes + dpl_colonne
val = Mid$(fichier, colonne, 1)
If posx > -1 And posx < 121 Then
If val = 1 Then
frm_carte.imgcase(posx).Picture = LoadPicture(App.Path & "\images" & "mer.gif")
ElseIf val = 2 Then
frm_carte.imgcase(posx).Picture = LoadPicture(App.Path & "\images" & "herbe.gif")
ElseIf val = 3 Then
frm_carte.imgcase(posx).Picture = LoadPicture(App.Path & "\images" & "arbre.gif")
ElseIf val = 0 Then
frm_carte.imgcase(posx).Picture = LoadPicture()
End If
End If
posx = posx + 1 'ici on incremente la position de 1
Next
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 10 avril 2005 à 23:46
c'est quoi le blème ?
forcément l'effacement. quand tu descend à la ligne 1, la ligne 0 n'est pas effacé et le même problème va se présenter quand tu commences à la colonne zéro il faudra effacer toute la colonne 1.
en prenant le problème en l'envers, il y a d'autres problèmes, comment lire le fichier et retrouver la Ligne, colonne correspondante ?
si le fichier était lu en table, ce serait déjà plus facile et plus rapide.
bon je reviens à la méthode précédente !
on crée une table de 0 à 120, remise à zéro au départ.
on met Table(posx)=1 quand elle est utilisée.
ensuite on balaye la Table pour effacer les PictureBox non utilisées.
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 11 avril 2005 à 10:53
La première méthode est bien la bonne, boucle de 0 à 120, calcul Ligne et colonne correspondant, et si c'est dans la matrice on édite l'image sinon on efface.
j'ai optimisé le code, le fichier est lu dès le départ et mis dans une table, c'est déjà nettement plus rapide mais il y a encore beaucoup à faire à ce niveau.
frm_carte
Private Sub Form_Load()
Dim i As Integer
Dim j As Integer
Dim s As String * 34
If map_monde = "" Then
fichier = App.Path & "\carte1.txt"
End If
ReDim Table(25, 34)
Open fichier For Random As #1 Len = 36
For i = 0 To 25
Get #1, , s For j 0 To 33: Table(i, j) Val(Mid$(s, j + 1, 1)): Next
Next
Close #1
init_carte
End Sub
initialisation
Const nbcolonnes = 11
Const nblignes = 11
Dim colonne As Integer
Dim ligne As Integer
Dim posx As Integer
Dim valeur As Integer
Public fichier As String
Public dpl_colonne As Integer
Public dpl_ligne As Integer
Public Table() As Integer
Sub init_carte()
frm_carte.Label1.Caption "dpl_colonne " & dpl_colonne frm_carte.Label2.Caption "dpl_ligne " & dpl_ligne
frm_carte.ecran1.Enabled = False
For posx = 0 To 120 'nblignes * nbcolonnes -1
ligne = (posx \ 11) - dpl_ligne
colonne = (posx Mod 11) - dpl_colonne
' la matrice: X de (0 à 24) et Y (de 0 à 33) correspond au fichier
If ligne > -1 And ligne < 25 And colonne > -1 And colonne < 34 Then
valeur = Table(ligne, colonne)
Select Case valeur
Case 0: frm_carte.imgcase(posx).Picture = Nothing
Case 1: frm_carte.imgcase(posx).Picture = LoadPicture(App.Path & "\images" & "mer.gif")
Case 2: frm_carte.imgcase(posx).Picture = LoadPicture(App.Path & "\images" & "herbe.gif")
Case 3: frm_carte.imgcase(posx).Picture = LoadPicture(App.Path & "\images" & "arbre.gif")
End Select
Else
frm_carte.imgcase(posx).Picture = Nothing
End If
darksoul551
Messages postés18Date d'inscriptionlundi 7 février 2005StatutMembreDernière intervention20 août 2005 11 avril 2005 à 14:16
mmmh ok, tu pourrai pas m'envoyer le projet zippé sur ftp ou a mon
adresse mail stp ? (Darksoul551@hotmail.com) vu que quand j'essayer
d'executer avec ta derniere modif ca marche pas :'(
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 11 avril 2005 à 14:55
mettre une pictureBox dans ecran1.
les propriétés à mettre sont dans Form_Load.
cette PictureBox remplace toutes les images qui ne servent plus.
toute l'image est dessinée dans PictureBox une seule fois.
le traitement se borne à déplacer Picture1 dans ecran1.
init_carte ne sert plus à rien.
frm_carte
Private Sub Form_Load()
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim s As String * 34
If map_monde = "" Then
fichier = App.Path & "\carte1.txt"
End If
ReDim Table(25, 34)
Open fichier For Random As #1 Len = 36
For i = 0 To 25
Get #1, , s For j 0 To 33: Table(i, j) Val(Mid$(s, j + 1, 1)): Next
Next
Close #1
Set pic(1) = LoadPicture(App.Path & "\images" & "mer.gif")
Set pic(2) = LoadPicture(App.Path & "\images" & "herbe.gif")
Set pic(3) = LoadPicture(App.Path & "\images" & "arbre.gif")
' init_carte
Picture1.Appearance = 0
Picture1.BorderStyle = 0
Picture1.Move 0, 0, 1088, 832
Picture1.AutoRedraw = True
Picture1.Visible = True
For i = 0 To 25
For j = 0 To 33:
k = Table(i, j)
If k > 0 Then Picture1.PaintPicture pic(k), j * 32, i * 32, 32, 32, 0, 0, 32, 32
Next
Next
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyDown
dpl_ligne = dpl_ligne + 1
Picture1.Top = dpl_ligne * 32
Case vbKeyUp
dpl_ligne = dpl_ligne - 1
Picture1.Top = dpl_ligne * 32
Case vbKeyLeft
dpl_colonne = dpl_colonne - 1
Picture1.Left = dpl_colonne * 32
Case vbKeyRight
dpl_colonne = dpl_colonne + 1
Picture1.Left = dpl_colonne * 32
End Select
End Sub
darksoul551
Messages postés18Date d'inscriptionlundi 7 février 2005StatutMembreDernière intervention20 août 2005 11 avril 2005 à 22:21
Ouch alors la, ca me fait un truc bizzare, envoie le moi par mail a
darksoul551@hotmail.com stp, ca fait un carré qui se déplace sur la
picturebox "ecran1" .