转向图形精灵
彩色矩形很好 - 它们是一个很好的开始方式,并确保你有游戏的基本工作,但迟早你会想要为你的精灵使用一个很酷的宇宙飞船图像或角色。这引出了我们的第一个问题:你在哪里获得你的游戏图形。
哪里可以找到图片资源
当你需要为你的游戏添加图片资源时,你有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
。现在您可以看到问题:
当您在计算机上有图像文件时,该文件始终是矩形像素网格。无论你绘制什么样的形状,仍然会有像素边框填充图像的“背景”。我们需要做的是告诉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,当我们绘制图像时,我们要忽略指定颜色的任何像素。现在我们的图像看起来好多了:
整合在一起
# 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()
网友评论