Dessiner la map

Inscrit
29 Octobre 2016
Messages
65
Reactions
2
#1
Hello à tous longtemps que je suis là mais c'est mon premier message :o

J'ai réussis tout seul à réparer ce que je voulais donc je vais résumer la chose "optionnel" que je voulais que j'aimerais bien donc j'ai éditer le message :X

J'ai ma fonction pour lire la map et tout et tout avec les numéro de "mov" (d'ailleurs j'ai pas comrpis le mov 5 ? C'est uniquement des cases cliquable hors cadre, les seuls sur leurs lignes à être cliquable) sur les maps comme bonta je n'ai pas les étoiles dans la décompilation de la map et elle m'a l'air fausser :X

La taille des maps changeant selon la région (587 pour astrub 7XX pour bonta) je n'arrive pas à imaginer une fonction pour dessiner (en faite je sais même pas comment dessiner un carré isométrique en vb, au pire je peux toujours prendre des images sans soucis) mais il me faut avant tout pouvoir savoir le nombre de case sur chaque ligne ... Et je n'arrive pas à automatisé de façon dynamique ça.

De plus si vous avez une technique pour que le bot n'attaque pas si il n'a pas une ligne de vu je prend :D
 
Dernière édition:

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#2
Hello,

Pour dessiner un MapControl, il y bouh2 qui a partagé de superbes sources:
https://cadernis.fr/index.php?threa...contrôle-pour-afficher-une-map.585/#post-6983

Pour la ligne de vue tu as une classe DofusLine dans les sources du jeu mais j'ai complétement oublié son nom exact et son emplacement.
La seule classe que je pourrais te conseiller est celle de Rebirth mais bon le code est hardcore.

Attention les yeux

Code:
Imports System.Runtime.CompilerServices
Imports Microsoft.VisualBasic.CompilerServices

