|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 戴宇轩 于 2015-7-5 20:11 编辑
效果图
呃,截得不好,不要在意这些细节。。。
演示视频:
演示视频.zip
(293.67 KB, 下载次数: 19)
特点
小球碰到边框会自动反弹
方向键可以长按
方向键松开后,小球由于惯性,还会往前滚一段距离~
按F11可以全屏(跟屏幕长宽比一样)
窗口可以改变大小
原版
Ball.zip
(9.56 KB, 下载次数: 11)
无BUG版本,按F11全屏,窗口可改变大小
NoBUG.zip
(10.12 KB, 下载次数: 9)
- # -*- coding: utf-8 -*-
- # Python 2.7.10 写的,不过Python 3.4应该也能用
- # Tip: 保存为.pyw就没有黑乎乎的CMD啦~
- import pygame
- import sys
- pygame.init()
- pygame.display.set_caption('Ball')
- size = width, height = 640, 480 # 默认640*480
- all_size = pygame.display.list_modes() # 所有可用大小
- full = all_size[0] # 屏幕大小
- divide = float(full[0]) / float(full[1]) # 屏幕长宽比
- for i in all_size:
- if i[0] <= 1680: # 如果宽大于1680会无法正常工作,所以要小于1680
- if float(i[0]) / float(i[1]) == divide: # 如果和屏幕的长宽比相同
- maximum = i # 就是最大分辨率
- break
- background = (255, 255, 255) # 背景是白色
- screen = pygame.display.set_mode(size, pygame.RESIZABLE)
- screen.fill(background)
- direction = [0, 0] # 球的方向和速度
- ball = pygame.image.load('ball.jpg') # 球的图片
- position = [1, 1] # 球的初始位置
- status = ball.get_rect() # 用于获取球的大小
- screen.blit(ball, position)
- pygame.display.flip()
- clock = pygame.time.Clock()
- long_press = {'up': False, 'down': False, 'left': False, 'right': False} # 记录按键是否长按
- fullscreen = False # 初始状态不是全屏
- while True:
- for i in pygame.event.get():
- #event = i.dict
- if i.type == pygame.QUIT: # 退出键按下
- sys.exit()
- if i.type == pygame.KEYDOWN: # F11按下(全屏)
- if i.key == pygame.K_F11:
- fullscreen = not fullscreen
- if fullscreen:
- screen = pygame.display.set_mode(maximum, pygame.FULLSCREEN | pygame.HWSURFACE) # 开启硬件加速和全屏
- width, height = maximum
- else:
- screen = pygame.display.set_mode(size, pygame.RESIZABLE)
- width, height = size
- if i.key == pygame.K_UP: # 增加长按状态(按下方向键)
- long_press['up'] = True
- if i.key == pygame.K_DOWN:
- long_press['down'] = True
- if i.key == pygame.K_LEFT:
- long_press['left'] = True
- if i.key == pygame.K_RIGHT:
- long_press['right'] = True
- if i.type == pygame.KEYUP: # 取消长按状态(松开按键)
- if i.key == pygame.K_UP:
- long_press['up'] = False
- if i.key == pygame.K_DOWN:
- long_press['down'] = False
- if i.key == pygame.K_LEFT:
- long_press['left'] = False
- if i.key == pygame.K_RIGHT:
- long_press['right'] = False
- if i.type == pygame.VIDEORESIZE: # 改变窗口大小时, 也改变尺寸
- now_size = list(i.size) # 记录改变前的大小
- if i.size[0] >= status.width + 2 and i.size[1] >= status.height + 2:
- size = width, height = i.size
- screen = pygame.display.set_mode(size, pygame.RESIZABLE)
- else: # 如果窗口大小小于球的大小
- if i.size[0] < status.width + 2: # 确保球不碰到边缘,左右各加一像素间距
- now_size[0] = status.width + 2
- if i.size[1] < status.height + 2:
- now_size[1] = status.height + 2
- screen = pygame.display.set_mode(now_size, pygame.RESIZABLE)
- clock.tick(200) # 每秒200帧
- # 检测是否碰到边缘
- if position[0] <= 0: # 碰到左边缘
- position[0] = 1
- direction[0] = -direction[0]
- if position[1] <= 0: # 碰到上边缘
- position[1] = 1
- direction[1] = -direction[1]
- if position[0] + status.width >= width: # 碰到右边缘
- position[0] = width - status.width - 1
- direction[0] = -direction[0]
- if position[1] + status.height >= height: # 碰到下边缘
- position[1] = height - status.height - 1
- direction[1] = -direction[1]
- # 长按时,球不断加速
- if long_press['up']:
- direction[1] -= 0.015
- if long_press['down']:
- direction[1] += 0.015
- if long_press['left']:
- direction[0] -= 0.015
- if long_press['right']:
- direction[0] += 0.015
- position[0] += direction[0] # 改变球的位置
- position[1] += direction[1] # 同上
- screen.fill(background)
- screen.blit(ball, (int(position[0]), int(position[1]))) # 更新球的位置
- pygame.display.flip()
- direction[0] *= 0.996 # 让球不断减速
- direction[1] *= 0.996 # 同上
复制代码 |
|