import bge # Bibliothèque Blender Game Engine (UPBGE) import bpy # Blender import math ############################################################################### # fop.py # @title: module principale du jeu Frankie on Platform # @project: Frankie on Platform # @lang: fr # @authors: Philippe Roy # @copyright: Copyright (C) 2023 Philippe Roy # @license: GNU GPL ############################################################################### # Scène UPBGE scene = bge.logic.getCurrentScene() eevee = bpy.context.scene.eevee # print("Objets de la scène : ", scene.objects) # Lister les objets de la scène # Constantes UPBGE JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED JUST_RELEASED = bge.logic.KX_INPUT_JUST_RELEASED ACTIVATE = bge.logic.KX_INPUT_ACTIVE PLAY = bge.logic.KX_ACTION_MODE_PLAY LOOP = bge.logic.KX_ACTION_MODE_LOOP ############################################################################### # Mouvements ############################################################################### ### # Flèches pour avancer, reculer et tourner ### def clavier(cont): obj = cont.owner obj_rig = scene.objects['Frankie-rig'] obj_cam = scene.objects['Camera'] keyboard = bge.logic.keyboard pas_lineaire = 0.1 pas_courrir = 0.2 pas_angulaire = 0.05 pas_angulaire_fps = 0.025 force_saut = 200 recul_camera = 40 idle=True # Avancer : Flèche haut - Up arrow if keyboard.inputs[bge.events.UPARROWKEY].status[0] == ACTIVATE: idle=False obj['chute']=0 if obj['courrir']<40: # 40 : nombre de pas pour courrir obj.applyMovement((0,-pas_lineaire,0), True) start, end, speed, layer = 1, 18, 2, 0 obj_rig.playAction('Frankie-avancer', start, end, 0, 1, 1.0, PLAY, 0.0, 0, speed) obj['courrir']+=1 else: obj.applyMovement((0,-pas_courrir,0), True) start, end, speed, layer = 1, 18, 2, 0 obj_rig.playAction('Frankie-courrir', start, end, layer, 1, 1.0, PLAY, 0.0, 0, speed) if keyboard.inputs[bge.events.UPARROWKEY].status[0] != ACTIVATE and obj['courrir']>0: obj['courrir']=0 # Reculer : Flèche bas - Down arrow if keyboard.inputs[bge.events.DOWNARROWKEY].status[0] == ACTIVATE: idle=False obj['chute']=0 obj.applyMovement((0,pas_lineaire,0), True) start, end, speed, layer = 1, 20, 2, 0 obj_rig.playAction('Frankie-reculer', start, end, layer, 1, 1.0, PLAY, 0.0, 0, speed) # Tourner gauche : Flèche gauche - Left arrow if keyboard.inputs[bge.events.LEFTARROWKEY].status[0] == ACTIVATE: idle=False obj['chute']=0 if obj_cam['fps']: obj.applyRotation((0, 0,pas_angulaire_fps), True) else: obj.applyRotation((0, 0,pas_angulaire), True) start, end, speed, layer = 1, 12, 2, 0 obj_rig.playAction('Frankie-gauche', start, end, 0, 1, 1.0, PLAY, 0.0, 0, speed) # Tourner droite : Flèche droit - Right arrow if keyboard.inputs[bge.events.RIGHTARROWKEY].status[0] == ACTIVATE: idle=False obj['chute']=0 if obj_cam['fps']: obj.applyRotation((0, 0,-pas_angulaire_fps), True) else: obj.applyRotation((0, 0,-pas_angulaire), True) start, end, speed, layer = 1, 12, 2, 0 obj_rig.playAction('Frankie-droite', start, end, layer, 1, 1.0, PLAY, 0.0, 0, speed) # Saut # obj['dist_terrain']= obj.getDistanceTo(scene.objects['Terrain']) # obj['dist_terrain']= obj.getVectTo(scene.objects['Terrain'])[0] # obj['dist_terrain']= obj.getVectTo((0,0,-1))[0] # print (obj.rayCast((0,0,1), None, -10)) if keyboard.inputs[bge.events.SPACEKEY].status[0] == ACTIVATE: idle=False obj['chute']=0 # print (obj.rayCast((0,0,1), None, 100)) # # print (obj.getDistanceTo(scene.objects['Terrain'])) # if obj.rayCast((0,0,1), None, 100)[0] is not None : # obj.applyForce((0, 0,force_saut), True) # start, end, speed, = 1, 34, 2 # obj_rig.playAction('Frankie-sauter', start, end, 0, 1, 1.0, PLAY, 0.0, 0, speed) objs_sol=('Terrain', 'Platforme', 'Pont 1', 'Pont 2') for obj_sol in objs_sol: if obj.collide(scene.objects[obj_sol])[0]: if len(obj.collide(scene.objects[obj_sol])[1])>0: obj.applyForce((0, 0,force_saut), True) start, end, speed, layer = 1, 34, 2, 1 obj_rig.playAction('Frankie-sauter', start, end, layer, 1, 1.0, PLAY, 0.0, 0, speed) break print (obj_rig.isPlayingAction(1)) # Chute if obj.worldPosition.z == obj['chute_z']: obj['chute']=0 if obj.worldPosition.z < obj['chute_z'] : obj['chute']+=1 objs_sol=('Terrain', 'Platforme', 'Pont 1', 'Pont 2') for obj_sol in objs_sol: # print (obj.collide(scene.objects[obj_sol])) if obj.collide(scene.objects[obj_sol])[0]: if len(obj.collide(scene.objects[obj_sol])[1])>0: obj['chute']=0 break # objs_sol=('Terrain', 'Platforme', 'Pont 1', 'Pont 2') # chute_flag=True # for obj_sol in objs_sol: # if obj.collide(scene.objects[obj_sol])[0]: # chute_flag=False # break # if chute_flag: # obj['chute']+=1 obj['chute_z'] = obj.worldPosition.z if obj['chute']>50: idle=False start, end, speed, layer = 1, 33, 2, 0 obj_rig.playAction('Frankie-tomber', start, end, layer, 1, 1.0, LOOP, 0.0, 0, speed) # Attente if idle: start, end, speed, layer = 1, 268, 2, 0 obj_rig.playAction('Frankie-attente', start, end, layer, 1, 1.0, LOOP, 0.0, 0, speed) # Caméra FPS if JUST_ACTIVATED in keyboard.inputs[bge.events.FKEY].queue: if obj_cam['fps']==False: scene.active_camera = scene.objects["Camera_fps"] obj_cam['fps'] = True else: scene.active_camera = scene.objects["Camera"] obj_cam['fps'] = False # Recul caméra if keyboard.inputs[bge.events.EKEY].status[0] == ACTIVATE and obj_cam['macro']==False: obj_cam.applyMovement((0,0,recul_camera), True) obj_cam['macro'] = True if keyboard.inputs[bge.events.EKEY].status[0] != ACTIVATE and obj_cam['macro']==True: obj_cam.applyMovement((0,0,-recul_camera), True) obj_cam['macro'] = False # Saut sur les téléportes (mode debug) : avancer if JUST_ACTIVATED in keyboard.inputs[bge.events.ZKEY].queue and obj['spawn']<8 and obj['debugg']: obj['spawn'] +=1 obj['chute'] = 0 obj['courrir'] = 0 obj_spawn = scene.objects['Spawn '+str(obj['spawn'])] obj.worldPosition = obj_spawn.worldPosition obj.applyRotation((0, 0, -obj.worldOrientation.to_euler().z+obj_spawn['sens']), False) # Saut sur les téléportes (mode debug) : reculer if JUST_ACTIVATED in keyboard.inputs[bge.events.AKEY].queue and obj['spawn']>0 and obj['debugg']: obj['spawn'] -=1 obj['chute'] = 0 obj['courrir'] = 0 obj_spawn = scene.objects['Spawn '+str(obj['spawn'])] obj.worldPosition = obj_spawn.worldPosition obj.applyRotation((0, 0, -obj.worldOrientation.to_euler().z+obj_spawn['sens']), False) ### # Suivi par la caméra ### def camera_track (cont): cont.owner.worldPosition = scene.objects['Frankie'].worldPosition ############################################################################### # Cycle ############################################################################### # Initialisation de la scène def init(cont): obj = cont.owner # Init EEVEE eevee.use_taa_reprojection = True eevee.use_ssr = True # Screen space reflection eevee.use_ssr_refraction = True # Screen space refractions eevee.use_ssr_halfres = True eevee.use_gtao = False eevee.taa_render_samples = 64 eevee.taa_samples = 16 eevee.use_volumetric_lights = True eevee.use_volumetric_shadows = False eevee.shadow_cascade_size='1024' eevee.shadow_cube_size='512' # Mode debug scene.objects['Frankie']['debugg']=True # Init de Frankie scene.objects['Frankie']['chute']=0 scene.objects['Frankie']['chute_z'] = scene.objects['Frankie'].worldPosition.z scene.objects['Frankie']['spawn']=0 # Cacher les pancartes for i in range (1, 7): scene.objects['Pancarte '+str(i)].setVisible(False,True) # Mise en route de la plateforme start, end, speed, layer = 1, 200, 0.5, 0 scene.objects['Platforme'].playAction('Platforme-action', start, end, layer, 1, 1.0, LOOP, 0.0, 0, speed) # Chute def chute(cont): obj = cont.owner if obj.worldPosition.z<=-9 : obj_spawn = scene.objects['Spawn '+str(obj['spawn'])] obj.worldPosition = obj_spawn.worldPosition obj.applyRotation((0, 0, -obj.worldOrientation.to_euler().z+obj_spawn['sens']), False) obj['chute'] = 0 obj['courrir'] = 0 # Checkpoint def checkpoint(cont): obj = cont.owner obj_i=int(obj.name[6:-7]) obj_frankie = scene.objects['Frankie'] if obj_i > obj_frankie['spawn']: obj_frankie['spawn']=obj_i scene.objects['Pancarte '+str(obj_i)].setVisible(True,True) # Ressort def ressort(cont): obj = cont.owner sensor = obj.sensors['Collision'] force_saut = 1000 obj_ressort=scene.objects[obj.name[:-7]] obj_frankie = scene.objects['Frankie'] if sensor.positive: start, end, speed, layer = 1, 16, 0.5, 0 obj_ressort.playAction(obj_ressort.name+'-action', start, end, layer, 1, 1.0, PLAY, 0.0, 0, speed) obj_frankie.applyForce((0, 0,force_saut), True) ############################################################################### # Gestion du Joystick (Joystick USB) ############################################################################### # def joystick(cont): # obj = cont.owner # joystickIndex = 0 #int from 0 to 6 # joy = bge.logic.joysticks[joystickIndex] # events = joy.activeButtons # axis = joy.axisValues[0:4] # resolution = 0.01 # leftStick_x = axis[0]; leftStick_y = axis[1] # rightStick_x = axis[2]; rightStick_y = axis[3] # #if any button is pressed # # if events: # # print(events) #spit out integer index of pressed buttons # # if 0 in events: # # doSomething() # # Up # if leftStick_y <-0.1 : # obj.applyRotation((-resolution,0,0), False) # # Down # if leftStick_y >0.1 : # obj.applyRotation((resolution,0,0), False) # # Left # if leftStick_x <-0.1 : # obj.applyRotation((0, -resolution,0), False) # # Right # if leftStick_x >0.1 : # obj.applyRotation((0, resolution,0), False)