Initialisation du rover en début de mission

This commit is contained in:
Philippe Roy 2022-08-24 14:12:23 +02:00
parent 25b3fa3d61
commit 18cdd236a0
7 changed files with 210 additions and 135 deletions

Binary file not shown.

26
rp.py
View File

@ -11,8 +11,8 @@ import threading # Multithreading
import xml.etree.ElementTree as ET # Creating/parsing XML file
import runpy
import rp_map1 as rp_map # waves script
import rp_doc # documentation
import rp_map1 as rp_map # Map definition
import rp_doc # Documentation
# import ct_cmd # user script (commands)
###############################################################################
@ -144,6 +144,7 @@ def terrain_init ():
eevee.use_eevee_smaa = True
# Init de la carte
scene.objects['Map_aim'].setVisible(False,True)
rp_map.map_init()
rp_map.map_reset()
@ -181,7 +182,7 @@ def terrain_run ():
# Démarrage de la map
if scene.objects['Terrain']['thread_cmd']==False:
scene.objects['Terrain']['thread_cmd']=True
rp_map.map_reset() # Mise à zéro des compteurs
rp_map.map_reset()
runpy.run_module('rp_cmd', run_name='start') # Execution du script utilisateur
# Arrêt de la pause
@ -195,6 +196,7 @@ def terrain_run ():
def terrain_stop ():
scene.objects['Terrain']['thread_cmd']=False
rp_map.map_reset()
##
# Fin naturelle du cycle
@ -240,22 +242,22 @@ def terrain_speed (obj):
##
def terrain_grid ():
# pass
if scene.objects['Grid-u'].visible:
scene.objects['Grid-u'].setVisible(False,True)
scene.objects['Grid-v'].setVisible(False,True)
scene.objects['Map_aim'].setVisible(False,True)
else:
scene.objects['Grid-u']['timer'] = 0.3
scene.objects['Grid-u']['timer'] = 0.2
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 =0.3
scene.objects['Grid-u'].setVisible(True,True)
scene.objects['Grid-v'].setVisible(True,True)
scene.objects['Map_aim'].setVisible(True,True)
scene.objects['Grid-u']['anim'] = True
def terrain_grid_anim ():
bpy.data.materials["Grid"].node_tree.nodes["Emission"].inputs[1].default_value =scene.objects['Grid-u']['timer']
scene.objects['Grid-u']['timer']+=0.01
if scene.objects['Grid-u']['timer']== 2:
if scene.objects['Grid-u']['timer']>= 1:
scene.objects['Grid-u']['anim'] = False
###############################################################################
@ -320,7 +322,7 @@ def cmd_init():
scene.objects['Pause'].suspendPhysics()
scene.objects['Pause-Hl'].setVisible(False,False)
scene.objects['Stop-Hl'].setVisible(False,False)
scene.objects['Objective-Hl'].setVisible(False,False)
scene.objects['Aim-Hl'].setVisible(False,False)
scene.objects['Doc-cmd-Hl'].setVisible(False,False)
scene.objects['ResetView-Hl'].setVisible(False,False)
scene.objects['About-cmd-Hl'].setVisible(False,False)
@ -410,7 +412,7 @@ def cmd_hl(cont):
text_hl ={"Run":"Exécuter (F5)",
"Stop":"Stop et initialisation (F6)",
"Pause":"Pause (F5)",
"Objective":"Afficher/cacher l'objectif",
"Aim":"Afficher/cacher l'objectif",
"Doc-cmd":"Documentation",
"ResetView": "Reset de la vue (Touche Début)",
"About-cmd": "A propos",
@ -421,7 +423,7 @@ def cmd_hl(cont):
# text_hl ={"Run":"Run (F5)",
# "Stop":"Stop (F6)",
# "Pause":"Pause (F5)",
# "Distance":"Show objective",
# "Aim":"Show aim",
# "Doc-cmd":"Documentation",
# "ResetView": "Reset view (Home key)",
# "About-cmd": "About",
@ -478,7 +480,7 @@ def cmd_click (cont):
sound_play (snd_click)
terrain_stop ()
if obj.name=="Objective":
if obj.name=="Aim":
sound_play (snd_grid)
terrain_grid ()
@ -860,7 +862,7 @@ def tablet_close ():
# scene.objects['Stop'].setVisible(False,False)
# scene.objects['Stop'].suspendPhysics()
scene.objects['Stop-Hl'].setVisible(False,False)
scene.objects['Objective-Hl'].setVisible(False,False)
scene.objects['Aim-Hl'].setVisible(False,False)
scene.objects['Doc-cmd-Hl'].setVisible(False,False)
scene.objects['ResetView-Hl'].setVisible(False,False)
scene.objects['About-cmd-Hl'].setVisible(False,False)

View File

@ -19,12 +19,18 @@ from rp_lib import * # Bibliothèque Ropy
def commands():
print("Go !!")
rp_sleep (0.5)
rp_gauche()
rp_sleep (0.5)
rp_avancer()
rp_droite()
rp_avancer()
rp_avancer()
rp_avancer()
rp_avancer()
rp_droite()
rp_avancer()
rp_avancer()
rp_sleep (2)
rp_fin()
###############################################################################

View File

@ -3,13 +3,13 @@
<speed>0.25</speed>
<sound>True</sound>
<cam>
<worldPosition.x>0.0057830810546875</worldPosition.x>
<worldPosition.y>-26.440298080444336</worldPosition.y>
<worldPosition.z>20.22315788269043</worldPosition.z>
<worldPosition.x>-8.529211044311523</worldPosition.x>
<worldPosition.y>-2.480304479598999</worldPosition.y>
<worldPosition.z>4.401391983032227</worldPosition.z>
</cam>
</config>
<mission>
<current>3</current>
<success>1</success>
<current>1</current>
<success>0</success>
</mission>
</data>

View File

@ -1,5 +1,6 @@
import bge # Bibliothèque Blender Game Engine (UPBGE)
import aud # Sounds
import rp_map1 # Map definition
###############################################################################
# rp_doc.py
@ -43,71 +44,9 @@ ACTIVATE = bge.logic.KX_INPUT_ACTIVE
# Cards description
card_description ={}
###############################################################################
# Missions
###############################################################################
# ###############################################################################
# # Initialisation du niveau :
# # Niveau 0 : Vide
# # Niveau 1 : Les premiers pas de Ropy
# # Niveau 2 : Sécuriser Ropy
# # Niveau 3 : Partir au bout du monde
# # Niveau 4 : Faire face à l'inconnu
# # Niveau 5 : Se rendre utile
# ###############################################################################
# rp_niveau (1) # Saisir le niveau (de 0 à 5)
# ropy_init.main() # Initialisation de la scène 3D
missions_card=["mission_1-card", "mission_2-card", "mission_3-card", "mission_4-card", "mission_5-card", "mission_6-card", "mission_7-card", "mission_8-card"]
# Mission 1
rp_mission_1_title="Mission 1\n Premiers pas"
rp_mission_1_text="\n \n aa"
card_description.update({"mission_1-card" : [rp_mission_1_title, rp_mission_1_text]})
# ct_build_text = ct_build_text +" \v- category (string) : \n \v \v- \"Archer tower\" (default value)\n \v \v- \"Mage tower\"\n"
# ct_build_text = ct_build_text +" \v- name (string)\n \v- color (RGB tuple, default=purple)\n"
# ct_build_text = ct_build_text +" \v- style (string) : \n \v \v- \"square\" (default value) or \"round\"\n \v \v- version : A (default value), B or C\n \v \v- exemple : 'round-B' \n"
# ct_build_text = ct_build_text +" \v- Return boolean flag (builded -> True)\n\n"
# ct_build_text = ct_build_text +"Predefined colors : blue, green, magenta,\n orange, purple, red, turquoise, yellow.\n\n"
# ct_build_text = ct_build_text +"Exemple : ct_build (1, 1, \"Archer tower\", \n \"Tower #1\", yellow, \"round-A\")\n"
# Mission 2
rp_mission_2_title="Mission 2\n FIXME"
rp_mission_2_text="\n \n FIXME"
card_description.update({"mission_2-card" : [rp_mission_2_title, rp_mission_2_text]})
# Mission 3
rp_mission_3_title="Mission 3\n FIXME"
rp_mission_3_text="\n \n FIXME"
card_description.update({"mission_3-card" : [rp_mission_3_title, rp_mission_3_text]})
# Mission 4
rp_mission_4_title="Mission 4\n FIXME"
rp_mission_4_text="\n \n FIXME"
card_description.update({"mission_4-card" : [rp_mission_4_title, rp_mission_4_text]})
# Mission 5
rp_mission_5_title="Mission 5\n FIXME"
rp_mission_5_text="\n \n FIXME"
card_description.update({"mission_5-card" : [rp_mission_5_title, rp_mission_5_text]})
# Mission 6
rp_mission_6_title="Mission 6\n FIXME"
rp_mission_6_text="\n \n FIXME"
card_description.update({"mission_6-card" : [rp_mission_6_title, rp_mission_6_text]})
# Mission 7
rp_mission_7_title="Mission 7\n FIXME"
rp_mission_7_text="\n \n FIXME"
card_description.update({"mission_7-card" : [rp_mission_7_title, rp_mission_7_text]})
# Mission 8
rp_mission_8_title="Mission 8\n FIXME"
rp_mission_8_text="\n \n FIXME"
card_description.update({"mission_8-card" : [rp_mission_8_title, rp_mission_8_text]})
card_description.update(rp_map1.get_card_description())
missions_card=rp_map1.get_missions_card()
###############################################################################
# Rover

View File

@ -1,4 +1,4 @@
+import bge # Blender Game Engine (UPBGE)
import bge # Blender Game Engine (UPBGE)
import aud # Sounds
import threading # Multithreading
import trace
@ -18,7 +18,7 @@ import random
# @license: GNU GPL
#
# Bibliothèque des actions du robot
# Bibliothèque pour la construction des murs
# Bibliothèque pour la construction des murs
#
# Ropy est destiné à la découverte de la programmation procédurale et du language Python.
# A travers plusieurs challenges, donc de manière graduée, les élèves vont apprendre à manipuler les structures algorithmiques de base et à les coder en Python.
@ -61,6 +61,7 @@ color_kaykit_black = (0.019, 0.032, 0.037, 1)
# sndbuff_life = aud.Sound.cache(snd_life)
threads_cmd=[]
debug_thread = scene.objects['Terrain']['debug_thread']
# UPBGE constants
JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED
@ -109,30 +110,37 @@ class thread_with_trace(threading.Thread):
def thread_start(threads, type_txt, fct):
threads.append(thread_with_trace(target = fct))
threads[len(threads)-1].start()
print ("Thread",type_txt, "#", len(threads)-1, "open.")
if (debug_thread):
print ("Thread",type_txt, "#", len(threads)-1, "open.")
def thread_stop(threads, type_txt):
i=0
zombie_flag=False
for t in threads:
if not t.is_alive():
print ("Thread",type_txt, "#",i,"closed.")
if (debug_thread):
print ("Thread",type_txt, "#",i,"closed.")
else:
print ("Thread",type_txt, "#",i,"still open ...")
if (debug_thread):
print ("Thread",type_txt, "#",i,"still open ...")
t.kill()
t.join()
if not t.is_alive():
print ("Thread",type_txt, "#",i,"killed.")
if (debug_thread):
print ("Thread",type_txt, "#",i,"killed.")
else:
print ("Thread",type_txt, "#",i,"zombie...")
if (debug_thread):
print ("Thread",type_txt, "#",i,"zombie...")
zombie_flag=True
i +=1
if zombie_flag==False:
print ("All threads",type_txt, "are closed.")
if (debug_thread):
print ("All threads",type_txt, "are closed.")
scene.objects['Terrain']['thread_cmd']=False
return True
else:
print ("There are zombies threads",type_txt, ".")
if (debug_thread):
print ("There are zombies threads",type_txt, ".")
return False
def thread_cmd_start(fct):
@ -142,8 +150,8 @@ def thread_cmd_stop():
thread_stop(threads_cmd, "commands")
def rp_end():
rp_sleep (0.5)
print ("Thread commands is arrived.")
if (debug_thread):
print ("Thread commands is arrived.")
scene.objects['Terrain']['thread_cmd']=False
def rp_fin():
@ -185,6 +193,7 @@ def rp_avancer ():
obj.worldPosition=[x0+step, y0, z0]
if round(obj.worldOrientation.to_euler().z, 2) == round(-math.pi/2,2) or round(obj.worldOrientation.to_euler().z, 2) == round(3*(math.pi/2),2) : # Ouest
obj.worldPosition=[x0-step, y0, z0]
rp_sleep (0.25)
##
# Tourner à gauche
@ -195,6 +204,7 @@ def rp_gauche ():
step=math.pi/2 # Pas angulaire
obj=scene.objects['Rover']
obj.applyRotation((0, 0, step), True)
rp_sleep (0.25)
##
# Tourner à droite
@ -205,6 +215,7 @@ def rp_droite ():
step=math.pi/2 # Pas angulaire
obj=scene.objects['Rover']
obj.applyRotation((0, 0, -step), True)
rp_sleep (0.25)
##
# Marquer
@ -250,6 +261,20 @@ def rover_radar ():
def rover_colision ():
pass
###############################################################################
# Temporisation
###############################################################################
def rp_sleep (duration):
# time.sleep(duration*(1/scene.objects['Terrain']['speed']))
time.sleep(duration)
# def ct_tempo (duration):
# scene.objects['Terrain']['delay_cmd']=0
# while scene.objects['Terrain']['delay_cmd']<duration*(1/scene.objects['Terrain']['speed']):
# # print("Temporization commands :",scene.objects['Terrain']['delay_cmd'])
# time.sleep(0.001)
# # pass
# ###############################################################################
# # Waves (minions)
@ -720,22 +745,6 @@ def rover_colision ():
# scene.objects['Terrain']['scene_tile_noncontruct'].append([math.ceil(x),math.floor(y)])
# scene.objects['Terrain']['scene_tile_noncontruct'].append([math.ceil(x),math.ceil(y)])
###############################################################################
# Temporisation
###############################################################################
def rp_sleep (duration):
# time.sleep(duration*(1/scene.objects['Terrain']['speed']))
time.sleep(duration)
# def ct_tempo (duration):
# scene.objects['Terrain']['delay_cmd']=0
# while scene.objects['Terrain']['delay_cmd']<duration*(1/scene.objects['Terrain']['speed']):
# # print("Temporization commands :",scene.objects['Terrain']['delay_cmd'])
# time.sleep(0.001)
# # pass
# ###############################################################################
# # Affichage
# ###############################################################################

View File

@ -16,6 +16,86 @@ import os
scene = bge.logic.getCurrentScene()
###############################################################################
# Missions
###############################################################################
missions_card_description ={}
missions_conf ={}
###############################################################################
# Initialisation du niveau :
# Niveau 0 : Vide
# Niveau 1 : Les premiers pas de Ropy
# Niveau 2 : Sécuriser Ropy
# Niveau 3 : Partir au bout du monde
# Niveau 4 : Faire face à l'inconnu
# Niveau 5 : Se rendre utile
###############################################################################
# rp_niveau (1) # Saisir le niveau (de 0 à 5)
# ropy_init.main() # Initialisation de la scène 3D
missions_card=["mission_1-card", "mission_2-card", "mission_3-card", "mission_4-card", "mission_5-card", "mission_6-card", "mission_7-card", "mission_8-card"]
# Mission 1
mission_1_title="Mission 1\n Premiers pas"
mission_1_text="\n \n aa"
missions_card_description.update({"mission_1-card" : [mission_1_title, mission_1_text]})
mission_1_init=[-11.0,3.0, "e"] # Rover init position (x,y), orientation ("n|s|e|w")
mission_1_aim=[-7.0,2.0] # Aim position (x,y)
missions_conf.update({"1" : [mission_1_init, mission_1_aim]})
# ct_build_text = ct_build_text +" \v- category (string) : \n \v \v- \"Archer tower\" (default value)\n \v \v- \"Mage tower\"\n"
# ct_build_text = ct_build_text +" \v- name (string)\n \v- color (RGB tuple, default=purple)\n"
# ct_build_text = ct_build_text +" \v- style (string) : \n \v \v- \"square\" (default value) or \"round\"\n \v \v- version : A (default value), B or C\n \v \v- exemple : 'round-B' \n"
# ct_build_text = ct_build_text +" \v- Return boolean flag (builded -> True)\n\n"
# ct_build_text = ct_build_text +"Predefined colors : blue, green, magenta,\n orange, purple, red, turquoise, yellow.\n\n"
# ct_build_text = ct_build_text +"Exemple : ct_build (1, 1, \"Archer tower\", \n \"Tower #1\", yellow, \"round-A\")\n"
# Mission 2
mission_2_title="Mission 2\n FIXME"
mission_2_text="\n \n FIXME"
missions_card_description.update({"mission_2-card" : [mission_2_title, mission_2_text]})
# Mission 3
mission_3_title="Mission 3\n FIXME"
mission_3_text="\n \n FIXME"
missions_card_description.update({"mission_3-card" : [mission_3_title, mission_3_text]})
# Mission 4
mission_4_title="Mission 4\n FIXME"
mission_4_text="\n \n FIXME"
missions_card_description.update({"mission_4-card" : [mission_4_title, mission_4_text]})
# Mission 5
mission_5_title="Mission 5\n FIXME"
mission_5_text="\n \n FIXME"
missions_card_description.update({"mission_5-card" : [mission_5_title, mission_5_text]})
# Mission 6
mission_6_title="Mission 6\n FIXME"
mission_6_text="\n \n FIXME"
missions_card_description.update({"mission_6-card" : [mission_6_title, mission_6_text]})
# Mission 7
mission_7_title="Mission 7\n FIXME"
mission_7_text="\n \n FIXME"
missions_card_description.update({"mission_7-card" : [mission_7_title, mission_7_text]})
# Mission 8
mission_8_title="Mission 8\n FIXME"
mission_8_text="\n \n FIXME"
missions_card_description.update({"mission_8-card" : [mission_8_title, mission_8_text]})
# Description des cartes missions
def get_missions_card():
return missions_card
def get_card_description():
return missions_card_description
###############################################################################
# Map
###############################################################################
@ -35,34 +115,73 @@ def map_init():
# directory=os.path.join(file_path, inner_path),
# filename=object_name)
# Rover
# obj=scene.objects['Rover']
# applyRotationTo(obj, None, None, 0.0, True)
# Reset counters
# Reset de la map
def map_reset():
scene.objects['Points']['step']=0
scene.objects['Points']['nbligne']=0
# scene.objects['Points']['lifes']=10
# scene.objects['Points']['lifes_max']=10
# scene.objects['Points']['coins']=0
# scene.objects['Points']['level']=0
# scene.objects['Points']['level_max']=1
# scene.objects['Points']['minions']=0
# scene.objects['Points']['minions_run']=0
# scene.objects['Points']['wave']=1
# Mission
if scene.objects['Terrain']['mission_current']==1:
mission_init= mission_1_init
mission_aim= mission_1_aim
# Initialisation du rover
obj = scene.objects['Rover']
obj.worldPosition.x = mission_init[0]
obj.worldPosition.y = mission_init[1]
obj.worldPosition.z = 0.2
applyRotationTo(obj, 0, 0, 0, True)
if mission_init[2] == "n":
obj.applyRotation((0, 0, math.pi), True)
if mission_init[2] == "e":
obj.applyRotation((0, 0, math.pi/2), True)
if mission_init[2] == "w":
obj.applyRotation((0, 0, -math.pi/2), True)
# ###############################################################################
# # Initialisation du niveau :
# # Niveau 0 : Vide
# # Niveau 1 : Les premiers pas de Ropy
# # Niveau 2 : Sécuriser Ropy
# # Niveau 3 : Partir au bout du monde
# # Niveau 4 : Faire face à l'inconnu
# # Niveau 5 : Se rendre utile
# ###############################################################################
# Initialisation des objectifs
obj_aim = scene.objects['Map_aim']
obj_aim.worldPosition.x = mission_aim[0]
obj_aim.worldPosition.y = mission_aim[1]
obj_aim.worldPosition.z = 0.5
# rp_niveau (1) # Saisir le niveau (de 0 à 5)
# ropy_init.main() # Initialisation de la scène 3D
# Initialization
def map_aim_near(cont):
print ("Goall !!")
###############################################################################
# Fonction bas niveau
###############################################################################
##
# Atteindre une orientation
##
def applyRotationTo(obj, rx=None, ry=None, rz=None, Local=True):
rres=0.001 # resolution rotation
# x
if rx is not None:
while (abs(rx-obj.worldOrientation.to_euler().x) > rres) :
if obj.worldOrientation.to_euler().x-rx > rres:
obj.applyRotation((-rres, 0, 0), Local)
if rx-obj.worldOrientation.to_euler().x > rres:
obj.applyRotation((rres, 0, 0), Local)
# print ("delta x ",rx-obj.worldOrientation.to_euler().x)
# y
if ry is not None:
while (abs(ry-obj.worldOrientation.to_euler().y) > rres) :
if obj.worldOrientation.to_euler().y-ry > rres:
obj.applyRotation((0, -rres, 0), Local)
if ry-obj.worldOrientation.to_euler().y > rres:
obj.applyRotation((0, rres, 0), Local)
# print ("delta y ",ry-obj.worldOrientation.to_euler().y)
# z
if rz is not None:
while (abs(rz-obj.worldOrientation.to_euler().z) > rres) :
if obj.worldOrientation.to_euler().z-rz > rres:
obj.applyRotation((0, 0, -rres), Local)
if rz-obj.worldOrientation.to_euler().z > rres:
obj.applyRotation((0, 0, rres), Local)
# print ("delta z ",rz-obj.worldOrientation.to_euler().z)