VB/VB.Net Système de trajet

  • Auteur de la discussion Anonymous
  • Date de début
A

Anonymous

Invité
#1
Bonsoir,

j'ai tenté de créer un système de trajet et voici ma class:
Public Class TrajetManager
'Trajet simple : "[X;Y] gauche"
'Trajet passe : "[X;Y] gauche passe"
'Trajet sans action sur la map "[X;Y] gauche passe"
'# c'est pour les commantaire, la ligne sera ignoré
'les coordonnées doivent être composés comme ceci : "[X;Y]" si il y a un espace ou autre la ligne est ignoré
'pas de majuscule

Sub trajetstart(ByVal trajetlist As List(Of String), ByVal map As String, ByVal casewalk As List(Of UInteger), ByVal bot_libre As Boolean, ByVal Bot_Harvesting As Boolean)
If FormBot.Bot_Trajet = True Then
Dim move As New Move
For i = 0 To trajetlist.Count - 1
If Not trajetlist(i) = "" Or trajetlist(i).Contains("#") Then 'Commantaire on ligne vide
'Trajet simple, GAUCHE/DROITE/HAUT/BAS
If Bot_Harvesting = False And bot_libre = True Then
If trajetlist(i) = map & " gauche" Then move.gauche(casewalk)
If trajetlist(i) = map & " droite" Then move.droite(casewalk)
If trajetlist(i) = map & " haut" Then move.haut(casewalk)
If trajetlist(i) = map & " bas" Then move.bas(casewalk)
End If
'Trajet passe
If Bot_Harvesting = False Then
If trajetlist(i) = map & " gauche passe" Then move.gauche(casewalk)
If trajetlist(i) = map & " droite passe" Then move.droite(casewalk)
If trajetlist(i) = map & " haut passe" Then move.haut(casewalk)
If trajetlist(i) = map & " bas passe" Then move.bas(casewalk)
End If

End If
Next
End If
End Sub
End Class
Le code est très moche.
Mais je n'ai vraiment pas l'air de bien m'y prendre de plus il ne marche pas dans les cases. Je n'ai aucune erreur et rien ne se passe. Il ne marche qu'avec des composants.

Pourriez-vous m'aider à trouver un bonne algo ?
 
A

Anonymous

Invité
#2
Re: Système de Ptrajet

Premièrement, je te conseille de parser ton trajet en premier (et non en même temps que tu bouge). Pour la fonctionnalité il n'y a pas vraiment de différence mais tout sera beaucoup plus simple pour toi.

Par exemple tu parse ton trajet text en une liste d'objets "Movement". Dans cet objet tu peux avoir des informations comme l'orientation et la map. C'est également plus facile à debogger car tu peux accéer à ton trajet en entier avec l'observateur d'objet de visual studio. Un trajet parser pourrait ressemble a ca:

Code:
[Add to list]
add new Movement(Orientation.Gauche, 1024);
add new Movement(Orientation.Droite, 1025);
Donc si tu es tu la map 1024, tu vas à gauche et si tu es sur la map 1025 tu vas à droite.

Ensuite, tu devrais détecter la case pour ton movement quand tu es sur la map. Par exemple si tu va à droite, tu scan les cases pour en trouver une de libre puis tu bouge vers cette case. Sinon tu peux ajouter un objet Case dans ton objet Movement.

Et comme dernier conseil, tu devrais commencer par faire des trajets qui ne prennent pas en considération si ton bot harvest ou pas, tu vas seulement te compliqué la vie je crois que la première étape serait de faire fonctionner un trajet simple qui va d'un point A vers un point B. Le point A devrait être détecter automatiquement dépendemment de la map sur laquelle tu te trouves. Par la suite, tu peux adapter plus facilement pour prendre en considération la récolte, le combat, etc..

Et je n'ai pas trop compris ce que tu veux dire:
Il ne marche qu'avec des composants.
 
A

Anonymous

Invité
#3
Ok j'ai compris je vais essayer.
 
A

Anonymous

