Suppression du déplacement de Ropy (glitch) avant le dépilage (patch de Julliand Gregory <Gregory.Julliand@ac-grenoble.fr>)

This commit is contained in:
Philippe Roy 2022-04-21 14:27:31 +02:00
parent 0144adcd77
commit 7d42c19c33

View File

@ -3,19 +3,19 @@ import math
import time import time
############################################################################### ###############################################################################
# ropy_lib.py # ropy_lib :
# @title: Bibliothèque du Robot Ropy (rp_*) # @title: Bibliothèque du Robot Ropy (rp_*)
# @project: Blender-EduTech # @project: Ropy (RobotProg pour Python)
# @lang: fr # @lang: fr
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr> # @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
# @copyright: Copyright (C) 2020-2022 Philippe Roy # @copyright: Copyright (C) 2020 Philippe Roy
# @license: GNU GPL # @license: GNU GPL
# #
# Bibliothèque des actions du robot # 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. # Ropy est destiné à la découverte de la programmation procédurale et du language Python en SNT (2nde en lycée).
# 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. # A travers plusieurs challenges, donc de manière graduée, les élèves vont apprendre à manipuler les structures algoritmiques de base et à les coder en Python.
# #
############################################################################### ###############################################################################
@ -46,6 +46,10 @@ def rp_init_position():
obj.worldPosition.z = 1.25 obj.worldPosition.z = 1.25
print('\x1b[6;30;47m', "Placer le robot case (X,Y) :", x, y, '\x1b[0m') print('\x1b[6;30;47m', "Placer le robot case (X,Y) :", x, y, '\x1b[0m')
#MODIF
obj['x'],obj['y'] = x,y
obj['d'] = 1 #est
# Pile des mouvements # Pile des mouvements
# obj['mvts'] = "" # obj['mvts'] = ""
# obj['mvt_i'] = 0 # obj['mvt_i'] = 0
@ -82,20 +86,32 @@ def rp_print_position():
############################################################################### ###############################################################################
# Moteur physique # Moteur physique
# Détection des colisions aves les murs # Détection des collisions aves les murs
############################################################################### ###############################################################################
# Détection d'une colision # Détection d'une collision
# rpcore_ : fonction bas niveau # rpcore_ : fonction bas niveau
def rpcore_detect_mur(debug_flag=False): def rpcore_detect_mur(debug_flag=False):
# Vecteur du mouvement # Vecteur du mouvement
init_x = round(obj.worldPosition.y/3+5.5) #MODIF
init_y = round(-obj.worldPosition.x/3+5.5) init_x,init_y = obj['x'],obj['y']
obj.applyMovement((0, -pas, 0), True) final_x,final_y = init_x,init_y
final_x = round(obj.worldPosition.y/3+5.5) direction = obj['d']
final_y = round(-obj.worldPosition.x/3+5.5) if direction == 0: #nord
obj.applyMovement((0, pas, 0), True) final_y+=1
elif direction == 1: #est
final_x+=1
elif direction == 2: #sud
final_y-=1
elif direction == 3: #ouest
final_x-=1
#init_x = round(obj.worldPosition.y/3+5.5)
#init_y = round(-obj.worldPosition.x/3+5.5)
#obj.applyMovement((0, -pas, 0), True)
#final_x = round(obj.worldPosition.y/3+5.5)
#final_y = round(-obj.worldPosition.x/3+5.5)
#obj.applyMovement((0, pas, 0), True)
# Calcul du centre du mouvement # Calcul du centre du mouvement
mov_xc =init_x + (final_x - init_x)/2-0.5 mov_xc =init_x + (final_x - init_x)/2-0.5
@ -160,24 +176,44 @@ def rp_detect_mur():
# Avancer # Avancer
def rp_avancer(debug_flag=False): def rp_avancer(debug_flag=False):
obj.visible=False obj.visible=False
if obj['detruit']!=True:
#MODIF
if obj['detruit']!=True and obj['d'] >= 0:
# Vecteur du mouvement # Vecteur du mouvement
init_x = round(obj.worldPosition.y/3+5.5) #MODIF
init_y = round(-obj.worldPosition.x/3+5.5) init_x,init_y = obj['x'],obj['y']
obj.applyMovement((0, -pas, 0), True) final_x,final_y = init_x,init_y
final_x = round(obj.worldPosition.y/3+5.5) direction = obj['d']
final_y = round(-obj.worldPosition.x/3+5.5) if direction == 0: #nord
obj.applyMovement((0, pas, 0), True) final_y+=1
elif direction == 1: #est
final_x+=1
elif direction == 2: #sud
final_y-=1
elif direction == 3: #ouest
final_x-=1
#init_x = round(obj.worldPosition.y/3+5.5)
#init_y = round(-obj.worldPosition.x/3+5.5)
#obj.applyMovement((0, -pas, 0), True)
#final_x = round(obj.worldPosition.y/3+5.5)
#final_y = round(-obj.worldPosition.x/3+5.5)
#obj.applyMovement((0, pas, 0), True)
# Test des murs # Test des murs
if rpcore_detect_mur(debug_flag) == True: if rpcore_detect_mur(debug_flag) == True:
print('\x1b[6;30;41m', "Avancer case (X,Y) -> case (X,Y) :", init_x,",",init_y,"->",final_x,",",final_y, '\x1b[0m') print('\x1b[6;30;41m', "Avancer case (X,Y) -> case (X,Y) :", init_x,",",init_y,"->",final_x,",",final_y, '\x1b[0m')
print('\x1b[6;30;41m', "Bling, blang ... L'aventure de Ropy s'arrête donc ici ...", '\x1b[0m') print('\x1b[6;30;41m', "Bling, blang ... L'aventure de Ropy s'arrête donc ici ...", '\x1b[0m')
obj['mvts'] = obj['mvts']+"c" obj['mvts'] = obj['mvts']+"c"
obj['detruit']=True
#MODIF
obj['d'] = -1
#obj['detruit']=True
else: else:
obj.applyMovement((0, -pas, 0), True) #MODIF
obj['x'],obj['y']=final_x,final_y
#obj.applyMovement((0, -pas, 0), True)
obj['mvts'] = obj['mvts']+"a" obj['mvts'] = obj['mvts']+"a"
print('\x1b[6;30;42m', "Avancer case (X,Y) -> case (X,Y) :", init_x,",",init_y,"->",final_x,",",final_y, '\x1b[0m') print('\x1b[6;30;42m', "Avancer case (X,Y) -> case (X,Y) :", init_x,",",init_y,"->",final_x,",",final_y, '\x1b[0m')
@ -193,9 +229,15 @@ def rp_avancer(debug_flag=False):
# Tourner à droite # Tourner à droite
def rp_droite(): def rp_droite():
# obj.visible=False # obj.visible=False
if obj['detruit']!=True:
#MODIF
if obj['detruit']!=True and obj['d'] >= 0:
# scene.objects['Robot'].applyRotation((0, 0, -pas_rot), True) # scene.objects['Robot'].applyRotation((0, 0, -pas_rot), True)
obj.applyRotation((0, 0, -pas_rot), True)
#MODIF
#obj.applyRotation((0, 0, -pas_rot), True)
obj['d'] = (obj['d']+1)%4
obj['mvts'] = obj['mvts']+"d" obj['mvts'] = obj['mvts']+"d"
print('\x1b[6;30;42m', "Tourner à droite", '\x1b[0m') print('\x1b[6;30;42m', "Tourner à droite", '\x1b[0m')
# print("Orientation : ", obj.worldOrientation.to_euler().z) # print("Orientation : ", obj.worldOrientation.to_euler().z)
@ -203,9 +245,15 @@ def rp_droite():
# Tourner à gauche # Tourner à gauche
def rp_gauche(): def rp_gauche():
# obj.visible=False # obj.visible=False
if obj['detruit']!=True:
#MODIF
if obj['detruit']!=True and obj['d'] >= 0:
# scene.objects['Robot'].applyRotation((0, 0, pas_rot), True) # scene.objects['Robot'].applyRotation((0, 0, pas_rot), True)
obj.applyRotation((0, 0, pas_rot), True)
#MODIF
obj['d'] = (obj['d']+3)%4
#obj.applyRotation((0, 0, pas_rot), True)
obj['mvts'] = obj['mvts']+"g" obj['mvts'] = obj['mvts']+"g"
print('\x1b[6;30;42m', "Tourner à gauche", '\x1b[0m') print('\x1b[6;30;42m', "Tourner à gauche", '\x1b[0m')
# print("Orientation : ", obj.worldOrientation.to_euler().z) # print("Orientation : ", obj.worldOrientation.to_euler().z)
@ -214,12 +262,20 @@ def rp_gauche():
def rp_orientation(orientation): def rp_orientation(orientation):
if orientation=="nord": if orientation=="nord":
obj.applyRotation((0, 0, -obj.worldOrientation.to_euler().z-math.pi/2), True) obj.applyRotation((0, 0, -obj.worldOrientation.to_euler().z-math.pi/2), True)
#MODIF
obj['d']=0
if orientation=="sud": if orientation=="sud":
obj.applyRotation((0, 0, -obj.worldOrientation.to_euler().z+math.pi/2), True) obj.applyRotation((0, 0, -obj.worldOrientation.to_euler().z+math.pi/2), True)
#MODIF
obj['d']=2
if orientation=="est": if orientation=="est":
obj.applyRotation((0, 0, -obj.worldOrientation.to_euler().z+math.pi), True) obj.applyRotation((0, 0, -obj.worldOrientation.to_euler().z+math.pi), True)
#MODIF
obj['d']=1
if orientation=="ouest": if orientation=="ouest":
obj.applyRotation((0, 0, -obj.worldOrientation.to_euler().z), True) obj.applyRotation((0, 0, -obj.worldOrientation.to_euler().z), True)
#MODIF
obj['d']=3
# print("Orientation : ", obj.worldOrientation.to_euler().z) # print("Orientation : ", obj.worldOrientation.to_euler().z)
############################################################################### ###############################################################################