2022-04-06 06:25:03 +02:00
# import importlib
2022-04-03 06:21:42 +02:00
# import imp
2022-03-29 14:12:58 +02:00
import bge # Blender Game Engine (UPBGE)
import bpy # Blender
import aud # Sounds
2022-03-10 01:08:08 +01:00
import math
import time
import sys
2022-03-23 00:27:11 +01:00
import os
2022-03-10 01:08:08 +01:00
import webbrowser
import threading # Multithreading
2022-03-23 00:27:11 +01:00
import xml . etree . ElementTree as ET # Creating/parsing XML file
2022-04-06 06:25:03 +02:00
import runpy
2022-03-10 01:08:08 +01:00
2022-04-03 06:21:42 +02:00
import ct_map1 as ct_map # waves script
# import ct_cmd # user script (commands)
2022-03-10 01:08:08 +01:00
###############################################################################
# ct.py
2022-03-20 05:57:07 +01:00
# @title: the CodeTower game
2022-04-01 01:34:54 +02:00
# @project: CodeTower
2022-03-24 17:00:09 +01:00
# @lang: fr,en
2022-03-10 01:08:08 +01:00
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
# @copyright: Copyright (C) 2022 Philippe Roy
# @license: GNU GPL
2022-04-01 01:34:54 +02:00
#
# This game is a tower defense coding game. The towers are driven by Python code.
2022-03-10 01:08:08 +01:00
# Ce simulateur est un jeu du type tower defense où les tours sont à piloter par la programmation Python.
2022-03-30 03:10:33 +02:00
#
# Commands trigged by button : cmd_*
# Commands trigged by 3D scene objects : scn_*
# Commands trigged by user (student or map designer) : ct_*
# 3D scene manipulation : manip_*
2022-03-10 01:08:08 +01:00
#
###############################################################################
2022-04-03 21:15:43 +02:00
sys . setrecursionlimit ( 10 * * 5 ) # Limite sur la récursivité (valeur par défaut : 1000) -> segfault de Blender
2022-04-06 06:25:03 +02:00
# Dynamic import user file
# importlib.invalidate_caches()
2022-04-03 06:21:42 +02:00
# ct_map = importlib.import_module('ct_map1') # Waves script
2022-04-06 06:25:03 +02:00
# ct_cmd = importlib.import_module('ct_cmd') # User script (commands) -> segfault de Blender
2022-03-10 01:08:08 +01:00
2022-03-29 14:12:58 +02:00
# UPBGE scene
2022-03-10 01:08:08 +01:00
scene = bge . logic . getCurrentScene ( )
2022-03-29 14:12:58 +02:00
eevee = bpy . context . scene . eevee
2022-04-03 06:21:42 +02:00
fps_time = 0.0
2022-03-23 00:27:11 +01:00
2022-03-29 14:12:58 +02:00
# Config file
2022-03-23 00:27:11 +01:00
# print (os.getcwd())
ct_config = ET . parse ( ' ct_config.xml ' )
ct_config_tree = ct_config . getroot ( )
2022-03-10 01:08:08 +01:00
2022-03-29 14:12:58 +02:00
# Colors
2022-04-03 06:21:42 +02:00
color_magenta = ( 0.800 , 0.005 , 0.315 , 1 )
color_orange = ( 0.799 , 0.130 , 0.063 , 1 )
color_white = ( 0.8 , 0.8 , 0.8 , 1 )
color_yellow = ( 0.8 , 0.619 , 0.021 , 1 )
color_black = ( 0 , 0 , 0 , 1 )
2022-03-10 01:08:08 +01:00
2022-04-03 06:21:42 +02:00
color_kaykit_black = ( 0.019 , 0.032 , 0.037 , 1 )
2022-03-30 03:10:33 +02:00
2022-04-03 06:21:42 +02:00
color_endbanner_bluelight = ( 0.361 , 0.527 , 0.716 , 1 )
color_endbanner_bluedark = ( 0.130 , 0.254 , 0.407 , 1 )
2022-03-10 01:08:08 +01:00
2022-04-03 06:21:42 +02:00
color_text = ( 0 , 0 , 0 , 1 ) # Noir
color_text_red = ( 0.799 , 0.031 , 0.038 , 1 )
color_text_orange = ( 0.799 , 0.176 , 0.054 , 1 )
color_text_yellow = ( 0.799 , 0.617 , 0.021 , 1 )
2022-03-23 00:27:11 +01:00
2022-04-03 06:21:42 +02:00
color_cmd = ( 0.8 , 0.8 , 0.8 , 1 ) # blanc
color_cmd_hl = ( 0.8 , 0.619 , 0.021 , 1 ) # jaune
2022-04-03 21:15:43 +02:00
# color_link = (0.024, 0.006, 0.8, 1) # bleu
# color_link_hl = (0.8, 0.005, 0.315, 1) # majenta
color_link = ( 0.799 , 0.617 , 0.021 , 1 )
color_link_hl = ( 0.8 , 0.8 , 0.8 , 1 )
2022-03-10 01:08:08 +01:00
2022-03-29 14:12:58 +02:00
# Sounds
audiodev = aud . Device ( )
snd_click = aud . Sound ( ' asset/sounds/click.ogg ' )
sndbuff_click = aud . Sound . cache ( snd_click )
snd_construct = aud . Sound ( ' asset/sounds/click_construct.ogg ' )
sndbuff_construct = aud . Sound . cache ( snd_construct )
2022-03-10 01:08:08 +01:00
2022-03-29 14:12:58 +02:00
# UPBGE constants
2022-03-10 01:08:08 +01:00
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
2022-03-11 00:21:00 +01:00
###############################################################################
2022-03-23 00:27:11 +01:00
# Tour
2022-03-11 00:21:00 +01:00
###############################################################################
2022-03-23 00:27:11 +01:00
# Commande pour afficher la position de la tour de construction
def cmd_tower_construct ( cont ) :
2022-03-11 00:21:00 +01:00
obj = cont . owner
obj_Hl = scene . objects [ obj . name + " -Hl " ]
if cont . sensors [ ' Click ' ] . status == JUST_ACTIVATED and cont . sensors [ ' MO ' ] . positive and scene . objects [ ' Terrain ' ] [ ' manip_mode ' ] == 0 :
2022-03-29 14:12:58 +02:00
audiodev . play ( sndbuff_construct )
2022-03-11 00:21:00 +01:00
if scene . objects [ ' Terrain ' ] [ ' construct_mode ' ] == True :
scene . objects [ ' Terrain ' ] [ ' construct_mode ' ] = False
obj . worldScale = [ 1 , 1 , 1 ]
2022-03-24 17:00:09 +01:00
obj . color = color_cmd
2022-03-11 00:21:00 +01:00
obj_Hl . worldScale = [ 1 , 1 , 1 ]
2022-03-24 17:00:09 +01:00
obj_Hl . color = color_cmd
2022-03-20 05:57:07 +01:00
scene . objects [ ' Tower_construc_mode ' ] . setVisible ( False , False )
2022-03-24 17:00:09 +01:00
scene . objects [ ' Tower_construc_mode ' ] . color = color_cmd
2022-03-23 00:27:11 +01:00
text_info ( " " )
2022-03-11 00:21:00 +01:00
else :
scene . objects [ ' Terrain ' ] [ ' construct_mode ' ] = True
obj . worldScale = [ 1.25 , 1.25 , 1.25 ]
2022-03-24 17:00:09 +01:00
obj . color = color_cmd_hl
2022-03-11 00:21:00 +01:00
obj_Hl . worldScale = [ 1.25 , 1.25 , 1.25 ]
2022-03-24 17:00:09 +01:00
obj_Hl . color = color_cmd_hl
2022-03-20 05:57:07 +01:00
scene . objects [ ' Tower_construc_mode ' ] . setVisible ( True , False )
2022-03-24 17:00:09 +01:00
scene . objects [ ' Tower_construc_mode ' ] . color = color_cmd
2022-03-23 00:27:11 +01:00
text_info ( " Tower position : " )
2022-03-31 18:26:55 +02:00
2022-03-10 01:08:08 +01:00
###############################################################################
2022-03-23 00:27:11 +01:00
# User interface : texte info et compteurs
2022-03-10 01:08:08 +01:00
###############################################################################
2022-03-23 00:27:11 +01:00
# Affichage sur la boite de texte sur 6 lignes
2022-03-24 17:00:09 +01:00
def text_info ( text ) :
if text == " " :
2022-03-23 00:27:11 +01:00
scene . objects [ ' Text_info-1 ' ] . setVisible ( False , False )
scene . objects [ ' Text_info-2 ' ] . setVisible ( False , False )
else :
2022-03-24 17:00:09 +01:00
lines_txt = text . split ( " \n " , 6 )
for i in range ( len ( lines_txt ) , 6 ) :
lines_txt . append ( " " )
2022-03-23 00:27:11 +01:00
scene . objects [ ' Text_info-1 ' ] . setVisible ( True , False )
scene . objects [ ' Text_info-2 ' ] . setVisible ( True , False )
2022-03-24 17:00:09 +01:00
scene . objects [ ' Text_info-1 ' ] [ ' Text ' ] = lines_txt [ 0 ] + " \n " + lines_txt [ 1 ] + " \n " + lines_txt [ 2 ]
scene . objects [ ' Text_info-2 ' ] [ ' Text ' ] = lines_txt [ 3 ] + " \n " + lines_txt [ 4 ] + " \n " + lines_txt [ 5 ]
2022-03-23 00:27:11 +01:00
2022-03-13 05:32:55 +01:00
# Mise à jour de l'affichage des compteurs
def points_maj ( cont ) :
2022-04-03 06:21:42 +02:00
2022-04-06 06:25:03 +02:00
global fps_time
2022-04-03 06:21:42 +02:00
# Texte
2022-03-20 05:57:07 +01:00
scene . objects [ ' Lifes_text ' ] [ ' Text ' ] = str ( scene . objects [ ' Points ' ] [ ' lifes ' ] ) + " / " + str ( scene . objects [ ' Points ' ] [ ' lifes_max ' ] )
scene . objects [ ' Coins_text ' ] [ ' Text ' ] = str ( scene . objects [ ' Points ' ] [ ' coins ' ] )
scene . objects [ ' Level_text ' ] [ ' Text ' ] = str ( scene . objects [ ' Points ' ] [ ' level ' ] ) + " / " + str ( scene . objects [ ' Points ' ] [ ' level_max ' ] )
scene . objects [ ' Minions_text ' ] [ ' Text ' ] = str ( scene . objects [ ' Points ' ] [ ' minions ' ] )
2022-03-29 14:12:58 +02:00
scene . objects [ ' Points ' ] [ ' tics ' ] + = 1
2022-03-13 05:32:55 +01:00
2022-04-03 06:21:42 +02:00
# Texte de la vague
if scene . objects [ ' Map_text ' ] [ ' anim ' ] :
if scene . objects [ ' Map_text ' ] [ ' timer ' ] > 0 :
scene . objects [ ' Map_text ' ] . worldPosition . x = scene . objects [ ' Map_text ' ] [ ' position_init ' ] [ 0 ] + ( scene . objects [ ' Map_text ' ] [ ' position_end ' ] [ 0 ] - scene . objects [ ' Map_text ' ] [ ' position_init ' ] [ 0 ] ) * ( scene . objects [ ' Map_text ' ] [ ' timer ' ] / 120 )
scene . objects [ ' Map_text ' ] . worldPosition . y = scene . objects [ ' Map_text ' ] [ ' position_init ' ] [ 1 ] + ( scene . objects [ ' Map_text ' ] [ ' position_end ' ] [ 1 ] - scene . objects [ ' Map_text ' ] [ ' position_init ' ] [ 1 ] ) * ( scene . objects [ ' Map_text ' ] [ ' timer ' ] / 120 )
scene . objects [ ' Map_text ' ] . worldPosition . z = scene . objects [ ' Map_text ' ] [ ' position_init ' ] [ 2 ] + ( scene . objects [ ' Map_text ' ] [ ' position_end ' ] [ 2 ] - scene . objects [ ' Map_text ' ] [ ' position_init ' ] [ 2 ] ) * ( scene . objects [ ' Map_text ' ] [ ' timer ' ] / 120 )
scene . objects [ ' Map_text ' ] [ ' timer ' ] - = 1
if scene . objects [ ' Map_text ' ] [ ' timer ' ] == 0 :
scene . objects [ ' Map_text ' ] . color = color_text
scene . objects [ ' Map_text ' ] . worldPosition = scene . objects [ ' Map_text ' ] [ ' position_end ' ]
scene . objects [ ' Map_text ' ] [ ' anim ' ] = False
# Gestion du FPS
2022-04-06 06:25:03 +02:00
if scene . objects [ ' Terrain ' ] [ ' debug_fps ' ] :
if scene . objects [ ' Points ' ] [ ' tics ' ] % 60 == 0 : # Toutes les 60 tics
milliseconds = int ( time . time ( ) * 1000 )
print ( milliseconds - fps_time )
print ( " Tics/second, coins : " , milliseconds - fps_time , str ( scene . objects [ ' Points ' ] [ ' coins ' ] ) )
fps_time = milliseconds
2022-04-03 06:21:42 +02:00
2022-03-30 03:10:33 +02:00
# Augmentation d'un niveau
2022-04-01 01:34:54 +02:00
if scene . objects [ ' Points ' ] [ ' coins ' ] > = 100 :
2022-03-30 03:10:33 +02:00
scene . objects [ ' Points ' ] [ ' level_max ' ] + = 1
scene . objects [ ' Points ' ] [ ' coins ' ] - = 100
2022-03-23 00:27:11 +01:00
# Level trop élevé
if scene . objects [ ' Points ' ] [ ' level ' ] > scene . objects [ ' Points ' ] [ ' level_max ' ] :
2022-03-24 17:00:09 +01:00
scene . objects [ ' Level_text ' ] . color = color_text_red
2022-04-03 06:21:42 +02:00
if scene . objects [ ' Points ' ] [ ' level ' ] < scene . objects [ ' Points ' ] [ ' level_max ' ] :
scene . objects [ ' Level_text ' ] . color = color_text_yellow
if scene . objects [ ' Points ' ] [ ' level ' ] == scene . objects [ ' Points ' ] [ ' level_max ' ] :
2022-03-24 17:00:09 +01:00
scene . objects [ ' Level_text ' ] . color = color_text
2022-03-23 00:27:11 +01:00
2022-04-06 06:25:03 +02:00
# Ramasse minions perdues ou zombis
if scene . objects [ ' Points ' ] [ ' tics ' ] % 240 == 0 : # Toutes les 4 secondes
2022-03-31 18:26:55 +02:00
scene . objects [ ' Points ' ] [ ' minions_lost ' ] = [ ]
for obj_i in scene . objects :
if " type_minion " in obj_i . getPropertyNames ( ) and " type_towerminion " not in obj_i . getPropertyNames ( ) :
2022-04-06 06:25:03 +02:00
# print ("Minion lost : (dist, dist_old, x, last_x, y, last_y) : ", obj_i.name, obj_i['dist'], obj_i['dist_old'], obj_i.worldPosition.x, obj_i['dist_last_x'], obj_i.worldPosition.y, obj_i['dist_last_y'])
if obj_i [ ' dist ' ] == obj_i [ ' dist_old ' ] and obj_i [ ' dist_new ' ] == False :
print ( " Minion lost : dist =dist_old (dist, dist_old) : " , obj_i . name , obj_i [ ' dist ' ] , obj_i [ ' dist_old ' ] )
obj_i [ ' dead ' ] = True
elif obj_i . worldLinearVelocity . x > 0 and abs ( obj_i . worldLinearVelocity . x ) < 0.001 and obj_i . worldLinearVelocity . y > 0 and abs ( obj_i . worldLinearVelocity . y ) < 0.001 :
2022-03-31 18:26:55 +02:00
print ( " Minion lost : x ' or y ' very slow (x, y, z, x ' , y ' ) : " , obj_i . name , obj_i . worldPosition . x , obj_i . worldPosition . y , obj_i . worldPosition . z , abs ( obj_i . worldLinearVelocity . x ) , abs ( obj_i . worldLinearVelocity . y ) )
obj_i [ ' dead ' ] = True
elif obj_i . worldPosition . x < scene . objects [ ' Terrain ' ] [ ' size ' ] [ 0 ] or obj_i . worldPosition . x > scene . objects [ ' Terrain ' ] [ ' size ' ] [ 1 ] or obj_i . worldPosition . y < scene . objects [ ' Terrain ' ] [ ' size ' ] [ 2 ] or obj_i . worldPosition . y > scene . objects [ ' Terrain ' ] [ ' size ' ] [ 3 ] :
print ( " Minion lost : x or y outside the map (x, y, z, x ' , y ' ) : " , obj_i . name , obj_i . worldPosition . x , obj_i . worldPosition . y , obj_i . worldPosition . z , abs ( obj_i . worldLinearVelocity . x ) , abs ( obj_i . worldLinearVelocity . y ) )
obj_i [ ' dead ' ] = True
2022-04-06 06:25:03 +02:00
obj_i [ ' dist_old ' ] = obj_i [ ' dist ' ]
obj_i [ ' dist_new ' ] = False
2022-03-31 18:26:55 +02:00
2022-03-30 03:10:33 +02:00
# Fin de la vague
2022-03-29 14:12:58 +02:00
if scene . objects [ ' Terrain ' ] [ ' thread_wave ' ] == False and scene . objects [ ' Terrain ' ] [ ' map_run ' ] == True :
if scene . objects [ ' Points ' ] [ ' minions_run ' ] == 0 :
2022-03-30 03:10:33 +02:00
2022-03-31 18:26:55 +02:00
# Fin ou vague suivante
if scene . objects [ ' Points ' ] [ ' lifes ' ] == 0 or scene . objects [ ' Points ' ] [ ' wave ' ] == scene . objects [ ' Terrain ' ] [ ' nb_waves ' ] :
terrain_end ( )
else :
2022-04-03 06:21:42 +02:00
scene . objects [ ' Points ' ] [ ' minions ' ] = 0
2022-03-30 03:10:33 +02:00
scene . objects [ ' Points ' ] [ ' wave ' ] + = 1
ct_map . start ( scene . objects [ ' Points ' ] [ ' wave ' ] ) # Lancement du script de la vague
2022-03-13 05:32:55 +01:00
2022-03-23 00:27:11 +01:00
###############################################################################
# Terrain
###############################################################################
# Mouse over du terrain
2022-03-30 03:10:33 +02:00
def scn_terrain_mo ( cont ) :
2022-03-23 00:27:11 +01:00
# Affiche la position de la tour de construction
if scene . objects [ ' Terrain ' ] [ ' construct_mode ' ] == True :
hitObject = cont . sensors [ ' MO ' ] . hitObject
hitPosition = cont . sensors [ ' MO ' ] . hitPosition
if hitObject is not None :
2022-03-30 03:10:33 +02:00
if round ( hitPosition . x ) > = scene . objects [ ' Terrain ' ] [ ' size ' ] [ 0 ] and round ( hitPosition . x ) < = scene . objects [ ' Terrain ' ] [ ' size ' ] [ 1 ] and round ( hitPosition . y ) > = scene . objects [ ' Terrain ' ] [ ' size ' ] [ 2 ] and round ( hitPosition . y ) < = scene . objects [ ' Terrain ' ] [ ' size ' ] [ 3 ] :
2022-03-23 00:27:11 +01:00
if [ round ( hitPosition . x ) , round ( hitPosition . y ) ] in scene . objects [ ' Terrain ' ] [ ' scene_tile_noncontruct ' ] or [ round ( hitPosition . x ) , round ( hitPosition . y ) ] in scene . objects [ ' Terrain ' ] [ ' scene_tile_tower ' ] :
pass
else :
scene . objects [ ' Tower_construc_mode ' ] . worldPosition . x = round ( hitPosition . x )
scene . objects [ ' Tower_construc_mode ' ] . worldPosition . y = round ( hitPosition . y )
scene . objects [ ' Tower_construc_mode ' ] . worldPosition . z = 0.2
text_info ( " Tower position : " + str ( round ( hitPosition . x ) ) + " , " + str ( round ( hitPosition . y ) ) )
# Affiche les informations sur la tour
2022-03-27 10:28:03 +02:00
# FIXME : High-light sur la tower sélectionnée
2022-03-23 00:27:11 +01:00
else :
hitPosition = cont . sensors [ ' MO ' ] . hitPosition
if cont . sensors [ ' Click ' ] . status == JUST_ACTIVATED and cont . sensors [ ' MO ' ] . positive and scene . objects [ ' Terrain ' ] [ ' manip_mode ' ] == 0 :
if [ round ( hitPosition . x ) , round ( hitPosition . y ) ] in scene . objects [ ' Terrain ' ] [ ' scene_tile_tower ' ] :
for obj_i in scene . objects :
if " type_tower " in obj_i . getPropertyNames ( ) :
if round ( hitPosition . x ) == obj_i . worldPosition . x and round ( hitPosition . y ) == obj_i . worldPosition . y :
text = obj_i [ ' tower_name ' ] + " \n " + " - level : " + str ( obj_i [ ' lvl ' ] ) + " \n " + " - damage : " + str ( obj_i [ ' damage ' ] ) + " \n " + " - speed : " + str ( round ( obj_i [ ' speed ' ] , 2 ) ) + " \n " + " - range : " + str ( obj_i [ ' range ' ] )
text_info ( text )
break
else :
text_info ( " " )
2022-03-13 05:32:55 +01:00
# Initialisation lors du chargement du terrain
def terrain_init ( cont ) :
2022-03-31 18:26:55 +02:00
2022-03-29 14:12:58 +02:00
# Cacher la bannière de fin
scene . objects [ ' End ' ] . setVisible ( False , True )
scene . objects [ ' End ' ] [ ' timer ' ] = 0
2022-03-27 10:28:03 +02:00
# Pile des draws
scene . objects [ ' Terrain ' ] [ ' draw_process ' ] = False
scene . objects [ ' Terrain ' ] [ ' draw_list ' ] = [ ]
2022-03-29 14:12:58 +02:00
2022-03-31 18:26:55 +02:00
# Ramasse-miettes
scene . objects [ ' Points ' ] [ ' minions_lost ' ] = [ ]
2022-03-29 14:12:58 +02:00
# Configuration du moteur de rendu
2022-04-06 06:25:03 +02:00
eevee . use_eevee_smaa = False
2022-04-06 17:28:16 +02:00
if scene . objects [ ' Terrain ' ] [ ' speed ' ] < 10 : # smaa avec en vitesse 4 et 10 -> tendance au plantage
2022-03-29 14:12:58 +02:00
eevee . use_eevee_smaa = True
2022-03-13 05:32:55 +01:00
2022-03-20 05:57:07 +01:00
# Recherche les tuiles non constructibles (chemin)
2022-03-23 00:27:11 +01:00
scene . objects [ ' Terrain ' ] [ ' scene_tile_noncontruct ' ] = [ ]
for obj_i in scene . objects :
if " tile_straight " in obj_i . name :
scene . objects [ ' Terrain ' ] [ ' scene_tile_noncontruct ' ] . append ( [ obj_i . worldPosition . x , obj_i . worldPosition . y ] )
obj_i . collisionGroup = 2
if " tile_cornerRound " in obj_i . name :
scene . objects [ ' Terrain ' ] [ ' scene_tile_noncontruct ' ] . append ( [ obj_i . worldPosition . x , obj_i . worldPosition . y ] )
obj_i . collisionGroup = 2
if " tile_hill " in obj_i . name :
obj_i . collisionGroup = 2
2022-03-29 14:12:58 +02:00
scene . objects [ ' Terrain ' ] [ ' scene_tile_tower ' ] = [ ]
2022-03-20 05:57:07 +01:00
2022-03-30 03:10:33 +02:00
# Init de la carte
ct_map . map_init ( )
ct_map . map_reset ( )
scene . objects [ ' Level_text ' ] . color = color_text
2022-03-10 01:08:08 +01:00
# Mise en route et pause du cycle
2022-03-29 14:12:58 +02:00
def terrain_run ( ) :
audiodev . play ( sndbuff_click )
2022-03-10 01:08:08 +01:00
2022-03-29 14:12:58 +02:00
# Pause
if scene . objects [ ' Terrain ' ] [ ' run ' ] == True :
scene . objects [ ' Terrain ' ] [ ' run ' ] = False
scene . objects [ ' Pause ' ] . setVisible ( False , False )
scene . objects [ ' Pause-Hl ' ] . setVisible ( False , False )
scene . objects [ ' Run-Hl ' ] . setVisible ( True , False )
for obj_i in scene . objects : # Pause des Steerings
if " type_minion " in obj_i . getPropertyNames ( ) and " type_towerminion " not in obj_i . getPropertyNames ( ) :
obj_i . actuators [ ' Steering ' ] . velocity = 0
2022-03-10 01:08:08 +01:00
2022-03-29 14:12:58 +02:00
# Run
2022-04-06 17:28:16 +02:00
else :
2022-03-29 14:12:58 +02:00
scene . objects [ ' Terrain ' ] [ ' run ' ] = True
scene . objects [ ' Run ' ] . setVisible ( False , False )
scene . objects [ ' Run-Hl ' ] . setVisible ( False , False )
scene . objects [ ' Pause-Hl ' ] . setVisible ( True , False )
2022-03-23 00:27:11 +01:00
2022-03-29 14:12:58 +02:00
# Démarrage de la map
if scene . objects [ ' Terrain ' ] [ ' thread_run ' ] == False :
scene . objects [ ' Stop ' ] . setVisible ( True , False )
2022-04-06 17:28:16 +02:00
runpy . run_module ( ' ct_cmd ' , run_name = ' stop ' ) # Stop du script utilisateur
ct_map . stop ( ) # Stop du script des vagues
2022-03-23 00:27:11 +01:00
2022-03-29 14:12:58 +02:00
# Mise à zéro des compteurs
2022-03-30 03:10:33 +02:00
ct_map . map_reset ( )
2022-03-29 14:12:58 +02:00
# Supprimer les tours
for obj_i in scene . objects :
if " type_tower " in obj_i . getPropertyNames ( ) :
obj_i . endObject ( )
if " type_towerminion " in obj_i . getPropertyNames ( ) :
obj_i . endObject ( )
scene . objects [ ' Terrain ' ] [ ' scene_tile_tower ' ] = [ ]
2022-04-06 17:28:16 +02:00
# Scripts utilisateur et vagues
2022-03-29 14:12:58 +02:00
scene . objects [ ' Terrain ' ] [ ' map_run ' ] = True
scene . objects [ ' Terrain ' ] [ ' thread_run ' ] = True
scene . objects [ ' Points ' ] [ ' time_begin ' ] = time . localtime ( )
2022-04-06 06:25:03 +02:00
# scene.objects['Commands']['cmd_start']=True
# Execution du script utilisateur par importlib -> Segfault de Blender
# importlib.reload(ct_cmd)
# ct_cmd.start() # Execution du script utilisateur
runpy . run_module ( ' ct_cmd ' , run_name = ' start ' ) # Execution du script utilisateur
2022-03-30 03:10:33 +02:00
ct_map . start ( 1 ) # Lancement du script de la permière vague
2022-03-29 14:12:58 +02:00
# Arrêt de la pause
else :
for obj_i in scene . objects : # Relance des Steerings
if " type_minion " in obj_i . getPropertyNames ( ) and " type_towerminion " not in obj_i . getPropertyNames ( ) :
2022-03-31 18:26:55 +02:00
obj_i . actuators [ ' Steering ' ] . velocity = obj_i [ ' speed_base ' ] * scene . objects [ ' Terrain ' ] [ ' speed ' ]
2022-03-20 05:57:07 +01:00
2022-03-10 01:08:08 +01:00
# Arrêt et réinitialisation du cycle
2022-03-29 14:12:58 +02:00
def terrain_stop ( ) :
audiodev . play ( sndbuff_click )
2022-03-10 01:08:08 +01:00
2022-03-29 14:12:58 +02:00
# Arrêt des threads utilisateurs
scene . objects [ ' Terrain ' ] [ ' run ' ] = False
scene . objects [ ' Terrain ' ] [ ' thread_run ' ] = False
scene . objects [ ' Terrain ' ] [ ' map_run ' ] = False # Ne pas afficher la bannière de fin
2022-04-06 17:28:16 +02:00
runpy . run_module ( ' ct_cmd ' , run_name = ' stop ' ) # Stop du script utilisateur
2022-03-30 03:10:33 +02:00
ct_map . stop ( ) # Stop du script des vagues
2022-03-10 01:08:08 +01:00
2022-03-29 14:12:58 +02:00
# Supprimer les enemis
for obj_i in scene . objects :
if " type_minion " in obj_i . getPropertyNames ( ) and " type_towerminion " not in obj_i . getPropertyNames ( ) :
obj_i . endObject ( )
scene . objects [ ' Points ' ] [ ' minions ' ] = 0
scene . objects [ ' Points ' ] [ ' minions_run ' ] = 0
# Commandes
scene . objects [ ' Pause ' ] . setVisible ( False , False )
scene . objects [ ' Pause-Hl ' ] . setVisible ( False , False )
scene . objects [ ' Run ' ] . setVisible ( True , False )
scene . objects [ ' Stop ' ] . setVisible ( False , False )
scene . objects [ ' Stop-Hl ' ] . setVisible ( False , False )
2022-03-10 01:08:08 +01:00
2022-03-30 03:10:33 +02:00
# Fin de la map
2022-03-29 14:12:58 +02:00
def terrain_end ( ) :
2022-03-11 00:21:00 +01:00
scene . objects [ ' Terrain ' ] [ ' run ' ] = False
scene . objects [ ' Terrain ' ] [ ' thread_run ' ] = False
# Commandes
scene . objects [ ' Pause ' ] . setVisible ( False , False )
2022-03-20 05:57:07 +01:00
scene . objects [ ' Pause-Hl ' ] . setVisible ( False , False )
2022-03-11 00:21:00 +01:00
scene . objects [ ' Run ' ] . setVisible ( True , False )
scene . objects [ ' Stop ' ] . setVisible ( False , False )
scene . objects [ ' Stop-Hl ' ] . setVisible ( False , False )
2022-03-10 01:08:08 +01:00
2022-03-29 14:12:58 +02:00
# Affichage des résultats
if scene . objects [ ' End ' ] [ ' timer ' ] == 0 :
scene . objects [ ' Terrain ' ] [ ' manip_mode ' ] = 9 # Fenêtre modale
2022-03-30 03:10:33 +02:00
scene . objects [ ' Camera ' ] . worldPosition . x = scene . objects [ ' Camera ' ] [ ' init_lx ' ]
scene . objects [ ' Camera ' ] . worldPosition . y = scene . objects [ ' Camera ' ] [ ' init_ly ' ]
scene . objects [ ' Camera ' ] . worldPosition . z = scene . objects [ ' Camera ' ] [ ' init_lz ' ]
2022-04-06 06:25:03 +02:00
# Wave
2022-04-06 17:28:16 +02:00
if scene . objects [ ' Points ' ] [ ' wave ' ] == scene . objects [ ' Terrain ' ] [ ' nb_waves ' ] and scene . objects [ ' Points ' ] [ ' lifes ' ] > 0 :
2022-04-06 06:25:03 +02:00
scene . objects [ ' Endbanner_wave ' ] [ ' Text ' ] = " Victory "
else :
scene . objects [ ' Endbanner_wave ' ] [ ' Text ' ] = " Wave \n " + str ( scene . objects [ ' Points ' ] [ ' wave ' ] )
# Time
2022-03-29 14:12:58 +02:00
maptime_mn = time . localtime ( ) . tm_min - scene . objects [ ' Points ' ] [ ' time_begin ' ] . tm_min
maptime_sec = time . localtime ( ) . tm_sec - scene . objects [ ' Points ' ] [ ' time_begin ' ] . tm_sec
if maptime_sec < 0 :
maptime_mn - = 1
maptime_sec + = 60
if maptime_mn < = 99 :
2022-04-03 06:21:42 +02:00
scene . objects [ ' Endbanner_points ' ] [ ' Text ' ] = " Level " + str ( scene . objects [ ' Points ' ] [ ' level_max ' ] ) + " \n Time " + str ( maptime_mn ) + " ' " + str ( maptime_sec ) + " \" "
2022-03-29 14:12:58 +02:00
else :
2022-04-03 06:21:42 +02:00
scene . objects [ ' Endbanner_points ' ] [ ' Text ' ] = " Level " + str ( scene . objects [ ' Points ' ] [ ' level_max ' ] ) + " \n Time " + str ( maptime_mn ) + " ' "
2022-04-06 06:25:03 +02:00
# Object 3D
2022-03-29 14:12:58 +02:00
scene . objects [ ' Endbanner ' ] . color = color_endbanner_bluelight
2022-04-03 06:21:42 +02:00
scene . objects [ ' Endbanner_wave ' ] . color = color_black
scene . objects [ ' Endbanner_points ' ] . color = color_black
scene . objects [ ' Endbanner_ok ' ] . color = color_black
2022-03-29 14:12:58 +02:00
scene . objects [ ' End ' ] . setVisible ( True , True )
2022-04-03 06:21:42 +02:00
scene . objects [ ' End ' ] . worldPosition = [ 0 , 1.53623 , - 0.892838 ]
# scene.objects['End']['position_init']= scene.objects['End'].localPosition
# scene.objects['End']['position_init']= [scene.objects['End'].localPosition.x, scene.objects['End'].localPosition.y, scene.objects['End'].localPosition.z]
2022-04-06 06:25:03 +02:00
# Animation
2022-03-29 14:12:58 +02:00
pas = 0.5
scene . objects [ ' End ' ] . localPosition . y = scene . objects [ ' End ' ] . localPosition . y - 1 * pas
scene . objects [ ' End ' ] . localPosition . z = scene . objects [ ' End ' ] . localPosition . z + 0.85 * pas
2022-04-03 06:21:42 +02:00
scene . objects [ ' End ' ] [ ' timer ' ] + = 1
2022-03-29 14:12:58 +02:00
if scene . objects [ ' End ' ] [ ' timer ' ] == 40 :
scene . objects [ ' Terrain ' ] [ ' map_run ' ] = False
# Vitesse du jeu
def terrain_speed ( obj ) :
audiodev . play ( sndbuff_click )
speed_mode = [ 0.25 , 0.5 , 1 , 2 , 4 , 10 ]
speed_mode_txt = [ " 1/4 " , " 1/2 " , " 1 " , " 2 " , " 4 " , " 10 " ]
i = speed_mode . index ( scene . objects [ ' Terrain ' ] [ ' speed ' ] )
# Affichage
if obj . name == " Speed_up " and i < 5 :
scene . objects [ ' Terrain ' ] [ ' speed ' ] = speed_mode [ i + 1 ]
scene . objects [ ' Text_speed ' ] [ ' Text ' ] = speed_mode_txt [ i + 1 ]
if obj . name == " Speed_down " and i > 0 :
scene . objects [ ' Terrain ' ] [ ' speed ' ] = speed_mode [ i - 1 ]
scene . objects [ ' Text_speed ' ] [ ' Text ' ] = speed_mode_txt [ i - 1 ]
# Maj des Nears (Towers) et des Steerings (Minions)
for obj_i in scene . objects :
if " type_tower " in obj_i . getPropertyNames ( ) and " Near " in obj_i . sensors :
2022-03-31 18:26:55 +02:00
obj_i . sensors [ ' Near ' ] . skippedTicks = round ( 1 / ( obj_i [ ' speed ' ] * scene . objects [ ' Terrain ' ] [ ' speed ' ] ) )
2022-03-29 14:12:58 +02:00
if " type_minion " in obj_i . getPropertyNames ( ) and " type_towerminion " not in obj_i . getPropertyNames ( ) :
2022-03-31 18:26:55 +02:00
obj_i . actuators [ ' Steering ' ] . velocity = obj_i [ ' speed_base ' ] * scene . objects [ ' Terrain ' ] [ ' speed ' ]
2022-03-29 14:12:58 +02:00
# Configuration du moteur de rendu
2022-04-06 17:28:16 +02:00
if scene . objects [ ' Terrain ' ] [ ' speed ' ] < 10 : # smaa avec en vitesse 4 et 10 -> tendance au plantage
2022-03-29 14:12:58 +02:00
eevee . use_eevee_smaa = True
else :
eevee . use_eevee_smaa = False
# Maj du fichier de config (vitesse du jeu : data/config/speed)
ct_config_tree [ 0 ] [ 0 ] . text = str ( scene . objects [ ' Terrain ' ] [ ' speed ' ] )
buffer_xml = ET . tostring ( ct_config_tree )
with open ( " ct_config.xml " , " wb " ) as f :
f . write ( buffer_xml )
2022-04-03 06:21:42 +02:00
# Page de fin
2022-03-29 14:12:58 +02:00
def endbanner_hl ( cont ) :
if cont . sensors [ ' MO ' ] . status == JUST_ACTIVATED :
scene . objects [ ' Endbanner ' ] . color = color_white
2022-04-03 06:21:42 +02:00
scene . objects [ ' Endbanner_wave ' ] . color = color_white
scene . objects [ ' Endbanner_points ' ] . color = color_white
scene . objects [ ' Endbanner_ok ' ] . color = color_white
2022-03-29 14:12:58 +02:00
if cont . sensors [ ' MO ' ] . status == JUST_RELEASED :
scene . objects [ ' Endbanner ' ] . color = color_endbanner_bluelight
2022-04-03 06:21:42 +02:00
scene . objects [ ' Endbanner_wave ' ] . color = color_black
scene . objects [ ' Endbanner_points ' ] . color = color_black
scene . objects [ ' Endbanner_ok ' ] . color = color_black
2022-03-29 14:12:58 +02:00
def endbanner_close ( cont ) :
if cont . sensors [ ' Click ' ] . status == JUST_ACTIVATED and cont . sensors [ ' MO ' ] . positive :
audiodev . play ( sndbuff_click )
scene . objects [ ' Terrain ' ] [ ' manip_mode ' ] = 0
scene . objects [ ' End ' ] . setVisible ( False , True )
2022-04-03 06:21:42 +02:00
scene . objects [ ' End ' ] . worldPosition = [ 20 , 1.53623 , - 0.892838 ]
2022-03-29 14:12:58 +02:00
scene . objects [ ' Endbanner ' ] . color = [ 0.592 , 0.68 , 0.407 , 1 ]
2022-04-03 06:21:42 +02:00
scene . objects [ ' Endbanner_wave ' ] . color = color_black
scene . objects [ ' Endbanner_points ' ] . color = color_black
2022-03-29 14:12:58 +02:00
scene . objects [ ' End ' ] [ ' timer ' ] = 0
2022-03-10 01:08:08 +01:00
###############################################################################
# Commandes
###############################################################################
2022-03-29 14:12:58 +02:00
2022-03-10 01:08:08 +01:00
# Init
def cmd_init ( ) :
# scene.objects['Terrain']['run']=False
scene . objects [ ' Run-Hl ' ] . setVisible ( False , False )
scene . objects [ ' Pause ' ] . setVisible ( False , False )
scene . objects [ ' Pause-Hl ' ] . setVisible ( False , False )
scene . objects [ ' Stop ' ] . setVisible ( False , False )
scene . objects [ ' Stop-Hl ' ] . setVisible ( False , False )
2022-03-11 00:21:00 +01:00
scene . objects [ ' Construc-Hl ' ] . setVisible ( False , False )
2022-04-03 21:15:43 +02:00
scene . objects [ ' About-cmd-Hl ' ] . setVisible ( False , False )
2022-04-06 06:25:03 +02:00
scene . objects [ ' About ' ] . setVisible ( False , True )
2022-03-11 00:21:00 +01:00
2022-03-20 05:57:07 +01:00
scene . objects [ ' Map_text ' ] . setVisible ( False , False )
2022-03-23 00:27:11 +01:00
scene . objects [ ' Text_info-1 ' ] . setVisible ( False , False )
scene . objects [ ' Text_info-2 ' ] . setVisible ( False , False )
2022-03-29 14:12:58 +02:00
scene . objects [ ' Tower_construc_mode ' ] . setVisible ( False , False )
scene . objects [ ' Terrain ' ] [ ' map_run ' ] = False
2022-03-20 05:57:07 +01:00
2022-03-11 00:21:00 +01:00
# scene.objects['Raz-vue-Hl'].setVisible(False,False)
2022-03-10 01:08:08 +01:00
# scene.objects['Aide-cmd-Hl'].setVisible(False,False)
2022-03-23 00:27:11 +01:00
# Récupérer la config (vitesse du jeu : data/config/speed)
speed_mode = [ 0.25 , 0.5 , 1 , 2 , 4 , 10 ]
speed_mode_txt = [ " 1/4 " , " 1/2 " , " 1 " , " 2 " , " 4 " , " 10 " ]
scene . objects [ ' Terrain ' ] [ ' speed ' ] = float ( ct_config_tree [ 0 ] [ 0 ] . text )
i = speed_mode . index ( scene . objects [ ' Terrain ' ] [ ' speed ' ] )
scene . objects [ ' Text_speed ' ] [ ' Text ' ] = speed_mode_txt [ i ]
2022-03-10 01:08:08 +01:00
# Le highlight des commandes
def cmd_hl ( cont ) :
obj = cont . owner
# Activation
if cont . sensors [ ' MO ' ] . status == JUST_ACTIVATED and scene . objects [ ' Terrain ' ] [ ' manip_mode ' ] == 0 :
2022-04-03 21:15:43 +02:00
if obj . name != " Run " and obj . name != " Pause " and obj . name != " Run-Hl " and obj . name != " Pause-Hl " and obj . name != " Stop " and obj . name != " Stop-Hl " :
2022-03-10 01:08:08 +01:00
obj . setVisible ( False , True )
scene . objects [ obj . name + ' -Hl ' ] . setVisible ( True , True )
# Run et pause
if obj . name == " Pause " or obj . name == " Run " :
if scene . objects [ ' Terrain ' ] [ ' run ' ] == True :
scene . objects [ ' Pause ' ] . setVisible ( False , False )
scene . objects [ ' Pause-Hl ' ] . setVisible ( True , False )
else :
scene . objects [ ' Run ' ] . setVisible ( False , False )
scene . objects [ ' Run-Hl ' ] . setVisible ( True , False )
# Stop
if obj . name == " Stop " :
if scene . objects [ ' Terrain ' ] [ ' thread_run ' ] == True :
scene . objects [ ' Stop ' ] . setVisible ( False , False )
scene . objects [ ' Stop-Hl ' ] . setVisible ( True , False )
# Désactivation
if cont . sensors [ ' MO ' ] . status == JUST_RELEASED and scene . objects [ ' Terrain ' ] [ ' manip_mode ' ] == 0 :
2022-04-03 21:15:43 +02:00
if obj . name != " Run " and obj . name != " Pause " and obj . name != " Run-Hl " and obj . name != " Pause-Hl " and obj . name != " Stop " and obj . name != " Stop-Hl " :
2022-03-10 01:08:08 +01:00
scene . objects [ obj . name + ' -Hl ' ] . setVisible ( False , True )
obj . setVisible ( True , True )
# Run et pause
if obj . name == " Pause " or obj . name == " Run " :
if scene . objects [ ' Terrain ' ] [ ' run ' ] == True :
scene . objects [ ' Pause-Hl ' ] . setVisible ( False , False )
scene . objects [ ' Pause ' ] . setVisible ( True , False )
else :
scene . objects [ ' Run-Hl ' ] . setVisible ( False , False )
scene . objects [ ' Run ' ] . setVisible ( True , False )
# Stop
if obj . name == " Stop " :
if scene . objects [ ' Terrain ' ] [ ' thread_run ' ] == True :
scene . objects [ ' Stop-Hl ' ] . setVisible ( False , False )
scene . objects [ ' Stop ' ] . setVisible ( True , False )
2022-03-29 14:12:58 +02:00
# Click sur les commandes
def cmd_click ( cont ) :
obj = cont . owner
if cont . sensors [ ' Click ' ] . status == JUST_ACTIVATED and cont . sensors [ ' MO ' ] . positive and scene . objects [ ' Terrain ' ] [ ' manip_mode ' ] == 0 :
2022-04-01 01:34:54 +02:00
if obj . name == " Pause " or obj . name == " Run " : # FIXME problème sur l'icone pause
2022-03-29 14:12:58 +02:00
terrain_run ( )
if obj . name == " Stop " :
terrain_stop ( )
if obj . name == " Speed_up " or obj . name == " Speed_down " :
terrain_speed ( obj )
2022-04-03 06:21:42 +02:00
if obj . name == " About-cmd " :
about_open ( )
2022-03-29 14:12:58 +02:00
2022-03-10 01:08:08 +01:00
###############################################################################
# Gestion du clavier
###############################################################################
2022-03-29 14:12:58 +02:00
# Mode :
# 0 : rien (par défaut)
# 1 : Pan avec Shift
# 2 : Zoom avec Ctrl
# 9 : Fenêtre modale
2022-03-10 01:08:08 +01:00
def mode ( cont ) :
obj = cont . owner
keyboard = bge . logic . keyboard
2022-04-06 06:25:03 +02:00
# Touche ESC
if JUST_ACTIVATED in keyboard . inputs [ bge . events . ESCKEY ] . queue :
bge . logic . endGame ( )
# Fenêtre modale
if scene . objects [ ' Terrain ' ] [ ' manip_mode ' ] == 9 :
return
2022-03-10 01:08:08 +01:00
# Shift -> mode 1 : Pan (clic milieu)
if JUST_ACTIVATED in keyboard . inputs [ bge . events . LEFTSHIFTKEY ] . queue :
obj [ ' manip_mode ' ] = 1
if JUST_ACTIVATED in keyboard . inputs [ bge . events . RIGHTSHIFTKEY ] . queue :
obj [ ' manip_mode ' ] = 1
# Ctrl -> mode 2 : Zoom (clic milieu)
if JUST_ACTIVATED in keyboard . inputs [ bge . events . LEFTCTRLKEY ] . queue :
obj [ ' manip_mode ' ] = 2
if JUST_ACTIVATED in keyboard . inputs [ bge . events . RIGHTCTRLKEY ] . queue :
obj [ ' manip_mode ' ] = 2
# Pas de modificateur -> mode 0 : Pas de Orbit (mode 0) ici
if JUST_RELEASED in keyboard . inputs [ bge . events . LEFTSHIFTKEY ] . queue :
obj [ ' manip_mode ' ] = 0
if JUST_RELEASED in keyboard . inputs [ bge . events . RIGHTSHIFTKEY ] . queue :
obj [ ' manip_mode ' ] = 0
if JUST_RELEASED in keyboard . inputs [ bge . events . LEFTCTRLKEY ] . queue :
obj [ ' manip_mode ' ] = 0
if JUST_RELEASED in keyboard . inputs [ bge . events . RIGHTCTRLKEY ] . queue :
obj [ ' manip_mode ' ] = 0
# Touche Home -> Reset de la vue
if JUST_ACTIVATED in keyboard . inputs [ bge . events . HOMEKEY ] . queue :
scene . objects [ ' Camera ' ] . worldPosition . x = scene . objects [ ' Camera ' ] [ ' init_lx ' ]
scene . objects [ ' Camera ' ] . worldPosition . y = scene . objects [ ' Camera ' ] [ ' init_ly ' ]
scene . objects [ ' Camera ' ] . worldPosition . z = scene . objects [ ' Camera ' ] [ ' init_lz ' ]
applyRotationTo ( scene . objects [ ' Terrain ' ] , 0 , 0 , 0 )
# Touche F5 -> Run et Pause
if JUST_ACTIVATED in keyboard . inputs [ bge . events . F5KEY ] . queue :
2022-03-29 14:12:58 +02:00
terrain_run ( )
2022-03-23 00:27:11 +01:00
2022-03-10 01:08:08 +01:00
# Touche F6 -> Stop / Init
if JUST_ACTIVATED in keyboard . inputs [ bge . events . F6KEY ] . queue :
if scene . objects [ ' Terrain ' ] [ ' thread_run ' ] == True :
2022-03-29 14:12:58 +02:00
terrain_stop ( )
2022-03-10 01:08:08 +01:00
2022-04-03 06:21:42 +02:00
# Touche +/- du pad -> Vitesse + ou /
if JUST_ACTIVATED in keyboard . inputs [ bge . events . PADPLUSKEY ] . queue :
terrain_speed ( scene . objects [ ' Speed_up ' ] )
if JUST_ACTIVATED in keyboard . inputs [ bge . events . PADMINUS ] . queue :
terrain_speed ( scene . objects [ ' Speed_down ' ] )
2022-03-10 01:08:08 +01:00
###############################################################################
2022-03-27 10:28:03 +02:00
# Manipulation 3D de la scène
2022-03-10 01:08:08 +01:00
###############################################################################
# Mémorisation de la position et orientation initiales du modèle 3D et de la caméra
def manip_init ( cont ) :
scene . objects [ ' Camera ' ] [ ' init_lx ' ] = scene . objects [ ' Camera ' ] . worldPosition . x
scene . objects [ ' Camera ' ] [ ' init_ly ' ] = scene . objects [ ' Camera ' ] . worldPosition . y
scene . objects [ ' Camera ' ] [ ' init_lz ' ] = scene . objects [ ' Camera ' ] . worldPosition . z
scene . objects [ ' Terrain ' ] [ ' init_lx ' ] = scene . objects [ ' Terrain ' ] . worldPosition . x
scene . objects [ ' Terrain ' ] [ ' init_ly ' ] = scene . objects [ ' Terrain ' ] . worldPosition . y
scene . objects [ ' Terrain ' ] [ ' init_lz ' ] = scene . objects [ ' Terrain ' ] . worldPosition . z
scene . objects [ ' Terrain ' ] [ ' init_rx ' ] = scene . objects [ ' Terrain ' ] . worldOrientation . to_euler ( ) . x
scene . objects [ ' Terrain ' ] [ ' init_ry ' ] = scene . objects [ ' Terrain ' ] . worldOrientation . to_euler ( ) . y
scene . objects [ ' Terrain ' ] [ ' init_rz ' ] = scene . objects [ ' Terrain ' ] . worldOrientation . to_euler ( ) . z
# Atteindre une orientation (bas niveau)
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)
# Reset de la manipulation de la vue
def manip_reset ( cont ) :
if cont . sensors [ ' Click ' ] . status == JUST_ACTIVATED and cont . sensors [ ' MO ' ] . positive and scene . objects [ ' Terrain ' ] [ ' manip_mode ' ] == 0 :
scene . objects [ ' Camera ' ] . worldPosition . x = scene . objects [ ' Camera ' ] [ ' init_lx ' ]
scene . objects [ ' Camera ' ] . worldPosition . y = scene . objects [ ' Camera ' ] [ ' init_ly ' ]
scene . objects [ ' Camera ' ] . worldPosition . z = scene . objects [ ' Camera ' ] [ ' init_lz ' ]
applyRotationTo ( scene . objects [ ' Terrain ' ] , 0 , 0 , 0 )
# Position de départ pour la manipulation de la vue
def manip_start ( cont ) :
2022-03-30 03:10:33 +02:00
if scene . objects [ ' Terrain ' ] [ ' manip_mode ' ] != 9 :
obj = cont . owner
obj [ ' click_x ' ] = cont . sensors [ ' ClickM ' ] . position [ 0 ]
obj [ ' click_y ' ] = cont . sensors [ ' ClickM ' ] . position [ 1 ]
2022-03-10 01:08:08 +01:00
# Cacher le cercle de la manipulation Orbit
def manip_stop ( cont ) :
# scene.objects['Orbit'].setVisible(False,False)
pass
# Manipulation du modèle ou de la caméra
def manip ( cont ) :
obj = cont . owner
sensibilite_orbit = 0.00005 # Base : 0.0005
sensibilite_pan = 0.001 # Base : 0.005
sensibilite_zoom = 0.005 # Base : 0.01
delta_x = cont . sensors [ ' DownM ' ] . position [ 0 ] - obj [ ' click_x ' ]
delta_y = cont . sensors [ ' DownM ' ] . position [ 1 ] - obj [ ' click_y ' ]
# Pan
if obj [ ' manip_mode ' ] == 1 : # Shift
scene . objects [ ' Camera ' ] . applyMovement ( ( delta_x * - sensibilite_pan , delta_y * sensibilite_pan , 0 ) , True )
# Zoom
if obj [ ' manip_mode ' ] == 2 : # Ctrl
scene . objects [ ' Camera ' ] . applyMovement ( ( 0 , 0 , ( delta_x + delta_y ) * sensibilite_zoom ) , True )
# Manipulation du modèle ou de la caméra
def manip_wheel ( cont ) :
2022-03-30 03:10:33 +02:00
if scene . objects [ ' Terrain ' ] [ ' manip_mode ' ] != 9 : # Fenêtre modale
obj = cont . owner
sensibilite_wheel = 5 # Base : 20
if cont . sensors [ ' WheelUp ' ] . positive :
scene . objects [ ' Camera ' ] . applyMovement ( ( 0 , 0 , - sensibilite_wheel ) , True )
if cont . sensors [ ' WheelDown ' ] . positive :
scene . objects [ ' Camera ' ] . applyMovement ( ( 0 , 0 , sensibilite_wheel ) , True )
2022-03-10 01:08:08 +01:00
###############################################################################
2022-04-03 06:21:42 +02:00
# About
2022-03-10 01:08:08 +01:00
###############################################################################
2022-04-03 06:21:42 +02:00
def about_open ( ) :
2022-04-03 21:15:43 +02:00
scene . objects [ ' About_title ' ] . color = color_black
scene . objects [ ' About_text ' ] . color = color_black
scene . objects [ ' About_copyright ' ] . color = color_black
2022-04-03 06:21:42 +02:00
scene . objects [ ' About_link_git ' ] . color = color_link
scene . objects [ ' About_link_gpl ' ] . color = color_link
scene . objects [ ' About_link_blender ' ] . color = color_link
scene . objects [ ' About_link_upbge ' ] . color = color_link
scene . objects [ ' About_link_kay ' ] . color = color_link
scene . objects [ ' About_link_kenney ' ] . color = color_link
2022-04-03 21:15:43 +02:00
scene . objects [ ' About_ok ' ] . color = color_black
2022-04-03 06:21:42 +02:00
scene . objects [ ' About ' ] . setVisible ( True , True )
scene . objects [ ' About ' ] . worldPosition = [ 0 , 1.53623 , - 0.892838 ]
scene . objects [ ' About ' ] [ ' timer ' ] = 0
scene . objects [ ' About ' ] [ ' anim ' ] = True
def about_open_anim ( ) :
pas = 0.5
scene . objects [ ' About ' ] . localPosition . y = scene . objects [ ' About ' ] . localPosition . y - 1 * pas
scene . objects [ ' About ' ] . localPosition . z = scene . objects [ ' About ' ] . localPosition . z + 0.85 * pas
scene . objects [ ' About ' ] [ ' timer ' ] + = 1
if scene . objects [ ' About ' ] [ ' timer ' ] == 40 :
scene . objects [ ' About ' ] [ ' anim ' ] = False
def about_hl ( cont ) :
if cont . sensors [ ' MO ' ] . status == JUST_ACTIVATED :
scene . objects [ ' Aboutbanner ' ] . color = color_white
2022-04-03 21:15:43 +02:00
scene . objects [ ' About_ok ' ] . color = color_white
scene . objects [ ' About_title ' ] . color = color_white
2022-04-03 06:21:42 +02:00
if cont . sensors [ ' MO ' ] . status == JUST_RELEASED :
scene . objects [ ' Aboutbanner ' ] . color = color_endbanner_bluelight
2022-04-03 21:15:43 +02:00
scene . objects [ ' About_ok ' ] . color = color_black
scene . objects [ ' About_title ' ] . color = color_black
2022-04-03 06:21:42 +02:00
def about_close ( cont ) :
if cont . sensors [ ' Click ' ] . status == JUST_ACTIVATED and cont . sensors [ ' MO ' ] . positive :
audiodev . play ( sndbuff_click )
scene . objects [ ' Terrain ' ] [ ' manip_mode ' ] = 0
scene . objects [ ' About ' ] . setVisible ( False , True )
scene . objects [ ' About ' ] . worldPosition = [ 22 , 1.53623 , - 0.892838 ]
scene . objects [ ' Aboutbanner ' ] . color = [ 0.592 , 0.68 , 0.407 , 1 ]
scene . objects [ ' About ' ] [ ' timer ' ] = 0
def about_link ( cont ) :
if cont . sensors [ ' Click ' ] . status == JUST_ACTIVATED and cont . sensors [ ' MO ' ] . positive :
obj = cont . owner
if obj . name == " About_link_git-colbox " :
webbrowser . open ( ' https://gitlab.com/phroy/codetower ' )
if obj . name == " About_link_gpl-colbox " :
webbrowser . open ( ' https://www.gnu.org/licenses/gpl-3.0.html ' )
if obj . name == " About_link_blender-colbox " :
webbrowser . open ( ' https://www.blender.org ' )
if obj . name == " About_link_upbge-colbox " :
webbrowser . open ( ' https://www.upbge.org ' )
if obj . name == " About_link_kay-colbox " :
webbrowser . open ( ' https://www.kaylousberg.com ' )
if obj . name == " About_link_kenney-colbox " :
webbrowser . open ( ' https://www.kenney.nl ' )
if obj . name == " About_link_blender-colbox " :
webbrowser . open ( ' https://www.blender.org ' )
def about_link_hl ( cont ) :
if cont . sensors [ ' MO ' ] . status == JUST_ACTIVATED :
obj = cont . owner
name = obj . name [ : - 7 ]
scene . objects [ name ] . color = color_link_hl
if cont . sensors [ ' MO ' ] . status == JUST_RELEASED :
obj = cont . owner
name = obj . name [ : - 7 ]
scene . objects [ name ] . color = color_link