Invité
#4
Bonsoir,

je rencontre un problème avec mon système de trajet.

Alors voilà mes logs avant tout:
envoie : id = 221, Class : ChangeMapMessage, taille = 4
0x00000918

J'envoie le packet de changement de map, je change de map mais je ne recoi pas le 226 o_O.

Lorsque je change de map manuellement avec un bouton tout va bien:
Dim move = New Move
move.droite(Map_ListWalkable)
Mais lorsque que j'effectue le changement de map avec mon système de trajet, cela marche une fois mais pas une seconde fois, je ne recoi pas mon 226, donc je ne peux pas changé de map avec une mapid fausse :
Sub TrajetStart()
If Bot_Trajet = True Then
For i = 0 To Trajet.Count - 1
If Trajet(i).Map = Map_POS Then
'--Passe on execute le mouvement immediatement--
If Trajet(i).passe = True Then
Dim move = New Move
Select Case Trajet(i).direction
Case "gauche"
move.gauche(Map_ListWalkable)
Case "droite"
move.droite(Map_ListWalkable)
Case "haut"
move.haut(Map_ListWalkable)
Case "bas"
move.bas(Map_ListWalkable)
End Select
Else
'--On execute le mouvement conditions--
If Bot_NoRessources = True Then
Dim move = New Move
Select Case Trajet(i).direction
Case 1
move.gauche(Map_ListWalkable)
Case 2
move.droite(Map_ListWalkable)
Case 3
move.haut(Map_ListWalkable)
Case 4
move.bas(Map_ListWalkable)
End Select
End If
End If
Exit For
End If
Next
End If
End Sub

Mes class:
Public Class Move
Private listhaut As New List(Of UInteger)
Private listbas As New List(Of UInteger)
Sub haut(ByVal cellulewalk As List(Of UInteger))
listhaut.Add(8)
listhaut.Add(6)
listhaut.Add(9)
listhaut.Add(5)
listhaut.Add(10)
listhaut.Add(4)
listhaut.Add(11)
listhaut.Add(3)
listhaut.Add(12)
listhaut.Add(2)
listhaut.Add(13)
listhaut.Add(1)
listhaut.Add(7)
listhaut.Add(0)

For i = 0 To listhaut.Count - 1
If cellulewalk.Contains(listhaut(i)) Then
FormBot.changemap(listhaut(i))
Exit For
End If
Next
End Sub
Sub bas(ByVal cellulewalk As List(Of UInteger))
listhaut.Add(553)
listhaut.Add(554)
listhaut.Add(552)
listhaut.Add(555)
listhaut.Add(551)
listhaut.Add(556)
listhaut.Add(550)
listhaut.Add(557)
listhaut.Add(549)
listhaut.Add(558)
listhaut.Add(548)
listhaut.Add(559)
listhaut.Add(547)
listhaut.Add(546)

For i = 0 To listhaut.Count - 1
If cellulewalk.Contains(listhaut(i)) Then
FormBot.changemap(listhaut(i))
Exit For
End If
Next
End Sub
Sub gauche(ByVal cellulewalk As List(Of UInteger))

listhaut.Add(252)
listhaut.Add(224)
listhaut.Add(280)
listhaut.Add(196)
listhaut.Add(308)
listhaut.Add(168)
listhaut.Add(336)
listhaut.Add(140)
listhaut.Add(364)
listhaut.Add(112)
listhaut.Add(392)
listhaut.Add(84)
listhaut.Add(420)
listhaut.Add(56)
listhaut.Add(448)
listhaut.Add(476)
listhaut.Add(28)
listhaut.Add(504)
listhaut.Add(0)
listhaut.Add(532)


For i = 0 To listhaut.Count - 1
If cellulewalk.Contains(listhaut(i)) Then
FormBot.changemap(listhaut(i))
Exit For
End If
Next
End Sub
Sub droite(ByVal cellulewalk As List(Of UInteger))

