import bge # Bibliothèque Blender Game Engine (UPBGE) import rp_map1 # Map definition ############################################################################### # rp_doc.py # @title: Documentation du Rover Ropy # @project: Ropy (Blender-EduTech) # @lang: fr # @authors: Philippe Roy # @copyright: Copyright (C) 2020-2022 Philippe Roy # @license: GNU GPL # # 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. # # ############################################################################### scene = bge.logic.getCurrentScene() # Colors color_doc_chap = (0, 1, 0.857,1) # Turquoise color_doc_fct = (0, 1, 0.857,1) # Turquoise color_doc_hl = (0.799, 0.617, 0.021, 1) # Jaune color_doc_activate = (0.936, 0.033, 1, 1) # Rose color_doc_mission = (1, 0.192, 0.03, 1) # Orange # UPBGE constants JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED JUST_RELEASED = bge.logic.KX_INPUT_JUST_RELEASED ACTIVATE = bge.logic.KX_INPUT_ACTIVE # JUST_DEACTIVATED = bge.logic.KX_SENSOR_JUST_DEACTIVATED # Cards description card_description ={} # Missions card_description.update(rp_map1.get_card_description()) missions_card=rp_map1.get_missions_card() ################################################################################ # Documentation Rover ################################################################################ rover_card=["avancer-card", "tourner-card", "baliser-card", "detecter-card", "radar-card"] rover_card=rover_card+["speed-card", "paint-card", "battery-card", "beacon-card"] # Avancer rp_avancer_title="Avancer" rp_avancer_text=" rp_avancer() \n -> Avance d'un pas en avant." rp_avancer_type="standard" card_description.update({"avancer-card" : [rp_avancer_title, rp_avancer_text, rp_avancer_type]}) # Tourner rp_tourner_title="Tourner" rp_tourner_text=" rp_gauche() \n -> Tourne à gauche (90°).\n \n" rp_tourner_text=rp_tourner_text + " rp_droite() \n -> Tourne à droite (90°)." rp_tourner_type="standard" card_description.update({"tourner-card" : [rp_tourner_title, rp_tourner_text, rp_tourner_type]}) # Baliser rp_baliser_title="Baliser" rp_baliser_text=" rp_marquer() \n -> Place une balise sur la case. \n \n Ropy possède que 40 balises, \n il ne peut pas en poser plus." rp_baliser_type="standard" card_description.update({"baliser-card" : [rp_baliser_title, rp_baliser_text, rp_baliser_type]}) # Détecter rp_detecter_title="Détecter" rp_detecter_text=" rp_detect() \n -> Détecte un obstacle.\n \n La fonction retourne : \n - \"True\" si il a un obstacle, \n - \"False\" si il n'y a pas d'obstacle." rp_detecter_type="standard" card_description.update({"detecter-card" : [rp_detecter_title, rp_detecter_text, rp_detecter_type]}) # Radar rp_radar_title="Radar" rp_radar_text="FIXME" rp_radar_type="standard" card_description.update({"radar-card" : [rp_radar_title, rp_radar_text, rp_radar_type]}) # Speed - Vitesse rp_speed_title="Vitesse" rp_speed_text="FIXME" rp_speed_type="upgrade" card_description.update({"speed-card" : [rp_speed_title, rp_speed_text, rp_speed_type]}) # Paint - Peinture rp_paint_title="Peinture" rp_paint_text="FIXME" rp_paint_type="upgrade" card_description.update({"paint-card" : [rp_paint_title, rp_paint_text, rp_paint_type]}) # Battery + - Batterie + rp_battery_title="Batterie +" rp_battery_text="FIXME" rp_battery_type="upgrade" card_description.update({"battery-card" : [rp_battery_title, rp_battery_text, rp_battery_type]}) # Beacon + - Balise + rp_beacon_title="Balise +" rp_beacon_text="FIXME" rp_beacon_type="upgrade" card_description.update({"beacon-card" : [rp_beacon_title, rp_beacon_text, rp_beacon_type]}) ############################################################################### # Documentation Python ############################################################################### python_card=["fonction-card", "alternative-card", "boucle-card"] # python_card=["fonction-card", "alternative-card", "boucle-card", "liste-card", "dict-card", "poo-card"] # Fonction rp_fonction_title="Fonction" rp_fonction_text=" La définition d'une fonction se fait \n avec \"def\". La fonction peut \n renvoyer une valeur avec \"return\". \n \n" rp_fonction_text=rp_fonction_text + " def fonction_1 (arguments) : \n instruction_1 \n instruction_2 \n ....\n return valeurs_renvoyées \n\n" rp_fonction_text=rp_fonction_text + " Les arguments sont des données \n transmises à la fonction." card_description.update({"fonction-card" : [rp_fonction_title, rp_fonction_text]}) # Alternative rp_alternative_title="Alternative" rp_alternative_text=" L'alternative permet d'éxécuter des \n instructions en fonction d'un test. \n" rp_alternative_text=rp_alternative_text + " Elle se programme en suivant la \n suite : si ... alors ... sinon ... où \n" rp_alternative_text=rp_alternative_text + " \"si\" est \"if \" et \"sinon\" est \"else\". \n \n" rp_alternative_text=rp_alternative_text + " if condition :\n" rp_alternative_text=rp_alternative_text + " instruction_1\n" rp_alternative_text=rp_alternative_text + " else : \n" rp_alternative_text=rp_alternative_text + " instruction_2\n \n" rp_alternative_text=rp_alternative_text + "Le sinon (\"else\") est facultatif. \n\n" card_description.update({"alternative-card" : [rp_alternative_title, rp_alternative_text]}) # Boucles rp_boucle_title="Boucles" rp_boucle_text=" Il y a deux types de boucle : \n - avec \"for\" pour définir un nombre \n de répétition (ici N), \n - avec \"while\" (tant que) pour \n prendre en compte une condition. \n \n" rp_boucle_text=rp_boucle_text + " for i in range (n) : \n instruction \n \n" rp_boucle_text=rp_boucle_text + " while condition : \n instruction \n \n" card_description.update({"boucle-card" : [rp_boucle_title, rp_boucle_text]}) # Liste rp_liste_title="Liste" rp_liste_text="FIXME" card_description.update({"liste-card" : [rp_liste_title, rp_liste_text]}) # Dictionnaire rp_dict_title="Dictionnaire" rp_dict_text="FIXME" card_description.update({"dict-card" : [rp_dict_title, rp_dict_text]}) # Objet (POO) rp_poo_title="Programmation\norientée objet (POO)" rp_poo_text="\nFIXME" card_description.update({"poo-card" : [rp_poo_title, rp_poo_text]}) ############################################################################### # Interface ############################################################################### ## # Initialisation de la tablette ## def init(): # Mettre les couleurs sur les icones (chapitres et cartes) chap=("general", "missions", "rover", "python") for page in chap: scene.objects["Doc-"+page].color = color_doc_chap scene.objects["Doc-"+page+"-text"].color = color_doc_chap for i in range(len(missions_card)): scene.objects[missions_card[i]].color = color_doc_fct scene.objects[missions_card[i]+"-icon"].color = color_doc_fct scene.objects[missions_card[i]+"-text"].color = color_doc_fct for i in range(len(rover_card)): scene.objects[rover_card[i]].color = color_doc_fct scene.objects[rover_card[i]+"-icon"].color = color_doc_fct scene.objects[rover_card[i]+"-text"].color = color_doc_fct for i in range(len(python_card)): scene.objects[python_card[i]].color = color_doc_fct scene.objects[python_card[i]+"-icon"].color = color_doc_fct scene.objects[python_card[i]+"-text"].color = color_doc_fct scene.objects['Book_level_button'].color = color_doc_chap scene.objects['Book_level_button'].setVisible(False,True) scene.objects["mission_"+str(scene.objects['Points']['mission'])+"-card"].color = color_doc_mission scene.objects["mission_"+str(scene.objects['Points']['mission'])+"-card-icon"].color = color_doc_mission scene.objects["mission_"+str(scene.objects['Points']['mission'])+"-card-text"].color = color_doc_mission # Mémorisation de la position des pages chap=("general", "missions", "rover", "python") for page in chap: scene.objects["Doc_chap-"+page]['init_lx']=scene.objects["Doc_chap-"+page].worldPosition.x scene.objects["Doc_chap-"+page]['init_ly']=scene.objects["Doc_chap-"+page].worldPosition.y scene.objects["Doc_chap-"+page]['init_lz']=scene.objects["Doc_chap-"+page].worldPosition.z # Page par défaut scene.objects['Doc']['page_chap'] = "general" ## # Ouvrir la tablette ## def open(): # Placer la tablette # scene.objects['Doc'].worldPosition = [0, -21, 15.75] scene.objects['Doc'].worldPosition = [0, -21, 15.8] scene.objects['Doc_close'].color = color_doc_chap scene.objects['Doc'].setVisible(True,True) scene.objects['Doc_title'].setVisible(False,True) scene.objects['Doc_text'].setVisible(False,True) # Placer le nouveau chapitre name_chap = scene.objects['Doc']['page_chap'] scene.objects['Doc-'+name_chap].color = color_doc_activate scene.objects['Doc-'+name_chap+'-text'].color = color_doc_activate scene.objects['Doc_chap-'+name_chap].worldPosition = scene.objects['Doc'].worldPosition scene.objects['Doc_chap-'+name_chap].setVisible(True,True) # Affichage ou pas du bouton de selection de la mission if name_chap == "missions": name_fct = scene.objects['Doc_chap-missions']['page_fct'] if name_fct !="": if scene.objects[name_fct]['mission'] <= scene.objects['Points']['level'] and scene.objects[name_fct]['mission'] != scene.objects['Points']['mission']: scene.objects['Book_level_button'].setVisible(True,True) else: scene.objects['Book_level_button'].setVisible(False,True) else: scene.objects['Book_level_button'].setVisible(False,True) # Upgrade if name_chap == "rover": upgrade_card=("battery", "beacon", "paint", "speed") for i in range(len(upgrade_card)): if scene.objects['Points']['upgrade_'+upgrade_card[i]]==True: scene.objects[upgrade_card[i]+'-card'].setVisible(True,True) scene.objects[upgrade_card[i]+'-card_colbox'].restorePhysics() else: scene.objects[upgrade_card[i]+'-card'].setVisible(False,True) scene.objects[upgrade_card[i]+'-card_colbox'].suspendPhysics() # Afficher le texte de la carte active if name_chap != "general": if scene.objects['Doc_chap-'+name_chap]['page_fct'] !="": name_fct = scene.objects['Doc_chap-'+name_chap]['page_fct'] scene.objects['Doc_title']['Text'] = card_description[name_fct][0] scene.objects['Doc_text']['Text'] = card_description[name_fct][1] scene.objects['Doc_title'].setVisible(True, False) scene.objects['Doc_text'].setVisible(True, False) else: scene.objects['Doc_title'].setVisible(False,True) scene.objects['Doc_text'].setVisible(False,True) else: if name_chap != "missions": scene.objects['Doc_title'].setVisible(False,True) scene.objects['Doc_text'].setVisible(False,True) else: scene.objects['Doc_title'].setVisible(False,True) scene.objects['Doc_text'].setVisible(False,True) ## # Fermeture du livre ## def close(): # sound_play (sndbuff_book_close) chap=("general", "missions", "rover", "python") for page in chap: scene.objects["Doc_chap-"+page].setVisible(False,True) scene.objects["Doc_chap-"+page].worldPosition.x = scene.objects["Doc_chap-"+page]['init_lx'] scene.objects["Doc_chap-"+page].worldPosition.y = scene.objects["Doc_chap-"+page]['init_ly'] scene.objects["Doc_chap-"+page].worldPosition.z = scene.objects["Doc_chap-"+page]['init_lz'] scene.objects['Doc'].setVisible(False,True) scene.objects['Doc'].worldPosition = [35, -2, 2] ## # Highlight du livre ## def hl (cont): # Activation if cont.sensors['MO'].status == JUST_ACTIVATED : obj = cont.owner name=obj.name[:-7] name_text=name+"-text" name_icon=name+"-icon" # Close if name == "Doc_close" or name == "Book_level_button": scene.objects[name].color = color_doc_hl else: if "Doc-" in name : # Chapitre if name[4:] == scene.objects['Doc']['page_chap']: scene.objects[name].color = color_doc_activate scene.objects[name_text].color = color_doc_activate else: scene.objects[name].color = color_doc_hl scene.objects[name_text].color = color_doc_hl else: # Carte name_chap = scene.objects['Doc']['page_chap'] if name == scene.objects['Doc_chap-'+name_chap]['page_fct'] : scene.objects[name].color = color_doc_activate scene.objects[name_text].color = color_doc_activate scene.objects[name_icon].color = color_doc_activate else: scene.objects[name].color = color_doc_hl scene.objects[name_text].color = color_doc_hl scene.objects[name_icon].color = color_doc_hl # Désactivation if cont.sensors['MO'].status == JUST_RELEASED : obj = cont.owner name=obj.name[:-7] name_text=obj.name[:-7]+"-text" name_icon=obj.name[:-7]+"-icon" # Close if name == "Doc_close" or name == "Book_level_button": scene.objects[name].color = color_doc_fct else: if "Doc-" in name : # Chapitre if name[4:] == scene.objects['Doc']['page_chap']: scene.objects[name].color = color_doc_activate scene.objects[name_text].color = color_doc_activate else: scene.objects[name].color = color_doc_fct scene.objects[name_text].color = color_doc_fct else: # Carte name_chap = scene.objects['Doc']['page_chap'] if name == scene.objects['Doc_chap-'+name_chap]['page_fct'] : scene.objects[name].color = color_doc_activate scene.objects[name_text].color = color_doc_activate scene.objects[name_icon].color = color_doc_activate else: if name == "mission_"+str(scene.objects['Points']['mission'])+"-card": scene.objects[name].color = color_doc_mission scene.objects[name_text].color = color_doc_mission scene.objects[name_icon].color = color_doc_mission else: scene.objects[name].color = color_doc_fct scene.objects[name_text].color = color_doc_fct scene.objects[name_icon].color = color_doc_fct ## # Afficher le chapitre ## def chapter(cont): if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive and cont.sensors['Click'].positive: # sound_play (sndbuff_book_flip) obj = cont.owner # Enlever l'ancien chapitre scene.objects['Doc-'+scene.objects['Doc']['page_chap']].color = color_doc_chap scene.objects['Doc-'+scene.objects['Doc']['page_chap']+'-text'].color = color_doc_chap scene.objects["Doc_chap-"+scene.objects['Doc']['page_chap']].worldPosition.x = scene.objects["Doc_chap-"+scene.objects['Doc']['page_chap']]['init_lx'] scene.objects["Doc_chap-"+scene.objects['Doc']['page_chap']].worldPosition.y = scene.objects["Doc_chap-"+scene.objects['Doc']['page_chap']]['init_ly'] scene.objects["Doc_chap-"+scene.objects['Doc']['page_chap']].worldPosition.z = scene.objects["Doc_chap-"+scene.objects['Doc']['page_chap']]['init_lz'] # Placer le nouveau chapitre name_chap= obj.name[4:-7] scene.objects['Doc-'+name_chap].color = color_doc_activate scene.objects['Doc-'+name_chap+'-text'].color = color_doc_activate scene.objects['Doc']['page_chap'] = name_chap scene.objects['Doc_chap-'+name_chap].worldPosition = scene.objects['Doc'].worldPosition scene.objects['Doc_chap-'+name_chap].setVisible(True,True) # Bouton de selection de la mission if name_chap == "missions": name_fct = scene.objects['Doc_chap-missions']['page_fct'] if name_fct !="": if scene.objects[name_fct]['mission'] <= scene.objects['Points']['level'] and scene.objects[name_fct]['mission'] != scene.objects['Points']['mission']: scene.objects['Book_level_button'].setVisible(True,True) else: scene.objects['Book_level_button'].setVisible(False,True) else: scene.objects['Book_level_button'].setVisible(False,True) # Upgrade if name_chap == "rover": upgrade_card=("battery", "beacon", "paint", "speed") for i in range(len(upgrade_card)): if scene.objects['Points']['upgrade_'+upgrade_card[i]]==True: scene.objects[upgrade_card[i]+'-card'].setVisible(True,True) scene.objects[upgrade_card[i]+'-card-colbox'].restorePhysics() else: scene.objects[upgrade_card[i]+'-card'].setVisible(False,True) scene.objects[upgrade_card[i]+'-card-colbox'].suspendPhysics() # Afficher le texte de la carte active if name_chap != "general": if scene.objects['Doc_chap-'+name_chap]['page_fct'] !="": name_fct = scene.objects['Doc_chap-'+name_chap]['page_fct'] scene.objects['Doc_title']['Text'] = card_description[name_fct][0] scene.objects['Doc_text']['Text'] = card_description[name_fct][1] scene.objects['Doc_title'].setVisible(True, False) scene.objects['Doc_text'].setVisible(True, False) else: scene.objects['Doc_title'].setVisible(False,True) scene.objects['Doc_text'].setVisible(False,True) else: scene.objects['Doc_title'].setVisible(False,True) scene.objects['Doc_text'].setVisible(False,True) ## # Afficher les details de la fonction à partir d'une carte ## def card (cont): if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive : # sound_play (sndbuff_book_flip) obj = cont.owner name_chap = scene.objects['Doc']['page_chap'] name_fct= obj.name[:-7] scene.objects['Doc_title']['Text'] = " " scene.objects['Doc_text']['Text'] = " " # Enlever l'ancienne carte if scene.objects['Doc_chap-'+name_chap]['page_fct'] !="": # Placer la carte de la mission active if scene.objects['Doc_chap-'+name_chap]['page_fct'] == "mission_"+str(scene.objects['Points']['mission'])+"-card": scene.objects[scene.objects['Doc_chap-'+name_chap]['page_fct']].color = color_doc_mission scene.objects[scene.objects['Doc_chap-'+name_chap]['page_fct']+'-text'].color = color_doc_mission scene.objects[scene.objects['Doc_chap-'+name_chap]['page_fct']+'-icon'].color = color_doc_mission else: scene.objects[scene.objects['Doc_chap-'+name_chap]['page_fct']].color = color_doc_fct scene.objects[scene.objects['Doc_chap-'+name_chap]['page_fct']+'-text'].color = color_doc_fct scene.objects[scene.objects['Doc_chap-'+name_chap]['page_fct']+'-icon'].color = color_doc_fct # Afficher le texte de la carte scene.objects['Doc_chap-'+name_chap]['page_fct'] = name_fct scene.objects[name_fct].color = color_doc_activate scene.objects[name_fct+'-icon'].color = color_doc_activate scene.objects[name_fct+'-text'].color = color_doc_activate scene.objects['Doc_title']['Text'] = card_description[name_fct][0] scene.objects['Doc_text']['Text'] = card_description[name_fct][1] scene.objects['Doc_title'].setVisible(True, False) scene.objects['Doc_text'].setVisible(True, False) # Sélection de la mission if "mission_" in name_fct : if scene.objects[name_fct]['mission'] <= scene.objects['Points']['level'] and scene.objects[name_fct]['mission'] != scene.objects['Points']['mission']: scene.objects['Book_level_button'].setVisible(True,True) else: scene.objects['Book_level_button'].setVisible(False,True) ## # Sélectionner le niveau ## def level_button (cont): if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive : # sound_play (sndbuff_book_flip) obj = cont.owner name_fct = scene.objects['Doc_chap-missions']['page_fct'] if name_fct !="": mission_select=scene.objects[name_fct]['mission'] if mission_select <= scene.objects['Points']['level'] and mission_select != scene.objects['Points']['mission']: scene.objects["mission_"+str(scene.objects['Points']['mission'])+"-card"].color = color_doc_fct scene.objects["mission_"+str(scene.objects['Points']['mission'])+"-card-icon"].color = color_doc_fct scene.objects["mission_"+str(scene.objects['Points']['mission'])+"-card-text"].color = color_doc_fct scene.objects['Points']['mission'] = mission_select scene.objects['Points-Map-text']['Text']="Mission "+str(scene.objects['Points']['mission']) scene.objects['Book_mission']['Text'] = "Mission en cours : "+str(scene.objects['Points']['mission']) scene.objects['Book_level_button'].setVisible(False,True) ## # Sounds ## def sound_play (sound): pass # FIXME # if scene.objects['Commands']['sound']: # audiodev.play(sound)