mirror of
https://forge.apps.education.fr/phroy/codetower.git
synced 2024-01-27 11:35:17 +01:00
Add graphical mouse
This commit is contained in:
parent
e3adb80bd3
commit
2d96b4759b
@ -6,9 +6,9 @@ CodeTower is a Tower Defense coding game where the towers are driven by Python c
|
|||||||
|
|
||||||
* [Screencast](http://www.phroy.org/cloud/index.php/s/BbMSaNayJHRbk5N)
|
* [Screencast](http://www.phroy.org/cloud/index.php/s/BbMSaNayJHRbk5N)
|
||||||
|
|
||||||
It's a early prototype. CodeTower is a open source software distributed under the terms of the GPLv3 license.
|
It's a early prototype. CodeTower is a open source software distributed under the terms of the [GPLv3 license]('https://www.gnu.org/licenses/gpl-3.0.html').
|
||||||
|
|
||||||
The game engine is [Blender](https://blender.org) - [UPGE](https://upbge.org).
|
The game engine is [Blender](https://blender.org) / [UPGE](https://upbge.org).
|
||||||
|
|
||||||
![Screenshot](img/screenshot-01.jpg)
|
![Screenshot](img/screenshot-01.jpg)
|
||||||
|
|
||||||
@ -24,7 +24,7 @@ With your Python script, you can build, remove and upgrade your towers.
|
|||||||
|
|
||||||
For each tower, you will be able to choose dynamically most appropriate techno (archer tower) or spell (mage tower).
|
For each tower, you will be able to choose dynamically most appropriate techno (archer tower) or spell (mage tower).
|
||||||
|
|
||||||
The Python script is **ct_cmd.py** (in the game folder), you have to edit it with editing software (Spyder, Emacs, Atom, ...).
|
The Python script is the file **ct_cmd.py** (in the game folder), you have to edit it with editing software (Spyder, Emacs, Atom, ...).
|
||||||
|
|
||||||
* **Build a tower : ct_build (x, y, category, name, color, style)**
|
* **Build a tower : ct_build (x, y, category, name, color, style)**
|
||||||
- x position (integer)
|
- x position (integer)
|
||||||
|
BIN
codetower-21.blend
Normal file
BIN
codetower-21.blend
Normal file
Binary file not shown.
190
ct.py
190
ct.py
@ -4,6 +4,7 @@ import bge # Blender Game Engine (UPBGE)
|
|||||||
import bpy # Blender
|
import bpy # Blender
|
||||||
import aud # Sounds
|
import aud # Sounds
|
||||||
import math
|
import math
|
||||||
|
import mathutils
|
||||||
import time
|
import time
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
@ -20,7 +21,7 @@ import ct_map1 as ct_map # waves script
|
|||||||
# @title: the CodeTower game
|
# @title: the CodeTower game
|
||||||
# @project: CodeTower
|
# @project: CodeTower
|
||||||
# @lang: fr,en
|
# @lang: fr,en
|
||||||
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
|
# @authors: Philippe Roy <phroy@phroy.org>
|
||||||
# @copyright: Copyright (C) 2022 Philippe Roy
|
# @copyright: Copyright (C) 2022 Philippe Roy
|
||||||
# @license: GNU GPL
|
# @license: GNU GPL
|
||||||
#
|
#
|
||||||
@ -140,6 +141,11 @@ def points_maj (cont):
|
|||||||
|
|
||||||
global fps_time
|
global fps_time
|
||||||
|
|
||||||
|
# Synchronisation des threads
|
||||||
|
while scene.objects['Terrain']['thread_cmd_lock'] == True:
|
||||||
|
# print ("UPBGE : thread_cmd_lock =True")
|
||||||
|
time.sleep(0.01)
|
||||||
|
|
||||||
# Texte
|
# Texte
|
||||||
scene.objects['Lifes_text']['Text']=str(scene.objects['Points']['lifes'])+"/"+str(scene.objects['Points']['lifes_max'])
|
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['Coins_text']['Text']=str(scene.objects['Points']['coins'])
|
||||||
@ -160,7 +166,7 @@ def points_maj (cont):
|
|||||||
scene.objects['Map_text']['anim']=False
|
scene.objects['Map_text']['anim']=False
|
||||||
|
|
||||||
# Gestion du FPS
|
# Gestion du FPS
|
||||||
if scene.objects['Terrain']['debug_fps']:
|
if scene.objects['Commands']['debug_fps']:
|
||||||
if scene.objects['Points']['tics']%60 ==0: # Toutes les 60 tics
|
if scene.objects['Points']['tics']%60 ==0: # Toutes les 60 tics
|
||||||
milliseconds = int(time.time() * 1000)
|
milliseconds = int(time.time() * 1000)
|
||||||
print (milliseconds-fps_time)
|
print (milliseconds-fps_time)
|
||||||
@ -181,6 +187,7 @@ def points_maj (cont):
|
|||||||
scene.objects['Level_text'].color = color_text
|
scene.objects['Level_text'].color = color_text
|
||||||
|
|
||||||
# Ramasse minions perdues ou zombis
|
# Ramasse minions perdues ou zombis
|
||||||
|
if scene.objects['Terrain']['run'] == True: # Pas en pause
|
||||||
if scene.objects['Points']['tics']%240 == 0: # Toutes les 4 secondes
|
if scene.objects['Points']['tics']%240 == 0: # Toutes les 4 secondes
|
||||||
scene.objects['Points']['minions_lost']=[]
|
scene.objects['Points']['minions_lost']=[]
|
||||||
for obj_i in scene.objects:
|
for obj_i in scene.objects:
|
||||||
@ -384,6 +391,7 @@ def terrain_end ():
|
|||||||
scene.objects['Camera'].worldPosition.y = scene.objects['Camera']['init_ly']
|
scene.objects['Camera'].worldPosition.y = scene.objects['Camera']['init_ly']
|
||||||
scene.objects['Camera'].worldPosition.z = scene.objects['Camera']['init_lz']
|
scene.objects['Camera'].worldPosition.z = scene.objects['Camera']['init_lz']
|
||||||
|
|
||||||
|
|
||||||
# Wave
|
# Wave
|
||||||
if scene.objects['Points']['wave']== scene.objects['Terrain']['nb_waves'] and scene.objects['Points']['lifes'] > 0:
|
if scene.objects['Points']['wave']== scene.objects['Terrain']['nb_waves'] and scene.objects['Points']['lifes'] > 0:
|
||||||
scene.objects['Endbanner_wave']['Text']="Victory"
|
scene.objects['Endbanner_wave']['Text']="Victory"
|
||||||
@ -407,14 +415,16 @@ def terrain_end ():
|
|||||||
scene.objects['Endbanner_points'].color = color_black
|
scene.objects['Endbanner_points'].color = color_black
|
||||||
scene.objects['Endbanner_ok'].color = color_black
|
scene.objects['Endbanner_ok'].color = color_black
|
||||||
scene.objects['End'].setVisible(True,True)
|
scene.objects['End'].setVisible(True,True)
|
||||||
scene.objects['End'].worldPosition = [0, 1.53623, -0.892838]
|
scene.objects['End'].worldPosition = [0, 1.53623, -1.8]
|
||||||
# scene.objects['End']['position_init']= scene.objects['End'].localPosition
|
scene.objects['End']['timer'] = 0
|
||||||
# scene.objects['End']['position_init']= [scene.objects['End'].localPosition.x, scene.objects['End'].localPosition.y, scene.objects['End'].localPosition.z]
|
scene.objects['End']['anim'] = True
|
||||||
|
|
||||||
# Animation
|
# Animation
|
||||||
pas=0.5
|
pas=0.5
|
||||||
scene.objects['End'].localPosition.y=scene.objects['End'].localPosition.y-1*pas
|
scene.objects['End'].localPosition.y -= pas
|
||||||
scene.objects['End'].localPosition.z=scene.objects['End'].localPosition.z+0.85*pas
|
scene.objects['End'].localPosition.z += (0.85*pas)
|
||||||
|
# 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
|
||||||
scene.objects['End']['timer']+=1
|
scene.objects['End']['timer']+=1
|
||||||
if scene.objects['End']['timer']== 40:
|
if scene.objects['End']['timer']== 40:
|
||||||
scene.objects['Terrain']['map_run'] = False
|
scene.objects['Terrain']['map_run'] = False
|
||||||
@ -438,6 +448,7 @@ def terrain_speed (obj):
|
|||||||
for obj_i in scene.objects:
|
for obj_i in scene.objects:
|
||||||
if "type_tower" in obj_i.getPropertyNames() and "Near" in obj_i.sensors :
|
if "type_tower" in obj_i.getPropertyNames() and "Near" in obj_i.sensors :
|
||||||
obj_i.sensors['Near'].skippedTicks =round(1/(obj_i['speed']*scene.objects['Terrain']['speed']))
|
obj_i.sensors['Near'].skippedTicks =round(1/(obj_i['speed']*scene.objects['Terrain']['speed']))
|
||||||
|
if scene.objects['Terrain']['run'] == True: # Pas en pause
|
||||||
if "type_minion" in obj_i.getPropertyNames() and "type_towerminion" not in obj_i.getPropertyNames():
|
if "type_minion" in obj_i.getPropertyNames() and "type_towerminion" not in obj_i.getPropertyNames():
|
||||||
obj_i.actuators['Steering'].velocity=obj_i['speed_base']*scene.objects['Terrain']['speed']
|
obj_i.actuators['Steering'].velocity=obj_i['speed_base']*scene.objects['Terrain']['speed']
|
||||||
|
|
||||||
@ -456,6 +467,7 @@ def terrain_speed (obj):
|
|||||||
# Page de fin
|
# Page de fin
|
||||||
def endbanner_hl(cont):
|
def endbanner_hl(cont):
|
||||||
if cont.sensors['MO'].status == JUST_ACTIVATED:
|
if cont.sensors['MO'].status == JUST_ACTIVATED:
|
||||||
|
mouse_up()
|
||||||
scene.objects['Endbanner'].color = color_white
|
scene.objects['Endbanner'].color = color_white
|
||||||
scene.objects['Endbanner_wave'].color = color_white
|
scene.objects['Endbanner_wave'].color = color_white
|
||||||
scene.objects['Endbanner_points'].color = color_white
|
scene.objects['Endbanner_points'].color = color_white
|
||||||
@ -484,6 +496,8 @@ def endbanner_close(cont):
|
|||||||
# Init
|
# Init
|
||||||
def cmd_init():
|
def cmd_init():
|
||||||
# scene.objects['Terrain']['run']=False
|
# scene.objects['Terrain']['run']=False
|
||||||
|
|
||||||
|
# UI : Commandes
|
||||||
scene.objects['Run-Hl'].setVisible(False,False)
|
scene.objects['Run-Hl'].setVisible(False,False)
|
||||||
scene.objects['Pause'].setVisible(False,False)
|
scene.objects['Pause'].setVisible(False,False)
|
||||||
scene.objects['Pause-Hl'].setVisible(False,False)
|
scene.objects['Pause-Hl'].setVisible(False,False)
|
||||||
@ -493,12 +507,23 @@ def cmd_init():
|
|||||||
scene.objects['About-cmd-Hl'].setVisible(False,False)
|
scene.objects['About-cmd-Hl'].setVisible(False,False)
|
||||||
scene.objects['About'].setVisible(False,True)
|
scene.objects['About'].setVisible(False,True)
|
||||||
|
|
||||||
|
# UI : Texte, ...
|
||||||
scene.objects['Map_text'].setVisible(False,False)
|
scene.objects['Map_text'].setVisible(False,False)
|
||||||
scene.objects['Text_info-1'].setVisible(False,False)
|
scene.objects['Text_info-1'].setVisible(False,False)
|
||||||
scene.objects['Text_info-2'].setVisible(False,False)
|
scene.objects['Text_info-2'].setVisible(False,False)
|
||||||
scene.objects['Tower_construc_mode'].setVisible(False,False)
|
scene.objects['Tower_construc_mode'].setVisible(False,False)
|
||||||
scene.objects['Terrain']['map_run'] = False
|
scene.objects['Terrain']['map_run'] = False
|
||||||
|
|
||||||
|
# UI : Mouse
|
||||||
|
# Window size : 738.5 415.5
|
||||||
|
bge.render.setMousePosition(int(bge.render.getWindowWidth() / 2), int(bge.render.getWindowHeight() / 2))
|
||||||
|
bge.render.showMouse(scene.objects['Commands']['debug_mouse'])
|
||||||
|
scene.objects['Mouse_main'].worldPosition = [0.07, -8.11, 4.71035] # Vielle version : [0.118161, -8.24305, 4.71035] ; [0, -3.5, 2], [0, -8, 6]
|
||||||
|
scene.objects['Mouse_main'].worldScale=[30, 30, 30]
|
||||||
|
scene.objects['Mouse_main']['past_x']=0
|
||||||
|
scene.objects['Mouse_main']['past_y']=0
|
||||||
|
scene.objects['Mouse_main']['mouse_up']=0
|
||||||
|
|
||||||
# scene.objects['Raz-vue-Hl'].setVisible(False,False)
|
# scene.objects['Raz-vue-Hl'].setVisible(False,False)
|
||||||
# scene.objects['Aide-cmd-Hl'].setVisible(False,False)
|
# scene.objects['Aide-cmd-Hl'].setVisible(False,False)
|
||||||
|
|
||||||
@ -535,7 +560,7 @@ def cmd_hl(cont):
|
|||||||
scene.objects['Stop-Hl'].setVisible(True,False)
|
scene.objects['Stop-Hl'].setVisible(True,False)
|
||||||
|
|
||||||
# Désactivation
|
# Désactivation
|
||||||
if cont.sensors['MO'].status == JUST_RELEASED and scene.objects['Terrain']['manip_mode']==0:
|
if cont.sensors['MO'].status == JUST_RELEASED and (scene.objects['Terrain']['manip_mode']==0 or scene.objects['Terrain']['manip_mode']==9):
|
||||||
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" :
|
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" :
|
||||||
scene.objects[obj.name+'-Hl'].setVisible(False,True)
|
scene.objects[obj.name+'-Hl'].setVisible(False,True)
|
||||||
obj.setVisible(True,True)
|
obj.setVisible(True,True)
|
||||||
@ -584,6 +609,7 @@ def mode(cont):
|
|||||||
|
|
||||||
# Touche ESC
|
# Touche ESC
|
||||||
if JUST_ACTIVATED in keyboard.inputs[bge.events.ESCKEY].queue:
|
if JUST_ACTIVATED in keyboard.inputs[bge.events.ESCKEY].queue:
|
||||||
|
terrain_stop ()
|
||||||
bge.logic.endGame()
|
bge.logic.endGame()
|
||||||
|
|
||||||
# Fenêtre modale
|
# Fenêtre modale
|
||||||
@ -619,6 +645,12 @@ def mode(cont):
|
|||||||
scene.objects['Camera'].worldPosition.z = scene.objects['Camera']['init_lz']
|
scene.objects['Camera'].worldPosition.z = scene.objects['Camera']['init_lz']
|
||||||
applyRotationTo(scene.objects['Terrain'], 0, 0, 0)
|
applyRotationTo(scene.objects['Terrain'], 0, 0, 0)
|
||||||
|
|
||||||
|
bge.render.setMousePosition(int(bge.render.getWindowWidth() / 2), int(bge.render.getWindowHeight() / 2))
|
||||||
|
scene.objects['Mouse_main'].worldPosition = [0.07, -8.11, 4.71035] # Vielle version : [0.118161, -8.24305, 4.71035] ; [0, -3.5, 2], [0, -8, 6]
|
||||||
|
scene.objects['Mouse_main'].worldScale=[30, 30, 30]
|
||||||
|
scene.objects['Mouse_main']['past_x']=0
|
||||||
|
scene.objects['Mouse_main']['past_y']=0
|
||||||
|
|
||||||
# Touche F5 -> Run et Pause
|
# Touche F5 -> Run et Pause
|
||||||
if JUST_ACTIVATED in keyboard.inputs[bge.events.F5KEY].queue:
|
if JUST_ACTIVATED in keyboard.inputs[bge.events.F5KEY].queue:
|
||||||
terrain_run ()
|
terrain_run ()
|
||||||
@ -643,6 +675,9 @@ def manip_init(cont):
|
|||||||
scene.objects['Camera']['init_lx']=scene.objects['Camera'].worldPosition.x
|
scene.objects['Camera']['init_lx']=scene.objects['Camera'].worldPosition.x
|
||||||
scene.objects['Camera']['init_ly']=scene.objects['Camera'].worldPosition.y
|
scene.objects['Camera']['init_ly']=scene.objects['Camera'].worldPosition.y
|
||||||
scene.objects['Camera']['init_lz']=scene.objects['Camera'].worldPosition.z
|
scene.objects['Camera']['init_lz']=scene.objects['Camera'].worldPosition.z
|
||||||
|
scene.objects['Camera']['past_lx']=scene.objects['Camera'].worldPosition.x
|
||||||
|
scene.objects['Camera']['past_ly']=scene.objects['Camera'].worldPosition.y
|
||||||
|
scene.objects['Camera']['past_lz']=scene.objects['Camera'].worldPosition.z
|
||||||
scene.objects['Terrain']['init_lx']=scene.objects['Terrain'].worldPosition.x
|
scene.objects['Terrain']['init_lx']=scene.objects['Terrain'].worldPosition.x
|
||||||
scene.objects['Terrain']['init_ly']=scene.objects['Terrain'].worldPosition.y
|
scene.objects['Terrain']['init_ly']=scene.objects['Terrain'].worldPosition.y
|
||||||
scene.objects['Terrain']['init_lz']=scene.objects['Terrain'].worldPosition.z
|
scene.objects['Terrain']['init_lz']=scene.objects['Terrain'].worldPosition.z
|
||||||
@ -713,26 +748,125 @@ def manip(cont):
|
|||||||
# Pan
|
# Pan
|
||||||
if obj['manip_mode']==1: # Shift
|
if obj['manip_mode']==1: # Shift
|
||||||
scene.objects['Camera'].applyMovement((delta_x*-sensibilite_pan, delta_y*sensibilite_pan, 0), True)
|
scene.objects['Camera'].applyMovement((delta_x*-sensibilite_pan, delta_y*sensibilite_pan, 0), True)
|
||||||
|
scene.objects['Mouse_main'].applyMovement((delta_x*-sensibilite_pan, delta_y*sensibilite_pan, 0), True)
|
||||||
|
|
||||||
# Zoom
|
# Zoom FIXME : marche pas au niveau de la souris
|
||||||
if obj['manip_mode']==2: # Ctrl
|
if obj['manip_mode']==2: # Ctrl
|
||||||
|
position_scale_x = 0.0005
|
||||||
|
position_scale_y = position_scale_x
|
||||||
|
mouse_x=scene.objects['Mouse_main'].sensors["Mouse"].position[0]-int(bge.render.getWindowWidth() / 2)
|
||||||
|
mouse_y=scene.objects['Mouse_main'].sensors["Mouse"].position[1]-int(bge.render.getWindowHeight() / 2)
|
||||||
|
distance_cam_past= math.sqrt(scene.objects['Camera']['past_ly']**2+scene.objects['Camera']['past_lz']**2)
|
||||||
|
distance_cam = math.sqrt((scene.objects['Camera'].worldPosition.y**2+scene.objects['Camera'].worldPosition.z**2))
|
||||||
|
size_scale = (distance_cam/distance_cam_past) * 0.23
|
||||||
scene.objects['Camera'].applyMovement((0, 0, (delta_x+delta_y)*sensibilite_zoom), True)
|
scene.objects['Camera'].applyMovement((0, 0, (delta_x+delta_y)*sensibilite_zoom), True)
|
||||||
|
scene.objects['Mouse_main'].applyMovement((mouse_x*(delta_x+delta_y)*sensibilite_zoom*position_scale_x, -mouse_y*(delta_x+delta_y)*sensibilite_zoom*position_scale_y, 0), True)
|
||||||
|
scene.objects['Mouse_main'].worldScale *= (delta_x+delta_y)*sensibilite_zoom*size_scale
|
||||||
|
scene.objects['Camera']['past_ly']=scene.objects['Camera'].worldPosition.y
|
||||||
|
scene.objects['Camera']['past_lz']=scene.objects['Camera'].worldPosition.z
|
||||||
|
|
||||||
|
|
||||||
# Manipulation du modèle ou de la caméra
|
# Manipulation du modèle ou de la caméra
|
||||||
def manip_wheel(cont):
|
def manip_wheel(cont):
|
||||||
if scene.objects['Terrain']['manip_mode']!=9: # Fenêtre modale
|
if scene.objects['Terrain']['manip_mode']!=9: # Fenêtre modale
|
||||||
obj = cont.owner
|
obj = cont.owner
|
||||||
sensibilite_wheel = 5 # Base : 20
|
sensibilite_wheel = 5 # Base : 20
|
||||||
|
position_scale_x = 0.0005
|
||||||
|
position_scale_y = position_scale_x
|
||||||
|
mouse_x=scene.objects['Mouse_main'].sensors["Mouse"].position[0]-int(bge.render.getWindowWidth() / 2)
|
||||||
|
mouse_y=scene.objects['Mouse_main'].sensors["Mouse"].position[1]-int(bge.render.getWindowHeight() / 2)
|
||||||
|
distance_cam_past = math.sqrt((scene.objects['Camera'].worldPosition.y**2+scene.objects['Camera'].worldPosition.z**2))
|
||||||
|
# size_scale = (distance_cam/distance_cam_past) * 0.23
|
||||||
|
size_scale = 0.2
|
||||||
|
# size_scale = 0.23
|
||||||
if cont.sensors['WheelUp'].positive:
|
if cont.sensors['WheelUp'].positive:
|
||||||
scene.objects['Camera'].applyMovement((0, 0, -sensibilite_wheel), True)
|
scene.objects['Camera'].applyMovement((0, 0, -sensibilite_wheel), True)
|
||||||
if cont.sensors['WheelDown'].positive:
|
distance_cam = math.sqrt((scene.objects['Camera'].worldPosition.y**2+scene.objects['Camera'].worldPosition.z**2))
|
||||||
|
scene.objects['Mouse_main'].applyMovement((-mouse_x*sensibilite_wheel*position_scale_x, mouse_y*sensibilite_wheel*position_scale_y, 0), True)
|
||||||
|
scene.objects['Mouse_main'].worldScale *= sensibilite_wheel* (distance_cam/distance_cam_past) *size_scale
|
||||||
|
elif cont.sensors['WheelDown'].positive:
|
||||||
scene.objects['Camera'].applyMovement((0, 0, sensibilite_wheel), True)
|
scene.objects['Camera'].applyMovement((0, 0, sensibilite_wheel), True)
|
||||||
|
distance_cam = math.sqrt((scene.objects['Camera'].worldPosition.y**2+scene.objects['Camera'].worldPosition.z**2))
|
||||||
|
scene.objects['Mouse_main'].applyMovement((mouse_x*sensibilite_wheel*position_scale_x, -mouse_y*sensibilite_wheel*position_scale_y, 0), True)
|
||||||
|
scene.objects['Mouse_main'].worldScale /= sensibilite_wheel* (distance_cam_past/distance_cam) *size_scale
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Icone de la souris
|
||||||
|
def mouse(cont):
|
||||||
|
obj = cont.owner
|
||||||
|
|
||||||
|
# Ancienne version basée sur la position de la caméra
|
||||||
|
# distance_cam_init= math.sqrt(scene.objects['Camera']['init_ly']**2+scene.objects['Camera']['init_lz']**2)
|
||||||
|
# distance_cam = math.sqrt((scene.objects['Camera'].worldPosition.y**2+scene.objects['Camera'].worldPosition.z**2))
|
||||||
|
# ratio = ((distance_cam_init - distance_cam)/distance_cam_init)*1.39 # trop vite -> +, pas assez vite -> -
|
||||||
|
# scale_x=0.0118-0.0118*ratio
|
||||||
|
# scale_y=scale_x
|
||||||
|
# delta_x=cont.sensors["Mouse"].position[0]-obj['past_x']
|
||||||
|
# delta_y=cont.sensors["Mouse"].position[1]-obj['past_y']
|
||||||
|
# if delta_x<500 and delta_y<500:
|
||||||
|
# scene.objects['Mouse_main'].worldPosition.x += delta_x*scale_x
|
||||||
|
# scene.objects['Mouse_main'].worldPosition.y -= delta_y*scale_y*math.cos(50*2*math.pi*(1/360))
|
||||||
|
# scene.objects['Mouse_main'].worldPosition.z -= delta_y*scale_y*math.sin(50*2*math.pi*(1/360))
|
||||||
|
# scene.objects['Mouse_main']['past_x']=cont.sensors["Mouse"].position[0]
|
||||||
|
# scene.objects['Mouse_main']['past_y']=cont.sensors["Mouse"].position[1]
|
||||||
|
|
||||||
|
# Version basée sur obj.getDistanceTo(scene.objects['Camera'])
|
||||||
|
delta_x=cont.sensors["Mouse"].position[0]-obj['past_x']
|
||||||
|
delta_y=cont.sensors["Mouse"].position[1]-obj['past_y']
|
||||||
|
vect=mathutils.Vector((1,1,1))-obj.getVectTo(scene.objects['Camera'])[1]
|
||||||
|
dist= obj.getDistanceTo(scene.objects['Camera'])
|
||||||
|
# print ("delta_x, delta_y, vect, dist : ", delta_x, delta_y, vect, dist)
|
||||||
|
if obj['past_dist']==0:
|
||||||
|
obj['past_dist']=obj.getDistanceTo(scene.objects['Camera'])
|
||||||
|
ratio = dist/obj['past_dist']
|
||||||
|
# print ("delta_x, delta_y, vect, dist : ", delta_x, delta_y, vect, dist)
|
||||||
|
scale_x=ratio*0.016
|
||||||
|
scale_y=ratio*0.0162
|
||||||
|
# scale_xy=ratio*0.0005
|
||||||
|
scale_xy=ratio*0
|
||||||
|
if delta_x<500 and delta_y<500:
|
||||||
|
# scene.objects['Mouse_main'].applyMovement((delta_x*scale_x, -vect[1]*delta_y*scale_y, -vect[1]*delta_y*scale_y), False)
|
||||||
|
scene.objects['Mouse_main'].applyMovement((delta_x*scale_x+delta_x*delta_y*scale_xy,
|
||||||
|
-delta_y*scale_y*math.cos(50*2*math.pi*(1/360)),
|
||||||
|
-delta_y*scale_y*math.sin(50*2*math.pi*(1/360))), False)
|
||||||
|
obj['past_x']=cont.sensors["Mouse"].position[0]
|
||||||
|
obj['past_y']=cont.sensors["Mouse"].position[1]
|
||||||
|
|
||||||
|
# Mise en avant de la souris
|
||||||
|
def mouse_up():
|
||||||
|
scene.objects['Mouse_main']['mouse_up']+=1
|
||||||
|
if scene.objects['Mouse_main']['mouse_up'] == 1:
|
||||||
|
decal = 18
|
||||||
|
size_scale = 0.2
|
||||||
|
# print (scene.objects['Mouse_main'].getVectTo(scene.objects['Camera'])[1])
|
||||||
|
vect=scene.objects['Mouse_main'].getVectTo(scene.objects['Camera'])[1]
|
||||||
|
dist_past= scene.objects['Mouse_main'].getDistanceTo(scene.objects['Camera'])
|
||||||
|
scene.objects['Mouse_main'].applyMovement((vect[0]*decal, vect[1]*decal, vect[2]*decal), False)
|
||||||
|
dist= scene.objects['Mouse_main'].getDistanceTo(scene.objects['Camera'])
|
||||||
|
scene.objects['Mouse_main'].worldScale *= (dist/dist_past) *size_scale
|
||||||
|
scene.objects['Mouse_main'].worldScale=[8, 8, 8]
|
||||||
|
|
||||||
|
# Mise en arrière de la souris
|
||||||
|
def mouse_down():
|
||||||
|
scene.objects['Mouse_main']['mouse_up']-=1
|
||||||
|
if scene.objects['Mouse_main']['mouse_up'] == 0:
|
||||||
|
decal = 18
|
||||||
|
size_scale = 0.2
|
||||||
|
# print (scene.objects['Mouse_main'].getVectTo(scene.objects['Camera'])[1])
|
||||||
|
vect=scene.objects['Mouse_main'].getVectTo(scene.objects['Camera'])[1]
|
||||||
|
dist_past= scene.objects['Mouse_main'].getDistanceTo(scene.objects['Camera'])
|
||||||
|
scene.objects['Mouse_main'].applyMovement((-vect[0]*decal, -vect[1]*decal, -vect[2]*decal), False)
|
||||||
|
dist= scene.objects['Mouse_main'].getDistanceTo(scene.objects['Camera'])
|
||||||
|
scene.objects['Mouse_main'].worldScale /= (dist_past/dist) *size_scale
|
||||||
|
scene.objects['Mouse_main'].worldScale=[30, 30, 30]
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# About
|
# About
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
def about_open():
|
def about_open():
|
||||||
|
scene.objects['Terrain']['manip_mode']=9 # Fenêtre modale
|
||||||
scene.objects['About_title'].color = color_black
|
scene.objects['About_title'].color = color_black
|
||||||
scene.objects['About_text'].color = color_black
|
scene.objects['About_text'].color = color_black
|
||||||
scene.objects['About_copyright'].color = color_black
|
scene.objects['About_copyright'].color = color_black
|
||||||
@ -744,27 +878,51 @@ def about_open():
|
|||||||
scene.objects['About_link_kenney'].color= color_link
|
scene.objects['About_link_kenney'].color= color_link
|
||||||
scene.objects['About_ok'].color = color_black
|
scene.objects['About_ok'].color = color_black
|
||||||
scene.objects['About'].setVisible(True,True)
|
scene.objects['About'].setVisible(True,True)
|
||||||
scene.objects['About'].worldPosition = [0, 1.53623, -0.892838]
|
scene.objects['About'].worldPosition = [0, 1.53623, -1.8] # old [0, 1.53623, -0.892838]
|
||||||
scene.objects['About']['timer'] = 0
|
scene.objects['About']['timer'] = 0
|
||||||
scene.objects['About']['anim'] = True
|
scene.objects['About']['anim'] = True
|
||||||
|
|
||||||
def about_open_anim():
|
def about_open_anim():
|
||||||
pas=0.5
|
pas=0.5
|
||||||
scene.objects['About'].localPosition.y=scene.objects['About'].localPosition.y-1*pas
|
scene.objects['About'].localPosition.y -= pas
|
||||||
scene.objects['About'].localPosition.z=scene.objects['About'].localPosition.z+0.85*pas
|
scene.objects['About'].localPosition.z += 0.85*pas
|
||||||
|
# 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
|
scene.objects['About']['timer']+=1
|
||||||
if scene.objects['About']['timer']== 40:
|
if scene.objects['About']['timer']== 40:
|
||||||
scene.objects['About']['anim'] = False
|
scene.objects['About']['anim'] = False
|
||||||
|
|
||||||
def about_hl(cont):
|
def about_hl(cont):
|
||||||
|
# decal = 18
|
||||||
|
# size_scale = 0.2
|
||||||
if cont.sensors['MO'].status == JUST_ACTIVATED:
|
if cont.sensors['MO'].status == JUST_ACTIVATED:
|
||||||
|
mouse_up()
|
||||||
|
# # print (scene.objects['Mouse_main'].getVectTo(scene.objects['Camera'])[1])
|
||||||
|
# vect=scene.objects['Mouse_main'].getVectTo(scene.objects['Camera'])[1]
|
||||||
|
# dist_past= scene.objects['Mouse_main'].getDistanceTo(scene.objects['Camera'])
|
||||||
|
# scene.objects['Mouse_main'].applyMovement((vect[0]*decal, vect[1]*decal, vect[2]*decal), False)
|
||||||
|
# dist= scene.objects['Mouse_main'].getDistanceTo(scene.objects['Camera'])
|
||||||
|
# scene.objects['Mouse_main'].worldScale *= (dist/dist_past) *size_scale
|
||||||
scene.objects['Aboutbanner'].color = color_white
|
scene.objects['Aboutbanner'].color = color_white
|
||||||
scene.objects['About_ok'].color = color_white
|
scene.objects['About_ok'].color = color_white
|
||||||
scene.objects['About_title'].color = color_white
|
scene.objects['About_title'].color = color_white
|
||||||
|
# scene.objects['Mouse_main'].worldScale=[8, 8, 8]
|
||||||
|
# print("about_hl A après", scene.objects['Mouse_main'].worldPosition)
|
||||||
|
|
||||||
if cont.sensors['MO'].status == JUST_RELEASED:
|
if cont.sensors['MO'].status == JUST_RELEASED:
|
||||||
|
# print("about_hl R avant", scene.objects['Mouse_main'].worldPosition)
|
||||||
|
mouse_down()
|
||||||
|
# print (scene.objects['Mouse_main'].getVectTo(scene.objects['Camera'])[1])
|
||||||
|
# vect=scene.objects['Mouse_main'].getVectTo(scene.objects['Camera'])[1]
|
||||||
|
# dist_past= scene.objects['Mouse_main'].getDistanceTo(scene.objects['Camera'])
|
||||||
|
# scene.objects['Mouse_main'].applyMovement((-vect[0]*decal, -vect[1]*decal, -vect[2]*decal), False)
|
||||||
|
# dist= scene.objects['Mouse_main'].getDistanceTo(scene.objects['Camera'])
|
||||||
|
# scene.objects['Mouse_main'].worldScale /= (dist_past/dist) *size_scale
|
||||||
scene.objects['Aboutbanner'].color = color_endbanner_bluelight
|
scene.objects['Aboutbanner'].color = color_endbanner_bluelight
|
||||||
scene.objects['About_ok'].color = color_black
|
scene.objects['About_ok'].color = color_black
|
||||||
scene.objects['About_title'].color = color_black
|
scene.objects['About_title'].color = color_black
|
||||||
|
# scene.objects['Mouse_main'].worldScale=[30, 30, 30]
|
||||||
|
# print("about_hl R après", scene.objects['Mouse_main'].worldPosition)
|
||||||
|
|
||||||
def about_close(cont):
|
def about_close(cont):
|
||||||
if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive :
|
if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive :
|
||||||
@ -793,13 +951,17 @@ def about_link(cont):
|
|||||||
if obj.name == "About_link_blender-colbox" :
|
if obj.name == "About_link_blender-colbox" :
|
||||||
webbrowser.open('https://www.blender.org')
|
webbrowser.open('https://www.blender.org')
|
||||||
|
|
||||||
|
# FIXME: souris graphique trop compliqué
|
||||||
def about_link_hl(cont):
|
def about_link_hl(cont):
|
||||||
|
decal = 15
|
||||||
if cont.sensors['MO'].status == JUST_ACTIVATED :
|
if cont.sensors['MO'].status == JUST_ACTIVATED :
|
||||||
obj = cont.owner
|
obj = cont.owner
|
||||||
name=obj.name[:-7]
|
name=obj.name[:-7]
|
||||||
scene.objects[name].color = color_link_hl
|
scene.objects[name].color = color_link_hl
|
||||||
|
mouse_up()
|
||||||
|
|
||||||
if cont.sensors['MO'].status == JUST_RELEASED :
|
if cont.sensors['MO'].status == JUST_RELEASED :
|
||||||
obj = cont.owner
|
obj = cont.owner
|
||||||
name=obj.name[:-7]
|
name=obj.name[:-7]
|
||||||
scene.objects[name].color = color_link
|
scene.objects[name].color = color_link
|
||||||
|
mouse_down()
|
||||||
|
@ -6,7 +6,7 @@ from ct_lib import * # Bibliothèque CodeTower
|
|||||||
# @title: Commands for the CodeTower game
|
# @title: Commands for the CodeTower game
|
||||||
# @project: CodeTower
|
# @project: CodeTower
|
||||||
# @lang: fr,en
|
# @lang: fr,en
|
||||||
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
|
# @authors: Philippe Roy <phroy@phroy.org>
|
||||||
# @copyright: Copyright (C) 2022 Philippe Roy
|
# @copyright: Copyright (C) 2022 Philippe Roy
|
||||||
# @license: GNU GPL
|
# @license: GNU GPL
|
||||||
#
|
#
|
||||||
@ -40,7 +40,7 @@ def stop():
|
|||||||
|
|
||||||
def end():
|
def end():
|
||||||
ct_sleep (2)
|
ct_sleep (2)
|
||||||
print ("Commands thread is arrived.")
|
print ("Thread commands is arrived.")
|
||||||
scene.objects['Terrain']['thread_cmd']=False
|
scene.objects['Terrain']['thread_cmd']=False
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
@ -6,7 +6,7 @@ from ct_lib import * # Bibliothèque CodeTower
|
|||||||
# @title: Commands for the CodeTower game
|
# @title: Commands for the CodeTower game
|
||||||
# @project: CodeTower
|
# @project: CodeTower
|
||||||
# @lang: fr,en
|
# @lang: fr,en
|
||||||
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
|
# @authors: Philippe Roy <phroy@phroy.org>
|
||||||
# @copyright: Copyright (C) 2022 Philippe Roy
|
# @copyright: Copyright (C) 2022 Philippe Roy
|
||||||
# @license: GNU GPL
|
# @license: GNU GPL
|
||||||
#
|
#
|
||||||
@ -40,7 +40,7 @@ def stop():
|
|||||||
|
|
||||||
def end():
|
def end():
|
||||||
ct_sleep (2)
|
ct_sleep (2)
|
||||||
print ("Commands thread is arrived.")
|
print ("Thread commands is arrived.")
|
||||||
scene.objects['Terrain']['thread_cmd']=False
|
scene.objects['Terrain']['thread_cmd']=False
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
@ -6,7 +6,7 @@ from collections import OrderedDict
|
|||||||
# @title: Composants python
|
# @title: Composants python
|
||||||
# @project: CodeTower
|
# @project: CodeTower
|
||||||
# @lang: fr,en
|
# @lang: fr,en
|
||||||
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
|
# @authors: Philippe Roy <phroy@phroy.org>
|
||||||
# @copyright: Copyright (C) 2022 Philippe Roy
|
# @copyright: Copyright (C) 2022 Philippe Roy
|
||||||
# @license: GNU GPL
|
# @license: GNU GPL
|
||||||
#
|
#
|
||||||
|
19
ct_lib.py
19
ct_lib.py
@ -13,7 +13,7 @@ import random
|
|||||||
# @title: User library
|
# @title: User library
|
||||||
# @project: CodeTower
|
# @project: CodeTower
|
||||||
# @lang: fr,en
|
# @lang: fr,en
|
||||||
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
|
# @authors: Philippe Roy <phroy@phroy.org>
|
||||||
# @copyright: Copyright (C) 2022 Philippe Roy
|
# @copyright: Copyright (C) 2022 Philippe Roy
|
||||||
# @license: GNU GPL
|
# @license: GNU GPL
|
||||||
#
|
#
|
||||||
@ -176,6 +176,11 @@ def ct_minion_details(x,y,cat,level,body="Knight_m_A_common"):
|
|||||||
while scene.objects['Terrain']['run'] == False:
|
while scene.objects['Terrain']['run'] == False:
|
||||||
time.sleep(0.01)
|
time.sleep(0.01)
|
||||||
|
|
||||||
|
# Synchronisation des threads
|
||||||
|
while scene.objects['Terrain']['thread_cmd_lock'] == True:
|
||||||
|
# print ("ct_minion : thread_cmd_lock =True")
|
||||||
|
time.sleep(0.01)
|
||||||
|
|
||||||
# Object 3D
|
# Object 3D
|
||||||
minion= scene.addObject(body, scene.objects['Terrain'])
|
minion= scene.addObject(body, scene.objects['Terrain'])
|
||||||
minion.worldScale=[0.25,0.25,0.25]
|
minion.worldScale=[0.25,0.25,0.25]
|
||||||
@ -228,6 +233,8 @@ def scn_minion_dead(cont):
|
|||||||
|
|
||||||
# Buff/debuff Minion
|
# Buff/debuff Minion
|
||||||
def scn_minion_affect(cont):
|
def scn_minion_affect(cont):
|
||||||
|
if scene.objects['Terrain']['run'] == False: # Pause
|
||||||
|
return
|
||||||
obj = cont.owner
|
obj = cont.owner
|
||||||
# print (obj.name, obj['buff'])
|
# print (obj.name, obj['buff'])
|
||||||
slow_state=False
|
slow_state=False
|
||||||
@ -285,8 +292,13 @@ def ct_build_details(x,y, cat='Archer tower', tower_name="Tower", color=tower_pu
|
|||||||
scene.objects['Terrain']['scene_tile_tower'].append([x,y])
|
scene.objects['Terrain']['scene_tile_tower'].append([x,y])
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
# Blocage des autres threads pendant la construction
|
||||||
|
scene.objects['Terrain']['thread_cmd_lock'] = True
|
||||||
|
|
||||||
# Objets 3D
|
# Objets 3D
|
||||||
|
time.sleep(0.01)
|
||||||
tour= scene.addObject('Tower-'+tower_3d, scene.objects['Terrain'])
|
tour= scene.addObject('Tower-'+tower_3d, scene.objects['Terrain'])
|
||||||
|
time.sleep(0.01)
|
||||||
tour.color = color
|
tour.color = color
|
||||||
tour.worldPosition=[x,y,0.2]
|
tour.worldPosition=[x,y,0.2]
|
||||||
tour.worldScale=[1,1,1]
|
tour.worldScale=[1,1,1]
|
||||||
@ -320,6 +332,8 @@ def ct_build_details(x,y, cat='Archer tower', tower_name="Tower", color=tower_pu
|
|||||||
# Capteur Near
|
# Capteur Near
|
||||||
tour.sensors['Near'].distance=tour['range']
|
tour.sensors['Near'].distance=tour['range']
|
||||||
tour.sensors['Near'].skippedTicks =round(1/(tour['speed']*scene.objects['Terrain']['speed']))
|
tour.sensors['Near'].skippedTicks =round(1/(tour['speed']*scene.objects['Terrain']['speed']))
|
||||||
|
|
||||||
|
scene.objects['Terrain']['thread_cmd_lock'] = False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
# Suppression d'une tour
|
# Suppression d'une tour
|
||||||
@ -458,7 +472,7 @@ def ct_map_text_wave(wave):
|
|||||||
scene.objects['Map_text'].setVisible(True,False)
|
scene.objects['Map_text'].setVisible(True,False)
|
||||||
scene.objects['Map_text'].color = color_text_yellow
|
scene.objects['Map_text'].color = color_text_yellow
|
||||||
scene.objects['Map_text']['timer']=120
|
scene.objects['Map_text']['timer']=120
|
||||||
scene.objects['Map_text']['position_init']=[8.22904, -2.86185, 6.07395]
|
scene.objects['Map_text']['position_init']=[8.37716, -2.39401, 5.56759]
|
||||||
scene.objects['Map_text']['position_end']=[11.1751, 5.99318, 0.480557]
|
scene.objects['Map_text']['position_end']=[11.1751, 5.99318, 0.480557]
|
||||||
scene.objects['Map_text'].worldPosition= scene.objects['Map_text']['position_init']
|
scene.objects['Map_text'].worldPosition= scene.objects['Map_text']['position_init']
|
||||||
scene.objects['Map_text']['anim']=True
|
scene.objects['Map_text']['anim']=True
|
||||||
@ -679,3 +693,4 @@ def scn_draw(cont):
|
|||||||
i=i+1
|
i=i+1
|
||||||
if len(scene.objects['Terrain']['draw_list'])==0:
|
if len(scene.objects['Terrain']['draw_list'])==0:
|
||||||
scene.objects['Terrain']['draw_process']=False
|
scene.objects['Terrain']['draw_process']=False
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ import os
|
|||||||
# @title: Map #1 definition
|
# @title: Map #1 definition
|
||||||
# @project: CodeTower
|
# @project: CodeTower
|
||||||
# @lang: fr,en
|
# @lang: fr,en
|
||||||
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
|
# @authors: Philippe Roy <phroy@phroy.org>
|
||||||
# @copyright: Copyright (C) 2022 Philippe Roy
|
# @copyright: Copyright (C) 2022 Philippe Roy
|
||||||
# @license: GNU GPL
|
# @license: GNU GPL
|
||||||
#
|
#
|
||||||
@ -46,7 +46,7 @@ def stop():
|
|||||||
|
|
||||||
def end():
|
def end():
|
||||||
ct_sleep (2)
|
ct_sleep (2)
|
||||||
print ("Waves thread is arrived.")
|
print ("Thread waves is arrived.")
|
||||||
scene.objects['Terrain']['thread_wave']=False
|
scene.objects['Terrain']['thread_wave']=False
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
Loading…
Reference in New Issue
Block a user