鱼C论坛

 找回密码
 立即注册
查看: 1638|回复: 10

pygame求助第二段循环中无法识别键盘按下(急,赶ddl中)

[复制链接]
发表于 2023-10-20 17:25:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. import pygame,sys

  2. pygame.init()

  3. desk_width = pygame.display.get_desktop_sizes()[0][0]
  4. desk_height = pygame.display.get_desktop_sizes()[0][1]

  5. WIN_WIDTH=1440
  6. WIN_HEIGHT=800

  7. window=pygame.display.set_mode((desk_width,desk_height))
  8. pygame.display.set_caption('The Cemetroy')
  9. window.fill((0,0,0))

  10. FPS=60
  11. image_start=r'C:/Users/26896/Desktop/THE CEMETERY/start.jpg'
  12. image_game0=r"C:\Users\26896\Desktop\THE CEMETERY\Cemetery-dusk.png"
  13. image_game1=r"C:\Users\26896\Desktop\THE CEMETERY\Cemetery-dusk(2).png"
  14. textbottom=r"C:/Users/26896/Desktop/THE CEMETERY/HYShangWeiHuangYeW.ttf"
  15. elder_left = pygame.image.load(r"C:\Users\26896\Desktop\THE CEMETERY\elder_left.png", )
  16. elder_right = pygame.image.load(r"C:\Users\26896\Desktop\THE CEMETERY\elder_right.png")


  17. def textbox( content,rfiles, color, size, x,y):
  18.         font=pygame.font.Font(rfiles,size)
  19.         text=font.render('content',True,color)
  20.         window.blit(text,(x,y))
  21.         pygame.display.update()

  22. def imagebox(rfiles,angle=0,scale=1):
  23.         image=pygame.image.load(rfiles)
  24.         w,h=image.get_size()
  25.         window.blit(image,(desk_width/2-w/2,desk_height/2-h/2))
  26.         pygame.display.flip()

  27.         image=pygame.transform.rotozoom(image,angle,scale)
  28.         window.blit(image,(desk_width/2-w/2,desk_height/2-h/2))
  29.         pygame.display.update()

  30. #按钮
  31. def bottombox(text_rfiles,text_size,text_color,text_content,rectangle_color,rx,ry,rw,rh,ractangles_width=0,border_radius=20,border_top_left_radius=-1,border_top_right_radius=-1,border_bottom_left_radius=-1,border_bottom_right_radius=-1,rectangle_color_beneath=(50,35,35)):
  32.         #中心坐标
  33.         font=pygame.font.Font(text_rfiles,text_size)
  34.         pygame.draw.rect(window, rectangle_color_beneath, (rx-rw*3/5,ry-rh*5/8,rw*6/5,rh*5/4),ractangles_width,border_radius,border_top_left_radius,border_top_right_radius,border_bottom_left_radius,border_bottom_right_radius)
  35.         pygame.draw.rect(window, rectangle_color, (rx-rw/2,ry-rh/2,rw,rh),ractangles_width,border_radius,border_top_left_radius,border_top_right_radius,border_bottom_left_radius,border_bottom_right_radius)

  36.         text=font.render(text_content,True,text_color)
  37.         tw,th = text.get_size()
  38.         window.blit(text,(rx-tw/2, ry-th/2))

  39.         pygame.display.update()

  40. for event in pygame.event.get():

  41. #按下按钮动画
  42.         def mousebottomdown(rx,ry,rw,rh,text_rfiles,text_size,text_color,text_content,rectangle_color,rectangle_width=0,border_radius=20,border_top_left_radius=-1,border_top_right_radius=-1,border_bottom_left_radius=-1,border_bottom_right_radius=-1):

  43.                 pygame.draw.rect(window,(100,100,100),(rx-rw/2,ry-rh/2,rw,rh),0,border_radius,border_top_left_radius,border_top_right_radius,border_bottom_left_radius,border_bottom_right_radius)

  44.                 font=pygame.font.Font(text_rfiles,text_size)
  45.                 text=font.render(text_content,True,(255,0,0))
  46.                 tw,th = text.get_size()
  47.                 window.blit(text,(rx-tw/2, ry-th/2))

  48.                 pygame.display.update()

  49.                 pygame.time.wait(300)


  50.         def mousebottomup(rx,ry,rw,rh,text_rfiles,text_size,text_color,text_content,rectangle_color,rectangle_width=0,border_radius=20,border_top_left_radius=-1,border_top_right_radius=-1,border_bottom_left_radius=-1,border_bottom_right_radius=-1):
  51.                 pygame.draw.rect(window,rectangle_color,(rx-rw/2,ry-rh/2,rw,rh),0,border_radius,border_top_left_radius,border_top_right_radius,border_bottom_left_radius,border_bottom_right_radius)
  52.                 font=pygame.font.Font(text_rfiles,text_size)
  53.                 text=font.render(text_content,True,text_color)
  54.                 tw,th = text.get_size()
  55.                 window.blit(text,(rx-tw/2, ry-th/2))
  56.                 pygame.display.update()
  57.                 print("succeed")
  58.                 pygame.time.wait(300)


  59. #开始页
  60. imagebox(image_start)
  61. #开始,退出选项
  62. bottombox(textbottom,70,(200,235,235),'start',(100,65,65),desk_width/2,desk_height/2,170,80)
  63. bottombox(textbottom,70,(200,235,235),'exit',(100,65,65),desk_width/2,desk_height/2+WIN_HEIGHT/4,170,80)


  64. def main():
  65.         clock=pygame.time.Clock()
  66.         #game loop
  67.         start = True
  68.         game = False
  69.         end = False
  70.         #print("start=",start)
  71.         while start:
  72.                 clock.tick(FPS)
  73.                 events=pygame.event.get()
  74.                 for event in events:

  75.                         if event.type == pygame.MOUSEBUTTONDOWN :

  76.                                 mx,my = event.pos
  77.                                 if (desk_width/2-170/2<=mx<=desk_width/2+170/2 and desk_height/2-80/2<=my<=desk_height/2+80/2):
  78.                                         #print("1")
  79.                                         start=False
  80.                                         game=True
  81.                                         mousebottomdown(desk_width/2,desk_height/2,170,80,textbottom,70,(200,235,235),'start',(100,65,65))
  82.                                         #print("down1")
  83.                                         mousebottomup(desk_width/2,desk_height/2,170,80,textbottom,70,(200,235,235),'start',(100,65,65))
  84.                                 if (desk_width / 2 - 170 / 2 <= mx <= desk_width / 2 + 170 / 2 and desk_height / 2 + WIN_HEIGHT / 4 - 80 / 2 <= my <= desk_height / 2 + WIN_HEIGHT / 4 + 80 / 2):
  85.                                         mousebottomdown(desk_width / 2, desk_height / 2 + WIN_HEIGHT / 4, 170, 80, textbottom, 70,(200, 235, 235), 'exit', (100, 65, 65))
  86.                                         start = False
  87.                                         #print("2")
  88.                                         mousebottomup(desk_width/2,desk_height/2+WIN_HEIGHT/4,170,80,textbottom,70,(200,235,235),'exit',(100,65,65))
  89.                                         return
  90.                                 # goto.loop2

  91.                         if event.type == pygame.MOUSEBUTTONUP :
  92.                                 #print("up")
  93.                                 pass



  94.         n=0
  95.         is_move = False
  96.         x_speed = 0
  97.         y_speed = 0
  98.         window.fill((0,0,0))
  99.         imagebox(image_game0)
  100.         pygame.display.update()

  101.         print("game",game)
  102.         while game:
  103.                 pygame.event.pump()
  104.                 clock.tick(FPS)
  105.                 for event in events:
  106.                         if event.type == pygame.MOUSEBUTTONDOWN:
  107.                                 if n==0:
  108.                                         pygame.time.wait(1000)
  109.                                         imagebox(image_game1)
  110.                                         n=1
  111.                                         # 放置角色
  112.                                         elder = elder_right
  113.                                         elder_x, elder_y = desk_width/2-WIN_WIDTH/2+150, desk_height/2-WIN_HEIGHT/2+150
  114.                                         window.blit(elder, (elder_x, elder_y))
  115.                                         pygame.display.update()
  116.                                 else :pass

  117.                         [backcolor=Red]//以上运行都没问题[/backcolor]
  118.                         if event.type == pygame.KEYDOWN:
  119.                                 print("3",event)   [backcolor=Red]//从这里无法输出[/backcolor]

  120.                                 if event.type == pygame.KEYDOWN:
  121.                                         char=chr(event.key)
  122.                                         print(char)
  123.                                         if char == 'w' and desk_width/2-WIN_WIDTH/2+555<=elder_x<=desk_width/2-WIN_WIDTH/2+565 and elder_y<=desk_height/2-WIN_HEIGHT/2+570:
  124.                                                 is_move=True
  125.                                                 imagebox(image_game1)
  126.                                                 x_speed = 0
  127.                                                 y_speed = -5
  128.                                                 elder_x+=x_speed
  129.                                                 elder_y+=y_speed
  130.                                                 pygame.time.wait(300)
  131.                                                 window.blit(elder,(elder_x,elder_y))

  132.                                         elif char == 'a' and (desk_width/2-WIN_WIDTH/2+100<=elder_x and (desk_height/2-WIN_HEIGHT/2+165<=elder_y<=desk_height/2-WIN_HEIGHT/2+175 or desk_height/2-WIN_HEIGHT/2+510<=elder_y<=desk_height/2-WIN_HEIGHT/2+570)) or (desk_width/2-WIN_WIDTH/2+555<=elder_x and desk_height/2-WIN_HEIGHT/2+165<=elder_y<=desk_height/2-WIN_HEIGHT/2+570):
  133.                                                 is_move=True
  134.                                                 imagebox(image_game1)
  135.                                                 x_speed=-5
  136.                                                 y_speed=0
  137.                                                 elder_x += x_speed
  138.                                                 elder_y += y_speed
  139.                                                 elder=elder_left
  140.                                                 window.blit(elder,(elder_x,elder_y))

  141.                                         elif char == 's' and desk_width/2-WIN_WIDTH/2+555<=elder_x<=desk_width/2-WIN_WIDTH/2+565 and desk_height/2-WIN_HEIGHT/2+170<=elder_y:
  142.                                                 is_move=True
  143.                                                 imagebox(image_game1)
  144.                                                 x_speed=0
  145.                                                 y_speed=5
  146.                                                 elder_x += x_speed
  147.                                                 elder_y += y_speed
  148.                                                 window.blit(elder,(elder_x,elder_y))

  149.                                         elif char == 'd' and (elder_x<=desk_width/2+WIN_WIDTH/2-100 and (desk_height/2-WIN_HEIGHT/2+165<=elder_y<=desk_height/2-WIN_HEIGHT/2+175 or desk_height/2-WIN_HEIGHT/2+510<=elder_y<=desk_height/2-WIN_HEIGHT/2+570)) or (elder_x<=desk_width/2-WIN_WIDTH/2+565 and desk_height/2-WIN_HEIGHT/2+165<=elder_y<=desk_height/2-WIN_HEIGHT/2+570):
  150.                                                 is_move=True
  151.                                                 imagebox(image_game1)
  152.                                                 x_speed=5
  153.                                                 y_speed=0
  154.                                                 elder_x += x_speed
  155.                                                 elder_y += y_speed
  156.                                                 elder=elder_right
  157.                                                 window.blit(elder,(elder_x,elder_y))
  158.                                         pygame.display.update()

  159.                         #键盘弹起
  160.                         elif event.type == pygame.KEYUP:
  161.                                 is_move=False
  162.                                 pygame.display.update()
  163.                         elif event.type == pygame.QUIT:
  164.                                 pygame.quit()
  165.                                 exit()
  166.         return


  167. if __name__=="__main__":
  168.         main()

  169. pygame.quit()
  170. sys.exit()
