为什么要写self.rect.left;self.rect.top,多了一个rect

为什么要写self.rect.left;self.rect.top,多了一个rect

正在回答

登陆购买课程后可参与讨论,去登陆

15回答

同学,你好。

1、在加载图片时应使用pygame.image.load()方法加载

http://img1.sycdn.imooc.com//climg/5e9d5a1409538f0107500136.jpg

2、在加载子弹声音时,同学可以使用wav格式的音乐

http://img1.sycdn.imooc.com//climg/5e9d5a660941000008430078.jpg

3、同学可以使用pygame.mixer.music.load()加载mp3格式的音乐,但是这样会与程序的背景音乐有冲突,建议同学选择方法二中的写法,加载wav格式音乐

http://img1.sycdn.imooc.com//climg/5e9d5b210990d11f07580102.jpg

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~

  • 慕python_SD三德 提问者 #1
    为什么我不能持续移动,就是按一个键持续移动,这个怎么做。对了帮我改下作业吧,教学服务要到了
    2020-04-20 16:31:51
  • 好帮手慕美 回复 提问者 慕python_SD三德 #2
    同学,你好。1、若同学要实现持续移动的话,需要定义一个变量key_down用于记住上次按下的键,从而实现持续移动的功能。同学可以重新看下3-11小节,视频中有详细讲解。2、同学提交的作业会忙批复的,请同学耐心等待。祝学习愉快~~~~
    2020-04-20 17:02:56
  • 慕python_SD三德 提问者 回复 好帮手慕美 #3
    我那个有问题的代码,怎么办?我23号就到期了,我还要提交一次的
    2020-04-20 17:20:49
提问者 慕python_SD三德 2020-04-20 17:19:45

http://img1.sycdn.imooc.com//climg/5e9d691d09b4ddcb19201080.jpghttp://img1.sycdn.imooc.com//climg/5e9d692209b4dafb19201080.jpg为什么我设定了还是没用?

  • 同学,你好。已经对同学提交的作业进行了批复,同学可根据批复文档进行修改。祝学习愉快~~~~
    2020-04-20 17:50:56
  • 提问者 慕python_SD三德 回复 好帮手慕美 #2
    我改一下,您再改一下哈,谢谢啦
    2020-04-20 18:02:36
  • 同学,你好。会安排老师批改作业的。 祝学习愉快~
    2020-04-20 18:50:01
提问者 慕python_SD三德 2020-04-20 15:08:56

http://img1.sycdn.imooc.com//climg/5e9d4a6e09eef8d119201080.jpg为什么会报错呢?音乐没问题

提问者 慕python_SD三德 2020-04-20 11:57:32

http://img1.sycdn.imooc.com//climg/5e9d1d950914138619201080.jpg运行main时还是报错?添加了

好帮手慕美 2020-04-20 11:54:12

同学,你好。Plane()类的__init__中需要调用load_src()方法加载静态资源,同学没有调用,因此img_list为空列表,在通过下标取值时报错。

http://img1.sycdn.imooc.com//climg/5e9d1ca40901cb9a03750270.jpg

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~


提问者 慕python_SD三德 2020-04-20 10:33:09

aa啊啊啊啊我还要交作业啊


提问者 慕python_SD三德 2020-04-20 09:24:27

在吗老师,帮我看下我的错误,我的教学服务期要没了

提问者 慕python_SD三德 2020-04-18 07:43:46

plane.py全代码:

import pygame
import constants
import game.bullets