listhaut.Add(265)
listhaut.Add(293)
listhaut.Add(237)
listhaut.Add(321)
listhaut.Add(209)
listhaut.Add(349)
listhaut.Add(181)
listhaut.Add(377)
listhaut.Add(153)
listhaut.Add(405)
listhaut.Add(125)
listhaut.Add(433)
listhaut.Add(97)
listhaut.Add(461)
listhaut.Add(69)
listhaut.Add(489)
listhaut.Add(41)
listhaut.Add(517)
listhaut.Add(13)
listhaut.Add(545)

For i = 0 To listhaut.Count - 1
If cellulewalk.Contains(listhaut(i)) Then
FormBot.changemap(listhaut(i))
Exit For
End If
Next
End Sub
End Class

Sub changemap(ByVal cellariivée As UInteger)
movemap(cellariivée)
Dim param1 As New Dofus.DofusWriter
For i = 0 To 27
If cellariivée = i Then
param1.WriteUInt32(Map_IdMap - 1)
Dofus.DofusWriter.Send(221, _socket_Jeu)
Exit For
End If
Next
For i = 532 To 559
If cellariivée = i Then
param1.WriteUInt32(Map_IdMap + 1)
Dofus.DofusWriter.Send(221, _socket_Jeu)
Exit For
End If
Next
For i = 27 To 559 Step 28
If cellariivée = i Then
param1.WriteUInt32(Map_IdMap + 512)
Dofus.DofusWriter.Send(221, _socket_Jeu)
Exit For
End If
Next
For i = 13 To 545 Step 28
If cellariivée = i Then
param1.WriteUInt32(Map_IdMap + 512)
Dofus.DofusWriter.Send(221, _socket_Jeu)
Exit For
End If
Next
For i = 0 To 532 Step 28
If cellariivée = i Then
param1.WriteUInt32(Map_IdMap - 512)
Dofus.DofusWriter.Send(221, _socket_Jeu)
Exit For
End If
Next
For i = 14 To 518 Step 28
If cellariivée = i Then
param1.WriteUInt32(Map_IdMap - 512)
Dofus.DofusWriter.Send(221, _socket_Jeu)
Exit For
End If
Next
End Sub

Voilà j'espère que vous pourrez m'aider
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#5
pas de 220 non plus je suppose ? et avec le bouton il y'a 220 et 226 ?
 
A

Anonymous

Invité
#6
Pas de 220 non plus et avec le bouton ya 226, j'ai pas regardé si je recevais 220. Mais j'ai toute les infos de la map bonne avec le bouton. Tres etrange.
 
A

Anonymous

Invité
#7
J'avoue, j'ai beau cherchez je ne trouve pas d'explication .
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#8
je pense qu'il est tellement occupé a vouloir continuer le trajet qu'il s'occupe meme plus des paquets , faut lui laisser le temps de reagir.

essais de mettre un boolean en variable globale , genre : dim Map_changed as boolean=false
et avant de bouger tu le mets a false (meme si il y ai deja)
et apres avoir envoyé le 221 de changement de map tu mets un truc du genre :
Code:
while not Map_changed then
    application.doevents ' faire autre chose tant que Map_changed = false
End While
et dans ton 226 tu le mets a true

autre chose qui a rien a voir , ca : Map_IdMap + 512 (et tout ses copains qui sont pareil avec les +1 -1 -512) , c'est nul (meme si je sais que y'a un tuto qui dit de faire ca) , c'est pas toujours vrai (bon c'est vrai a 90% des cas mais pas toujours) , dans les d2p il y'a les les ID des 4 maps voisines et de toute facons tu lis deja les d2p pour avoir les obstacles alors c'est pas un probleme de prendre 4 variables de plus
 
A

Anonymous

Invité
#9
Merci ToOnS, je vais essayer. Pour les d2p, j'avais pas vu.
 
A

Anonymous

Invité
#10
Toujours le même problème:

Ici le 226, on vient de changer de map une premier fois:

[14:54:19] Chargement de le map terminé !
On change de map une seconde fois:

envoie : id = 221, Class : ChangeMapMessage, taille = 4
0x00000918
Pas de 226 ni de 220.