复制代码


各位大佬,救救
万分感谢

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-10-20 17:26:42 | 显示全部楼层
第151行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-20 18:42:05 | 显示全部楼层
解决了uu们,果然还是得靠活人
问题出在系统默认键盘事件类型为TEXTEDITING,加上pygame.key.stop_text_input()就好了
给有相同问题的uu指路原文:
(csdn)pygame获取键盘输入失败
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-20 17:26:15 | 显示全部楼层
你的问题是在第二个循环中,pygame无法识别键盘按下的事件。这个问题可能是由于你在处理事件的时候,没有正确地获取和处理事件。

在你的代码中,你在主循环while game:中使用了for event in events:,但是你没有在这个循环中更新events。这意味着你在处理的是在进入while game:循环时获取的事件,而不是在每个循环迭代中获取的新事件。

你应该在while game:循环的开始处添加events = pygame.event.get(),这样你就可以在每次迭代中获取新的事件。这样修改后,你的代码应该是这样的:

  1. while game:
  2.     events = pygame.event.get()  # 获取新的事件
  3.     pygame.event.pump()
  4.     clock.tick(FPS)
  5.     for event in events:
  6.         # 处理事件的代码
复制代码


这样,你的程序就应该能够正确地检测到键盘按下的事件了。希望这个答案能够帮助你解决问题!如果你还有其他问题,欢迎继续提问。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-20 17:26:18 | 显示全部楼层
问题出在你的代码中的事件处理部分。你只在开始的时候获取了一次事件列表,然后在循环中重复使用这个事件列表。这样做是不正确的,因为在每次循环中,你需要获取最新的事件列表。