class Plane(pygame.sprite.Sprite):
   # 飞机图片
   plane_images = []
   # 存活状态(默认为True)
   active = True
   # 发射的子弹(一个精灵组)
   bullets = pygame.sprite.Group()

   def __init__(self, screen, speed=None):
       """ 飞机类的初始化 """
       super().__init__()
       # 屏幕Surface对象
       self.screen = screen
       # 速度
       self.speed = speed
       # 飞机的图片(存储至一个list中)
       self.img_list = []
       # 得到飞机的位置
       self.rect = self.img_list[0].get_rect()
       # 得到飞机的大小
       self.plane_width, self.plane_height = self.img_list[0].get_size()
       # 游戏窗口的大小
       self.width, self.height = self.screen.get_size()
       # 得到飞机位置处于游戏窗口左边和上边的距离
       self.rect.left = int((self.width - self.plane_width) / 2)
       self.rect.top = int(self.height/2)

   def load_src(self):
       """ 加载飞机图片资源 """
       for img in self.plane_images:
           self.img_list.append(img)

   @property
   def image(self):
       """
       :return:飞机第一个图片
       """
       return self.img_list[0]

   def draw_plane(self):
       """ 绘制飞机 """
       self.screen.blit(self.image, self.rect)

   def move_up(self):
       """ 使飞机上移 """
       self.rect.top -= self.speed

   def move_down(self):
       """ 使飞机下移 """
       self.rect.top += self.speed

   def move_left(self):
       """ 使飞机左移 """
       self.rect.top -= self.speed

   def move_right(self):
       """ 使飞机右移 """
       self.rect.top += self.speed

   def shoot(self):
       """ 发射子弹 """
       bullet = game.bullets.Bullet(self.screen, self, 15)
       self.bullets.add(bullet)


class OurPlane(Plane):
   plane_images = [constants.OUR_PLANE_IMAGE_1, constants.OUR_PLANE_IMAGE_2]

   def update(self, *args, frame):
       if frame % 5:
           self.screen.blit(self.img_list[0], self.rect)
       else:
           self.screen.blit(self.img_list[1], self.rect)

   def move_up(self):
       """ 防止飞机飞出屏幕外面,重写移动方法 """
       super().move_up()
       if self.rect.top <= 0:
           self.rect.top = 0

   def move_down(self):
       """ 防止飞机飞出屏幕外面,重写移动方法 """
       super().move_down()
       if self.rect.top >= self.height - self.plane_height:
           self.rect.top = self.height - self.plane_height

   def move_left(self):
       """ 防止飞机飞出屏幕外面,重写移动方法 """
       super().move_left()
       if self.rect.left <= 0:
           self.rect.left = 0

   def move_right(self):
       """ 防止飞机飞出屏幕外面,重写向右移动方法 """
       super().move_right()
       if self.rect.left >= self.width - self.plane_width:
           self.rect.left = self.width - self.plane_width

提问者 慕python_SD三德 2020-04-18 07:42:50
好帮手慕美 2020-04-17 17:03:43

同学,你好。在加载图片时应使用pygame.image.load(),而同学是直接将constants.BG_IMG直接赋值给了相应的变量,因此会报错

http://img1.sycdn.imooc.com//climg/5e99709909339b3405670240.jpg

同学的代码:

http://img1.sycdn.imooc.com//climg/5e9970e209a2c98a06310349.jpg

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~

  • 提问者 慕python_SD三德 #1
    还是有个错误,是plane.py的错误(上图)(上代码)
    2020-04-18 07:44:24
提问者 慕python_SD三德 2020-04-17 14:29:12

main.py全代码:

import sys
import pygame
import constants
import game.bullets
import game.plane

clock = pygame.time.Clock()


