鱼C论坛

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

鱼C老师第85课 动画精灵 【求助】

[复制链接]
发表于 2019-2-12 16:00:09 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 yesteray0931 于 2019-2-12 16:00 编辑

不知道有没有大佬可以帮忙看一看
代码跟老师视频上一样的
  1. import pygame
  2. from pygame import sprite
  3. import sys
  4. from pygame.locals import *
  5. from random import *

  6. class Ball(sprite.Sprite):
  7.     def __init__(self, image, position, speed, bg_size):
  8.         sprite.Sprite.__init__(self)

  9.         self.image = pygame.image.load(image).convert_alpha()
  10.         self.rect = self.image.get_rect()
  11.         self.rect.left, self.rect.top = position
  12.         self.speed = speed
  13.         self.width, self.height = bg_size[0], bg_size[1]

  14.     def move(self, screen):
  15.         self.rect = self.rect.move(self.speed)
  16.         if self.rect.right < 0:
  17.             self.rect.left = self.width
  18.         elif self.rect.left > self.width:
  19.             self.rect.right = 0
  20.         elif self.rect.bottom < 0:
  21.             self.rect.top = self.height
  22.         elif self.rect.top > self.height:
  23.             self.rect.bottom = 0

  24.         screen.blit(self.image, self.rect)

  25. def main():
  26.     pygame.init()

  27.     ball_image = 'gray_ball.png'
  28.     bg_image = 'background_85.png'

  29.     running = True

  30.     bg_size = width, height = 1280, 768
  31.     screen = pygame.display.set_mode(bg_size)
  32.     pygame.display.set_caption('Play the ball')

  33.     screen.fill((255,255,255))
  34.     background = pygame.image.load(bg_image).convert_alpha()

  35.     balls = []

  36.     for i in range(5):
  37.         position = randint(0,width-100), randint(0, height-100)
  38.         speed = [randint(-10,10), randint(-10,10)]
  39.         ball = Ball(ball_image, position, speed, bg_size)
  40.         balls.append(ball)

  41.     clock = pygame.time.Clock()

  42.     while running:
  43.         clock.tick(30)
  44.         for event in pygame.event.get():
  45.             if event.type == QUIT:
  46.                 sys.exit()
  47.         screen.blit(background,(0,0))
  48.         for each in balls:
  49.             each.move(screen)
  50.         pygame.display.flip()

  51. if __name__ == '__main__':
  52.     main()
复制代码

结果跑起来变成这样

                               
登录/注册后可看大图

不知道图片看不看得到,就是球在运动中一直有运动轨迹,非常难看。
用的python版本是3.6.8
pygame 版本是1.9.4
各位大佬帮帮忙!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-2-12 16:12:48 | 显示全部楼层
我运行好像没有
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-12 16:25:40 | 显示全部楼层
是啊,代码是一样的,不知道是不是pygame的问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-12 16:27:18 | 显示全部楼层
yesteray0931 发表于 2019-2-12 16:25
是啊,代码是一样的,不知道是不是pygame的问题