Namespace Dofus.Pathfinding
    Public Class Dofus1Line
        ' Methods
        Public Shared Function GetLine(ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer) As ArrayList
            Dim num As Integer = 0
            Dim pointd As Point3D = Nothing
            Dim point As Point = Nothing
            Dim num2 As Integer = 0
            Dim num3 As Integer = 0
            Dim d As Double = 0
            Dim a As Double = 0
            Dim num6 As Double = 0
            Dim num7 As Double = 0
            Dim num8 As Double = 0
            Dim num9 As Double = 0
            Dim num10 As Double = 0
            Dim num11 As Double = 0
            Dim num12 As UInt32 = 0
            Dim num13 As UInt32 = 0
            Dim list As New ArrayList
            Dim pointd2 As New Point3D(CDbl(x1), CDbl(y1), 0)
            Dim pointd3 As New Point3D(CDbl(x2), CDbl(y2), 0)
            pointd = New Point3D((pointd2.X + 0.5), (pointd2.Y + 0.5), pointd2.Z)
            Dim pointd4 As New Point3D((pointd3.X + 0.5), (pointd3.Y + 0.5), pointd3.Z)
            Dim num14 As Double = 0
            Dim num15 As Double = 0
            Dim num16 As Double = 0
            Dim list2 As New ArrayList
            Dim list3 As New ArrayList
            Dim num17 As UInt32 = 0
            If (Math.Abs(CDbl((pointd.X - pointd4.X))) = Math.Abs(CDbl((pointd.Y - pointd4.Y)))) Then
                num16 = Math.Abs(CDbl((pointd.X - pointd4.X)))
                num14 = If((pointd4.X > pointd.X), CDbl(1), CDbl(-1))
                num15 = If((pointd4.Y > pointd.Y), CDbl(1), CDbl(-1))
                Dim num1 As Double = If((num16 = 0), 0, ((pointd3.Z - pointd2.Z) / num16))
                num17 = 1
            ElseIf (Math.Abs(CDbl((pointd.X - pointd4.X))) > Math.Abs(CDbl((pointd.Y - pointd4.Y)))) Then
                num16 = Math.Abs(CDbl((pointd.X - pointd4.X)))
                num14 = If((pointd4.X > pointd.X), CDbl(1), CDbl(-1))
                num15 = If((pointd4.Y > pointd.Y), If((Math.Abs(CDbl((pointd.Y - pointd4.Y))) = 0), 0, (Math.Abs(CDbl((pointd.Y - pointd4.Y))) / num16)), (-Math.Abs(CDbl((pointd.Y - pointd4.Y))) / num16))
                num15 = (num15 * 100)
                num15 = (Math.Ceiling(num15) / 100)
                Dim num18 As Double = If((num16 = 0), 0, ((pointd3.Z - pointd2.Z) / num16))
                num17 = 2
            Else
                num16 = Math.Abs(CDbl((pointd.Y - pointd4.Y)))
                num14 = If((pointd4.X > pointd.X), If((Math.Abs(CDbl((pointd.X - pointd4.X))) = 0), 0, (Math.Abs(CDbl((pointd.X - pointd4.X))) / num16)), (-Math.Abs(CDbl((pointd.X - pointd4.X))) / num16))
                num14 = (num14 * 100)
                num14 = (Math.Ceiling(num14) / 100)
                num15 = If((pointd4.Y > pointd.Y), CDbl(1), CDbl(-1))
                Dim num19 As Double = If((num16 = 0), 0, ((pointd3.Z - pointd2.Z) / num16))
                num17 = 3
            End If
            For num = 0 To num16 - 1
                num2 = CInt(Math.Round(Math.Floor(CDbl((3 + (num16 / 2))))))
                num3 = CInt(Math.Round(Math.Floor(CDbl((97 - (num16 / 2))))))
                Select Case num17
                    Case 2
                        d = (Math.Ceiling(CDbl(((pointd.Y * 100) + (num15 * 50)))) / 100)
                        a = (Math.Floor(CDbl(((pointd.Y * 100) + (num15 * 150)))) / 100)
                        num6 = (Math.Floor(Math.Abs(CDbl(((Math.Floor(d) * 100) - (d * 100))))) / 100)
                        num7 = (Math.Ceiling(Math.Abs(CDbl(((Math.Ceiling(a) * 100) - (a * 100))))) / 100)
                        If (Math.Floor(d) = Math.Floor(a)) Then
                            list3 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.Y + num15)))})
                            If (Operators.ConditionalCompareObjectEqual(d, list3.Item(0), False) AndAlso Operators.ConditionalCompareObjectLess(a, list3.Item(0), False)) Then
                                list3 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.Y + num15)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(d, list3.Item(0), False) AndAlso Operators.ConditionalCompareObjectGreater(a, list3.Item(0), False)) Then
                                list3 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.Y + num15)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(a, list3.Item(0), False) AndAlso Operators.ConditionalCompareObjectLess(d, list3.Item(0), False)) Then
                                list3 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.Y + num15)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(a, list3.Item(0), False) AndAlso Operators.ConditionalCompareObjectGreater(d, list3.Item(0), False)) Then
                                list3 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.Y + num15)))})
                            End If
                        ElseIf (Math.Ceiling(d) = Math.Ceiling(a)) Then
                            list3 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.Y + num15)))})
                            If (Operators.ConditionalCompareObjectEqual(d, list3.Item(0), False) AndAlso Operators.ConditionalCompareObjectLess(a, list3.Item(0), False)) Then
                                list3 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.Y + num15)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(d, list3.Item(0), False) AndAlso Operators.ConditionalCompareObjectGreater(a, list3.Item(0), False)) Then
                                list3 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.Y + num15)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(a, list3.Item(0), False) AndAlso Operators.ConditionalCompareObjectLess(d, list3.Item(0), False)) Then
                                list3 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.Y + num15)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(a, list3.Item(0), False) AndAlso Operators.ConditionalCompareObjectGreater(d, list3.Item(0), False)) Then
                                list3 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.Y + num15)))})
                            End If
                        ElseIf (Math.Floor(CDbl((num6 * 100))) <= num2) Then
                            Dim list4 As New ArrayList
                            list4.Add(Math.Floor(a))
                            list3 = list4
                        ElseIf (Math.Floor(CDbl((num7 * 100))) >= num3) Then
                            Dim list5 As New ArrayList
                            list5.Add(Math.Floor(d))
                            list3 = list5
                        Else
                            Dim list6 As New ArrayList
                            list6.Add(Math.Floor(d))
                            list6.Add(Math.Floor(a))
                            list3 = list6
                        End If
                        Exit Select
                    Case 3
                        num8 = (Math.Ceiling(CDbl(((pointd.X * 100) + (num14 * 50)))) / 100)
                        num9 = (Math.Floor(CDbl(((pointd.X * 100) + (num14 * 150)))) / 100)
                        num10 = (Math.Floor(Math.Abs(CDbl(((Math.Floor(num8) * 100) - (num8 * 100))))) / 100)
                        num11 = (Math.Ceiling(Math.Abs(CDbl(((Math.Ceiling(num9) * 100) - (num9 * 100))))) / 100)
                        If (Math.Floor(num8) = Math.Floor(num9)) Then
                            list2 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.X + num14)))})
                            If (Operators.ConditionalCompareObjectEqual(num8, list2.Item(0), False) AndAlso Operators.ConditionalCompareObjectLess(num9, list2.Item(0), False)) Then
                                list2 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.X + num14)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(num8, list2.Item(0), False) AndAlso Operators.ConditionalCompareObjectGreater(num9, list2.Item(0), False)) Then
                                list2 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.X + num14)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(num9, list2.Item(0), False) AndAlso Operators.ConditionalCompareObjectLess(num8, list2.Item(0), False)) Then
                                list2 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.X + num14)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(num9, list2.Item(0), False) AndAlso Operators.ConditionalCompareObjectGreater(num8, list2.Item(0), False)) Then
                                list2 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.X + num14)))})
                            End If
                        ElseIf (Math.Ceiling(num8) = Math.Ceiling(num9)) Then
                            list2 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.X + num14)))})
                            If (Operators.ConditionalCompareObjectEqual(num8, list2.Item(0), False) AndAlso Operators.ConditionalCompareObjectLess(num9, list2.Item(0), False)) Then
                                list2 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.X + num14)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(num8, list2.Item(0), False) AndAlso Operators.ConditionalCompareObjectGreater(num9, list2.Item(0), False)) Then
                                list2 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.X + num14)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(num9, list2.Item(0), False) AndAlso Operators.ConditionalCompareObjectLess(num8, list2.Item(0), False)) Then
                                list2 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.X + num14)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(num9, list2.Item(0), False) AndAlso Operators.ConditionalCompareObjectGreater(num8, list2.Item(0), False)) Then
                                list2 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.X + num14)))})
                            End If
                        ElseIf (Math.Floor(CDbl((num10 * 100))) <= num2) Then
                            list2 = Dofus1Line.smethod_0(New Object() {num9})
                        ElseIf (Math.Floor(CDbl((num11 * 100))) >= num3) Then
                            list2 = Dofus1Line.smethod_0(New Object() {num8})
                        Else
                            list2 = Dofus1Line.smethod_0(New Object() {num8, num9})
                        End If
                        Exit Select
                End Select
                If (list3.Count > 0) Then
                    num12 = 0
                    Do While (num12 < list3.Count)
                        point = New Point(Math.Floor(CDbl((pointd.X + num14))), Conversions.ToDouble(list3.Item(CInt(num12))))
                        list.Add(point)
                        num12 = (num12 + 1)
                    Loop
                ElseIf (list2.Count > 0) Then
                    num13 = 0
                    Do While (num13 < list2.Count)
                        point = New Point(Conversions.ToDouble(list2.Item(CInt(num13))), Math.Floor(CDbl((pointd.Y + num15))))
                        list.Add(point)
                        num13 = (num13 + 1)
                    Loop
                ElseIf (num17 = 1) Then
                    point = New Point(Math.Floor(CDbl((pointd.X + num14))), Math.Floor(CDbl((pointd.Y + num15))))
                    list.Add(point)
                End If
                pointd.X = (((pointd.X * 100) + (num14 * 100)) / 100)
                pointd.Y = (((pointd.Y * 100) + (num15 * 100)) / 100)
            Next num
            Return list
        End Function

        Private Shared Function smethod_0(ByVal object_0 As Object()) As ArrayList
            Dim list As New ArrayList
            list.AddRange(object_0)
            Return list
        End Function


        ' Nested Types
        Public Class Point
            ' Methods
            Public Sub New(ByVal X As Double, ByVal Y As Double)
                Me.X = X
                Me.Y = Y
            End Sub


            ' Properties
            Public Property X As Double
                Get
                    Return Me.double_0
                End Get
                Set(ByVal value As Double)
                    Me.double_0 = value
                End Set
            End Property

            Public Property Y As Double
                Get
                    Return Me.double_1
                End Get
                Set(ByVal value As Double)
                    Me.double_1 = value
                End Set
            End Property


            ' Fields
            <CompilerGenerated> _
            Private double_0 As Double
            <CompilerGenerated> _
            Private double_1 As Double
        End Class

        Public Class Point3D
            ' Methods
            Public Sub New(ByVal X As Double, ByVal Y As Double, ByVal Z As Double)
                Me.X = X
                Me.Y = Y
                Me.Z = Z
            End Sub


            ' Properties
            Public Property X As Double
                Get
                    Return Me.double_0
                End Get
                Set(ByVal value As Double)
                    Me.double_0 = value
                End Set
            End Property

            Public Property Y As Double
                Get
                    Return Me.double_1
                End Get
                Set(ByVal value As Double)
                    Me.double_1 = value
                End Set
            End Property

            Public Property Z As Double
                Get
                    Return Me.double_2
                End Get
                Set(ByVal value As Double)
                    Me.double_2 = value
                End Set
            End Property


            ' Fields
            <CompilerGenerated> _
            Private double_0 As Double
            <CompilerGenerated> _
            Private double_1 As Double
            <CompilerGenerated> _
            Private double_2 As Double
        End Class
    End Class
