<bdo id='h9x8x'></bdo><ul id='h9x8x'></ul>

      <small id='h9x8x'></small><noframes id='h9x8x'>

      <legend id='h9x8x'><style id='h9x8x'><dir id='h9x8x'><q id='h9x8x'></q></dir></style></legend>

        <i id='h9x8x'><tr id='h9x8x'><dt id='h9x8x'><q id='h9x8x'><span id='h9x8x'><b id='h9x8x'><form id='h9x8x'><ins id='h9x8x'></ins><ul id='h9x8x'></ul><sub id='h9x8x'></sub></form><legend id='h9x8x'></legend><bdo id='h9x8x'><pre id='h9x8x'><center id='h9x8x'></center></pre></bdo></b><th id='h9x8x'></th></span></q></dt></tr></i><div id='h9x8x'><tfoot id='h9x8x'></tfoot><dl id='h9x8x'><fieldset id='h9x8x'></fieldset></dl></div>
      1. <tfoot id='h9x8x'></tfoot>

        电子游戏控制器支持的问题

        problems with pygame controller support(电子游戏控制器支持的问题)

            <i id='H4dVv'><tr id='H4dVv'><dt id='H4dVv'><q id='H4dVv'><span id='H4dVv'><b id='H4dVv'><form id='H4dVv'><ins id='H4dVv'></ins><ul id='H4dVv'></ul><sub id='H4dVv'></sub></form><legend id='H4dVv'></legend><bdo id='H4dVv'><pre id='H4dVv'><center id='H4dVv'></center></pre></bdo></b><th id='H4dVv'></th></span></q></dt></tr></i><div id='H4dVv'><tfoot id='H4dVv'></tfoot><dl id='H4dVv'><fieldset id='H4dVv'></fieldset></dl></div>
          • <legend id='H4dVv'><style id='H4dVv'><dir id='H4dVv'><q id='H4dVv'></q></dir></style></legend>

                  <tbody id='H4dVv'></tbody>
              1. <tfoot id='H4dVv'></tfoot>

                <small id='H4dVv'></small><noframes id='H4dVv'>

                  <bdo id='H4dVv'></bdo><ul id='H4dVv'></ul>
                • 本文介绍了电子游戏控制器支持的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  import pygame
                  import os
                  import random
                  import time
                  import json
                  from pygame import joystick
                  pygame.font.init()
                  pygame.init()
                  
                  WIDTH, HEIGHT = 1920, 1000
                  WIN = pygame.display.set_mode((WIDTH, HEIGHT))
                  pygame.display.set_caption("space invaders")
                  WHITE = (255, 255, 255)
                  
                  #load images
                  RED_SPACE_SHIP = pygame.transform.scale(pygame.image.load(os.path.join("Assets", "pixel_ship_red_small.png")), (125, 100))
                  GREEN_SPACE_SHIP = pygame.transform.scale(pygame.image.load(os.path.join("Assets", "pixel_ship_green_small.png")), (125, 100))
                  BLUE_SPACE_SHIP = pygame.transform.scale(pygame.image.load(os.path.join("Assets", "pixel_ship_blue_small.png")), (125, 100))
                  #player
                  YELLOW_SPACE_SHIP = pygame.transform.rotate(pygame.transform.scale(pygame.image.load(os.path.join("Assets", "spaceship_yellow.png")), (154, 121)), 180)
                  #lasers
                  RED_LASER = pygame.image.load(os.path.join("Assets", "pixel_laser_red.png"))
                  BLUE_LASER = pygame.image.load(os.path.join("Assets", "pixel_laser_blue.png"))
                  GREEN_LASER = pygame.image.load(os.path.join("Assets", "pixel_laser_green.png"))
                  #player laser
                  YELLOW_LASER = pygame.image.load(os.path.join("Assets", "pixel_laser_yellow.png"))
                  #background
                  BG = pygame.transform.scale(pygame.image.load(
                      os.path.join('Assets', 'space.png')), (WIDTH, HEIGHT))
                  
                  class Laser():
                      def __init__(self, x, y, img):
                          self.x = x
                          self.y = y
                          self.img = img
                          self.mask = pygame.mask.from_surface(self.img)
                  
                      def draw(self, window):
                          window.blit(self.img, (self.x, self.y))
                      
                      def move(self, vel):
                          self.y += vel
                  
                      def off_screen(self, height):
                          return not(self.y <= height and self.y >= 0)
                  
                      def collision(self, obj):
                          return collide(self, obj)
                  
                  class Ship:
                      COOLDOWN = 30
                  
                      def __init__(self, x, y, health = 100):
                          self.x = x
                          self.y = y
                          self.health = health
                          self.ship_img = None
                          self.laser_img = None
                          self.lasers = []
                          self.cool_down_counter = 0
                  
                      def draw(self, window):
                          window.blit(self.ship_img, (self.x, self.y))
                          for laser in self.lasers:
                              laser.draw(window)
                  
                      def move_lasers(self, vel, obj):
                          self.cooldown()
                          for laser in self.lasers:
                              laser.move(vel)
                              if laser.off_screen(HEIGHT):
                                  self.lasers.remove(laser)
                              elif laser.collision(obj):
                                  obj.health -= 10
                                  self.lasers.remove(laser)
                      
                      def cooldown(self):
                          if self.cool_down_counter >= self.COOLDOWN:
                              self.cool_down_counter = 0
                          elif self.cool_down_counter > 0:
                              self.cool_down_counter += 1
                  
                      def shoot(self):
                          if self.cool_down_counter == 0:
                              laser = Laser(self.x, self.y, self.laser_img)
                              self.lasers.append(laser)
                              self.cool_down_counter = 1
                  
                      def get_width(self):
                          return self.ship_img.get_width()
                  
                      def get_height(self):
                          return self.ship_img.get_height()
                  
                  class Player(Ship):
                      def __init__(self, x, y, health = 100):
                          super().__init__(x, y, health)
                          self.ship_img = YELLOW_SPACE_SHIP
                          self.laser_img = YELLOW_LASER
                          self.mask = pygame.mask.from_surface(self.ship_img)
                          self.max_health = health
                      
                      def shoot(self):
                          if self.cool_down_counter == 0:
                              laser = Laser(self.x + 26, self.y - 57, self.laser_img)
                              self.lasers.append(laser)
                              self.cool_down_counter = 1
                      
                      def move_lasers(self, vel, objs):
                          self.cooldown()
                          for laser in self.lasers:
                              laser.move(vel)
                              if laser.off_screen(HEIGHT):
                                  self.lasers.remove(laser)
                              else:
                                  for obj in objs:
                                      if laser.collision(obj):
                                          objs.remove(obj)
                                          if laser in self.lasers:
                                              self.lasers.remove(laser)
                  
                      def draw(self, window):
                          super().draw(window)
                          self.healthbar(window)
                  
                      def healthbar(self, window):
                          pygame.draw.rect(window, (255, 0, 0), (self.x, self.y + self.ship_img.get_height() + 10, self.ship_img.get_width(), 10))
                          pygame.draw.rect(window, (0, 255, 0), (self.x, self.y + self.ship_img.get_height() + 10, self.ship_img.get_width()* (self.health/self.max_health),10))
                  
                  class Enemy(Ship):
                      COLOR_MAP = {
                                  "red": (RED_SPACE_SHIP, RED_LASER),
                                  "green": (GREEN_SPACE_SHIP, GREEN_LASER),
                                  "blue": (BLUE_SPACE_SHIP, BLUE_LASER)
                                  }
                      
                      def __init__(self, x, y, color, health = 100):
                          super().__init__(x, y, health)
                          self.ship_img, self.laser_img = self.COLOR_MAP[color]
                          self.mask = pygame.mask.from_surface(self.ship_img)
                  
                      def move(self, vel):
                          self.y += vel
                  
                      def shoot(self):
                          if self.cool_down_counter == 0:
                              laser = Laser(self.x - 3, self.y + 20, self.laser_img)
                              self.lasers.append(laser)
                              self.cool_down_counter = 1
                  
                  def collide(obj1, obj2):
                      offset_x = obj2.x - obj1.x
                      offset_y = obj2.y - obj1.y
                      return obj1.mask.overlap(obj2.mask, (offset_x, offset_y)) != None 
                  
                  
                  
                  def main():
                      run = True
                      FPS = 60
                      level = 0
                      lives = 5
                      lost = False
                      lost_count = 0
                      main_font = pygame.font.SysFont("comicsans", 75)
                      lost_font = pygame.font.SysFont("comicsans", 500)
                  
                      enemies = []
                      wave_length = 5
                  
                      player_vel = 7
                      laser_vel = 7
                      enemy_vel = 1
                  
                      player = Player(WIDTH // 2, 650)
                  
                      clock = pygame.time.Clock()
                  
                      def redraw_window():
                          WIN.blit(BG, (0,0))
                          #draw text
                          level_label = main_font.render(f"Level: {level}", 1, WHITE)
                          lives_label = main_font.render(f"Lives: {lives}", 1, WHITE)
                  
                          WIN.blit(lives_label, (10, 10))
                          WIN.blit(level_label, (WIDTH - level_label.get_width() - 10, 10))
                  
                          player.draw(WIN)
                  
                          for enemy in enemies:
                              enemy.draw(WIN)
                  
                          if lost:
                              lost_label = lost_font.render("You Lost!", 1, (WHITE))
                              WIN.blit(lost_label, (WIDTH/2 - lost_label.get_width()/2, HEIGHT / 2 - lost_label.get_height() / 2))
                  
                          pygame.display.update()
                      joysticks = []
                      for i in range(pygame.joystick.get_count()):
                          joysticks.append(pygame.joystick.Joystick(i))
                      for joystick in joysticks:
                          pygame.joystick.init()
                          print(pygame.joystick.get_init())
                  
                      with open(os.path.join("ps4_keys.json"), 'r+') as file:
                          button_keys = json.load(file)
                  
                      # 0: Left analog horizonal, 1: left analog verticle, 2: right analog horizonal
                      # 3: right analog verticle, 4: left Triger, 5: Right Trigger
                      analog_keys = {0:0, 1:0, 2:0, 3:0, 4:-1, 5:-1} 
                  
                      while run:
                          clock.tick(FPS)
                          redraw_window()
                  
                          if lives <= 0 or player.health <= 0:
                              lost = True
                              lost_count += 1
                          
                          if lost:
                              if lost_count > FPS * 3:
                                 run = False 
                              else:
                                  continue
                  
                          if len(enemies) == 0:
                              level += 1
                              wave_length += 5
                              for i in range(wave_length):
                                  enemy = Enemy(random.randrange(100, WIDTH-100), random.randrange(-1500, -100), random.choice(["red", "blue", "green"]))
                                  enemies.append(enemy)
                  
                          for event in pygame.event.get():
                              if event.type == pygame.QUIT:
                                  quit()
                  
                              if event.type == pygame.JOYAXISMOTION:
                                  analog_keys[event.axis] = event.value
                                  print(analog_keys)
                                  if abs(analog_keys[0]) > .4:
                                      if analog_keys[0] < -.7:
                                          player.x -= 7
                                      else:
                                          continue
                                      if analog_keys[0] < .7:
                                          player.x += 7
                  
                          for enemy in enemies[:]:
                              enemy.move(enemy_vel)
                              enemy.move_lasers(laser_vel, player)
                  
                              if random.randrange(0, 120) == 1:
                                  enemy.shoot()
                  
                              if collide(enemy, player):
                                  player.health -= 10
                                  enemies.remove(enemy)
                  
                              elif enemy.y + enemy.get_height() > HEIGHT:
                                  lives -= 1
                                  enemies.remove(enemy)
                  
                          player.move_lasers(-laser_vel, enemies)
                  
                  def main_menu():
                      title_font = pygame.font.SysFont("comicsans", 150)
                      run = True
                      while run:
                          WIN.blit(BG, (0,0))
                          title_label = title_font.render("Click the mouse to begin...", 1, WHITE)
                          WIN.blit(title_label, (WIDTH / 2 - title_label.get_width() / 2, HEIGHT / 2 - title_label.get_height() / 2))
                          pygame.display.update()
                          for event in pygame.event.get():
                              if event.type == pygame.QUIT:
                                  run = False
                              if event.type == pygame.MOUSEBUTTONDOWN:
                                  main()
                  
                      pygame.quit()
                  
                  main_menu()   
                  

                  ^^ 所以这是我的代码(这里也是JSON文件):

                  {
                      "x": 0,
                      "circle": 1,
                      "square": 2,
                      "triangle": 3,
                      "share": 4,
                      "PS": 5,
                      "options": 6,
                      "left_stick_click": 7,
                      "right_stick_click": 8,
                      "L1": 9,
                      "R1": 10,
                      "up_arrow": 11,
                      "down_arrow": 12,
                      "left_arrow": 13,
                      "right_arrow": 14,
                      "touchpad": 15
                      
                  }
                  
                  我正在尝试使游戏机由控制器左侧的操纵杆控制,它没有返回任何错误,但是我的游戏机没有移动,并且它从print(pygame.joystick.get_init())打印TRUE,并从print(analog_keys)打印游戏杆金额,但是游戏机没有移动。知道为什么吗?

                  推荐答案

                  请勿使用JOYAXISMOTION事件。该事件不会连续发生,它只在轴更改时发生一次。
                  使用pygame.joystick.Joystick.get_axis获取轴的当前位置,并根据轴移动播放器:

                  def main():
                      # [...]
                  
                      while run:
                          # [...]
                      
                          for event in pygame.event.get():
                              if event.type == pygame.QUIT:
                                  run = False
                  
                          if joysticks:
                              joystick = joysticks[0]
                              axis_x, axis_y = (joystick.get_axis(0), joystick.get_axis(1))
                              if abs(axis_x) > 0.1:
                                  player.x += round(7 * axis_x)
                              if abs(axis_y) > 0.1:
                                  player.y += round(7 * axis_y)
                  
                          # [...]
                  

                  最小示例:

                  import pygame
                  from pygame.locals import *
                  
                  pygame.init()
                  window = pygame.display.set_mode((300, 300))
                  clock = pygame.time.Clock()
                  x, y = window.get_rect().center
                  
                  if pygame.joystick.get_count() > 0:
                      joystick = pygame.joystick.Joystick(0)
                      joystick.init()
                  
                  run = True
                  while run:
                      for event in pygame.event.get():
                          if event.type == pygame.QUIT:
                              run = False
                  
                      axis_x, axis_y = (joystick.get_axis(0), joystick.get_axis(1))
                      if abs(axis_x) > 0.1:
                          x = (x + round(7 * axis_x)) % window.get_width()
                      if abs(axis_y) > 0.1:
                          y = (y + round(7 * axis_y)) % window.get_height()   
                  
                      window.fill(0)
                      pygame.draw.circle(window, (255, 0, 0), (x, y), 10)
                      pygame.display.flip()
                      clock.tick(60)
                  
                  pygame.quit()
                  exit()
                  

                  这篇关于电子游戏控制器支持的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                  相关文档推荐

                  GUI Freezes while downloading PyQt5 and Pytube(GUI在下载PyQt5和Pytube时冻结)
                  How to solve memory issues while multiprocessing using Pool.map()?(如何解决使用Pool.map()进行多处理时的内存问题?)
                  Python - How to use FastAPI and uvicorn.run without blocking the thread?(Python-如何使用FastAPI和uvicorn.run而不阻塞线程?)
                  How to increment a shared counter from multiple processes?(如何从多个进程递增共享计数器?)
                  Using pika, how to connect to rabbitmq running in docker, started with docker-compose with external network?(使用pika,如何连接运行在docker中的rabbitmq,从docker开始-与外部网络连接?)
                  How to use .rolling() on each row of a Pandas dataframe?(如何对 pandas 数据帧的每一行使用.roll()?)

                        <tbody id='sgpRM'></tbody>

                        <bdo id='sgpRM'></bdo><ul id='sgpRM'></ul>

                        <small id='sgpRM'></small><noframes id='sgpRM'>

                        <i id='sgpRM'><tr id='sgpRM'><dt id='sgpRM'><q id='sgpRM'><span id='sgpRM'><b id='sgpRM'><form id='sgpRM'><ins id='sgpRM'></ins><ul id='sgpRM'></ul><sub id='sgpRM'></sub></form><legend id='sgpRM'></legend><bdo id='sgpRM'><pre id='sgpRM'><center id='sgpRM'></center></pre></bdo></b><th id='sgpRM'></th></span></q></dt></tr></i><div id='sgpRM'><tfoot id='sgpRM'></tfoot><dl id='sgpRM'><fieldset id='sgpRM'></fieldset></dl></div>
                          <legend id='sgpRM'><style id='sgpRM'><dir id='sgpRM'><q id='sgpRM'></q></dir></style></legend><tfoot id='sgpRM'></tfoot>