pygame一般不会出问题,如果你指画了一次背景而没有放在循环里会是这样,但是你没有这么画,你的代码是不是和发出来的不一样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-12 16:42:20 | 显示全部楼层
塔利班 发表于 2019-2-12 16:27
pygame一般不会出问题,如果你指画了一次背景而没有放在循环里会是这样,但是你没有这么画,你的代码是不 ...
  1. import pygame
  2. import sys
  3. import math
  4. from pygame.locals import *
  5. from random import *

  6. class Ball(pygame.sprite.Sprite):
  7.     def __init__(self, image, position, speed, bg_size):
  8.         # Call the parent class (Sprite) constructor
  9.         pygame.sprite.Sprite.__init__(self)

  10.         self.image = pygame.image.load(image).convert_alpha()
  11.         self.rect = self.image.get_rect()
  12.         # 小球的位置
  13.         self.rect.left, self.rect.top = position
  14.         self.speed = speed
  15.         self.width, self.height = bg_size[0], bg_size[1]

  16.     '''
  17.     Pygame.Rect.move():
  18.         moves the rectangle
  19.         move(x, y) -> Rect
  20.         Returns a new rectangle that is moved by the given offset. The
  21.         x and y arguments can be any integer value, positive or
  22.         negative.
  23.         可以在Rect对象的move方法中添加可正可负的两元素
  24.         如果要实现小球的移动,则要在类中添加一个move()方法,并且在绘图的时候调用小球
  25.         对象的move()方法
  26.     '''

  27.     def move(self):
  28.         self.rect = self.rect.move(self.speed)

  29.         # 类似实现贪吃蛇穿入墙壁从对面墙壁出来(左右方向)
  30.         if self.rect.right < 0:
  31.             self.rect.left = self.width
  32.         elif self.rect.left > self.width:
  33.             self.rect.right = 0

  34.         # (上下方向) 从下往上 和 从上往下
  35.         elif self.rect.bottom < 0:
  36.             self.rect.top = self.height
  37.         elif self.rect.top > self.height:
  38.             self.rect.bottom = 0


  39. def collide_check(item, target):
  40.     col_balls = []
  41.     for each in target:
  42.         # 判断正方形center之间的距离和小球直径的关系
  43.         distance = math.sqrt( \
  44.             math.pow((item.rect.center[0] - each.rect.center[0]), 2) + \
  45.             math.pow((item.rect.center[1] - each.rect.center[1]), 2))
  46.         if distance <= (item.rect.width + each.rect.width) / 2:
  47.             col_balls.append(each)

  48.     return col_balls


  49. def main():
  50.     pygame.init()

  51.     ball_image = "gray_ball.png"
  52.     bg_image = "background_85.png"

  53.     running = True

  54.     bg_size = width, height = 1280, 768
  55.     screen = pygame.display.set_mode(bg_size)
  56.     pygame.display.set_caption("Play the Ball")

  57.     # .png格式可以加入apha通道
  58.     background = pygame.image.load(bg_image).convert_alpha()

  59.     screen.fill((255, 255, 255))
  60.     # 用来存放小球对象的列表
  61.     balls = []

  62.     # 创建5个小球
  63.     BALL_NUM = 5
  64.     for i in range(BALL_NUM):
  65.         # 球的尺寸是100*100 随机产生小球的位置和速度
  66.         position = randint(0, width - 100), randint(0, height - 100)
  67.         # 两个元素的一个列表,表示x轴和y轴方向的速度
  68.         speed = [randint(-10, 10), randint(-10, 10)]
  69.         # 实例化小球对象 分别传入Surface对象 位置二元组 速度两元素列表
  70.         ball = Ball(ball_image, position, speed, bg_size)
  71.         '''
  72.         在这里碰撞检测的原因是,如果没有这里的检测
  73.         那么刚开始有可能随机生成的小球有部分重叠,而小球反向之后速度太小
  74.         无法离开与自己重叠的小球,就会又反向朝对方移动,这样会有抖动。
  75.         所以只需要在生成小球后检查是否有重叠的小球,有就重新分配位置,
  76.         让其不重叠
  77.         '''
  78.         while collide_check(ball, balls):
  79.             ball.rect.left, ball.rect.top = randint(0, width - 100), \
  80.                                             randint(0, height - 100)
  81.         balls.append(ball)  # 将小球加入到小球列表中

  82.     # CLock()对象用来设置小球的帧率
  83.     clock = pygame.time.Clock()

  84.     while running:
  85.         for event in pygame.event.get():
  86.             if event.type == QUIT:
  87.                 sys.exit()

  88.         screen.blit(background, (0, 0))

  89.         for each in balls:
  90.             each.move()
  91.             screen.blit(each.image, each.rect)

  92.         # i从0开始到4
  93.         for i in range(BALL_NUM):
  94.             item = balls.pop(i)

  95.             if collide_check(item, balls):
  96.                 item.speed[0] = -item.speed[0]
  97.                 item.speed[1] = -item.speed[1]

  98.             balls.insert(i, item)  # 放入到原来的位置

  99.         pygame.display.flip()  # 将显示缓冲区中的数据刷入显示器中
  100.         clock.tick(30)


  101. if __name__ == "__main__":
  102.     main()
复制代码


这个代码和甲鱼老师的代码是一样的,添加了球的碰撞效果,视频里正常,但是我这里跑起来还是有拖尾
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-12 16:54:12 | 显示全部楼层
yesteray0931 发表于 2019-2-12 16:42
这个代码和甲鱼老师的代码是一样的,添加了球的碰撞效果,视频里正常,但是我这里跑起来还是有拖尾{: ...

那就不知道了,我这边没问题。你碰撞的我也没看,你没加碰撞就有问题,你也没发出来图片,怀疑你没运行对代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-12 17:02:29 | 显示全部楼层
塔利班 发表于 2019-2-12 16:54
那就不知道了,我这边没问题。你碰撞的我也没看,你没加碰撞就有问题,你也没发出来图片,怀疑你没运行对 ...

谢谢了,我再查查看问题在哪
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-13 23:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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