你需要将获取事件列表的代码放在循环内部,像这样:

  1. while start:
  2.     clock.tick(FPS)
  3.     events = pygame.event.get()
  4.     for event in events:
  5.         # 处理事件的代码
复制代码


这样,每次循环都会获取最新的事件列表,并对每个事件进行处理。

另外,你的代码还有一些其他问题,比如没有正确地缩进和定义函数时没有使用正确的缩进。请确保你的代码缩进正确,以避免出现语法错误。

希望这些解释对你有帮助!如果你还有其他问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-20 17:35:35 | 显示全部楼层
本帖最后由 mothvv 于 2023-10-20 17:39 编辑

谢谢,但是加上之后还是没有执行print("3",event)
并且更无法通过键盘移动人物
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-20 17:36:03 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-10-20 17:50:03 | 显示全部楼层
找到一个小bug,修复了可允许移动范围,但是还是无法移动人物
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-20 17:59:17 | 显示全部楼层
求活人,ai靠不住
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-20 18:38:17 | 显示全部楼层
如果你的程序在第二段循环中无法识别键盘按下的事件,可能是因为你的代码没有正确地处理键盘事件。在很多编程语言和框架中,你需要不断地监听键盘事件,并在检测到按键后执行相应的操作。

以下是一个使用Python和Pygame库处理键盘事件的示例代码:

  1. python
  2. import pygame
  3. import sys

  4. pygame.init()

  5. # 设置窗口尺寸
  6. window_width = 800
  7. window_height = 600

  8. # 创建窗口
  9. window = pygame.display.set_mode((window_width, window_height))

  10. # 设置窗口标题
  11. pygame.display.set_caption('键盘按下示例')

  12. # 循环检测键盘事件
  13. while True:
  14.     # 检查是否退出游戏
  15.     for event in pygame.event.get():
  16.         if event.type == pygame.QUIT:
  17.             pygame.quit()
  18.             sys.exit()

  19.     # 检查键盘按下事件
  20.     keys = pygame.key.get_pressed()
  21.     if keys[pygame.K_SPACE]:  # 如果按下空格键
  22.         print("空格键被按下")
  23.         # 在这里执行你想要的操作

  24.     # 更新窗口
  25.     pygame.display.flip()
复制代码

在这个示例代码中,我们使用pygame.key.get_pressed()函数来获取键盘的按下状态。这个函数返回一个元组,其中每个元素代表一个按键的状态,如果该键被按下,则对应的元素为True,否则为False。我们可以通过检查keys[pygame.K_SPACE]来检测空格键是否被按下,如果为True,则执行相应的操作。

请注意,这只是一个简单的示例代码,你需要根据你的实际需求来修改和扩展它。如果你使用的是其他编程语言或框架,你需要查找相应的键盘事件处理方法。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-20 18:44:16 | 显示全部楼层
来个活人,我给你设为最佳答案,不想给ai
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 01:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表