def main():
   """ 开始游戏 """
   pygame.init()
   # 屏幕的x,y轴
   width, height = 480, 852
   # 屏幕对象
   screen = pygame.display.set_mode((width, height))
   # 设置窗口标题
   pygame.display.set_caption('飞机大战')
   # 背景图片
   bg = constants.BG_IMAGE_BACK
   # 标题图片
   img_game_title = constants.IMAGE_GAME_TITLE
   t_width, t_height = img_game_title.get_size()
   # 获取标题的矩形区域
   img_game_title_rect = img_game_title.get_rect()
   img_game_title_rect.topleft = (int((width - t_width) / 2), int(height / 2 - t_height))
   # 开始按钮图片
   btn_start = constants.IMAGE_GAME_START
   btn_width, btn_height = btn_start.get_size()
   # 获取开始键的矩形区域
   img_game_title_rect = img_game_title.get_rect()
   img_game_title_rect.topleft = (int((width - t_width) / 2), int(height / 2 - t_height + btn_height))

   # 游戏背景音效
   pygame.mixer.music.load(constants.BG_MUSIC)
   pygame.mixer.music.play(-1)
   pygame.mixer.music.set_volume(0.2)

   status = 'READY'
   frame = 0

   # 实例化我方飞机
   our_plane = game.plane.OurPlane(screen, speed=4)
   while True:
       # 设置帧速率
       clock.pygame.tick(60)
       frame += 1
       if frame >= 60:
           frame = 0
       # 1. 监听事件
       for event in pygame.event.get():
           # 退出游戏
           if event.type == pygame.QUIT:
               pygame.quit()
               sys.exit()
           elif event.type == pygame.MOUSEBUTTONDOWN:
               # 鼠标点击进入游戏
               # 游戏正在准备中,点击才能进入游戏
               if status == 'READY':
                   status = 'PLAYING'
               elif status == 'PLAYING':
                   # 点击鼠标发射子弹
                   our_plane.shoot()
               elif status == 'OVER':
                   status = 'READY'
           elif event.type == pygame.KEYDOWN:
               # 键盘事件
               key_down = event.key
               # 游戏正在游戏中,才需要控制键盘 ASWD
               if status == 'PLAYING':
                   if event.key == pygame.K_w or event.key == pygame.K_UP:
                       our_plane.move_up()
                   elif event.key == pygame.K_s or event.key == pygame.K_DOWN:
                       our_plane.move_down()
                   elif event.key == pygame.K_a or event.key == pygame.K_LEFT:
                       our_plane.move_left()
                   elif event.key == pygame.K_d or event.key == pygame.K_RIGHT:
                       our_plane.move_right()
                   elif event.key == pygame.K_SPACE:
                       # 发射子弹
                       our_plane.shoot()


if __name__ == '__main__':
   main()

提问者 慕python_SD三德 2020-04-17 12:03:01
  • 提问者 慕python_SD三德 #1
    这个也要加pygame.get_size吗?
    2020-04-17 12:03:22
提问者 慕python_SD三德 2020-04-17 12:02:52
提问者 慕python_SD三德 2020-04-16 18:26:24

http://img1.sycdn.imooc.com//climg/5e9832c309cfa2c919201080.jpg这是什么意思?

  • 同学你好:第三行代码from pygame.examples.video import clock不要这么写。pygame.examples()是官方的一些demo示例。我们应该写成clock = pygame.time.Clock()
    2020-04-17 08:12:29
  • 为什么我的get_size报错?上图
    2020-04-17 14:28:43
好帮手慕觉浅 2020-04-16 16:48:08

同学你好:self.rect是飞机的位置,self.rect.left和self.rect.top都是rect原有的属性,代表自身左边界和上边界的位置。这两句是设置游戏初始情况下飞机的位置。

http://img1.sycdn.imooc.com//climg/5e981bb70951837e06830288.jpg

如果解决了你的疑惑,请采纳,祝学习愉快~ 


  • 提问者 慕python_SD三德 #1
    根据飞机速度重新设置距离游戏窗口上边框和左边框的距离 这在课程中要求了吗?飞机类的移动后面
    2020-04-16 16:50:09
  • 同学你好:根据飞机速度重新设置距离游戏窗口上边框和左边框的距离是对飞机移动方法的提示。这句是说可以根据飞机速度重新设置距离游戏窗口上边框和左边框的距离来完成飞机上移方法move_up、下移方法move_down、左移方法move_left、右移方法move_right。例如: def move_up(self): """ 飞机向上移动 """ self.rect.top -= self.speed
    2020-04-16 17:33:31
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师