End Namespace
 
Inscrit
29 Octobre 2016
Messages
65
Reactions
2
#5
Je vais voir ça merci beaucoup :)
Je ne savais pas trop où ni quoi chercher :/
J'ai essayer de trouver des algorithme pour dessiner ça mais j'arrivais pas ^^'

Edit: Bon, le code traduit comme ça n'est pas viable pour dessiner une map, mais maintenant que je sais mieux quoi chercher ce ne sera pas un soucis je vais retravailler le code, je n'ai pas peur de mettre les mains dedans, même si je suis très flemmard :D

J'ai créer mon propre script map je le partagerais plus tard je cherche à pouvoir faire une auto map par le nombre de case sur la map.

J'ai trouver aussi:
Code:
if(_loc11_.lineOfSight && (_loc14_ <= _loc13_ && !_loc15_)) {
         return true;
}
Je vais voir avec ça car avec ton code comme ça je ne vois pas comment l'ajouter au m4x0ubot.
Difficile de modifier un truc déjà coder sans tout tout modifier x)

Edit2: Tiens je viens de remarquer ToOns je te connais depuis longtemps sur le forum je sais pas si j'avais un autre pseudo avant mais je sais que je suis là depuis très longtemps mais j'ai jamais vraiment participé juste lu ^^ Avec the falcons qui était sur tout les fofo des différents bots et qui participer partout à la fois x)
 
