« 1 (2) 3 4 5 »


Re: système Sid Meyer like (Civilization)
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 1653
J'arrive pas à comprendre le code générique du A*. Trop générique, j'arrive pas a faire de lien avec ce qui est possible sur le BGE

Ce que j'ai compris:
la notion de node = mes tuiles

la boucle for me permet de vérifier tout les objets désirés (donc on pourrai dire que c'est le "maze" dont l'auteur ne parle nulle part, hormis le code), je peux exclure la case là ou se trouve mon bateau, déjà. Par contre, si j'utilise "ma_case.getDistanceTo(point_arrivee)", python va me communiquer la distance, toujours positive, par rapport au point d'arrivée. Sauf que la tuile en question peut se trouver n'importe où. "getDistanceTo" dessine un périmètre en cercle pour faire sa détection.

Donc, je peux avoir la distance du bateau vers le point d'arrivee et la distance entre chaque tuiles vers le point d'arrivée. Par contre, comme les tuiles sont alignées, je peux avoir plusieurs tuiles ayant les mêmes distances renseignées, comment je fais le tri dans pareille cas ?

Pour le diagramme Voronoï et les bibliothèques, si il existe un fichier python (.py) avec l’algorithme et les dépendances nécessaire, ça devrait être possible...

Sinon, j'ai vu dans le module BGL "Imagetoarray" qui semble lire les pixels d'une image. Ça peut le faire aussi ?

Contribution le : 08/04 14:14:29
Créer un fichier PDF de la contribution Imprimer


Re: système Sid Meyer like (Civilization)
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2649
Oui, les nodes sont bien tes tuiles.

Quand tu génères ta carte, j'imagine que tu as un tableau dans lequel tu indiques le type (forêt, océan, montagne, ...). C'est ce tableau qui constitue ton "maze" (que tu peux appeler simplement "map" dans ta situation).

La distance est calculée dans l'algorithme A* avec le théorème de Pythagore qui est obligatoirement positive. Ca ne pose aucun souci car tu compares la distance à la tuile en cours. Tu gardes la tuile dans la distance est la plus courte parmi les tuiles adjacentes.
Les nodes du code sur le site sont également alignés. Ca ne pose aucun souci.

