鱼C论坛

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

摩擦摩擦,我的键盘按下,小球不受控制

[复制链接]
发表于 2020-4-28 21:13:57 | 显示全部楼层 |阅读模式

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

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

x

  1. #cartoon
  2. import pygame
  3. import sys   #退出程序时要用
  4. from pygame.locals import *
  5. from random import *
  6. import math
  7. #继承本身自带的类即可,本身定义了精灵
  8. class Ball(pygame.sprite.Sprite):
  9.     #实例化球对象
  10.     def __init__(self,grayball_image,greenball_image,position,speed,bg_size,target):
  11.         pygame.sprite.Sprite.__init__(self)#调用该类

  12.         self.grayball_image = pygame.image.load(grayball_image).convert_alpha()
  13.         self.greenball_image = pygame.image.load(greenball_image).convert_alpha()
  14.         
  15.         self.rect = self.greenball_image.get_rect()#获取球的大小
  16.         self.rect.left,self.rect.top = position   #希望球在position的位置上显示
  17.         self.speed = speed    #赋值速度
  18.         self.target = target
  19.         self.control = False
  20.         self.width,self.height = bg_size[0],bg_size[1]

  21.     def move(self):
  22.         self.rect = self.rect.move(self.speed)

  23.         #实现小球从左边出去,从右边进来,从上边出去,从下面进来
  24.         if self.rect.right <0: #球出右边
  25.             self.rect.left = self.width
  26.             
  27.         if self.rect.left >self.width:
  28.             self.rect.right = 0

  29.         if self.rect.bottom <0:
  30.             self.rect.top = self.height

  31.         if self.rect.top > self.height:
  32.             self.rect.bottom = 0
  33.     #用于判断鼠标在1秒内产生的事件数量是否匹配此目标
  34.     def check(self,motion):
  35.         if self.target < motion <self.target +5 :
  36.             return True
  37.         else:
  38.             return False
  39.         

  40. #设定玻璃板,在玻璃板内移动鼠标,给每个小球设定不同的频率(响应事件数量),鼠标移动,
  41. #当鼠标移动的频率(产生一定的事件数量)和某个小球的频率一致时,小球产生响应
  42. class Glass(pygame.sprite.Sprite):
  43.     def __init__(self,glass_image,mouse_image,bg_size):
  44.         pygame.sprite.Sprite.__init__(self)#调用该类
  45.         self.glass_image = pygame.image.load(glass_image).convert_alpha()
  46.         self.glass_rect = self.glass_image.get_rect()
  47.         #摆放玻璃面板的位置在屏幕下方的正中间,x=(屏幕的宽度-面板宽度)/2
  48.         self.glass_rect.left,self.glass_rect.top = \
  49.                                  (bg_size[0] - self.glass_rect.width) // 2 ,\
  50.                                  bg_size[1] - self.glass_rect.height

  51.         self.mouse_image = pygame.image.load(mouse_image).convert_alpha()
  52.         self.mouse_rect = self.mouse_image.get_rect()
  53.         #给鼠标一个初始位置
  54.         self.mouse_rect.left,self.mouse_rect.top = \
  55.                                                  self.glass_rect.left,self.glass_rect.top
  56.         
  57.         #把真实的鼠标设置为不可见,然后显示自己的鼠标图片
  58.         pygame.mouse.set_visible(False)


  59.         

  60. #target是除了Item(1个球),的四个球
  61. def collide_check(item,target):
  62.     collide_ball = []
  63.     for each in target:        
  64.         distance = math.sqrt(\
  65.             math.pow((item.rect.center[0] - each.rect.center[0]), 2) + \
  66.             math.pow((item.rect.center[1] - each.rect.center[1]), 2))
  67.         if distance <= (item.rect.width + each.rect.width) / 2:
  68.             collide_ball.append(each)
  69.     return collide_ball
  70.                
  71. def main():
  72.     pygame.init()
  73.     grayball_image = "gray_ball.png"
  74.     greenball_image = "green_ball.png"
  75.     bg_image = "background_ball.png"
  76.     glass_image = "glass.png"
  77.     mouse_image = "hand.png"

  78.     running = True

  79.     bg_size = width,height = 1024,681
  80.     screen = pygame.display.set_mode(bg_size)
  81.     pygame.display.set_caption("play the ball")

  82.     #背景音乐
  83.     pygame.mixer.music.load("bg_music.ogg")
  84.     pygame.mixer.music.set_volume(0.2)
  85.     pygame.mixer.music.play()


  86.     #添加音效
  87.     loser_sound = pygame.mixer.Sound("loser.wav")
  88.     laugh_sound = pygame.mixer.Sound("laugh.wav")
  89.     winner_sound = pygame.mixer.Sound("winner.wav")
  90.     hole_sound = pygame.mixer.Sound("hole.wav")

  91.     #音乐播放结束时,游戏结束,USEEVENT,可以自定义事件,USEEVENT+1,USEEVENT+2,,,,,
  92.     GAMEOVER = USEREVENT
  93.     pygame.mixer.music.set_endevent(GAMEOVER)    #音乐播放结束时,就会发送自定义事件game_over到事件队列

  94.     #添加自定义事件,每隔1秒,触发一次此事件,1000毫秒 = 1秒
  95.     MYTIMER = USEREVENT +1
  96.     pygame.time.set_timer(MYTIMER,1*1000)
  97.    
  98.    
  99.    
  100.     balls= []

  101.     #产生五个随机大小相同的球
  102.     for i in range(5):
  103.         position = randint(0,width-100),randint(0,height-100)  #球宽是100,避免球越界
  104.         speed = [randint(-10,10),randint(-10,10)]
  105.         #5*(i+1),产生事件数量,从0—4
  106.         ball = Ball(grayball_image,greenball_image,position,speed,bg_size,6*(i+1))
  107.         #如果产生的球发生碰撞,重新再设置球的位置
  108.         while collide_check(ball,balls):
  109.             ball.rect.left,ball.rect.top = randint(0,width-100),randint(0,height-100)
  110.         balls.append(ball)
  111.         
  112.         
  113.     clock = pygame.time.Clock()
  114.     background =pygame.image.load(bg_image).convert_alpha()

  115.     #调用类
  116.     glass = Glass(glass_image,mouse_image,bg_size)

  117.     #记录每秒钟产生的事件数量
  118.     motion = 0
  119.                  
  120.     while running:
  121.         for event in pygame.event.get():
  122.             if event.type == QUIT:
  123.                 sys.exit()

  124.             if event.type == GAMEOVER:
  125.                 loser_sound.play()
  126.                 pygame.time.delay(2000)
  127.                 laugh_sound.play()
  128.                 running = False   #结束循环

  129.             if event.type == MYTIMER:
  130.                 if motion:   #如果产生事件
  131.                     for each in balls:
  132.                         if each.check(motion):
  133.                             each.speed = [0,0]
  134.                             each.control = True
  135.             

  136.                     motion = 0

  137.             if event.type == MOUSEMOTION:   #鼠标移动,计数事件
  138.                 motion +=1


  139.             #如果按下W,A,S,D,表示绿色小球受玩家控制
  140.             if event.type == KEYDOWN:
  141.                 if event.type == K_w:
  142.                     for each in balls:
  143.                         if each.control:
  144.                             each.speed[1] -= 1   #向上垂直加速运动

  145.                 if event.type == K_s:
  146.                     for each in balls:
  147.                         if each.control:
  148.                             each.speed[1] += 1   #向下垂直加速运动

  149.                 if event.type == K_a:
  150.                     for each in balls:
  151.                         if each.control:
  152.                             each.speed[0] -= 1   #向左垂直加速运动

  153.                 if event.type == K_d:
  154.                     for each in balls:
  155.                         if each.control:
  156.                             each.speed[0] += 1   #向右垂直加速运动
  157.                
  158.                
  159.                     
  160.                
  161.         screen.blit(background,(0,0))
  162.         screen.blit(glass.glass_image,glass.glass_rect)

  163.         glass.mouse_rect.left,glass.mouse_rect.top = pygame.mouse.get_pos()  #获取鼠标当前的位置
  164.         if glass.mouse_rect.left <glass.glass_rect.left :  #出了玻璃面板的左侧
  165.             glass.mouse_rect.left = glass.glass_rect.left
  166.         if glass.mouse_rect.left >glass.glass_rect.right -  glass.mouse_rect.width:
  167.             glass.mouse_rect.left = glass.glass_rect.right -  glass.mouse_rect.width
  168.         if glass.mouse_rect.top <glass.glass_rect.top:
  169.             glass.mouse_rect.top = glass.glass_rect.top
  170.         if glass.mouse_rect.top >glass.glass_rect.bottom -glass.mouse_rect.height :
  171.             glass.mouse_rect.top = glass.glass_rect.bottom -glass.mouse_rect.height
  172.             
  173.         screen.blit(glass.mouse_image,glass.mouse_rect)
  174.         
  175.         for each in balls:
  176.             each.move()
  177.             #如果球的频率和鼠标移动的频率相同,表表示小球被控制,显示绿色
  178.             #灰色表示没有被控制
  179.             if each.control:
  180.                 screen.blit(each.greenball_image,each.rect)
  181.             else:
  182.                 screen.blit(each.grayball_image,each.rect)

  183.         #移动后开始检测小球的碰撞情况
  184.         for i in range(5):
  185.             item = balls.pop(i)
  186.             if collide_check(item,balls):  #collide_ball不为空
  187.                 item.speed[0] = -item.speed[0]
  188.                 item.speed[1] = -item.speed[1]
  189.                
  190.             balls.insert(i,item)

  191.         
  192.         pygame.display.flip()
  193.         clock.tick(30)
  194.         
  195.         
  196. if __name__ =="__main__":
  197.     main()
  198.         
  199.         
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-28 21:57:10 | 显示全部楼层
我以为我进了作品展示。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-4-28 22:25:11 | 显示全部楼层
Twilight6 发表于 2020-4-28 21:57
我以为我进了作品展示。。。

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

使用道具 举报

 楼主| 发表于 2020-4-29 09:45:34 | 显示全部楼层
Twilight6 发表于 2020-4-28 21:57
我以为我进了作品展示。。。

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

使用道具 举报

 楼主| 发表于 2020-4-29 09:46:31 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-29 10:28:32 | 显示全部楼层
我连刚开始第一次测试都报错(跟着教程搞得,就是甲鱼老师第一次测试未完成的代码的那一段)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-29 11:07:32 | 显示全部楼层
weiter 发表于 2020-4-29 10:28
我连刚开始第一次测试都报错(跟着教程搞得,就是甲鱼老师第一次测试未完成的代码的那一段)

我这个没报错,就是不受控制,都不知道从哪改
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-18 11:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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