Dernière édition:
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#6
Hello,

Pour dessiner un MapControl, il y bouh2 qui a partagé de superbes sources:
https://cadernis.fr/index.php?threads/dofus-map-control-un-contrôle-pour-afficher-une-map.585/#post-6983

Pour la ligne de vue tu as une classe DofusLine dans les sources du jeu mais j'ai complétement oublié son nom exact et son emplacement.
La seule classe que je pourrais te conseiller est celle de Rebirth mais bon le code est hardcore.

Attention les yeux

Code:
Imports System.Runtime.CompilerServices
Imports Microsoft.VisualBasic.CompilerServices

Namespace Dofus.Pathfinding
    Public Class Dofus1Line
        ' Methods
        Public Shared Function GetLine(ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer) As ArrayList
            Dim num As Integer = 0
            Dim pointd As Point3D = Nothing
            Dim point As Point = Nothing
            Dim num2 As Integer = 0
            Dim num3 As Integer = 0
            Dim d As Double = 0
            Dim a As Double = 0
            Dim num6 As Double = 0
            Dim num7 As Double = 0
            Dim num8 As Double = 0
            Dim num9 As Double = 0
            Dim num10 As Double = 0
            Dim num11 As Double = 0
            Dim num12 As UInt32 = 0
            Dim num13 As UInt32 = 0
            Dim list As New ArrayList
            Dim pointd2 As New Point3D(CDbl(x1), CDbl(y1), 0)
            Dim pointd3 As New Point3D(CDbl(x2), CDbl(y2), 0)
            pointd = New Point3D((pointd2.X + 0.5), (pointd2.Y + 0.5), pointd2.Z)
            Dim pointd4 As New Point3D((pointd3.X + 0.5), (pointd3.Y + 0.5), pointd3.Z)
            Dim num14 As Double = 0
            Dim num15 As Double = 0
            Dim num16 As Double = 0
            Dim list2 As New ArrayList
            Dim list3 As New ArrayList
            Dim num17 As UInt32 = 0
            If (Math.Abs(CDbl((pointd.X - pointd4.X))) = Math.Abs(CDbl((pointd.Y - pointd4.Y)))) Then
                num16 = Math.Abs(CDbl((pointd.X - pointd4.X)))
                num14 = If((pointd4.X > pointd.X), CDbl(1), CDbl(-1))
                num15 = If((pointd4.Y > pointd.Y), CDbl(1), CDbl(-1))
                Dim num1 As Double = If((num16 = 0), 0, ((pointd3.Z - pointd2.Z) / num16))
                num17 = 1
            ElseIf (Math.Abs(CDbl((pointd.X - pointd4.X))) > Math.Abs(CDbl((pointd.Y - pointd4.Y)))) Then
                num16 = Math.Abs(CDbl((pointd.X - pointd4.X)))
                num14 = If((pointd4.X > pointd.X), CDbl(1), CDbl(-1))
                num15 = If((pointd4.Y > pointd.Y), If((Math.Abs(CDbl((pointd.Y - pointd4.Y))) = 0), 0, (Math.Abs(CDbl((pointd.Y - pointd4.Y))) / num16)), (-Math.Abs(CDbl((pointd.Y - pointd4.Y))) / num16))
                num15 = (num15 * 100)
                num15 = (Math.Ceiling(num15) / 100)
                Dim num18 As Double = If((num16 = 0), 0, ((pointd3.Z - pointd2.Z) / num16))
                num17 = 2
            Else
                num16 = Math.Abs(CDbl((pointd.Y - pointd4.Y)))
                num14 = If((pointd4.X > pointd.X), If((Math.Abs(CDbl((pointd.X - pointd4.X))) = 0), 0, (Math.Abs(CDbl((pointd.X - pointd4.X))) / num16)), (-Math.Abs(CDbl((pointd.X - pointd4.X))) / num16))
                num14 = (num14 * 100)
                num14 = (Math.Ceiling(num14) / 100)
                num15 = If((pointd4.Y > pointd.Y), CDbl(1), CDbl(-1))
                Dim num19 As Double = If((num16 = 0), 0, ((pointd3.Z - pointd2.Z) / num16))
                num17 = 3
            End If
            For num = 0 To num16 - 1
                num2 = CInt(Math.Round(Math.Floor(CDbl((3 + (num16 / 2))))))
                num3 = CInt(Math.Round(Math.Floor(CDbl((97 - (num16 / 2))))))
                Select Case num17
                    Case 2
                        d = (Math.Ceiling(CDbl(((pointd.Y * 100) + (num15 * 50)))) / 100)
                        a = (Math.Floor(CDbl(((pointd.Y * 100) + (num15 * 150)))) / 100)
                        num6 = (Math.Floor(Math.Abs(CDbl(((Math.Floor(d) * 100) - (d * 100))))) / 100)
                        num7 = (Math.Ceiling(Math.Abs(CDbl(((Math.Ceiling(a) * 100) - (a * 100))))) / 100)
                        If (Math.Floor(d) = Math.Floor(a)) Then
                            list3 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.Y + num15)))})
                            If (Operators.ConditionalCompareObjectEqual(d, list3.Item(0), False) AndAlso Operators.ConditionalCompareObjectLess(a, list3.Item(0), False)) Then
                                list3 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.Y + num15)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(d, list3.Item(0), False) AndAlso Operators.ConditionalCompareObjectGreater(a, list3.Item(0), False)) Then
                                list3 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.Y + num15)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(a, list3.Item(0), False) AndAlso Operators.ConditionalCompareObjectLess(d, list3.Item(0), False)) Then
                                list3 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.Y + num15)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(a, list3.Item(0), False) AndAlso Operators.ConditionalCompareObjectGreater(d, list3.Item(0), False)) Then
                                list3 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.Y + num15)))})
                            End If
                        ElseIf (Math.Ceiling(d) = Math.Ceiling(a)) Then
                            list3 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.Y + num15)))})
                            If (Operators.ConditionalCompareObjectEqual(d, list3.Item(0), False) AndAlso Operators.ConditionalCompareObjectLess(a, list3.Item(0), False)) Then
                                list3 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.Y + num15)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(d, list3.Item(0), False) AndAlso Operators.ConditionalCompareObjectGreater(a, list3.Item(0), False)) Then
                                list3 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.Y + num15)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(a, list3.Item(0), False) AndAlso Operators.ConditionalCompareObjectLess(d, list3.Item(0), False)) Then
                                list3 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.Y + num15)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(a, list3.Item(0), False) AndAlso Operators.ConditionalCompareObjectGreater(d, list3.Item(0), False)) Then
                                list3 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.Y + num15)))})
                            End If
                        ElseIf (Math.Floor(CDbl((num6 * 100))) <= num2) Then
                            Dim list4 As New ArrayList
                            list4.Add(Math.Floor(a))
                            list3 = list4
                        ElseIf (Math.Floor(CDbl((num7 * 100))) >= num3) Then
                            Dim list5 As New ArrayList
                            list5.Add(Math.Floor(d))
                            list3 = list5
                        Else
                            Dim list6 As New ArrayList
                            list6.Add(Math.Floor(d))
                            list6.Add(Math.Floor(a))
                            list3 = list6
                        End If
                        Exit Select
                    Case 3
                        num8 = (Math.Ceiling(CDbl(((pointd.X * 100) + (num14 * 50)))) / 100)
                        num9 = (Math.Floor(CDbl(((pointd.X * 100) + (num14 * 150)))) / 100)
                        num10 = (Math.Floor(Math.Abs(CDbl(((Math.Floor(num8) * 100) - (num8 * 100))))) / 100)
                        num11 = (Math.Ceiling(Math.Abs(CDbl(((Math.Ceiling(num9) * 100) - (num9 * 100))))) / 100)
                        If (Math.Floor(num8) = Math.Floor(num9)) Then
                            list2 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.X + num14)))})
                            If (Operators.ConditionalCompareObjectEqual(num8, list2.Item(0), False) AndAlso Operators.ConditionalCompareObjectLess(num9, list2.Item(0), False)) Then
                                list2 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.X + num14)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(num8, list2.Item(0), False) AndAlso Operators.ConditionalCompareObjectGreater(num9, list2.Item(0), False)) Then
                                list2 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.X + num14)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(num9, list2.Item(0), False) AndAlso Operators.ConditionalCompareObjectLess(num8, list2.Item(0), False)) Then
                                list2 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.X + num14)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(num9, list2.Item(0), False) AndAlso Operators.ConditionalCompareObjectGreater(num8, list2.Item(0), False)) Then
                                list2 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.X + num14)))})
                            End If
                        ElseIf (Math.Ceiling(num8) = Math.Ceiling(num9)) Then
                            list2 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.X + num14)))})
                            If (Operators.ConditionalCompareObjectEqual(num8, list2.Item(0), False) AndAlso Operators.ConditionalCompareObjectLess(num9, list2.Item(0), False)) Then
                                list2 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.X + num14)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(num8, list2.Item(0), False) AndAlso Operators.ConditionalCompareObjectGreater(num9, list2.Item(0), False)) Then
                                list2 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.X + num14)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(num9, list2.Item(0), False) AndAlso Operators.ConditionalCompareObjectLess(num8, list2.Item(0), False)) Then
                                list2 = Dofus1Line.smethod_0(New Object() {Math.Floor(CDbl((pointd.X + num14)))})
                            ElseIf (Operators.ConditionalCompareObjectEqual(num9, list2.Item(0), False) AndAlso Operators.ConditionalCompareObjectGreater(num8, list2.Item(0), False)) Then
                                list2 = Dofus1Line.smethod_0(New Object() {Math.Ceiling(CDbl((pointd.X + num14)))})
                            End If
                        ElseIf (Math.Floor(CDbl((num10 * 100))) <= num2) Then
                            list2 = Dofus1Line.smethod_0(New Object() {num9})
                        ElseIf (Math.Floor(CDbl((num11 * 100))) >= num3) Then
                            list2 = Dofus1Line.smethod_0(New Object() {num8})
                        Else
                            list2 = Dofus1Line.smethod_0(New Object() {num8, num9})
                        End If
                        Exit Select
                End Select
                If (list3.Count > 0) Then
                    num12 = 0
                    Do While (num12 < list3.Count)
                        point = New Point(Math.Floor(CDbl((pointd.X + num14))), Conversions.ToDouble(list3.Item(CInt(num12))))
                        list.Add(point)
                        num12 = (num12 + 1)
                    Loop
                ElseIf (list2.Count > 0) Then
                    num13 = 0
                    Do While (num13 < list2.Count)
                        point = New Point(Conversions.ToDouble(list2.Item(CInt(num13))), Math.Floor(CDbl((pointd.Y + num15))))
                        list.Add(point)
                        num13 = (num13 + 1)
                    Loop
                ElseIf (num17 = 1) Then
                    point = New Point(Math.Floor(CDbl((pointd.X + num14))), Math.Floor(CDbl((pointd.Y + num15))))
                    list.Add(point)
                End If
                pointd.X = (((pointd.X * 100) + (num14 * 100)) / 100)
                pointd.Y = (((pointd.Y * 100) + (num15 * 100)) / 100)
            Next num
            Return list
        End Function

        Private Shared Function smethod_0(ByVal object_0 As Object()) As ArrayList
            Dim list As New ArrayList
            list.AddRange(object_0)
            Return list
        End Function


        ' Nested Types
        Public Class Point
            ' Methods
            Public Sub New(ByVal X As Double, ByVal Y As Double)
                Me.X = X
                Me.Y = Y
            End Sub


            ' Properties
            Public Property X As Double
                Get
                    Return Me.double_0
                End Get
                Set(ByVal value As Double)
                    Me.double_0 = value
                End Set
            End Property

            Public Property Y As Double
                Get
                    Return Me.double_1
                End Get
                Set(ByVal value As Double)
                    Me.double_1 = value
                End Set
            End Property


            ' Fields
            <CompilerGenerated> _
            Private double_0 As Double
            <CompilerGenerated> _
            Private double_1 As Double
        End Class

        Public Class Point3D
            ' Methods
            Public Sub New(ByVal X As Double, ByVal Y As Double, ByVal Z As Double)
                Me.X = X
                Me.Y = Y
                Me.Z = Z
            End Sub


            ' Properties
            Public Property X As Double
                Get
                    Return Me.double_0
                End Get
                Set(ByVal value As Double)
                    Me.double_0 = value
                End Set
            End Property

            Public Property Y As Double
                Get
                    Return Me.double_1
                End Get
                Set(ByVal value As Double)
                    Me.double_1 = value
                End Set
            End Property

            Public Property Z As Double
                Get
                    Return Me.double_2
                End Get
                Set(ByVal value As Double)
                    Me.double_2 = value
                End Set
            End Property


            ' Fields
            <CompilerGenerated> _
            Private double_0 As Double
            <CompilerGenerated> _
            Private double_1 As Double
            <CompilerGenerated> _
            Private double_2 As Double
        End Class
    End Class