Une différence notable par rapport au code proposé sur le site qui explique A*, c'est que tu as différents types de cases.
Si par exemple "Ocean=2", ton bateau ne pourra considérer que les tuiles ayant le type "Ocean=2" (voir la ligne #69 du code Python "# Make sure walkable terrain").


Pour Python, j'ai vu des projets sur GitHub qui sont des fichiers .py.
https://github.com/search?l=Python&q=voronoi&type=Repositories

J'ai en particulier vu celui-ci mais je ne sais pas après s'il fonctionne directement. Il semble assez générique à première vue mais je ne connais pas assez Python pour savoir.
https://github.com/jansonh/Voronoi/blob/master/Voronoi.py

Contribution le : 08/04 15:54:44
_________________
Venez tester notre projet de Blender clan 2.0 + Tchat (en cours de développement) !
Pourquoi ? Retrouver un forum fonctionnel.
Créer un fichier PDF de la contribution Imprimer


Re: système Sid Meyer like (Civilization)
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 1653
Citation :

Quand tu génères ta carte, j'imagine que tu as un tableau...


Je n'en suis pas sûr. Pour générer mes tuiles, j'ai construit mon script comme ça:

from bge import logic as gl
from random import choice

scene = gl.getCurrentScene()
obj = gl.getCurrentController().owner

case_added = 0
terrain_size = 73

cases_random = ['tuile_eau', 'tuile_terre', 'tuile_montagne']
list_sp_jou = [] # un empty s'apelle "sp_jou", c'est là ou sont généré les tuiles

def fonct1(val_max, val_depart_interval):
    if obj.worldPosition[0] > val_max:
        obj.worldPosition[0] = val_depart_interval
        obj.worldPosition[1] -= 0.600001
        obj['intervalle'] = not obj['intervalle']
    else:
        obj.worldPosition[0] += 0.692820

while case_added != terrain_size:
    case_to_add = choice(cases_random)
    case = scene.addObject(case_to_add, obj, 0)
    case['id'] = case_added
    case_added += 1
    
    if case['type'] == 'eau':
        list_sp_jou.append(case['id']) # toute les cases d'eau sont ajoutées dans une liste pour placer aléatoirement le bateau sur l'une de ses cases de cette liste
    
    if obj['intervalle']:
        fonct1(3.4585, -3.1232) # rangee 2, 4, 6
        case['decale'] = True
    else:
        fonct1(3, -3.4696) # rangee 1, 3, 5
        case['decale'] = False


Je reviens au script pour le pathfinding, devrais-je ajouter les tuiles dans une liste, qui ferai office de "maze" et quelles informations ?

Contribution le : 08/04 16:57:48
Créer un fichier PDF de la contribution Imprimer


Re: système Sid Meyer like (Civilization)
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2649
Il faudrait que tu stockes un tableau à 2 dimensions de valeurs (une énumération par exemple serait parfaite pour ça). Avant de penser à générer ta map en 3D, tu génères d'abord ce tableau qui représente les données de tes tuiles. Uniquement les données.

Par données, j'entends le type (océan, montagne plaine, forêt, désert, ...). Pour A*, il faut aussi que la case sache ses coordonnées dans la carte. Mais plus tard, tu peux aussi y inclure d'autres informations supplémentaires selon les besoins de ton jeu comme le royaume auquel elle appartient, etc.


Ensuite, une fois que ce tableau est généré, tu t'en sers pour créer ta carte en 3D. Et bien entendu, tu synchronises ce que tu vois avec les données.

Quand tu lances ton algorithme A*, tu utilises les données et non la vue 3D pour les calculs.

Pour dire les choses plus directement encore : il faudrait que tes données puissent être utilisables telles qu'elles sont avec n'importe quel autre affichage. Par exemple, si tu voulais faire un jeu 2D avec PyGame avec le même code.

C'est peut-être ça qui te pose problème pour implémenter l'algorithme A* : tes données ne sont pas clairement distinctes de la vue 3D, et la structure de tes données ne le permet pas non plus.

Contribution le : 08/04 21:43:04
_________________
Venez tester notre projet de Blender clan 2.0 + Tchat (en cours de développement) !
Pourquoi ? Retrouver un forum fonctionnel.
Créer un fichier PDF de la contribution Imprimer


Re: système Sid Meyer like (Civilization)
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 1653
Je me suis réveillé ce matin et j'ai eu une "révélation de ouf guedin".

J'ai effectivement pris le problème dans le mauvais sens: je me suis focalisé sur ce que je vois, or, c'est sur ce que ne je vois pas qu'il faut travailler.

Le maze m'as mit la puce à l'oreille, ce qui m'a permis de trouver tous les liens avec l’algorithme. Il me suffisait de reproduire du 3D au 2D les infos dont le script avait besoin.

Du coup, ça fonctionne pour le programme, mais visuellement, pas encore à 100%. En effet, le maze est composé d'une taille carrée (10x10, ou 9x9 pour python). Or, j'ai des hexagones, ce qui fait 9x5 ou 8x4 en python.

Du coup, quand mes points de passages sont crées, des cases sont "loupée", car j'ai une disposition qui n'est pas "carrée".

Virtuellement, j'ai ceci (j'ai fais exprès pour l'indentation):

map = [[0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0]]


Je pense que c'est cette ligne qui est concernée:

for new_position in [(0, -1), (0, 1), (-1, 0), (1, 0), (-1, -1), (-1, 1), (1, -1), (1, 1)]:


Mais je n'en suis pas sûr. Du coup, je me pose une question: supposons que je veuille créer un jeu complet, devrai-je vraiment utiliser des tuiles, ou plutôt des carrés ? Car au plus simple, le choix est vite fait...

Et au sujet du diagramme Voronoï, si j'anticipe, je suppose que j'aurai un tableau comme pour le maze de A*, et que je devrai mapper sur mes tuiles, ou que je devrai le faire au préalable ?

Mais avant, j'ai testé le script et j'ai cette erreur:

voronoi_map.py", line 144
    if (i.e is not None) and (i.e.x  <> self.x0):
                                      ^
SyntaxError: invalid syntax

Contribution le : 09/04 12:40:24
Créer un fichier PDF de la contribution Imprimer


Re: système Sid Meyer like (Civilization)
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2649
Je crois qu'on s'est compris.

Il y a un décalage entre ce que tu vois (et donc la façon dont tu structures une matrice d'hexagones) et la façon de représenter les données en interne.

Une matrice d'hexagone, c'est un peu comme une matrice de carrés. Il faut juste glisser les cases impaires vers le haut ou vers le bas d'une demi-case :


Mais tu vois sur cette image que si tu mets les cases sur une même ligne, ça te fait toujours un carré. Tu peux en déduire les tuiles adjacentes à tester.


**Tu génères le diagramme de Voronoï. Ca te donnera des cellules. Tu remplis ces cellules avec les hexagones.
Tu utilises les même hexagones pour A*.

Quant à l'opérateur "<>" (différent), il a été remplacé par "!=" dans Python3. Tu peux donc faire cette modification sans que ça ne change le fonctionnement de l'algorithme.


**
EDIT: pour la génération de la map, je vais essayer d'être plus clair.

Tu génères un diagramme de Voronoi de la même taille que tu veux avoir ta map. Si ta map fait 64x48 tuiles, tu génères un diagramme de 64x48 pixels. Chaque pixel représente le type de terrain (terre, montagne, mer). Tu as alors ta map qui est constitué de tuiles et chaque tuile représente déjà le terrain.

Tu utilises ta map de données pour lancer A*.
Pas besoin de faire plusieurs tableaux.

Contribution le : 09/04 13:05:48
_________________
Venez tester notre projet de Blender clan 2.0 + Tchat (en cours de développement) !
Pourquoi ? Retrouver un forum fonctionnel.
Créer un fichier PDF de la contribution Imprimer


Re: système Sid Meyer like (Civilization)
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 1653
Je pense qu'il y a un problème:

Voilà un premier essais

Voilà un deuxième essais.

Qu'en penses-tu ?

Contribution le : 09/04 15:12:35
Créer un fichier PDF de la contribution Imprimer


Re: système Sid Meyer like (Civilization)
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2649
Oui mais il faudrait ton code pour mieux comprendre.

Contribution le : 09/04 15:55:47
_________________
Venez tester notre projet de Blender clan 2.0 + Tchat (en cours de développement) !
Pourquoi ? Retrouver un forum fonctionnel.
Créer un fichier PDF de la contribution Imprimer


Re: système Sid Meyer like (Civilization)
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 1653
Voici le blend

J'utilise la version 2.79b BGE de la BlendFundation.

Tu trouvera les script nécessaires dans le blend. Je pense que tu devra enregistrer (certains) scripts pour que l'import fonctionne.

Contribution le : 09/04 16:19:30
Créer un fichier PDF de la contribution Imprimer


Re: système Sid Meyer like (Civilization)
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2649
J'ai effectué un changement dans l'algorithme car utilisation de tuiles hexagonales. Il faut gérer la différence entre les tuiles de coordonnées Y paire/impaire car les tuiles adjacentes n'ont pas les mêmes coordonnées.

adjacent_coords = []
if (current_node.position[1] % 2 == 0): # Even Y coord
    adjacent_coords = [(-1, -1,), (-1, 0), (-1, +1), (0, -1), (+1, 0), (-1, +1)]
else:                                   # Odd Y coord
    adjacent_coords = [(0, -1), (-1, 0), (0, +1), (+1, -1), (+1, 0), (+1, +1)]
    

for new_position in adjacent_coords: # Adjacent squares
...


Après ça, il semble faire un chemin complet du départ à l'arrivée mais je ne sais pas coder dans le BGE pour les afficher (si je print le path directement en sortie de A*).
Je crois qu'il y a un souci dans la boucle du main() qui gère l'affichage des marqueurs verts mais comme je ne sais pas coder cette partie, je te laisse regarder.

Contribution le : 09/04 20:56:59
_________________
Venez tester notre projet de Blender clan 2.0 + Tchat (en cours de développement) !
Pourquoi ? Retrouver un forum fonctionnel.
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant
« 1 (2) 3 4 5 »




Enregistrer votre réponse
Compte*
Nom   Mot de passe   Authentification
Message:*



[Recherche avancée]



Sujets récemment répondus
Forums Sujets Réponses Lus Dernières contributions
[WIP] et travaux terminés [terminé] Scène de Pti dej à la Française - EVEE a donf - 2.9 Blender    [1][2][3] 23 226 Aujourd'hui 02:57:29
meltingman 
Questions & Réponses [WIP] Problème Rétopo 5 34 Hier 22:37:06
Laorz 
[WIP] et travaux terminés image couteau dans caillou qui saigne 1 17 Hier 22:19:25
meltingman 
Questions & Réponses Placer sa camera sur un HDRI    [1][2] 10 299 Hier 21:32:01
meltingman 
[WIP] et travaux terminés [terminé] Chaussures Très Réalistes (.bend disponible) 5 122 Hier 21:23:47
Crocodile_13 
Le coin des geeks gain de fluidité viewport entre ryzen 3900X et 3950X    [1][2][3] 28 1327 Hier 15:45:54
papillon 
Questions & Réponses hdri en mode ombrage 2 108 Hier 10:27:06
kimlicrea 
Questions & Réponses Modifier les attribue de plusieurs objet en même temps (lumière) 3 64 Hier 10:21:47
kimlicrea 
[WIP] et travaux terminés [terminé] Moderno 404    [1][2] 13 482 23/10 20:26:41
moonboots 
Questions & Réponses Lissage de face 4 78 23/10 19:43:53
Maxence34 
Mes premières images sous Blender (débutants) Première réalisation    [1][2] 15 8980 23/10 02:13:26
Talason 
The Blender Clan 'tchat Addon convertisseur d'images en courbes 2 72 22/10 20:29:31
Rimpotche 
The Blender Clan 'tchat Pour les arboriculteurs 3D 1 75 22/10 18:05:18
moonboots 
Hors Sujet !! Faire parler son personnage en 5 minutes - tutoriel Francais - Blender 2.9 4 133 22/10 13:03:28
meltingman 
GIMP Faire un drégradé selon la forme sous gimp 9 105 22/10 12:49:57
Thewada 
Questions & Réponses [résolu] Perte des Vertex lors d'un Separate 7 105 21/10 21:45:05
debutant 
[WIP] et travaux terminés [terminé] Pantin articulé    [1][2] 12 6767 21/10 18:53:51
meltingman 
Hors Sujet !! Une citrouille en 13 clics - Tutoriel - Blender 2.9 2 165 19/10 23:40:15
meltingman 
Hors Sujet !! un banc de dauphin - tutoriel - workflow sculpte > bake - 2.9    [1][2] 12 467 19/10 23:36:41
meltingman 
Questions & Réponses [résolu] Particule réaliste pour un sprite    [1][2] 12 689 19/10 13:39:34
Redstar 

Qui est en ligne
184 utilisateur(s) en ligne (dont 92 sur Forums)

Membre(s): 0
Invité(s): 184


plus...
Nouveaux membres
BritneyMac 25/10/2020
NBVLatonya 25/10/2020
Mel46E969 25/10/2020
CathyGrims 25/10/2020
KayVergara 25/10/2020
RegenaDene 25/10/2020
Sina 25/10/2020
MaddisonCo 25/10/2020
ElenaChick 25/10/2020
SonyaBidme 24/10/2020
Dernier Ajout
mirages-preview~0.jpg

Evènements à venir
Nov 18
Anniversaire de RichDeg
Dec 29
Anniversaire d'ebrain
Jan 9
BUG de Lyon
plus 264 plus d'élément(s)
 Par Mickaël Guédon [ebrain] © 2003-2020 The Blender Clan - hébergé par TuxFamily - Site déclaré à la CNIL sous le numéro 1155445