美文网首页
Pygame第1-3课:图片精灵

Pygame第1-3课:图片精灵

作者: __豆约翰__ | 来源:发表于2019-02-11 08:30 被阅读5次

转向图形精灵

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

哪里可以找到图片资源

当你需要为你的游戏添加图片资源时,你有3个选择:

  1. 自己画吧
  2. 找一位艺术家为你画画
  3. 使用互联网上已有的艺术作品

如果你或你的朋友具有艺术倾向,那么1和2就没问题,但是对于大多数程序员(你真正包括在内)来说,创造漂亮的图片资源并不在我们的技能组合中。因此,离开互联网,记住你不应该使用你没有权利使用的图片资源并是非常重要的。虽然搜索和查找马里奥或你最喜欢的口袋妖怪的照片很容易,但这并不意味着你可以在你的游戏中使用它,特别是如果你打算把它放在网上并让其他人看到它。

幸运的是,有一个很好的解决方案:OpenGameArt.org。这个网站上装满了大量的图片,声音,音乐等等 - 而且这些都是艺术家慷慨许可的,供您在游戏中使用。你可以在那里找到最好的艺术家之一,名叫肯尼(只需在搜索框中输入他的名字)。

您也可以访问Kenney的网站

在本课中,我们将使用Kenney的Platformer Art Complete Pack,它有很多用于制作平台游戏风格游戏的图形。继续下载并解压缩。我们将使用图像“p1_jump.png”:

image

您也可以点击上面的图片下载播放器图片。

组织您的游戏资产

首先,我们需要一个文件夹来保存我们的资产,这是游戏开发人员用来指代艺术和声音之类的术语。我简称为“img”文件夹,然后将播放器图像放入其中。

要在我们的游戏中使用此图像,我们需要告诉Pygame加载图片文件,这意味着我们需要程序知道文件的位置。根据您使用的计算机类型,这可能会有所不同,我们希望能够在任何计算机上运行我们的程序,因此我们需要加载一个名为的Python库os,然后指定我们的游戏所在位置:

 import pygame
 import random
 import os

 # set up asset folders
 game_folder = os.path.dirname(__file__)

特殊的Python变量__file__指的是保存游戏代码的任何文件夹,命令会指出该文件夹os.path.dirname路径。例如,在我的计算机上,我的代码的路径是这样的:

/Users/chris/Documents/gamedev/tutorials/1-3 sprite example.py

但我正在使用运行OS X的计算机。如果您使用的是Windows,您的路径可能如下所示:

C:\Users\chris\Documents\python\game.py

如您所见,不同的操作系统使用不同的方式来描述计算机上的位置。通过使用该os.path命令,我们可以让计算机找出正确的路径(例如,是否使用“/”或“\”。)

现在,我们可以指定我们的“img”文件夹:

 import pygame
 import random
 import os

 # set up asset folders
 game_folder = os.path.dirname(__file__)
 img_folder = os.path.join(game_folder, 'img')
 player_img = pygame.image.load(os.path.join(img_folder, 'p1_jump.png')).convert()

现在我们已经通过使用加载了我们的图像,pygame.image.load()并且我们已经确保使用convert(),这将通过将图像转换为在屏幕上绘制更快的格式来加速Pygame的绘制。现在我们准备用我们精美的玩家形象替换我们精灵中的普通绿色方块:

class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = player_img
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH / 2, HEIGHT / 2)

请注意,我们已经删除了命令self.image.fill(GREEN)- 我们不再需要填充纯色。get_rect()仍然可以正常工作,因为它会查看什么self.image是找出边界矩形应该是什么。

现在,如果你运行该程序,你应该看到一个漂亮的小卡通外星人在屏幕上运行。但是我们遇到了一个问题 - 我们无法看到,因为背景目前是黑色的。screen.fill()将底部的命令更改为其他内容 - 我决定使用BLUE。现在您可以看到问题:

image

当您在计算机上有图像文件时,该文件始终是矩形像素网格。无论你绘制什么样的形状,仍然会有像素边框填充图像的“背景”。我们需要做的是告诉Pygame忽略我们不关心的图像中的像素。在此图像中,这些像素恰好是黑色,因此我们可以添加以下内容:

class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = player_img
    self.image.set_colorkey(BLACK)
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH / 2, HEIGHT / 2)

set_colorkey()只是告诉Pygame,当我们绘制图像时,我们要忽略指定颜色的任何像素。现在我们的图像看起来好多了:

image

整合在一起

# Pygame sprite Example
import pygame
import random
import os

WIDTH = 800
HEIGHT = 600
FPS = 30

# define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

# set up assets folders
# Windows: "C:\Users\chris\Documents\img"
# Mac: "/Users/chris/Documents/img"
game_folder = os.path.dirname(__file__)
img_folder = os.path.join(game_folder, "img")

class Player(pygame.sprite.Sprite):
    # sprite for the Player
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(os.path.join(img_folder, "p1_jump.png")).convert()
        self.image.set_colorkey(BLACK)
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH / 2, HEIGHT / 2)
        self.y_speed = 5

    def update(self):
        self.rect.x += 5
        self.rect.y += self.y_speed
        if self.rect.bottom > HEIGHT - 200:
            self.y_speed = -5
        if self.rect.top < 200:
            self.y_speed = 5
        if self.rect.left > WIDTH:
            self.rect.right = 0

# initialize pygame and create window
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("My Game")
clock = pygame.time.Clock()

all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
# Game loop
running = True
while running:
    # keep loop running at the right speed
    clock.tick(FPS)
    # Process input (events)
    for event in pygame.event.get():
        # check for closing window
        if event.type == pygame.QUIT:
            running = False

    # Update
    all_sprites.update()

    # Draw / render
    screen.fill(BLUE)
    all_sprites.draw(screen)
    # *after* drawing everything, flip the display
    pygame.display.flip()

pygame.quit()

相关文章

  • Pygame第1-3课:图片精灵

    转向图形精灵 彩色矩形很好 - 它们是一个很好的开始方式,并确保你有游戏的基本工作,但迟早你会想要为你的精灵使用一...

  • Pygame精灵和精灵组

    Pygame精灵和精灵组 Pygame提供了两个类 pygame.sprite.Sprite—— 存储图像数据 i...

  • Day_10 异常与pygame

    异常捕获 pygame操作流程 pygame显示文字 pygame显示图片与图片操作 pygame基本显示

  • 从0开始学python第14.5节 pygame 加载图片和声音

    pygame.image 上节课的猫咪移动里我们用了cat.png图片,使用了pygame.image 模块,这个...

  • Pygame第1-2课:使用精灵

    什么是精灵? 精灵是可围绕移动屏幕上的任何对象的计算机图形术语。当您玩任何2D游戏时,您在屏幕上看到的所有对象都是...

  • Day-18正则表达式2

    pygame游戏基本框架的创建 pygame中图片的显示 字体的显示 图形 Pygame Pygame有很多的模块...

  • 2020-04-20

    使用Pygame显示图片 第一步:导入 pygame 和 sys 库 第二步:设定窗口大小 第三步:设定标题栏 第...

  • 2020 无人驾驶(5)之车道线检测

    这里使用 pygame 来显示图片,有关 pygame 使用方法还是比较简单,pygame.init()初始化 p...

  • 2018-07-27 day10 Pygame模块

    Pygame模块 显示文字 显示图片 显示图形 动画

  • day10

    01 pygame 02 显示文字 03 显示图片 04 显示图形

网友评论

      本文标题:Pygame第1-3课:图片精灵

      本文链接:https://www.haomeiwen.com/subject/sgapsqtx.html