End Namespace
Sinon, pour la ligne de vue, voilà comment je fais :

1) je transforme le monstre et le personnage en (x;y)
2) je cherche l'équation de la droite de type y=mx + p
3) j'utilise une matrice ou la méthode de cramer
4) j'ai l'équation de la droite, je vérifie, les cellules qui sont adhérante à celle-ci
5) si c'est le cas je l'ajoute à la liste
Et voilà j'ai la liste des cellules passant par mon perso et le monstre.
 
Dernière édition par un modérateur:

Arth

Contributeur
Inscrit
28 Aout 2016
Messages
80
Reactions
3
#7
Ta réponse m'intrigue, tu peut m’éclairer ?
1) Et si les 2 cases (origine et final) sont aligné selon ton axe y ? Tu vas jouer avec une autre équation x = m2 y + p2 ?
2) Pourquoi tu veut utiliser un système d’équation ?
4) comment tu exclus les cases qui ont juste un point de contact avec la droite ?
 
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#8
Je résous une system d'équation 2 équations 2 inconnues :

Y = mx+p si j'ai le point (10;20) et (15;25) je remplace :
20 = m10+p
25 = m15+p

à partir de ça tu trouves la valeur de p et m tu as l'équation de la droite,
Vu que la ligne de vue c'est une simple droite entre toi et le monstre
tu restreins ta fonction à savoir son domaine soit ici [10;15].
Pour finir, tu regardes les cellules (transformées en coordonnées adhérente à ta droite) ex :
Imaginons, j'invente cell 320 = (14;20)
tu cherches la valeur de y en remplaçant le x par 15 dans l'équation de la droite tout en vérifiant que le x est adhérant au domaine de définition à savoir ici [10;15] c'est le cas donc. Valeur de y théorique selon la droite Y = M * 14 + P dont tu connais P et M et là tu as la valeur de Y donc , tu regardes si y = 20 et si c'est le cas la cellule est dans ta ligne de vue.
 