Edit: Apres avoir utilisé le trajet, j'essaye avec un bouton et sa en marche pas non plus:


envoie : id = 221, Class : ChangeMapMessage, taille = 4
0x00000918
envoie : id = 950, Class : GameMapMovementRequestMessage, taille = 60
0x001B00FC00EE00FD00EF00FE00F000FF00F1010000F2010100F3010200F4010300F5010400F6010500F7010600F8010700F9010800FA010900000B18
envoie : id = 952, Class : GameMapMovementConfirmMessage, taille = 0
0x
envoie : id = 221, Class : ChangeMapMessage, taille = 4
0x00000D18
envoie : id = 950, Class : GameMapMovementRequestMessage, taille = 60
0x001B00FC00EE00FD00EF00FE00F000FF00F1010000F2010100F3010200F4010300F5010400F6010500F7010600F8010700F9010800FA010900000B18
envoie : id = 952, Class : GameMapMovementConfirmMessage, taille = 0
0x
envoie : id = 221, Class : ChangeMapMessage, taille = 4
0x00000D18

Aucune réponse du serveur. On dirait que ya une boucle qui monopolise toute l'application dans mon trajet.

De plus a la fin de mon 226 j'ai mis:
TrajetStart()

Et rien ne se passe non plus.
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#11
msn -> teamviewer ?
 
A

Anonymous

Invité
#12
D'accord je me connecte
 
A

Anonymous

Invité
#13
Résolue ?
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#14
un peu :mrgreen: ,pour un trajet normal oui mais apres il veut que ca marche pas tout a fait comme prevu pour un trajet normal , on regardait ca puis il a du se deco , en fait il veut que ca s'arrete a chaque map pour verifier quelques variables et si y'a pas ce qu'il veut le trajet repart
 
A

Anonymous

Invité
#15
Oui, enfin je pense que c'est la meilleur façon non ?
Parce que si ya un problème avec le déplacement, comme c'est souvent le cas avec mon pathfinding qui marche à moitier. Vaut mieux verifier à chaque fois.
 
A

Anonymous

Invité
#16
Alors toujours pas résolue ?
 
A

Anonymous

Invité
#17
Non toujours pas. Franchement c'est bizard
 
A

Anonymous

Invité
#18
Ben fais un trajet comme tout le monde aussi sa sera plus simple^^
 
A

Anonymous

Invité
#19
Comme tout le monde ? Que veux tu dire ?
 
A

Anonymous

Invité
#20
Bonsoir,

j'ai une erreur dans ma fenêtre de sortie :
Le référence d'objet Calcul_H n'est pas définie à une instance d'objet.

Cela vient de mon déplacement pour le changement de map:
Public Class CellInfo
Public index As Integer 'index dans le tableau des noeuds

Public parent As CellInfo 'noeud parents du noeud en cours

Public fermée As Boolean 'fait-il parti de la liste fermée ?
Public ouverte As Boolean 'de la liste ouverte ?
Public reachable As Boolean = True 'est-ce qu'on peu l'atteindre ? (est-ce un mur)

Public start, finish As Boolean 'est-ce le noeud de départ ? d'arrivé ?

Public x, y As Integer 'coordonnées en x, y de la case qui correspond au noeud
Public F, G, H As Integer 'variables de calcul de l'A*


Public Sub New(ByVal _index As Integer, ByVal _x As Integer, ByVal _y As Integer)

index = _index
x = _x
y = _y

End Sub

Public Sub Calcul_H(ByVal _arrivé As CellInfo)
'la distance à l'arrivé est égale à la diff en abscisse + la diff en ordonnée
H = 10 * (Math.Abs(_arrivé.x - x) + Math.Abs(_arrivé.y - y)) 'la distance à l'arrivé est égale à al diff en abscisse + la diff en ordonnée)

End Sub
End Class

'--Calcul des H--
For i As Integer = 0 To 559
mat(i).Calcul_H(finish_node)
Next
 
Haut Bas