def update(self): """ update main game loop """ camera.rotation_y += mouse.velocity[0] * 40 camera.rotation_x -= mouse.velocity[1] * 40 camera.rotation_x = clamp(camera.rotation_x, -90, 90) # snake eats snack if distance(self.snake.head.position, self.snack.position) < 0.1: # make_sound(1) self.score[-1] += 1 msg = 'Your score is {0}'.format(self.score[-1]) print_on_screen(msg, position=(-0.85, 0.45), scale=2, duration=1) self.snake.add_block() while True: self.snack.random_position() snack_pos = self.snack.position if not (snack_pos in list( map(lambda x: x.position, self.snake.body))): break # snake eats its tail if self.snake.self_eat(): # make_sound(3) self.score.append(len(self.snake.body)) msg = 'You lost!\nYour score is {0}\n[record is {1}]'.format( self.score[-1], max(self.score)) print_on_screen(msg, position=(-0.7, 0.15), scale=5, duration=2) self.snake.isPause = True invoke(self.start_new_game, delay=3)
def intersects(self, traverse_target=scene, ignore=(), debug=False): from ursina.hit_info import HitInfo if not self.collision or not self.collider: self.hit = HitInfo(hit=False) return self.hit from ursina import distance if not hasattr(self, '_picker'): from panda3d.core import CollisionTraverser, CollisionNode, CollisionHandlerQueue from panda3d.core import CollisionRay, CollisionSegment, CollisionBox self._picker = CollisionTraverser() # Make a traverser self._pq = CollisionHandlerQueue() # Make a handler self._pickerNode = CollisionNode('raycaster') self._pickerNode.set_into_collide_mask(0) self._pickerNP = self.attach_new_node(self._pickerNode) self._picker.addCollider(self._pickerNP, self._pq) self._pickerNP.show() self._pickerNode.addSolid(self._collider.shape) if debug: self._pickerNP.show() else: self._pickerNP.hide() self._picker.traverse(traverse_target) if self._pq.get_num_entries() == 0: self.hit = HitInfo(hit=False) return self.hit ignore += (self, ) ignore += tuple([e for e in scene.entities if not e.collision]) self._pq.sort_entries() self.entries = [ # filter out ignored entities e for e in self._pq.getEntries() if e.get_into_node_path().parent not in ignore ] if len(self.entries) == 0: self.hit = HitInfo(hit=False, distance=0) return self.hit collision = self.entries[0] nP = collision.get_into_node_path().parent point = collision.get_surface_point(nP) point = Vec3(*point) world_point = collision.get_surface_point(render) world_point = Vec3(*world_point) hit_dist = distance(self.world_position, world_point) self.hit = HitInfo(hit=True) self.hit.entity = next(e for e in scene.entities if e == nP) self.hit.point = point self.hit.world_point = world_point self.hit.distance = hit_dist normal = collision.get_surface_normal(collision.get_into_node_path().parent).normalized() self.hit.normal = Vec3(*normal) normal = collision.get_surface_normal(render).normalized() self.hit.world_normal = Vec3(*normal) self.hit.entities = [] for collision in self.entries: self.hit.entities.append(next(e for e in scene.entities if e == collision.get_into_node_path().parent)) return self.hit