Dernière édition:

Arth

Contributeur
Inscrit
28 Aout 2016
Messages
80
Reactions
3
#9
Comme je disais, si tu as des cases alignées sur l'axe des Y tu vas pas pouvoir trouver ta droite:
Y = m*X+p si j'ai le point (10;20) et (10;25) je remplace :
20 = m*10+p
25 = m*10+p

Tu vas chercher longtemps pour résoudre ton système.

Sinon, les cases sont carré et ont une surface tu peut pas te limité a considérer le centre des cases., du coup tu doit surement devoir fait un arrondi supérieur et inferieur...
ça serait peut-etre plus intéressant de voir si ta droite coupe une des diagonales de la case non ?
 
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#10
Dans ce cas là ça va encore plus vite car tu le vois direct si c'est pas une fonction. y <> pour un même x, c'est simple à trouver les cellids. tu fais +1 ou -1 pas besoin de décomposer en x;y
 

Arth

Contributeur
Inscrit
28 Aout 2016
Messages
80
Reactions
3
#11
Sinon, si on travail avec des équation paramétrique (x et y dépendent d'une variable t).
On oublie tous les problèmes et je trouve ça plus jolie mathématiquement :p.
Si on a les points P1(X1, Y2) et P2(X2, Y2).
On cherche les équations:
x = X0 + t*ax
y = Y0 + t*ay
Tu fixes t = 0 en P1 et t = 1 en P2.

Donc tu cherches à résoudre le systeme à 4 équations:
X1 = X0 + 0*ax = X0
X2 = X0 + 1*ax
Y1 = Y0 + 0*ay = Y0
Y2 = Y0 + 1*ay

Les solutions sont direct, pas besoin de matrice ^^:
X0 = X1
Y0 = Y1
ax = X2-X1
ay = Y2-Y1
et pour délimiter ta droite, tu dit que 0 <= t <= 1

si tu veut tester si une case coupe cette droite, soit tu test si elle coupe un des 4 cotés (mais tester 3 cotés suffit !), sois tu regarde si elle coupe une des 2 diagonales.
il y a moins de diagonale alors c'est plus rapide. Il faut trouver l’équation des diagonales de la case (X, Y). les résultats (paramétré par une variable 0 <= u <= 1):
x = X0d1 + u*axd1
y = Y0d1 + u*ayd1
X0d1 = X-0.5 ; Y0d1 = Y-0.5 ; axd1 = 1 ; ayd1 = 1
X0d2 = X+0.5 ; Y0d2 = Y-0.5 ; axd2 = -1 ; ayd2 = 1

Si tu veut tester si ta droite coupe une des deux diagonales tu résous (on cherche t et u, c'est a dire pour quels paramètres des droite elle ce coupe):
X0 + t*ax = X0d1 + u*axd1
Y0 + t*ay = Y0d1 + u*ayd1
Ici tu peut utiliser une méthode à base de matrice.
Tu as 2 cas de figure :
  • Si tu n'as aucune solution, la droite ne coupe pas la diagonale
  • Si tu as une solution, il faut que u sois entre 0 et 1 et t entre 0 et 1 sinon la droite ne coupe pas la diagonale (0 et 1 exclu pour u si tu veut éliminer les coins)
Tu fait de même avec la 2eme diagonale, si aucune des diagonales n'est coupée alors la case n'est pas dans la ligne de vue.

L'avantage ici c'est que tu peut prendre en compte le cas ou la droite est juste en contact avec un coin d'une case. Mais tu doit résoudre 2 systèmes d’équation pour chaque case (même si c'est pas très lourd pour notre cas).

Enfin bref, désolé pour le pavé ^^ et en espérant que cela puisse servir à quelqu’un un jour.
 
Inscrit
29 Octobre 2016
Messages
65
Reactions
2
#12
Avec ma copine on à passer 1h à tester y=mx + p et nous en sommes venu au résultat suivant:
Faudrait refaire le terrain entier et on galéré on arriver pas à placer les cases au bon endroit, au final on à tester d'autres méthode en traçant 2 droits pour créer un axe sur le tableau isométrique, le soucis c'est que 2 cases sont couper sur un même point. Au final c'était pas possible :X

Je verrais avec elle les calculs demain, j'ai arrêté l'école assez tôt je galère avec vos fonctions mathématique elle elle est en 2eme année de fac de science c'est simple pour elle, ça évite que j'ai mal à la tête ^^
 

Arth

Contributeur
Inscrit
28 Aout 2016
Messages
80
Reactions
3
#13
Je ne sais pas comment vous faites pour convertir vos coordonnées en X, Y, mais je vous propose cela au cas ou:
N = width*2-1
n = (int) (cellid / N); // arrondi au dessous
D = cellid-n*N;
x = D%(width-1) + n;
y = D%width - n;


et en inverse:
cellid = x*width + y*(1-width)

Et ne me demandez pas comment j'ai trouvé ça ... je pense que je ne sais pas moi même, et je suis incapable de le prouver x).
et c'est en partant de de la première cellid = 1 (je ne sais plus si c'est 0 ou 1). Il existe peut-être plus simple ... mais c'est vraiment pas joli de toute façon.

