Ajout des zones (aimzone et initzone).

This commit is contained in:
Philippe Roy 2022-09-24 04:53:54 +02:00
parent d2de5620d4
commit c180fe5033
6 changed files with 113 additions and 45 deletions

BIN
ropy-17.blend Normal file

Binary file not shown.

17
rp.py
View File

@ -157,7 +157,6 @@ def terrain_init ():
eevee.use_eevee_smaa = True eevee.use_eevee_smaa = True
# Création des balises # Création des balises
scene.objects['Map_aim'].setVisible(False,True)
scene.objects['Terrain']['map_tile_beacon']= [] scene.objects['Terrain']['map_tile_beacon']= []
# for i in range (500): # for i in range (500):
for i in range (100): for i in range (100):
@ -282,20 +281,24 @@ def terrain_grid ():
scene.objects['Grid-u'].setVisible(False,True) scene.objects['Grid-u'].setVisible(False,True)
scene.objects['Grid-v'].setVisible(False,True) scene.objects['Grid-v'].setVisible(False,True)
rp_map.aim_hide() rp_map.aim_hide()
scene.objects['Map_aim'].setVisible(False,True)
else: else:
scene.objects['Grid-u']['timer'] = 0 scene.objects['Grid-u']['timer'] = 0
bpy.data.materials["Grid"].node_tree.nodes["Shader de mélange"].inputs[0].default_value = 0 bpy.data.materials["Grid"].node_tree.nodes["Shader de mélange"].inputs[0].default_value = 0
bpy.data.materials["Grid-Yellow"].node_tree.nodes["Shader de mélange"].inputs[0].default_value = 0
bpy.data.materials["Grid-Green"].node_tree.nodes["Shader de mélange"].inputs[0].default_value = 0
bpy.data.materials["Grid-Holo"].node_tree.nodes["Émission"].inputs[1].default_value = 0 bpy.data.materials["Grid-Holo"].node_tree.nodes["Émission"].inputs[1].default_value = 0
# bpy.data.materials["Grid-Holo-Yellow"].node_tree.nodes["Émission"].inputs[1].default_value = 5
# bpy.data.materials["Grid"].node_tree.nodes["Emission"].inputs[1].default_value =scene.objects['Grid-u']['timer'] # bpy.data.materials["Grid"].node_tree.nodes["Emission"].inputs[1].default_value =scene.objects['Grid-u']['timer']
scene.objects['Grid-u'].setVisible(True,True) scene.objects['Grid-u'].setVisible(True,True)
scene.objects['Grid-v'].setVisible(True,True) scene.objects['Grid-v'].setVisible(True,True)
# scene.objects['Map_aim'].setVisible(True,True)
scene.objects['Grid-u']['anim'] = True scene.objects['Grid-u']['anim'] = True
def terrain_grid_anim (): def terrain_grid_anim ():
bpy.data.materials["Grid"].node_tree.nodes["Shader de mélange"].inputs[0].default_value=scene.objects['Grid-u']['timer'] bpy.data.materials["Grid"].node_tree.nodes["Shader de mélange"].inputs[0].default_value=scene.objects['Grid-u']['timer']
bpy.data.materials["Grid-Yellow"].node_tree.nodes["Shader de mélange"].inputs[0].default_value=scene.objects['Grid-u']['timer']
bpy.data.materials["Grid-Green"].node_tree.nodes["Shader de mélange"].inputs[0].default_value=scene.objects['Grid-u']['timer']
bpy.data.materials["Grid-Holo"].node_tree.nodes["Émission"].inputs[1].default_value =scene.objects['Grid-u']['timer']*5 bpy.data.materials["Grid-Holo"].node_tree.nodes["Émission"].inputs[1].default_value =scene.objects['Grid-u']['timer']*5
# bpy.data.materials["Grid-Holo-Yellow"].node_tree.nodes["Émission"].inputs[1].default_value =scene.objects['Grid-u']['timer']*5
# bpy.data.materials["Grid"].node_tree.nodes["Emission"].inputs[1].default_value =scene.objects['Grid-u']['timer'] # bpy.data.materials["Grid"].node_tree.nodes["Emission"].inputs[1].default_value =scene.objects['Grid-u']['timer']
scene.objects['Grid-u']['timer']+=0.01 scene.objects['Grid-u']['timer']+=0.01
if scene.objects['Grid-u']['timer']>= 0.05 and scene.objects['Grid-u'].visible : if scene.objects['Grid-u']['timer']>= 0.05 and scene.objects['Grid-u'].visible :
@ -365,7 +368,7 @@ def cmd_init():
scene.objects['Pause'].suspendPhysics() scene.objects['Pause'].suspendPhysics()
scene.objects['Pause-Hl'].setVisible(False,False) scene.objects['Pause-Hl'].setVisible(False,False)
scene.objects['Stop-Hl'].setVisible(False,False) scene.objects['Stop-Hl'].setVisible(False,False)
scene.objects['Aim-Hl'].setVisible(False,False) scene.objects['Aim-cmd-Hl'].setVisible(False,False)
scene.objects['Doc-cmd-Hl'].setVisible(False,False) scene.objects['Doc-cmd-Hl'].setVisible(False,False)
scene.objects['ResetView-Hl'].setVisible(False,False) scene.objects['ResetView-Hl'].setVisible(False,False)
scene.objects['About-cmd-Hl'].setVisible(False,False) scene.objects['About-cmd-Hl'].setVisible(False,False)
@ -459,7 +462,7 @@ def cmd_hl(cont):
text_hl ={"Run":"Exécuter (F5)", text_hl ={"Run":"Exécuter (F5)",
"Stop":"Stop et initialisation (F6)", "Stop":"Stop et initialisation (F6)",
"Pause":"Pause (F5)", "Pause":"Pause (F5)",
"Aim":"Afficher/cacher l'objectif", "Aim-cmd":"Afficher/cacher l'objectif",
"Doc-cmd":"Documentation", "Doc-cmd":"Documentation",
"ResetView": "Reset de la vue (Touche Début)", "ResetView": "Reset de la vue (Touche Début)",
"About-cmd": "A propos", "About-cmd": "A propos",
@ -527,7 +530,7 @@ def cmd_click (cont):
sound_play (snd_click) sound_play (snd_click)
terrain_stop () terrain_stop ()
if obj.name=="Aim": if obj.name=="Aim-cmd":
sound_play (snd_grid) sound_play (snd_grid)
terrain_grid () terrain_grid ()
@ -929,7 +932,7 @@ def tablet_close ():
# scene.objects['Stop'].setVisible(False,False) # scene.objects['Stop'].setVisible(False,False)
# scene.objects['Stop'].suspendPhysics() # scene.objects['Stop'].suspendPhysics()
scene.objects['Stop-Hl'].setVisible(False,False) scene.objects['Stop-Hl'].setVisible(False,False)
scene.objects['Aim-Hl'].setVisible(False,False) scene.objects['Aim-cmd-Hl'].setVisible(False,False)
scene.objects['Doc-cmd-Hl'].setVisible(False,False) scene.objects['Doc-cmd-Hl'].setVisible(False,False)
scene.objects['ResetView-Hl'].setVisible(False,False) scene.objects['ResetView-Hl'].setVisible(False,False)
scene.objects['About-cmd-Hl'].setVisible(False,False) scene.objects['About-cmd-Hl'].setVisible(False,False)

View File

@ -26,6 +26,14 @@ def mrp_avancer():
rp_avancer() rp_avancer()
rp_marquer() rp_marquer()
def mrp_avancer_nbpas(pas):
for i in range (pas):
mrp_avancer()
def mrp_avancer_mur():
while rp_detect()==False:
mrp_avancer()
############################################################################### ###############################################################################
# Commandes # Commandes
############################################################################### ###############################################################################
@ -35,11 +43,12 @@ def commandes():
print("Go !!") print("Go !!")
rp_marquer() rp_marquer()
rp_gauche() rp_gauche()
for i in range (19): mrp_avancer_mur()
mrp_avancer() rp_droite()
mrp_avancer_mur()
rp_gauche() rp_gauche()
for i in range (5): mrp_avancer_mur()
mrp_avancer() print ("fin")
rp_fin() rp_fin()

View File

@ -3,13 +3,13 @@
<speed>10.0</speed> <speed>10.0</speed>
<sound>False</sound> <sound>False</sound>
<cam> <cam>
<worldPosition.x>8.954777717590332</worldPosition.x> <worldPosition.x>2.1837825775146484</worldPosition.x>
<worldPosition.y>-41.523250579833984</worldPosition.y> <worldPosition.y>-27.433191299438477</worldPosition.y>
<worldPosition.z>40.40361404418945</worldPosition.z> <worldPosition.z>21.05629539489746</worldPosition.z>
</cam> </cam>
</config> </config>
<mission> <mission>
<current>4</current> <current>6</current>
<level>5</level> <level>6</level>
</mission> </mission>
</data> </data>

View File

@ -429,7 +429,7 @@ def rp_detect ():
# Pas de mouvement si colision ou objectif # Pas de mouvement si colision ou objectif
if obj['stop']: if obj['stop']:
return False return True
# Points et console # Points et console
print ("rp_detect") print ("rp_detect")
@ -622,8 +622,8 @@ def rover_goal ():
rp_tempo (0.1) rp_tempo (0.1)
# Level # Level
print ("scene.objects['Points']['mission'] :", scene.objects['Points']['mission']) # print ("scene.objects['Points']['mission'] :", scene.objects['Points']['mission'])
print ("scene.objects['Points']['level'] :", scene.objects['Points']['level']) # print ("scene.objects['Points']['level'] :", scene.objects['Points']['level'])
if scene.objects['Points']['mission']==scene.objects['Points']['level']: if scene.objects['Points']['mission']==scene.objects['Points']['level']:
scene.objects['Points']['level']+=1 scene.objects['Points']['level']+=1

View File

@ -1,5 +1,6 @@
import bge # Bibliothèque Blender Game Engine (UPBGE) import bge # Bibliothèque Blender Game Engine (UPBGE)
import bpy # Blender import bpy # Blender
import random
from rp_lib import * # Bibliothèque Ropy from rp_lib import * # Bibliothèque Ropy
import os import os
@ -62,15 +63,15 @@ mission_3_title="Mission 3\n Apprendre le danger"
mission_3_text="\n \n Tout d'abords, il faut provoquer une \n collision avec un obstacle (pente \n ou station) et observer ce qui se \n passe.\n \n" mission_3_text="\n \n Tout d'abords, il faut provoquer une \n collision avec un obstacle (pente \n ou station) et observer ce qui se \n passe.\n \n"
mission_3_text= mission_3_text + " Il faut donc sécuriser Ropy en \n utilisant une structure alternative. \n -> Voir onglet Python, page \"Si alors\" \n -> Voir onglet Rover, page \"Détecter\" \n \n" mission_3_text= mission_3_text + " Il faut donc sécuriser Ropy en \n utilisant une structure alternative. \n -> Voir onglet Python, page \"Si alors\" \n -> Voir onglet Rover, page \"Détecter\" \n \n"
mission_3_init=[-11.0,3.0, "e"] # Rover init position (x,y), orientation ("n|s|e|w") mission_3_init=[-11.0,3.0, "e"] # Rover init position (x,y), orientation ("n|s|e|w")
mission_3_aim=[100.0,100.0] # Aim caché mission_3_aim=[100.0,100.0] # Aim caché -> pas de de position objectif
missions_card_description.update({"mission_3-card" : [mission_3_title, mission_3_text]}) missions_card_description.update({"mission_3-card" : [mission_3_title, mission_3_text]})
missions_conf.update({"3" : [mission_3_init, mission_3_aim]}) missions_conf.update({"3" : [mission_3_init, mission_3_aim]})
# Mission 4 # Mission 4
mission_4_title="Mission 4\n Partir au bout du monde" mission_4_title="Mission 4\n Partir au bout du monde"
mission_4_text="\n \n Ropy est maintenant prêt pour \n l'aventure soit atteindre la case \n du nouvel objectif (loin, très loin ...). \n \n Pour un tel voyage, l'utilisation \n d'une boucle s'impose. \n" mission_4_text="\n \n Ropy est maintenant prêt pour \n l'aventure soit atteindre la case \n du nouvel objectif (loin, très loin ...). \n \n Pour un tel voyage, l'utilisation \n d'une boucle du type \"for\" s'impose. \n"
mission_4_text= mission_4_text +" -> Voir onglet Python, page \"Boucle\" \n \n \n \n \n" mission_4_text= mission_4_text +" -> Voir onglet Python, page \"Boucle\" \n \n \n \n \n"
mission_4_init=[-7.0,4.0, "s"] mission_4_init=[-7.0,4.0, "e"]
mission_4_aim=[12.0,9.0] mission_4_aim=[12.0,9.0]
missions_card_description.update({"mission_4-card" : [mission_4_title, mission_4_text]}) missions_card_description.update({"mission_4-card" : [mission_4_title, mission_4_text]})
missions_conf.update({"4" : [mission_4_init, mission_4_aim]}) missions_conf.update({"4" : [mission_4_init, mission_4_aim]})
@ -78,10 +79,10 @@ missions_conf.update({"4" : [mission_4_init, mission_4_aim]})
# Mission 5 # Mission 5
mission_5_title="Mission 5\n Faire face à l'inconnu" mission_5_title="Mission 5\n Faire face à l'inconnu"
mission_5_text="\n \n La case à atteindre est toujours la \n même, mais le lieu de départ change \n à chaque fois. \n \n" mission_5_text="\n \n La case à atteindre est toujours la \n même, mais le lieu de départ change \n à chaque fois. \n \n"
mission_5_text= mission_5_text +" Pour pallier à l\'aléatoire, vous \n utiliserez les pentes (obstacle) du \n terrain." mission_5_text= mission_5_text +" Pour pallier à l\'aléatoire, vous \n utiliserez les pentes comme obstacle. \n"
mission_5_text= mission_5_text +" Il faudra alors créer une \n fonction avec une boucle \"tant que\" \n qui permet d'avancer jusqu'à un \n obstacle :" mission_5_text= mission_5_text +" Il faut alors créer une fonction \n avec une boucle \"while\" (tant que) \n qui permet d'avancer jusqu'à un \n obstacle :"
mission_5_text= mission_5_text +" \"mrp_avancer_mur()\". \n \n \n" mission_5_text= mission_5_text +" \"mrp_avancer_mur()\". \n \n \n"
mission_5_init=[-7.0,4.0, "s"] # FIXME position aléatoire mission_5_init=[0.0,0.0, "e"] # Position aléatoire tourné vers l'est -> défini dans le reset
mission_5_aim=[12.0,9.0] mission_5_aim=[12.0,9.0]
missions_card_description.update({"mission_5-card" : [mission_5_title, mission_5_text]}) missions_card_description.update({"mission_5-card" : [mission_5_title, mission_5_text]})
missions_conf.update({"5" : [mission_5_init, mission_5_aim]}) missions_conf.update({"5" : [mission_5_init, mission_5_aim]})
@ -89,8 +90,8 @@ missions_conf.update({"5" : [mission_5_init, mission_5_aim]})
# Mission 6 # Mission 6
mission_6_title="Mission 6\n Se rendre utile" mission_6_title="Mission 6\n Se rendre utile"
mission_6_text="\n \n Une zone précise du terrain présente \n des pierres à analyser. \n \n Elles apparaissent de manière \n aléatoire (encore !), pour les \n ramasser, Ropy doit passer sur \n toutes les cases de la zone. \n \n \n \n \n \n \n" mission_6_text="\n \n Une zone précise du terrain présente \n des pierres à analyser. \n \n Elles apparaissent de manière \n aléatoire (encore !), pour les \n ramasser, Ropy doit passer sur \n toutes les cases de la zone. \n \n \n \n \n \n \n"
mission_6_init=[-7.0,4.0, "s"] # FIXME position aléatoire mission_6_init=[0.0,0.0, "e"] # Position aléatoire tourné vers l'est -> défini dans le reset
mission_6_aim=[9.0,11.0] # FIXME plusieurs objectifs avec des positions aléatoires mission_6_aim=[100.0,100.0] # Aim caché -> rammassage de pierre
missions_card_description.update({"mission_6-card" : [mission_6_title, mission_6_text]}) missions_card_description.update({"mission_6-card" : [mission_6_title, mission_6_text]})
missions_conf.update({"6" : [mission_6_init, mission_6_aim]}) missions_conf.update({"6" : [mission_6_init, mission_6_aim]})
@ -118,7 +119,10 @@ def get_card_description():
# Map # Map
############################################################################### ###############################################################################
##
# Initialization # Initialization
##
def map_init(): def map_init():
scene.objects['Terrain']['size'] = [-15,-11,15,10] # Map size scene.objects['Terrain']['size'] = [-15,-11,15,10] # Map size
scene.objects['Terrain']['map_tile_montain']= [] scene.objects['Terrain']['map_tile_montain']= []
@ -126,6 +130,12 @@ def map_init():
for obj_i in scene.objects: for obj_i in scene.objects:
if "terrain_sideCliff" in obj_i.name or "terrain_sideCorner" in obj_i.name or "terrain_sideCornerInner" in obj_i.name: if "terrain_sideCliff" in obj_i.name or "terrain_sideCorner" in obj_i.name or "terrain_sideCornerInner" in obj_i.name:
scene.objects['Terrain']['map_tile_montain'].append([round(obj_i.worldPosition.x), round(obj_i.worldPosition.y)]) scene.objects['Terrain']['map_tile_montain'].append([round(obj_i.worldPosition.x), round(obj_i.worldPosition.y)])
# Cacher les zones
scene.objects['Aim'].setVisible(False,True)
scene.objects['Initzone-mission-5'].setVisible(False,True)
scene.objects['Aimzone-mission-6'].setVisible(False,True)
# print (scene.objects['Terrain']['map_tile_montain']) # print (scene.objects['Terrain']['map_tile_montain'])
# i=0 # i=0
# for i_xy in scene.objects['Terrain']['map_tile_montain']: # for i_xy in scene.objects['Terrain']['map_tile_montain']:
@ -143,7 +153,10 @@ def map_init():
# directory=os.path.join(file_path, inner_path), # directory=os.path.join(file_path, inner_path),
# filename=object_name) # filename=object_name)
##
# Reset de la map # Reset de la map
##
def map_reset(): def map_reset():
scene.objects['Points']['step']=0 scene.objects['Points']['step']=0
scene.objects['Points']['nbligne']=0 scene.objects['Points']['nbligne']=0
@ -171,9 +184,25 @@ def map_reset():
if mission_init[2] == "w": if mission_init[2] == "w":
obj.applyRotation((0, 0, -math.pi/2), True) obj.applyRotation((0, 0, -math.pi/2), True)
# Initialisation du rover pour les missions 5 et 6 : position aléatoire entre -3.0 ; 5.0 et 1.0 ; -10.0
if scene.objects['Points']['mission']==5 or scene.objects['Points']['mission']==6:
position_ok=False
while position_ok==False: # Exclusion de certaines cases
obj.worldPosition.x = random.randint(-3,1)
obj.worldPosition.y = random.randint(-10,5)
position_ok=True
if obj.worldPosition.x== 0 and obj.worldPosition.y== -10:
position_ok=False
if obj.worldPosition.x== 1 and obj.worldPosition.y== -8:
position_ok=False
if obj.worldPosition.x== 1 and obj.worldPosition.y== -9:
position_ok=False
if obj.worldPosition.x== 1 and obj.worldPosition.y== -10:
position_ok=False
# Initialisation des objectifs # Initialisation des objectifs
scene.objects['Terrain']['map_aim']= [[mission_aim[0],mission_aim[1]]] scene.objects['Terrain']['map_aim']= [[mission_aim[0],mission_aim[1]]]
obj_aim = scene.objects['Map_aim'] obj_aim = scene.objects['Aim']
obj_aim.worldPosition.x = mission_aim[0] obj_aim.worldPosition.x = mission_aim[0]
obj_aim.worldPosition.y = mission_aim[1] obj_aim.worldPosition.y = mission_aim[1]
obj_aim.worldPosition.z = 0.5 obj_aim.worldPosition.z = 0.5
@ -188,17 +217,33 @@ def map_reset():
## ##
def aim_show(): def aim_show():
if scene.objects['Points']['mission']==3 :
scene.objects['Map_aim'].setVisible(False,True) # Zone de départ
if scene.objects['Points']['mission']==5 or scene.objects['Points']['mission']==6:
scene.objects['Initzone-mission-5'].setVisible(True,True)
else: else:
scene.objects['Map_aim'].setVisible(True,True) scene.objects['Initzone-mission-5'].setVisible(False,True)
# Cible
if scene.objects['Points']['mission']==3 or scene.objects['Points']['mission']==6:
scene.objects['Aim'].setVisible(False,True)
else:
scene.objects['Aim'].setVisible(True,True)
# Zone cible
if scene.objects['Points']['mission']==6:
scene.objects['Aimzone-mission-6'].setVisible(True,True)
else:
scene.objects['Aimzone-mission-6'].setVisible(False,True)
## ##
# Cacher l'objectif # Cacher l'objectif
## ##
def aim_hide(): def aim_hide():
scene.objects['Map_aim'].setVisible(False,True) scene.objects['Aim'].setVisible(False,True)
scene.objects['Aimzone-mission-6'].setVisible(False,True)
scene.objects['Initzone-mission-5'].setVisible(False,True)
## ##
# Validation de l'objectif atteint # Validation de l'objectif atteint
@ -218,7 +263,7 @@ def objectif_control(x,y):
if len(scene.objects['Terrain']['map_tile_beacon'])>=6: # 6 balises posées mini if len(scene.objects['Terrain']['map_tile_beacon'])>=6: # 6 balises posées mini
if scene.objects['Points']['nbligne'] <=40: # 40 lignes de code maxi if scene.objects['Points']['nbligne'] <=40: # 40 lignes de code maxi
txt=["def mrp_avancer():", "def mrp_avancer() :", "def mrp_avancer ():", "def mrp_avancer () :"] # Présence de "def mrp_avancer():" txt=["def mrp_avancer():", "def mrp_avancer() :", "def mrp_avancer ():", "def mrp_avancer () :"] # Présence de "def mrp_avancer():"
if rp_cmd_txtcount(txt): if rp_cmd_txtcount(txt, 1):
return True return True
# Mission 3 (structure alternative) # Mission 3 (structure alternative)
@ -228,14 +273,31 @@ def objectif_control(x,y):
if scene.objects['Points']['mission']==4: if scene.objects['Points']['mission']==4:
if [x,y] in scene.objects['Terrain']['map_aim']: # Aim if [x,y] in scene.objects['Terrain']['map_aim']: # Aim
if scene.objects['Points']['nbligne'] <=40: # 40 lignes de code maxi if scene.objects['Points']['nbligne'] <=40: # 40 lignes de code maxi
txt=["for" ] # Présence de "for i in range" 2x
if rp_cmd_txtcount(txt, 2):
txt=["in range" ]
if rp_cmd_txtcount(txt, 2):
return True
else:
txt=["def mrp_avancer_nbpas"] # Présence de "def mrp_avancer_nbpas"
if rp_cmd_txtcount(txt, 1):
return True return True
# Mission 5 (boucle en while) # Mission 5 (boucle en while)
if scene.objects['Points']['mission']==5: if scene.objects['Points']['mission']==5:
return False if [x,y] in scene.objects['Terrain']['map_aim']: # Aim
if scene.objects['Points']['nbligne'] <=40: # 40 lignes de code maxi
txt=["while" ] # Présence de "while" 2x
if rp_cmd_txtcount(txt, 2):
return True
else:
txt=["def mrp_avancer_mur():", "def mrp_avancer_mur() :", "def mrp_avancer_mur ():", "def mrp_avancer_mur () :"] # Présence de "def mrp_avancer_mur():"
if rp_cmd_txtcount(txt, 1):
return True
# Mission 6 (passer sur tout le terrain) # Mission 6 (passer sur tout le terrain)
if scene.objects['Points']['mission']==6: if scene.objects['Points']['mission']==6:
# FIXME
return False return False
return False return False
@ -249,20 +311,14 @@ def objectif_control(x,y):
# Recherche de texte dans le script # Recherche de texte dans le script
## ##
def rp_cmd_txtcount (text_list): def rp_cmd_txtcount (text_list, n):
# print (os.getcwd()) # print (os.getcwd())
file = open('rp_cmd.py', 'r') file = open('rp_cmd.py', 'r')
file_txt = file.read() file_txt = file.read()
print (file_txt)
for text in text_list: for text in text_list:
# print ("text :", text) if file_txt.count (text) >= n:
# print ("file_txt.count (text) :", file_txt.count (text))
if file_txt.count (text) >0:
# print ("Recherche de ",text," dans le script 'rp_cmd.py' -> True")
file.close() file.close()
return True return True
# else:
# print ("Recherche de ",text," dans le script 'rp_cmd.py' -> False")
file.close() file.close()
return False return False