def update(task): if s.mouseWatcherNode.is_button_down(KeyboardButton.up()): pingPong("accelerate", -1) elif s.mouseWatcherNode.is_button_down(KeyboardButton.down()): pingPong("accelerate", 1) else: pingPong("accelerate", 0) if s.mouseWatcherNode.is_button_down(KeyboardButton.right()): pingPong("turn", -1) elif s.mouseWatcherNode.is_button_down(KeyboardButton.left()): pingPong("turn", 1) else: pingPong("turn", 0) if s.mouseWatcherNode.is_button_down(KeyboardButton.ascii_key(b'd')): pingPong("strafe", -1) elif s.mouseWatcherNode.is_button_down(KeyboardButton.ascii_key(b'a')): pingPong("strafe", 1) else: pingPong("strafe", 0) if s.mouseWatcherNode.is_button_down(KeyboardButton.ascii_key(b's')): pingPong("hover", 1, 0, 0, 20) else: pingPong("hover", 0, 0, 0, 20) return task.cont
def poll_keyboard(self, velocity): # under normal circumstances, use median of joytick output x_speed = 0.5 y_speed = 0.5 # checks keyboard, not mouse, in this case is_down = self.base.mouseWatcherNode.is_button_down # Instead of usual movement, exactly counteract joystick, # if using joystick and currently moving if self.joystick: if abs(velocity.x) > self.threshold: if velocity.x > 0: x_speed = velocity.x else: x_speed = -velocity.x if abs(velocity.y) > self.threshold: if velocity.y > 0: y_speed = velocity.y else: y_speed = -velocity.y else: velocity.x = 0 velocity.y = 0 if is_down(KeyboardButton.up()): velocity.y += y_speed if is_down(KeyboardButton.down()): velocity.y -= y_speed if is_down(KeyboardButton.left()): velocity.x -= x_speed # print 'keyboard' if is_down(KeyboardButton.right()): velocity.x += x_speed return velocity
def read_keys(self): self.upArrowIsPressed = base.mouseWatcherNode.isButtonDown( KeyboardButton.up()) self.downArrowIsPressed = base.mouseWatcherNode.isButtonDown( KeyboardButton.down()) self.rightArrowIsPressed = base.mouseWatcherNode.isButtonDown( KeyboardButton.right()) self.leftArrowIsPressed = base.mouseWatcherNode.isButtonDown( KeyboardButton.left())
def __init__(self, charId, charNr, controls): FSM.__init__(self, "FSM-Player{}".format(charNr)) self.charId = charId charPath = "characters/character{}/".format(charNr) self.character = Actor( charPath + "char", { "Idle": charPath + "idle", "Walk": charPath + "walk", "Walk_back": charPath + "walk_back", "Punch_l": charPath + "punch_l", "Punch_r": charPath + "punch_r", "Kick_l": charPath + "kick_l", "Kick_r": charPath + "kick_r", "Hit": charPath + "hit", "Defend": charPath + "defend", "Defeated": charPath + "defeated" }) self.character.reparentTo(render) self.character.hide() self.walkSpeed = 2.0 if controls == "p1": self.character.setH(90) self.leftButton = KeyboardButton.asciiKey("d") self.rightButton = KeyboardButton.asciiKey("f") self.punchLButton = KeyboardButton.asciiKey("q") self.punchRButton = KeyboardButton.asciiKey("w") self.kickLButton = KeyboardButton.asciiKey("a") self.kickRButton = KeyboardButton.asciiKey("s") self.defendButton = KeyboardButton.asciiKey("e") elif controls == "p2": self.character.setH(-90) self.leftButton = KeyboardButton.right() self.rightButton = KeyboardButton.left() self.punchLButton = KeyboardButton.asciiKey("i") self.punchRButton = KeyboardButton.asciiKey("o") self.kickLButton = KeyboardButton.asciiKey("k") self.kickRButton = KeyboardButton.asciiKey("l") self.defendButton = KeyboardButton.asciiKey("p") characterSphere = CollisionSphere(0, 0, 1.0, 0.5) self.collisionNodeName = "character{}Collision".format(charId) characterColNode = CollisionNode(self.collisionNodeName) characterColNode.addSolid(characterSphere) self.characterCollision = self.character.attachNewNode( characterColNode) base.pusher.addCollider(self.characterCollision, self.character) base.cTrav.addCollider(self.characterCollision, base.pusher) characterHitRay = CollisionSegment(0, -0.5, 1.0, 0, -0.8, 1.0) characterColNode.addSolid(characterHitRay) self.getPos = self.character.getPos self.getX = self.character.getX
def poll_keyboard(self): x_speed = 0.5 y_speed = 0.5 velocity = LVector3(0) # poorly named, checks keyboard, not mouse, in this case is_down = base.mouseWatcherNode.is_button_down if is_down(KeyboardButton.up()): velocity.y += y_speed if is_down(KeyboardButton.down()): velocity.y -= y_speed if is_down(KeyboardButton.left()): velocity.x -= x_speed if is_down(KeyboardButton.right()): velocity.x += x_speed return velocity
def __init__(self, charId, charNr, controls): # 参数 controls 是一个字符串变量,我们等待 p# 之类的值,其中 # 必须是 1 或 2 ,因为我们只有两个游戏玩家 # 使用字符编号调用 init 函数,因此我们可以将该类用于我们存储在资产中的任何字符模型,而不需要为每个字符编写一个类以的字符ID FSM.__init__(self, "FSM-Player{}".format(charNr)) # 初始化 FSM 类 self.charId = charId charPath = "characters/character{}/".format(charNr) # 使用存储在 charNr 中的字符编号来选择玩家所选字符的文件夹 self.character = Actor( charPath + "char", { "Idle":charPath + "idle", "walk":charPath + "walk", "punch_l":charPath + "punch_l", "punch_r":charPath + "punch_r", "kick_l":charPath + "kick_l", "kick_r":charPath + "kick_r", "Hit":charPath + "hit", "defend":charPath + "defend" }) # 告诉Panda3D引擎加载动画模型,演员是由引擎设置的全局功能。这个函数的第一个参数是我们角色的主要模型,第二个是名称和路径字符串的映射。名称将用于稍后选择应播放哪个动画,另一个字符串确定 .egg 文件的路径,该文件包含属于主模型的动画。请注意,不需要也不应该将.egg 扩展名添加到路径中,因为稍后鸡蛋文件将转换为bam文件格式,我们将在后面的部分中对其进行描述。 # self.character.setH(90) # 将字符围绕其向上指向轴旋转90度,在这种情况下,该轴是Z轴。 # 告诉引擎它应该将字符添加到渲染节点。必须对应该在引擎创建的3D空间中呈现的任何对象执行此操作。 self.character.reparentTo(render) # render 是由引擎设置的全局变量 self.character.hide() # 直接调用 hide 函数,因为我们不希望角色在加载后直接显示。 # 使用一组预定义的运动变量为角色添加键盘交互 self.walkSpeed = 2.0 # units per second if controls == "p1": self.character.setH(90) self.leftButton = KeyboardButton.asciiKey(b"d") self.rightButton = KeyboardButton.asciiKey(b"f") # 使用'D'和'F'键分别让角色左右移动 self.punchLButton = KeyboardButton.asciiKey(b"q") self.punchRButton = KeyboardButton.asciiKey(b"w") self.kickLButton = KeyboardButton.asciiKey(b"a") self.kickRButton = KeyboardButton.asciiKey(b"s") self.defendButton = KeyboardButton.asciiKey(b"e") elif controls == "p2": self.character.setH(-90) self.leftButton = KeyboardButton.right() self.rightButton = KeyboardButton.left() self.punchLButton = KeyboardButton.asciiKey(b"i") self.punchRButton = KeyboardButton.asciiKey(b"o") self.kickLButton = KeyboardButton.asciiKey(b"k") self.kickRButton = KeyboardButton.asciiKey(b"l") self.defendButton = KeyboardButton.asciiKey(b"p")
def defineKeys(self): for k in self.keyState.keys(): self.keyState[k] = False if self.isKeyDown(KeyboardButton.up()): self.keyState["WalkFw"] = True if self.isKeyDown(KeyboardButton.down()): self.keyState["WalkBw"] = True if self.isKeyDown(KeyboardButton.left()): self.keyState["RotateL"] = True if self.isKeyDown(KeyboardButton.right()): self.keyState["RotateR"] = True if self.isKeyDown(KeyboardButton.shift()): self.keyState["Run"] = True if self.isKeyDown(KeyboardButton.space()): self.keyState["Jump"] = True if self.isKeyDown(KeyboardButton.asciiKey("d")): self.keyState["Duck"] = True
def poll_keyboard(self): # under normal circumstances, use median of joytick output x_speed = 0.5 y_speed = 0.5 # checks keyboard, not mouse, in this case is_down = self.base.mouseWatcherNode.is_button_down if not self.joystick: self.velocity.x = 0 self.velocity.y = 0 if is_down(KeyboardButton.up()): self.velocity.y += y_speed if is_down(KeyboardButton.down()): self.velocity.y -= y_speed if is_down(KeyboardButton.left()): self.velocity.x -= x_speed # print 'keyboard' if is_down(KeyboardButton.right()): self.velocity.x += x_speed
def update(task): forward, turn, strafe, hover = 0, 0, 0, 0 if s.mouseWatcherNode.is_button_down(KeyboardButton.up()): forward += 1 if s.mouseWatcherNode.is_button_down(KeyboardButton.down()): forward -= 1 if s.mouseWatcherNode.is_button_down(KeyboardButton.left()): turn -= 1 if s.mouseWatcherNode.is_button_down(KeyboardButton.right()): turn += 1 if s.mouseWatcherNode.is_button_down(KeyboardButton.ascii_key(b'a')): strafe -= 1 if s.mouseWatcherNode.is_button_down(KeyboardButton.ascii_key(b'd')): strafe += 1 if s.mouseWatcherNode.is_button_down(KeyboardButton.ascii_key(b's')): hover += 1 animate(forward, turn, strafe, hover) #if s.mouseWatcherNode.is_button_down(KeyboardButton.space()): # control("hover") return task.cont
def move_camera(self, task): rot = globalClock.get_dt() * 360.0 / 3.0 up_down = 0 left_right = 0 if base.mouseWatcherNode.is_button_down(KeyboardButton.up()): up_down -= 1 if base.mouseWatcherNode.is_button_down(KeyboardButton.down()): up_down += 1 if base.mouseWatcherNode.is_button_down(KeyboardButton.left()): left_right -=1 if base.mouseWatcherNode.is_button_down(KeyboardButton.right()): left_right +=1 if self.rotation_mode and base.mouseWatcherNode.has_mouse(): mouse_pos = base.mouseWatcherNode.get_mouse() mouse_delta = mouse_pos - self.mouse_pos self.mouse_pos = Point2(mouse_pos) up_down += mouse_delta.get_y() * 50 left_right += mouse_delta.get_x() * -50 self.camera_orbit.set_h(self.camera_orbit, left_right * rot) new_pitch = self.camera_pitch.get_p() + up_down * rot self.camera_pitch.set_p(min(max(new_pitch, -89), 89)) return Task.cont
def move_camera(self, task): rot = globalClock.get_dt() * 360.0 / 3.0 up_down = 0 left_right = 0 if base.mouseWatcherNode.is_button_down(KeyboardButton.up()): up_down -= 1 if base.mouseWatcherNode.is_button_down(KeyboardButton.down()): up_down += 1 if base.mouseWatcherNode.is_button_down(KeyboardButton.left()): left_right -= 1 if base.mouseWatcherNode.is_button_down(KeyboardButton.right()): left_right += 1 if self.rotation_mode and base.mouseWatcherNode.has_mouse(): mouse_pos = base.mouseWatcherNode.get_mouse() mouse_delta = mouse_pos - self.mouse_pos self.mouse_pos = Point2(mouse_pos) up_down += mouse_delta.get_y() * 50 left_right += mouse_delta.get_x() * -50 self.camera_orbit.set_h(self.camera_orbit, left_right * rot) new_pitch = self.camera_pitch.get_p() + up_down * rot self.camera_pitch.set_p(min(max(new_pitch, -89), 89)) return Task.cont
def __init__(self): # Initialize the ShowBase class from which we inherit, which will # create a window and set up everything we need for rendering into it. ShowBase.__init__(self) self.stimtype = 'random image' # session_start self.session_start_time = datetime.datetime.now() # self.accept("escape", sys.exit, [0])#don't let the user do this, because then the data isn't saved. self.accept('q', self.close) self.accept('Q', self.close) self.upArrowIsPressed = base.mouseWatcherNode.isButtonDown(KeyboardButton.up()) self.downArrowIsPressed = base.mouseWatcherNode.isButtonDown(KeyboardButton.down()) self.rightArrowIsPressed = base.mouseWatcherNode.isButtonDown(KeyboardButton.right()) self.leftArrowIsPressed = base.mouseWatcherNode.isButtonDown(KeyboardButton.left()) self.AUTO_REWARD = AUTO_REWARD # disable mouse control so that we can place the camera base.disableMouse() camera.setPosHpr(0, 0, 10, 0, -90, 0) mat = Mat4(camera.getMat()) mat.invertInPlace() base.mouseInterfaceNode.setMat(mat) # base.enableMouse() props = WindowProperties() # props.setOrigin(0, 0) props.setFullscreen(True) props.setCursorHidden(True) props.setMouseMode(WindowProperties.M_relative) base.win.requestProperties(props) base.setBackgroundColor(0, 0, 0) # set the background color to black print('FULSCREEN:') print(props.getFullscreen()) print('=============') # set up the textures # we now get buffer thats going to hold the texture of our new scene altBuffer = self.win.makeTextureBuffer("hello", 1524, 1024) # altBuffer.getDisplayRegion(0).setDimensions(0.5,0.9,0.5,0.8) # altBuffer = base.win.makeDisplayRegion() # altBuffer.makeDisplayRegion(0,1,0,1) # now we have to setup a new scene graph to make this scene self.dr2 = base.win.makeDisplayRegion(0, 0.001, 0, 0.001)#make this really,really small so it's not seeable by the subject altRender = NodePath("new render") # this takes care of setting up ther camera properly self.altCam = self.makeCamera(altBuffer) self.dr2.setCamera(self.altCam) self.altCam.reparentTo(altRender) self.altCam.setPos(0, -10, 0) self.bufferViewer.setPosition("lrcorner") # self.bufferViewer.position = (-.1,-.4,-.1,-.4) self.bufferViewer.setCardSize(1.0, 0.0) print(self.bufferViewer.position) self.imagesTexture = MovieTexture("image_sequence") # success = self.imagesTexture.read("models/natural_images.avi") # success = self.imagesTexture.read("models/movie_5hz.mpg") self.imagesTexture.setPlayRate(1.0) self.imagesTexture.setLoopCount(10) # self.imageTexture =loader.loadTexture("models/NaturalImages/BSDs_8143.tiff") # self.imagesTexture.reparentTo(altRender) self.fixationPoint = OnscreenImage(image='models/fixationpoint.jpg', pos=(0, 0,0),scale=0.01) cm = CardMaker("stimwindow") cm.setFrame(-4, 4, -3, 3) # cm.setUvRange(self.imagesTexture) self.card = NodePath(cm.generate()) self.card.reparentTo(altRender) if self.stimtype == 'image_sequence': self.card.setTexture(self.imagesTexture, 1) # add the score display self.scoreLabel = OnscreenText(text='Current Score:', pos=(-1, 0.9), scale=0.1, fg=(0.8, 0.8, 0.8, 1)) self.scoreText = OnscreenText(text=str(0), pos=(-1, 0.76), scale=0.18, fg=(0, 1, 0, 1), shadow=(0.1, 1, 0.1, 0.5)) self.feebackScoreText = OnscreenText(text='+ ' + str(0), pos=(-0.5, 0.5), scale=0.3, fg=(0, 1, 0, 1), shadow=(0.1, 1, 0.1, 0.5)) self.feebackScoreText.setX(3.) # self.imagesTexture.play() # self.bufferViewer.setPosition("lrcorner") # self.bufferViewer.setCardSize(1.0, 0.0) self.accept("v", self.bufferViewer.toggleEnable) self.accept("V", self.bufferViewer.toggleEnable) # Load the tunnel self.initTunnel() # initialize some things # for the tunnel construction: self.boundary_to_add_next_segment = -1 * TUNNEL_SEGMENT_LENGTH self.current_number_of_segments = 8 # task flow booleans self.in_waiting_period = False self.stim_started = False self.looking_for_a_cue_zone = True self.in_reward_window = False self.show_stimulus = False # for task control self.interval = 0 self.time_waiting_in_cue_zone = 0 self.wait_time = 1.83 self.stim_duration = 0 # in seconds # self.distribution_type = np.random.uniform# # self.distribution_type_inputs = [0.016,0.4] #change the min & max stim duration times #New lines EAS: set weights higher for faster image durations self.durWeights = list() a = np.linspace(0.016,0.4,10) for i,j in enumerate(a): if j<0.1: p1 = 0.25 self.durWeights.append(p1) elif j > 0.1 and j < 0.21: p1 = 0.1 self.durWeights.append(p1) elif j> 0.21: p1 = 0.04 self.durWeights.append(p1) self.rng = np.random.default_rng() a = np.asarray(a) self.distribution_type_inputs = a #subset_size = len(p) #End new lines # self.distribution_type_inputs = [0.05,1.5] #can be anytong should match # self.distribution_type_inputs = [0.016,0.4] #change the min & max stim duration times # self.distribution_type_inputs = [0.016,0.4, 10] #change the min & max stim duration times self.max_stim_duration = 1.0 # in seconds self.stim_elapsed = 0.0 # in seconds self.last_position = base.camera.getZ() self.position_on_track = base.camera.getZ() # for reward control self.reward_window = REWARD_WINDOW # in seconds self.reward_elapsed = 0.0 # self.new_dt = list() # self.reward_volume = 0.008 # in mL. this is for the hardcoded 0.1 seconds of reward time self.reward_volume = int(REWARD_VOLUME) # in uL, for the stepper motor self.reward_time = 0.1 # in sec, based on volume. hard coded right now but should be modified by the (1) calibration and (2) optionally by the main loop for dynamic reward scheduling # self.lick_buffer = [] self.current_score = 0 self.score = 0 self.feedback_score_startime = -2 # INITIALIZE NIDAQ self.nidevice = 'Dev2' self.encodervinchannel = 1 self.encodervsigchannel = 0 self.invertdo = False self.diport = 1 self.lickline = 1 self.doport = 0 self.rewardline = 0 self.rewardlines = [0] self.encoder_position_diff = 0 if have_nidaq: self._setupDAQ() self.do.WriteBit(1, 1) self.do.WriteBit(3, 1) # set reward high, because the logic is flipped somehow. possibly by haphazard wiring of the circuit (12/24/2018 djd) self.previous_encoder_position = self.ai.data[0][self.encodervsigchannel] else: self.previous_encoder_position = 0 self.encoder_gain = 3 # INITIALIZE LICK SENSOR self._lickSensorSetup() # INITIALIZE output data self.lickData = [] self.x = [] self.t = [] self.trialData = [] self.reactionTimeData = [] self.rewardData = [] self.rightKeyData = [] self.leftKeyData = [] self.imageData = [] self.imageTimeData = [] self.scoreData = [] self.trialDurationData = [] self.new_dt = [] # INITIALIZE KEY SENSOR, for backup inputs and other user controls self.keys = key.KeyStateHandler() self.accept('r', self._give_reward, [self.reward_volume]) self.accept('l', self._toggle_reward) # initialize the image list and populate what images you want included # self.img_list = glob.glob('models/2AFC_IMAGES_HUMAN/*.tif') # self.img_list = glob.glob('models/2AFC_IMAGES_HUMAN2/*.tif') # self.img_list = glob.glob('/Users/elizabethstubblefield/Desktop/cheetah_or_elephant/composite_images/masks/all_same_num_ea/*.tif') #Newest images self.img_list = glob.glob('models/all_same_ea/*.tif') #Newest images #No longer hard-coded: self.original_indices = [0,0] #this was manually counted... first number must was the index of the first easy img; was [43, -18] for ndx, name in enumerate(self.img_list): if 'Cheetah255' in name: self.original_indices[0] = ndx elif 'Elephant0' in name: self.original_indices[1] = ndx # print(self.img_list) # self.original_indices = [43,-18] #manually counted, grump #Problematic w/out at least 43 images in the folder self.imageTextures =[loader.loadTexture(img) for img in self.img_list] self.img_id = None #this variable is used so we know which stimulus is being presented self.img_mask = None #this tells us what the image mask being presented is # self._setupEyetracking() # self._startEyetracking() if AUTO_MODE: self.gameTask = taskMgr.add(self.autoLoop2, "autoLoop2") self.rewardTask = taskMgr.add(self.rewardControl, "reward") self.cue_zone = concatenate((self.cue_zone, arange( \ self.current_number_of_segments * -TUNNEL_SEGMENT_LENGTH-50, \ self.current_number_of_segments * -TUNNEL_SEGMENT_LENGTH - TUNNEL_SEGMENT_LENGTH - 100, \ -1))) self.auto_position_on_track = 0 self.auto_restart = False self.auto_running = True self.contTunnel() else: # Now we create the task. taskMgr is the task manager that actually # calls the function each frame. The add method creates a new task. # The first argument is the function to be called, and the second # argument is the name for the task. It returns a task object which # is passed to the function each frame. self.gameTask = taskMgr.add(self.gameLoop, "gameLoop") # self.stimulusTask = taskMgr.add(self.stimulusControl, "stimulus") self.lickTask = taskMgr.add(self.lickControl, "lick") self.rewardTask = taskMgr.add(self.rewardControl, "reward") self.keyTask = taskMgr.add(self.keyControl, "Key press")
def rollTask(self, task): # Standard technique for finding the amount of time since the last # frame #print("\r",self.maze.getR(), self.maze.getP(), self.ballRoot.getPos(), end="") dt = globalClock.getDt() print("\r{:.3} fps ".format(1 / dt), end="") # If dt is large, then there has been a # hiccup that could cause the ball # to leave the field if this functions runs, so ignore the frame if dt > .2: return Task.cont #print(action) if action == "start": a = 1 elif action == "stop": while action == "stop": a = 0 # elif action == "restart": in Line 531 elif action == "coord": a = 1 #ALGUNA CRIDA A METODE DE NARCIS/MARC key_down = base.mouseWatcherNode.is_button_down if self.ready_to_solve: if key_down(KeyboardButton.ascii_key('d')): screenshot = self.camera2_buffer.getScreenshot() if screenshot: v = memoryview(screenshot.getRamImage()).tolist() img = np.array(v, dtype=np.uint8) img = img.reshape( (screenshot.getYSize(), screenshot.getXSize(), 4)) img = img[::-1] #self.digitizer.set_src_img(img) #self.digitizer.digitalize_source() cv2.imshow('img', img) #cv2.waitKey(0) if key_down(KeyboardButton.ascii_key('s')): print("Screenshot!") self.camera2_buffer.saveScreenshot("screenshot.jpg") # The collision handler collects the collisions. We dispatch which function # to handle the collision based on the name of what was collided into for i in range(self.cHandler.getNumEntries()): entry = self.cHandler.getEntry(i) name = entry.getIntoNode().getName() if action == "restart": self.loseGame(entry) if name == "wall_col": self.wallCollideHandler(entry) elif name == "ground_col": self.groundCollideHandler(entry) elif name == "loseTrigger": vr.restart = 1 global th th = threading.Thread(target=listenVoice) th.start() self.loseGame(entry) # Read the mouse position and tilt the maze accordingly # Rotation axes use (roll, pitch, heave) """ if base.mouseWatcherNode.hasMouse(): mpos = base.mouseWatcherNode.getMouse() # get the mouse position self.maze.setP(mpos.getY() * -10) self.maze.setR(mpos.getX() * 10) """ ballPos = self.get_ball_position() #print("BALL POS: ", ballPos) posFPixel = self.path[self.indexPuntActual] xFinal = posFPixel[1] #posFPixel[1]/np.shape(laberint)[0]*13 - 6.5 yFinal = posFPixel[ 0] #-(posFPixel[0]/np.shape(laberint)[1]*13.5 - 6.8) dist = math.sqrt((xFinal - ballPos[1])**2 + (yFinal - ballPos[0])**2) if (dist < self.minDist): if (self.indexPuntActual == len(self.path) - 1): print("SOLVED!!", end="") while (self.aStar.distance( (ballPos[0], ballPos[1]), self.path[self.indexPuntActual]) < self.pas): if (self.indexPuntActual < len(self.path) - 1): self.indexPuntActual += 1 else: break # ball pos (y,x) #print("END POS: ", self.digitizer.endPos) if voice_solving: p_rotation = dir_veu[0] r_rotation = dir_veu[1] if p_rotation == 0 and r_rotation == 0 and ballPos is not None: p_rotation, r_rotation = self.pid.getPR( ballPos[1], ballPos[0], ballPos[1], ballPos[0], self.maze.getP(), self.maze.getR(), dt) else: p_rotation = 0 r_rotation = 0 #print(ballPos, dist) #print(ballPos) if ballPos is not None: p_rotation, r_rotation = self.pid.getPR( ballPos[1], ballPos[0], xFinal, yFinal, self.maze.getP(), self.maze.getR(), dt) #print(p_rotation, r_rotation) if key_down(KeyboardButton.up()): p_rotation = -1 elif key_down(KeyboardButton.down()): p_rotation = 1 if key_down(KeyboardButton.left()): r_rotation = -1 elif key_down(KeyboardButton.right()): r_rotation = 1 self.rotateMaze(p_rotation, r_rotation) # Finally, we move the ball # Update the velocity based on acceleration self.ballV += self.accelV * dt * ACCEL # Clamp the velocity to the maximum speed if self.ballV.lengthSquared() > MAX_SPEED_SQ: self.ballV.normalize() self.ballV *= MAX_SPEED # Update the position based on the velocity self.ballRoot.setPos(self.ballRoot.getPos() + (self.ballV * dt)) #print(self.ballRoot.getPos()) # This block of code rotates the ball. It uses something called a quaternion # to rotate the ball around an arbitrary axis. That axis perpendicular to # the balls rotation, and the amount has to do with the size of the ball # This is multiplied on the previous rotation to incrimentally turn it. prevRot = LRotationf(self.ball.getQuat()) axis = LVector3.up().cross(self.ballV) newRot = LRotationf(axis, 45.5 * dt * self.ballV.length()) self.ball.setQuat(prevRot * newRot) elif key_down(KeyboardButton.ascii_key('1')): self.solve() if key_down(KeyboardButton.ascii_key('i')): self.light.setY(self.light.getY() + 10 * dt) elif key_down(KeyboardButton.ascii_key('k')): self.light.setY(self.light.getY() - 10 * dt) if key_down(KeyboardButton.ascii_key('j')): self.light.setX(self.light.getX() - 10 * dt) elif key_down(KeyboardButton.ascii_key('l')): self.light.setX(self.light.getX() + 10 * dt) if key_down(KeyboardButton.ascii_key('u')): self.lightColor += 10000 * dt self.light.node().setColor( (self.lightColor, self.lightColor, self.lightColor, 1)) elif key_down(KeyboardButton.ascii_key('o')): self.lightColor -= 10000 * dt self.light.node().setColor( (self.lightColor, self.lightColor, self.lightColor, 1)) if key_down(KeyboardButton.ascii_key('8')): self.alightColor += 1 * dt self.ambientL.node().setColor( (self.alightColor, self.alightColor, self.alightColor, 1)) elif key_down(KeyboardButton.ascii_key('9')): self.alightColor -= 1 * dt self.ambientL.node().setColor( (self.alightColor, self.alightColor, self.alightColor, 1)) if key_down(KeyboardButton.ascii_key('r')): base.trackball.node().set_pos(0, 200, 0) base.trackball.node().set_hpr(0, 60, 0) return Task.cont # Continue the task indefinitely
def update(self, entities_by_filter): for entity in entities_by_filter['character']: character = entity[CharacterController] character.jumps = False character.sprints = False character.crouches = False character.move.x = 0.0 character.move.y = 0.0 character.heading = 0.0 character.pitch = 0.0 # For debug purposes, emulate analog stick on keyboard # input, being half-way pressed, by holding shift analog = 1 if base.mouseWatcherNode.is_button_down(KeyboardButton.shift()): analog = 0.5 if base.mouseWatcherNode.is_button_down( KeyboardButton.ascii_key("w")): character.move.y += analog if base.mouseWatcherNode.is_button_down( KeyboardButton.ascii_key("s")): character.move.y -= analog if base.mouseWatcherNode.is_button_down( KeyboardButton.ascii_key("a")): character.move.x -= analog if base.mouseWatcherNode.is_button_down( KeyboardButton.ascii_key("d")): character.move.x += analog # Rotation if base.mouseWatcherNode.is_button_down(KeyboardButton.up()): character.pitch += 1 if base.mouseWatcherNode.is_button_down(KeyboardButton.down()): character.pitch -= 1 if base.mouseWatcherNode.is_button_down(KeyboardButton.left()): character.heading += 1 if base.mouseWatcherNode.is_button_down(KeyboardButton.right()): character.heading -= 1 if TurntableCamera in entity: camera = entity[TurntableCamera] camera.heading = camera.pitch = 0 if base.mouseWatcherNode.is_button_down( KeyboardButton.ascii_key("j")): camera.heading = 1 if base.mouseWatcherNode.is_button_down( KeyboardButton.ascii_key("l")): camera.heading = -1 if base.mouseWatcherNode.is_button_down( KeyboardButton.ascii_key("i")): camera.pitch = -1 if base.mouseWatcherNode.is_button_down( KeyboardButton.ascii_key("k")): camera.pitch = 1 # Special movement modes. # By default, you run ("sprint"), unless you press e, in # which case you walk. You can crouch by pressing q; this # overrides walking and running. Jump by pressing space. # This logic is implemented by the Walking system. Here, # only intention is signalled. if base.mouseWatcherNode.is_button_down( KeyboardButton.ascii_key("e")): character.sprints = True if base.mouseWatcherNode.is_button_down( KeyboardButton.ascii_key("c")): character.crouches = True if base.mouseWatcherNode.is_button_down(KeyboardButton.space()): character.jumps = True
def __init__(self, charId, charNr, controls): FSM.__init__(self, "FSM-Player{}".format(charNr)) self.charId = charId charPath = "characters/character{}/".format(charNr) self.character = Actor( charPath + "char", { "Idle": charPath + "idle", "Walk": charPath + "walk", "Walk_back": charPath + "walk_back", "Punch_l": charPath + "punch_l", "Punch_r": charPath + "punch_r", "Kick_l": charPath + "kick_l", "Kick_r": charPath + "kick_r", "Defend": charPath + "defend", "Hit": charPath + "hit", "Defeated": charPath + "defeated", }, ) self.character.reparentTo(render) self.character.hide() self.walkSpeed = 2.0 # units per second if controls == "p1": self.character.setH(90) self.leftButton = KeyboardButton.asciiKey("d") self.rightButton = KeyboardButton.asciiKey("f") self.punchLButton = KeyboardButton.asciiKey("q") self.punchRButton = KeyboardButton.asciiKey("w") self.kickLButton = KeyboardButton.asciiKey("a") self.kickRButton = KeyboardButton.asciiKey("s") self.defendButton = KeyboardButton.asciiKey("e") elif controls == "p2": self.character.setH(-90) self.leftButton = KeyboardButton.right() self.rightButton = KeyboardButton.left() self.punchLButton = KeyboardButton.asciiKey("i") self.punchRButton = KeyboardButton.asciiKey("o") self.kickLButton = KeyboardButton.asciiKey("k") self.kickRButton = KeyboardButton.asciiKey("l") self.defendButton = KeyboardButton.asciiKey("p") self.getPos = self.character.getPos self.getX = self.character.getX characterSphere = CollisionSphere(0, 0, 1.0, 0.5) self.collisionNodeName = "character{}Collision".format(charId) characterColNode = CollisionNode(self.collisionNodeName) characterColNode.addSolid(characterSphere) self.characterCollision = self.character.attachNewNode(characterColNode) # Uncomment this line to show collision solids # self.characterCollision.show() base.pusher.addCollider(self.characterCollision, self.character) base.cTrav.addCollider(self.characterCollision, base.pusher) characterHitRay = CollisionSegment(0, -0.5, 1.0, 0, -0.8, 1.0) characterColNode.addSolid(characterHitRay) self.audioStep = base.audio3d.loadSfx("assets/audio/step.ogg") self.audioStep.setLoop(True) base.audio3d.attachSoundToObject(self.audioStep, self.character) self.audioHit = base.audio3d.loadSfx("assets/audio/hit.ogg") self.audioHit.setLoop(False) base.audio3d.attachSoundToObject(self.audioStep, self.character)
def __init__(self, charId, charNr, controls): FSM.__init__(self, "FSM-Player{}".format(charNr)) self.charId = charId charPath = "characters/character{}/".format(charNr) self.character = Actor( charPath + "char", { "Idle": charPath + "idle", "Walk": charPath + "walk", "Walk_back": charPath + "walk_back", "Punch_l": charPath + "punch_l", "Punch_r": charPath + "punch_r", "Kick_l": charPath + "kick_l", "Kick_r": charPath + "kick_r", "Defend": charPath + "defend", "Hit": charPath + "hit", "Defeated": charPath + "defeated" }) self.character.reparentTo(render) self.character.hide() self.walkSpeed = 2.0 # units per second if controls == "p1": self.character.setH(90) self.leftButton = KeyboardButton.asciiKey(b"d") self.rightButton = KeyboardButton.asciiKey(b"f") self.punchLButton = KeyboardButton.asciiKey(b"q") self.punchRButton = KeyboardButton.asciiKey(b"w") self.kickLButton = KeyboardButton.asciiKey(b"a") self.kickRButton = KeyboardButton.asciiKey(b"s") self.defendButton = KeyboardButton.asciiKey(b"e") elif controls == "p2": self.character.setH(-90) self.leftButton = KeyboardButton.right() self.rightButton = KeyboardButton.left() self.punchLButton = KeyboardButton.asciiKey(b"i") self.punchRButton = KeyboardButton.asciiKey(b"o") self.kickLButton = KeyboardButton.asciiKey(b"k") self.kickRButton = KeyboardButton.asciiKey(b"l") self.defendButton = KeyboardButton.asciiKey(b"p") self.getPos = self.character.getPos self.getX = self.character.getX characterSphere = CollisionSphere(0, 0, 1.0, 0.5) self.collisionNodeName = "character{}Collision".format(charId) characterColNode = CollisionNode(self.collisionNodeName) characterColNode.addSolid(characterSphere) self.characterCollision = self.character.attachNewNode( characterColNode) # Uncomment this line to show collision solids #self.characterCollision.show() base.pusher.addCollider(self.characterCollision, self.character) base.cTrav.addCollider(self.characterCollision, base.pusher) characterHitRay = CollisionSegment(0, -0.5, 1.0, 0, -0.8, 1.0) characterColNode.addSolid(characterHitRay) self.audioStep = base.audio3d.loadSfx("assets/audio/step.ogg") self.audioStep.setLoop(True) base.audio3d.attachSoundToObject(self.audioStep, self.character) self.audioHit = base.audio3d.loadSfx("assets/audio/hit.ogg") self.audioHit.setLoop(False) base.audio3d.attachSoundToObject(self.audioStep, self.character)
from direct.showbase.ShowBase import ShowBase from direct.task import Task from panda3d.core import AmbientLight from panda3d.core import Vec4, Mat4, Point3, Point4, BitMask32 from panda3d.core import LineSegs, NodePath from panda3d.core import LVecBase4, LVecBase2d, InputDevice from pandac.PandaModules import WindowProperties from direct.gui.OnscreenText import OnscreenText from direct.interval.LerpInterval import LerpPosInterval arrow_right = KeyboardButton.right() arrow_left = KeyboardButton.left() arrow_back = KeyboardButton.down() arrow_forward = KeyboardButton.up() GG = LVecBase4(0, 1, 0, 1) # game green constant camera_dict = {"turn_ang_vel": 0.25, "translate_vel": 0.5} NUMET = 2 # number of enemy tanks tanks_dict = { "0": {}, "1": { "init_pos": Point3(30, 50, 0), "color_scale": Point4(0, 0.7, 0, 1.0), "move_params": { "Ax": 25, "Ay": 18, "Bx": -0.15, "By": 0.25,