Sinon, si mes équations te font peur, c'est pas aussi complexe que cela peut en avoir l'air, et je peux simplifier ^^.

Bonne chance sinon :p

PS : j'ai edit pour ajouter la fonction inverse de ma methode.
 
Dernière édition:
Inscrit
29 Octobre 2016
Messages
65
Reactions
2
#14
Edit: En faite c'était de la m#### je l'ai refais à 0 :

Code:
Public Class coordXY
    Public y As Integer = 0
    Public x As Integer = 0
End Class

Function getCaseCoordonnee(ByVal nNum As Integer,byval largeur as integer)
        Dim calc1 As Integer = Math.Floor(nNum / (largeur * 2 - 1))
        Dim calc2 As Integer = nNum - calc1 * (largeur * 2 - 1)
        Dim verifP As Integer = calc2 Mod largeur
        Dim coordoCase = New coordXY()
        coordoCase.y = calc1 - verifP
        coordoCase.x = (nNum - (largeur - 1) * coordoCase.y) / largeur
        Return coordoCase
    End Function
 
Dernière édition:

Arth

Contributeur
Inscrit
28 Aout 2016
Messages
80
Reactions
3
#15
Je pense que ma méthode réduit bien le nombre d’opération pour les position x y, et normalement cela fonctionne avec toutes les tailles. Mais de toute façon c'est toujours pas joli et pas très claire ^^.
SI ça marche tant mieux :p.

Et courage pour la suite
 
Haut Bas