鱼C论坛

 找回密码
 立即注册
查看: 3227|回复: 6

[已解决]pygame模块中键控命令不能实现方块移动,求解

[复制链接]
发表于 2018-3-16 09:01:44 | 显示全部楼层 |阅读模式

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

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

x
  1. import pygame,sys
  2. from pygame.locals import*
  3. pygame.init()
  4. screen=pygame.display.set_mode((500,500))
  5. pygame.display.set_caption('hello world')

  6. player=pygame.Rect(300,100,50,50)
  7. moveLeft=False
  8. moveRight=False
  9. moveUp=False
  10. moveDown=False
  11. MOVESPEED=6


  12. BLACK=(0,0,0)
  13. WHITE=(255,255,255)
  14. while True:
  15.     for event in pygame.event.get():
  16.         if event.type==QUIT:
  17.             pygame.quit()
  18.             sys.exit()

  19.         if event.type == KEYDOWN:
  20.             
  21.             if event.key==K_LEFT:
  22.                 moveRight=False
  23.                 moveLeft=True
  24.             if event.key==K_RIGHT:
  25.                 moveLeft=False
  26.                 moveRight=True
  27.             if event.key==K_UP:
  28.                 moveDown=False
  29.                 moveUp=True
  30.             if event.key=K_DOWN:
  31.                 moveUp=False
  32.                 moveDown=True
  33.         if event.type==KEYUP:
  34.             if event.key == K_LEFT:
  35.                 moveLeft=False
  36.             if event.key ==K_RIGHT:
  37.                 moveRight=False
  38.             if event.key ==K_UP:
  39.                 moveUp= False
  40.             if event.key == K_DOWN:
  41.                 moveDown=False
  42.         if moveDown and player.bottom <500:
  43.             player.top+=MOVESPEED
  44.         if moveUp and player.top >0:
  45.             player.top-=MOVESPEED
  46.         if moveLeft and player.left >0:
  47.             player.left-=MOVESPEED
  48.         if moveRight and player.right<500:
  49.             player.right+=MOVESPEED
  50.             
  51.         screen.fill(WHITE)
  52.         pygame.draw.rect(screen,BLACK,player)

  53.         pygame.display.update()
复制代码
最佳答案
2018-3-16 11:00:31
34行少了个等号  “==” 不是 “=”
另外你这个程序只能按键移动,不能按着持续移动!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-3-16 09:07:13 | 显示全部楼层
你这代码逻辑只能一直按着键不放才能移动
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-16 11:00:31 | 显示全部楼层    本楼为最佳答案   
34行少了个等号  “==” 不是 “=”
另外你这个程序只能按键移动,不能按着持续移动!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-16 12:21:12 | 显示全部楼层
我根据你的思路重写了一个程序,能够实现按键以后持续移动,直到屏幕边界。
但是,我还没找到你这个程序不能持续移动的原因。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-19 08:45:56 | 显示全部楼层
铁棍阿童木 发表于 2018-3-16 11:00
34行少了个等号  “==” 不是 “=”
另外你这个程序只能按键移动,不能按着持续移动!

怎么实现持续移动呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-19 09:21:44 | 显示全部楼层
.Black. 发表于 2018-3-19 08:45
怎么实现持续移动呢?

我修改了你的代码,现在可以持续移动了,并加了注释。
  1. # 导入pygame和sys模块
  2. import pygame,sys


  3. # 初始化pygame、生成屏幕对象screen、显示标题字幕
  4. pygame.init()
  5. screen = pygame.display.set_mode((500,500))
  6. pygame.display.set_caption('hello world')

  7. # 在屏幕(0, 0)的位置上绘制一个(50*50)大小的矩形
  8. # 获取屏幕对象的矩形坐标
  9. # 然后把矩形移动到屏幕指定的初始位置(屏幕正中央)
  10. player = pygame.Rect(0, 0, 50, 50)
  11. screen_rect = screen.get_rect()
  12. player.centerx = screen_rect.centerx
  13. player.centery = screen_rect.centery

  14. # 设置上下左右移动标记,实现方块在按键以后持续移动
  15. # 移动速度为 0.1 [否则移动太快无法看清楚方块的移动]
  16. # 设置颜色值
  17. moveLeft = False
  18. moveRight = False
  19. moveUp = False
  20. moveDown = False
  21. MOVESPEED = 0.1
  22. BLACK=(0,0,0)
  23. WHITE=(255,255,255)

  24. # 因为centerx和centery不能存储小数,所以要设置中间变量
  25. player_x = float(player.centerx)
  26. player_y = float(player.centery)

  27.    
  28. # 进入游戏大循环
  29. while True:

  30.     # 侦听事件,响应退出操作
  31.     for event in pygame.event.get():
  32.         if event.type==pygame.QUIT:
  33.             pygame.quit()
  34.             sys.exit()

  35.         # 侦听事件,响应按键操作
  36.         # 如果按下 <上下左右>键,则修改移动标记为True实现持续移动
  37.         elif event.type == pygame.KEYDOWN:
  38.             if event.key == pygame.K_LEFT:
  39.                 moveLeft = True
  40.             elif event.key == pygame.K_RIGHT:
  41.                 moveRight = True
  42.             elif event.key == pygame.K_UP:
  43.                 moveUp = True
  44.             elif event.key==pygame.K_DOWN:
  45.                 moveDown = True

  46.         # 侦听事件,响应松键操作
  47.         # 如果松开<上下左右>键,则修改移动标记为False停止移动
  48.         elif event.type == pygame.KEYUP:
  49.             if event.key == pygame.K_LEFT:
  50.                 moveLeft = False
  51.             elif event.key == pygame.K_RIGHT:
  52.                 moveRight = False
  53.             elif event.key == pygame.K_UP:
  54.                 moveUp = False
  55.             elif event.key == pygame.K_DOWN:
  56.                 moveDown = False

  57.     # 如果移动标记为True并且方块player没有越过屏幕边界,那么持续移动
  58.     # 将中间变量的值存储到centerx和centery中去
  59.     # 从而改变方块的位置
  60.     if moveDown and player.bottom < screen_rect.bottom:
  61.         player_y += MOVESPEED
  62.         player.centery = player_y
  63.     if moveUp and player.top > screen_rect.top:
  64.         player_y -= MOVESPEED
  65.         player.centery = player_y
  66.     if moveLeft and player.left > screen_rect.left:
  67.         player_x -= MOVESPEED
  68.         player.centerx = player_x
  69.     if moveRight and player.right < screen_rect.right:
  70.         player_x += MOVESPEED
  71.         player.centerx = player_x

  72.     # 每次循环都用白色填充屏幕
  73.     # 么次循环重新绘制player方块
  74.     # 每次循环都让元素在屏幕上可见
  75.     screen.fill(WHITE)
  76.     pygame.draw.rect(screen, BLACK, player)
  77.     pygame.display.flip()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-20 13:47:29 | 显示全部楼层
学习了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-8 16:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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