太空射击 第07课: 添加图形

在本课中,我们将讨论如何在游戏中使用预先绘制的图形。

视频

在这里可以观看本教程的视频

选择图形

我们谈到了 Opengameart.org,这是免费游戏艺术的重要来源,也是我们最喜欢的艺术家之一“肯尼”。Kenney为我们的游戏制作了完美的艺术包“太空射击包”,你可以在这里找到:

http://opengameart.org/content/space-shooter-redux

它有很多非常漂亮的图像,包括宇宙飞船,激光,小行星等等。

当您下载包时,它会解压缩到一堆不同的文件夹中。我们想要的是PNG文件夹,其中包含所有单独的图像。我们将为三个精灵选择三个图像,以及包含用于游戏背景的“星域”图像。



这些图像需要复制到我们的游戏可以找到它们的地方。执行此操作的最简单方法是在游戏代码所在的同一位置创建一个新文件夹。我们将文件夹命名为“img”。

加载图像

正如我们在 太空射击 第 03 课:图像精灵课程中所讨论的,为了确保我们的代码可以在任何操作系统上运行,我们需要使用os.path函数来找出文件的正确位置和路径。在程序的顶部,我们将定义文件夹img的位置:

from os import pathimg_dir = path.join(path.dirname(__file__), 'img')

绘制背景

现在,我们可以从加载背景图像开始。我们将在现有游戏循环和初始化代码之前完成所有组件加载:

# Load all game graphics
background = pygame.image.load(path.join(img_dir, 'starfield.png')).convert()
background_rect = background.get_rect()

现在,我们可以在绘制任何精灵之前,在游戏循环的绘制部分中绘制背景:

# Draw / render
screen.fill(BLACK)
screen.blit(background, background_rect)
all_sprites.draw(screen)

blit是一个老式的计算机图形学术语,意思是将一个图像的像素绘制到另一个图像的像素上 ,把背景图绘制到屏幕上。现在我们的背景看起来好多了:

精灵图像

现在我们可以加载精灵的图像:

# Load all game graphics
background = pygame.image.load(path.join(img_dir, 'starfield.png')).convert()
background_rect = background.get_rect()
player_img = pygame.image.load(path.join(img_dir, "playerShip1_orange.png")).convert()
meteor_img = pygame.image.load(path.join(img_dir, "meteorBrown_med1.png")).convert()
bullet_img = pygame.image.load(path.join(img_dir, "laserRed16.png")).convert()

从玩家精灵开始 - 我们想要替换绿色矩形,因此我们更改了self.image ,并且不要忘记删除self.image.fill(GREEN) ,我们不再需要它:

