一、第一部分

#文件1.py
from ship import Ship
from settings import Settings
from pygame.sprite import Group
import pygame
import game_functions as gf
def run_game():pygame.init()my_set = Settings()screen = pygame.display.set_mode(my_set.set_mode)my_ship = Ship(screen,my_set)ships = Group()ships.add(my_ship)bullets = Group()pygame.display.set_caption(my_set.set_caption)while True:gf.check_events(screen,my_ship,my_set,bullets)bullets.update()#用编组update完全可以的ships.update()gf.update_screen(screen,my_ship,bullets,my_set)#删除多余的子弹for bullet in bullets.copy():if bullet.rect.bottom < 0:bullets.remove(bullet)
run_game()#文件game_functions.py
from bullet import Bullet
import pygame
import sys
def check_keydown_events(screen,ship,ai_settings,bullets,event):if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueelif event.key == pygame.K_UP:ship.moving_up = Trueelif event.key == pygame.K_DOWN:ship.moving_down = Trueelif event.key == pygame.K_SPACE:new_bullet = Bullet(screen,ship,ai_settings)bullets.add(new_bullet)elif event.key == pygame.K_q:sys.exit()def check_keyup_events(ship,event):if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left  = Falseelif event.key == pygame.K_UP:ship.moving_up    = Falseelif event.key == pygame.K_DOWN:ship.moving_down  = Falsedef check_events(screen,ship,ai_settings,bullets):for event in pygame.event.get():if event.type == pygame.KEYDOWN:check_keydown_events(screen,ship,ai_settings,bullets,event)   elif event.type == pygame.KEYUP:check_keyup_events(ship,event)elif event.type == pygame.QUIT:sys.exit()def update_screen(screen,ship,bullets,ai_settings):screen.fill(ai_settings.color)#这里不能用编组画ship,否则报错,#'Group' has no attribute 'blitme',所以,编组不能直接画飞船ship.blitme()for bullet in bullets.sprites():bullet.draw_bullet()pygame.display.flip()#文件settings.py
import pygame
import sys
class Settings():def __init__(self):self.set_mode = (1000,800)self.set_caption = "alien invasion"self.color = (255,255,255)self.bullet_color = 60,60,60self.bullet_speed_factor = 0.5self.bullet_width = 3self.bullet_height = 15#文件ship.py
import pygame
from pygame.sprite import Sprite
class Ship(Sprite):def __init__(self,screen,settings):super().__init__()self.screen = screenself.settings = settingsself.image = pygame.image.load("ship.bmp")self.rect = self.image.get_rect()self.screen_rect = self.screen.get_rect()self.rect.centerx = self.screen_rect.centerxself.rect.bottom  = self.screen_rect.bottomself.moving_right = Falseself.moving_left  = Falseself.moving_up    = Falseself.moving_down  = Falseself.center = float(self.rect.centerx)def update(self):if self.moving_right and self.rect.right < self.screen_rect.right:self.rect.centerx += 1elif  self.moving_left and self.rect.left > 0:self.rect.centerx -= 1elif  self.moving_up and self.rect.top > self.screen_rect.top:self.rect.bottom -= 1elif  self.moving_down and self.rect.bottom < self.screen_rect.bottom:self.rect.bottom += 1def blitme(self):self.screen.blit(self.image,self.rect)#文件bullet.py
from pygame.sprite import Sprite
import pygameclass Bullet(Sprite):def __init__(self,screen,ship,ai_settings):super().__init__()self.screen = screenself.settings = ai_settingsself.rect = pygame.Rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height)self.rect.top = ship.rect.topself.rect.centerx = ship.rect.centerxself.y = float(self.rect.y)def draw_bullet(self):pygame.draw.rect(self.screen,self.settings.bullet_color,self.rect)def update(self):self.y -= self.settings.bullet_speed_factorself.rect.y = self.y

编组不能画飞船的意思是,如果在主函数1.py中创立编组,比如ships = Group(),然后把ship加入,执行ships.blitme()是错误的。不能运行成功。即称为编组不能画飞船。我自己理解的。

但是,编组可以执行飞船位置更新,也就是按上述过程创立编组,然后执行ships.update()可以把飞船的位置更新.

另外,虽然,编组不能画飞船,但是可以对编组的每个元素,飞别调用画飞船的函数。如下:

   for ship in ships.sprites():ship.blitme()

或者

   for ship in ships:ship.blitme()

两者有啥区别,我不知道,但是都可以运行成功,这样说来,飞船编组完全没问题。

结论:

不论是pygame自己画图还是从外面load图片,最后要使得图形移动,都可以编组的,也就是调用导入类pygame.sprite.Group,然后创立编组,进行管理。

现在有如下结论:

假设ship的编组是ships,bullet的编组是bullets:

(1)ships可以执行update(飞船位置更新),但是不能执行ships.blitme(),否则会报错,’Group‘ has no attribute 'blitme'

(2)bullets可以执行update(子弹位置更新),但是不能执行bullets.draw_bullet(),否则汇报错:

 bullets.draw_bullet()
AttributeError: 'Group' object has no attribute 'draw_bullet'

第二部分:

如果对子弹编组调用如下代码,汇报错:

bullets.draw(screen)   

编译器提示如下:

pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):File "game.py", line 23, in <module>run_game()File "game.py", line 22, in run_gameupdate_screen(screen,my_set,my_ship,bullets)File "/home/r/alien_invasion/1/game_functions.py", line 46, in update_screenbullets.draw(screen)      File "/usr/lib/python3/dist-packages/pygame/sprite.py", line 476, in drawself.spritedict[spr] = surface_blit(spr.image, spr.rect)
AttributeError: 'Bullet' object has no attribute 'image'

大题意思是,bullet没有image属性,所以不能使用bullets.draw(screen)来运行代码。看编译结尾的叙述,类似    精灵编组.draw(screen)的代码其实是如下方式调用的:

self.screen.blit(self.image,self.rect)   #这句是伪代码,是解释调用.draw(screen)的过程

pygame用精灵编组的问题的猜想和验证(未完待续)相关推荐

  1. 数学猜想验证步骤_初中数学猜想与验证优质课教案教学设计

    综合实践<猜想与验证>教学设计 一.内容和内容解析 1 .内容 本节课是为人教版七年级下册第五章 <相交线与平行线> 设计的 综合实践课. 2 .内容解析 观察.猜想.验证是研 ...

  2. Python pygame,精灵和精灵组

    plane_sprites.py(模块,定义派生精灵子类,继承pygame.sprite.Sprite): import pygame# 自定义的派生精灵子类,继承pygame.sprite.Spri ...

  3. pygame图片精灵

    转向图片精灵 彩色矩形很好 - 它们是一个好的开始,并确保你的游戏基本工作,但迟早你会想要为你的精灵使用一个很酷的宇宙飞船图像或角色.这引出了第一个问题:在哪里获得游戏资源. 获取图片资源 当你需要为 ...

  4. pygame中精灵的方法详解

    目录 pygame.sprite.Sprite pygame.sprite.Sprite.update() pygame.sprite.Sprite.add() pygame.sprite.Sprit ...

  5. 第2课pygame使用精灵

    1.使用精灵 使用精灵的概概念在游戏开发当中的各种物品或者动作,英雄,子弹等所有这个动态变化,都统称为精灵. 2.精灵组 在pygame中有很多很多的精灵,比如说屏幕上有密密麻麻的很多颗子弹,然后有很 ...

  6. pygame动画精灵

    [1701H1][穆晨][180302]第143天总结 面向对象的游戏开发思维 pygame已经有了动画精灵的基类,我们可以直接使用 image球的样式 position球的位置 speed球的速度

  7. 第3课pygame图片精灵

    1.图片精灵 因为在这个游戏当中看到的都是很漂亮的图形或图片. 这个首先都是由美工给开发出来各种图像的资源. 导入资源图片,加载到精灵. 定义一个pygame.sprite.Sprite.init(s ...

  8. 有没有哪些数学猜想是验证到很大的数以后才发现是错的?

    来源:孙天任算数学苑 素数的分布密度为 ρ(x)~1/ln(x),从而在 x 以内的素数个数--通常用 π(x) 表示--为:  π(x) ~ Li(x)  其中 Li(x) ≡ ∫ 1/ln(x) ...

  9. Python 在windows上跑图色脚本?简单又好玩,自己编写一个自动化脚本

    Python 在windows上跑图色脚本?简单又好玩,自己编写一个自动化脚本 大家好 我又来开新坑了,如图这次准备用python弄个简单脚本(根据图色判断进行键鼠操作) 1.老规矩 先安排运行环境 ...

最新文章

  1. 阿里员工吐槽:我在阿里工作五年,面试一个小公司竟然挂了
  2. sql 字符串函数(一)
  3. 这是我见过对 IOC 和 DI 解释的最清楚的一篇文章了!
  4. matlab errorbar对数,Matlab之errorbar
  5. 给 UITextField 添加左侧指示图片(类似微信登录框)
  6. matlab 定步长积分,数值积分:基于牛顿-柯茨公式的定步长和自适应积分方法 [MATLAB]...
  7. iOS 实现APP之间内容的拷贝、分享
  8. 正确的座机号码格式_电话号码格式怎么输入才是正确
  9. Linux 系统启动与服务管理
  10. 自动采集收录导航源码
  11. android timepicker 设置颜色,android – 更改TimePicker文本颜色
  12. 几种微弱信号处理电路
  13. 谁动了你的 MSN?—— MSN 帐号被盗原因的分析和解决办法,鄙视msnlivesn.com
  14. 快速抢占Shopee墨西哥广告蓝海,Shopee广告投放策略分享
  15. yxc_第一章 基础算法(一)
  16. Leetcode_75_Sort Colors
  17. Maven的基本使用方法
  18. (计算几何+二分+网络流)P4048 [JSOI2010]冷冻波
  19. 生物电镜常见问题及解答
  20. 社区宽带繁忙是什么意思_康平附近企业宽带价位,附近光纤宽带上门安装多少钱...

热门文章

  1. 屏蔽Xcode 8“烦人”的日志输出
  2. MySQL Infobright 数据仓库快速安装笔记[转]
  3. HDU 2612 Find a way
  4. [网络安全自学篇] 三.Burp Suite安装配置、Proxy基础用法及流量分析示例
  5. iOS之深入解析谓词NSPredicate的语法与应用
  6. ALGO-221 数据交换
  7. 1114:白细胞计数
  8. 2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - B. 星系炸弹
  9. 1336:【例3-1】找树根和孩子
  10. 【Qt】Qt登录对话框(纯代码实现)