Systeme de deplacement

Résolu
darksoul551 Messages postés 18 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 20 août 2005 - 10 avril 2005 à 21:28
darksoul551 Messages postés 18 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 20 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

Dim txt2 As String 'suppr





Sub init_carte()



frm_carte.Label1.Caption "dpl_colonne " & dpl_colonne 'marquage ds label1

frm_carte.Label2.Caption "dpl_ligne " & dpl_ligne 'marquage ds label2

posx = -1

Open fichier For Input As #1



For ligne = 1 To nblignes



Line Input #1, fichier



'début pour une ligne

For colonne = 1 +
dpl_colonne To nbcolonnes + dpl_colonne '+1 et +1 pr incrementer de 1
vers la droite

posx = posx + 1 'ici on incremente la position de 1

val = Mid(fichier, colonne, 1)

'gbytLevel(posx) = val



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

Next

'fin pour une ligne



posx = ligne * (nbcolonnes - 1) + (ligne - 1) + (ligne * 0) 'position case

Next



Close #1



End Sub





'module : mod_jeu



Option Explicit

Public map_monde As String



Sub dpl_bas()

fichier = App.Path & "\carte1.txt"

init_carte

End Sub



Sub dpl_haut()

fichier = App.Path & "\carte1.txt"

init_carte

End Sub



Sub dpl_gauche()

fichier = App.Path & "\carte1.txt"

init_carte

End Sub



Sub dpl_droite()

fichier = App.Path & "\carte1.txt"

init_carte

End Sub





sinon, on peux retrouverle zip sur :

http://www.membres.lycos.fr/darksoul551/poubelle/jeu2.zip



Voila merci pour tout, j'espere avoir une réponse ca m'aiderai beaucoup

17 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
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

Daniel
3
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
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.

Daniel
0
darksoul551 Messages postés 18 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 20 août 2005
10 avril 2005 à 22:37
Je te balance une adresse URL qui marche, désolé ^^ ca sera plus compréhensible pour toi deja ^^

j'affiche 11*11 cases en meme tps



http://membres.lycos.fr/downighteam/Jeu2.zip



la ca marche, j'ai testé
0
darksoul551 Messages postés 18 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 20 août 2005
10 avril 2005 à 22:46
enfin, quand je dit que ca marche, c'est l'url qui marche, pas le prog ^^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
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

Daniel
0
darksoul551 Messages postés 18 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 20 août 2005
10 avril 2005 à 23:35
p est une image :

frm_carte.imgcase(posx).Picture



c'est elle qui deviens apres, selon les valeurs de la matrice l'image ou mur, ou herbe, ou mer, etc...

(Je c pas si g bien repondu a ta question)

En tout cas la, ca marche sauf qu 'il y a un bleme qd je descends.

*replonge dans son code*



merci pour ton aide en tout cas ! J'espere qu on va resoudre ce pb ^^
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
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.

Daniel
0
darksoul551 Messages postés 18 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 20 août 2005
10 avril 2005 à 23:50
mmmh pas bête, voir ca

mais demain, je v aller pioncer la, chuis mort



Merci pour tout en tt cas !
0
darksoul551 Messages postés 18 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 20 août 2005
10 avril 2005 à 23:57
Mais en fait nan, les colonnes ca marche niquel, y'a juste qd on descends que ca foire :

plus on descends plus la ligne n°11 (apres 10, apres 9, etc ) se duplique.

Y'a juste ce pb a regler.
0
darksoul551 Messages postés 18 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 20 août 2005
10 avril 2005 à 23:59
heu nan, je retire ce que g dit,ca foire qussi qd on monte, chuis
vraiment crever la, j'arriverai plusa rien ce soir lol, v dormir.

Merci pour tout !
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
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

Next
frm_carte.ecran1.Enabled = True


End Sub

Daniel
0
darksoul551 Messages postés 18 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 20 août 2005
11 avril 2005 à 11:37
Ok, c cool, ca marche j'avais trouvé une autre solution mais dix fois plus compliquée :




'frm_carte

Option Explicit





Private Sub Form_Load()

If map_monde = "" Then

nblignesmax = 25

nbcolonnesmax = 34

Set perso_g = LoadPicture(App.Path & "\images\perso_g.gif")

DsnPerso.Picture = perso_g

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

If dpl_ligne < nblignesmax - 11 Then

dpl_ligne = dpl_ligne + 1

dpl_bas

End If

Case vbKeyUp

If dpl_ligne > 0 Then

dpl_ligne = dpl_ligne - 1

dpl_haut

End If

Case vbKeyLeft

If dpl_colonne > 0 Then

dpl_colonne = dpl_colonne - 1

dpl_gauche

End If

Case vbKeyRight

If dpl_colonne <= nbcolonnesmax - 12 Then

dpl_colonne = dpl_colonne + 1

dpl_droite

End If

End Select



End Sub



'mod 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

Public perso_g As Picture, perso_d As Picture

Public perso_h As Picture, perso_b As Picture





Sub init_carte()



frm_carte.Label1.Caption "dpl_colonne " & dpl_colonne 'marquage ds label1

frm_carte.Label2.Caption "dpl_ligne " & dpl_ligne 'marquage ds label2







posx = -1

Open fichier For Input As #1

posx = (-dpl_ligne) * nbcolonnes



For ligne = -dpl_ligne 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

Next

Close #1



End Sub



'mod : mod_jeu



Option Explicit

Public map_monde As String

Public nblignesmax

Public nbcolonnesmax





Sub dpl_bas()

fichier = App.Path & "\carte1.txt"

init_carte

End Sub



Sub dpl_haut()

fichier = App.Path & "\carte1.txt"

init_carte

End Sub



Sub dpl_gauche()

fichier = App.Path & "\carte1.txt"

init_carte

End Sub



Sub dpl_droite()

fichier = App.Path & "\carte1.txt"

init_carte

End Sub



Merci pour tout !!!!!
0
darksoul551 Messages postés 18 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 20 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 :'(
0
darksoul551 Messages postés 18 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 20 août 2005
11 avril 2005 à 14:24
t bon, j'ai réussi a faire marcher !

T'avais raison, c'est beaucoup plus rapide !



Merci pour tout en tout cas !
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
11 avril 2005 à 14:26
ha bon t'as réussi !
attends encore un peu, j'aurais encore mieux.

Daniel
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
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

Daniel
0
darksoul551 Messages postés 18 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 20 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" .
0
Rejoignez-nous