class Player(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.image = player_imgself.rect = self.image.get_rect()

但是,现在我们看到了几个问题。首先,图像比我们想要的要大得多。我们有两个选择:1. 在图形编辑器(Photoshop,GIMP等)中打开图像并调整其大小;2. 在我们的代码中调整图像大小。我们将选择选项2,使用Pygame的transform.scale()命令使图像大约是其大小的一半,即50x38像素。

另一个问题是我们的船周围有一个黑色的矩形,因为我们没有使用set_colorkey设置透明颜色:

self.image = pygame.transform.scale(player_img, (50, 38))
self.image.set_colorkey(BLACK)

如果我们对BulletMob类采取相同的过程,我们最终会得到一个更漂亮的游戏:

结束语

现在我们已经有了图形,你可能已经注意到一个新问题:有时流星会摧毁我们的飞船,即使它看起来不像是触摸的。自己试试吧 - 多么令人沮丧!在下一课中,我们将了解如何调整冲突以便正常工作。


此部分的完整代码

# KidsCanCode - Game Development with Pygame video series
# Shmup game - part 4
# Video link: https://www.youtube.com/watch?v=mOckdKp3V38
# Adding graphics
import pygame
import random
from os import pathimg_dir = path.join(path.dirname(__file__), 'img')WIDTH = 480
HEIGHT = 600
FPS = 60# define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)# initialize pygame and create window
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Shmup!")
clock = pygame.time.Clock()class Player(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.transform.scale(player_img, (50, 38))self.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.rect.centerx = WIDTH / 2self.rect.bottom = HEIGHT - 10self.speedx = 0def update(self):self.speedx = 0keystate = pygame.key.get_pressed()if keystate[pygame.K_LEFT]:self.speedx = -8if keystate[pygame.K_RIGHT]:self.speedx = 8self.rect.x += self.speedxif self.rect.right > WIDTH:self.rect.right = WIDTHif self.rect.left < 0:self.rect.left = 0def shoot(self):bullet = Bullet(self.rect.centerx, self.rect.top)all_sprites.add(bullet)bullets.add(bullet)class Mob(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.image = meteor_imgself.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)self.speedx = random.randrange(-3, 3)def update(self):self.rect.x += self.speedxself.rect.y += self.speedyif self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:self.rect.x = random.randrange(WIDTH - self.rect.width)self.rect.y = random.randrange(-100, -40)self.speedy = random.randrange(1, 8)class Bullet(pygame.sprite.Sprite):def __init__(self, x, y):pygame.sprite.Sprite.__init__(self)self.image = bullet_imgself.image.set_colorkey(BLACK)self.rect = self.image.get_rect()self.rect.bottom = yself.rect.centerx = xself.speedy = -10def update(self):self.rect.y += self.speedy# kill if it moves off the top of the screenif self.rect.bottom < 0:self.kill()# Load all game graphics
background = pygame.image.load(path.join(img_dir, "starfield.png")).convert()
background_rect = background.get_rect()
player_img = pygame.image.load(path.join(img_dir, "playerShip1_orange.png")).convert()
meteor_img = pygame.image.load(path.join(img_dir, "meteorBrown_med1.png")).convert()
bullet_img = pygame.image.load(path.join(img_dir, "laserRed16.png")).convert()all_sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
bullets = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
for i in range(8):m = Mob()all_sprites.add(m)mobs.add(m)# Game loop
running = True
while running:# keep loop running at the right speedclock.tick(FPS)# Process input (events)for event in pygame.event.get():# check for closing windowif event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE:player.shoot()# Updateall_sprites.update()# check to see if a bullet hit a mobhits = pygame.sprite.groupcollide(mobs, bullets, True, True)for hit in hits:m = Mob()all_sprites.add(m)mobs.add(m)# check to see if a mob hit the playerhits = pygame.sprite.spritecollide(player, mobs, False)if hits:running = False# Draw / renderscreen.fill(BLACK)screen.blit(background, background_rect)all_sprites.draw(screen)# *after* drawing everything, flip the displaypygame.display.flip()pygame.quit()

太空射击 第07课: 添加图形相关推荐

  1. 太空射击第13课: 爆炸效果

    太空射击第13课: 爆炸效果 在本课中,我们将在玩家射击流星时进行一些动画爆炸. 视频 您可以在此处观看本课程的视频: 自动开火 首先,让我们对玩家的射击方式进行一些小的改变.现在,我们必须为每次射击 ...

  2. 太空射击第08课: 改进的碰撞

    太空射击第08课: 改进的碰撞 在本课中,我们将讨论如何更改 Pygame 处理精灵之间冲突的方式. 视频 可以在这里找到本教程的视频 碰撞是怎么回事? 在上一次教程中,我们添加了图形,将精灵从普通矩 ...

  3. 太空射击第15课: 道具

    太空射击第15课: 道具(第1部分) 在本课中,我们将添加一些偶尔出现的道具. 本教程所需素材从这里可以下载 视频 您可以在此处观看本课程的视频 道具 我们的游戏已经走了很远,但我们仍然缺少的一件事是 ...

  4. 太空射击第14课: 玩家生命

    太空射击第14课: 玩家生命 在本课中,我们将为玩家添加多个生命值,并在玩家死亡时添加一个漂亮的爆炸. 本教程所有素材包从这里下载 视频 您可以在此处观看本课程的视频: 玩家爆炸 我们将使用不同的爆炸 ...

  5. 太空射击第16课: 道具(Part 2)

    太空射击第16课: 道具(Part 2) 在本课中,我们将添加增加对子弹道具的处理. 视频 您可以在此处观看本课程的视频: 武器道具 上一次,我们创建了一个道具精灵,当流星被摧毁时,它会从流星中随机掉 ...

  6. 太空射击第10课: Score (繪畫和文字)

    太空射击第10课: Score (繪畫和文字) 在本课中,我们将开始显示分数,并学习如何在屏幕上显示文本.将使用pygame.freetype模块来完成文本的渲染,模块的详细说明在这里. 视频 观看视 ...

  7. 太空射击第17课: Game Over (結束)

    太空射击第17课: Game Over (結束) 在本课中,我们将通过添加"游戏结束"屏幕和再次玩游戏的功能来完成游戏. 视频 您可以在此处观看本课程的视频: 游戏结束 现在,当我 ...

  8. 太空射击第09课:精灵动画

    太空射击第09课:精灵动画 在本课中,我们将通过添加一些精灵动画来使我们的流星更有趣.本次课用到的图像可以点击这里下载 视频 观看视频 流星动画 pygame 中的transform模块 我们所有的流 ...

  9. 太空射击第11课: Sound and Music

    Sound and Music 在本课中,我们将为游戏添加音效和音乐.在这里可以下载太空射击游戏素材 视频 您可以在此处观看本课程的视频: 声音的力量 良好的音频是为游戏添加"果汁" ...

最新文章

  1. SAP QM初阶之启用了Multiple Specification功能后检验批的不同之处?
  2. M产品研发日志(4)---项目出差
  3. Python:list 和 array的对比以及转换时的注意事项
  4. Citrix虚拟化技术之一XenServer6.2安装
  5. HD1864_最大报销额
  6. Flask框架(flask模板(jinja2)与字符串过滤器、列表过滤器以及自定义过滤器)
  7. 系统级alias vs Oracle ADR功能
  8. 酒鬼随机漫步(一个矢量类)
  9. 微软面向初学者的机器学习课程:1.4-机器学习技术
  10. window10维护不了华为服务器,win10怎么打开云服务器异常
  11. 稳站大屏 AIoT 时代之巅,创维 Swaiot 生态品牌实现全面布局!
  12. 最新Oreo支付系统平台完整源码+已全开源
  13. Android 音频管理器AudioManager类介绍
  14. 2021-5-11 atcoder C - Replacing Integer
  15. 信息系统分析与设计 机票预定管理系统
  16. 2015-12-12 java hibernate 微信表情昵称保存
  17. disable属性导致后台接收值为null解决方法
  18. 数据挖掘学习之路:Python去极值方法(极值滤波)
  19. python如何录音_python实现录音功能
  20. Windows环境下msysgit安装git flow

热门文章

  1. Rational Software Architect 的介绍和基础教程
  2. Redis:缩容、扩容、渐进式rehash
  3. Win7 64位系统USB免驱设备驱动识别失败解决方法
  4. CSS - Flexbox总结
  5. 2013腾讯马拉松编程初赛3月23日1001
  6. kali burpsuit抓取不了https的包
  7. [算法设计题] 双栈结构
  8. Axure的页面交互
  9. html圆角边框怎么做,CSS圆角边框制作指南与实例
  10. 学生管理系统设计与实现(C++实现)