鱼C论坛

 找回密码
 立即注册
查看: 5380|回复: 1

[作品展示] Pygame长按方向键控制小球

[复制链接]
发表于 2015-7-3 10:32:53 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 戴宇轩 于 2015-7-5 20:11 编辑

效果图
gan.gif
呃,截得不好,不要在意这些细节。。。
演示视频: 演示视频.zip (293.67 KB, 下载次数: 19)

特点
小球碰到边框会自动反弹
方向键可以长按
方向键松开后,小球由于惯性,还会往前滚一段距离~
按F11可以全屏(跟屏幕长宽比一样)
窗口可以改变大小


原版 Ball.zip (9.56 KB, 下载次数: 11)
无BUG版本,按F11全屏,窗口可改变大小 NoBUG.zip (10.12 KB, 下载次数: 9)

  1. # -*- coding: utf-8 -*-
  2. # Python 2.7.10 写的,不过Python 3.4应该也能用
  3. # Tip: 保存为.pyw就没有黑乎乎的CMD啦~

  4. import pygame
  5. import sys

  6. pygame.init()

  7. pygame.display.set_caption('Ball')

  8. size = width, height = 640, 480 # 默认640*480
  9. all_size = pygame.display.list_modes() # 所有可用大小
  10. full = all_size[0] # 屏幕大小
  11. divide = float(full[0]) / float(full[1]) # 屏幕长宽比
  12. for i in all_size:
  13.     if i[0] <= 1680: # 如果宽大于1680会无法正常工作,所以要小于1680
  14.         if float(i[0]) / float(i[1]) == divide: # 如果和屏幕的长宽比相同
  15.             maximum = i # 就是最大分辨率
  16.             break

  17. background = (255, 255, 255) # 背景是白色
  18. screen = pygame.display.set_mode(size, pygame.RESIZABLE)
  19. screen.fill(background)

  20. direction = [0, 0] # 球的方向和速度

  21. ball = pygame.image.load('ball.jpg') # 球的图片
  22. position = [1, 1] # 球的初始位置
  23. status = ball.get_rect() # 用于获取球的大小
  24. screen.blit(ball, position)

  25. pygame.display.flip()

  26. clock = pygame.time.Clock()

  27. long_press = {'up': False, 'down': False, 'left': False, 'right': False} # 记录按键是否长按

  28. fullscreen = False # 初始状态不是全屏

  29. while True:
  30.     for i in pygame.event.get():
  31.         #event = i.dict
  32.         if i.type == pygame.QUIT: # 退出键按下
  33.             sys.exit()
  34.         if i.type == pygame.KEYDOWN: # F11按下(全屏)
  35.             if i.key == pygame.K_F11:
  36.                 fullscreen = not fullscreen
  37.                 if fullscreen:
  38.                     screen = pygame.display.set_mode(maximum, pygame.FULLSCREEN | pygame.HWSURFACE) # 开启硬件加速和全屏
  39.                     width, height = maximum
  40.                 else:
  41.                     screen = pygame.display.set_mode(size, pygame.RESIZABLE)
  42.                     width, height = size
  43.             if i.key == pygame.K_UP: # 增加长按状态(按下方向键)
  44.                 long_press['up'] = True
  45.             if i.key == pygame.K_DOWN:
  46.                 long_press['down'] = True
  47.             if i.key == pygame.K_LEFT:
  48.                 long_press['left'] = True
  49.             if i.key == pygame.K_RIGHT:
  50.                 long_press['right'] = True
  51.         if i.type == pygame.KEYUP: # 取消长按状态(松开按键)
  52.             if i.key == pygame.K_UP:
  53.                 long_press['up'] = False
  54.             if i.key == pygame.K_DOWN:
  55.                 long_press['down'] = False
  56.             if i.key == pygame.K_LEFT:
  57.                 long_press['left'] = False
  58.             if i.key == pygame.K_RIGHT:
  59.                 long_press['right'] = False
  60.         if i.type == pygame.VIDEORESIZE: # 改变窗口大小时, 也改变尺寸
  61.             now_size = list(i.size) # 记录改变前的大小
  62.             if i.size[0] >= status.width + 2 and i.size[1] >= status.height + 2:
  63.                 size = width, height = i.size
  64.                 screen = pygame.display.set_mode(size, pygame.RESIZABLE)
  65.             else: # 如果窗口大小小于球的大小
  66.                 if i.size[0] < status.width + 2: # 确保球不碰到边缘,左右各加一像素间距
  67.                     now_size[0] = status.width + 2
  68.                 if i.size[1] < status.height + 2:
  69.                     now_size[1] = status.height + 2
  70.                 screen = pygame.display.set_mode(now_size, pygame.RESIZABLE)
  71.     clock.tick(200) # 每秒200帧
  72.      # 检测是否碰到边缘
  73.     if position[0] <= 0: # 碰到左边缘
  74.         position[0] = 1
  75.         direction[0] = -direction[0]
  76.     if position[1] <= 0: # 碰到上边缘
  77.         position[1] = 1
  78.         direction[1] = -direction[1]
  79.     if position[0] + status.width >= width: # 碰到右边缘
  80.         position[0] = width - status.width - 1
  81.         direction[0] = -direction[0]
  82.     if position[1] + status.height >= height: # 碰到下边缘
  83.         position[1] = height - status.height - 1
  84.         direction[1] = -direction[1]
  85.     # 长按时,球不断加速
  86.     if long_press['up']:
  87.         direction[1] -= 0.015
  88.     if long_press['down']:
  89.         direction[1] += 0.015
  90.     if long_press['left']:
  91.         direction[0] -= 0.015
  92.     if long_press['right']:
  93.         direction[0] += 0.015
  94.     position[0] += direction[0] # 改变球的位置
  95.     position[1] += direction[1] # 同上
  96.     screen.fill(background)
  97.     screen.blit(ball, (int(position[0]), int(position[1]))) # 更新球的位置
  98.     pygame.display.flip()
  99.     direction[0] *= 0.996 # 让球不断减速
  100.     direction[1] *= 0.996 # 同上
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-7-3 14:41:12 | 显示全部楼层
支持原创~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-22 21:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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