当我点击移动时如何动画一个pygame角色走动

时间:2015-08-20 02:32:24

标签: python animation pygame

我是pygame的新手,正在制作游戏。我有一个角色,我想让腿移动。它有2张图片以及如何让它们切换? 这个角色是蓝色巫师。有人可以帮忙吗?谢谢大家

import pygame
import time
time_start = time.time()
seconds = 0
pygame.init()
time = pygame.time.get_ticks()
timeStep = 1000
display_width = 1500
display_height = 750
originx = 0
originy = 0
gameDisplay = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption('Game')
black = (0,0,0)
white = (255,255,255)
dollarBill = pygame.image.load('DollarBill.png')
clock = pygame.time.Clock()
killed = False
manImg = pygame.image.load('Wizard1Front.png')
manImgt = pygame.image.load('Wizard1Front.png')
wfo = True
def dollarbill(dx,dy):
    gameDisplay.blit(dollarBill, (dx,dy))
def blueWizard(x,y):
    if wfo == True:
        gameDisplay.blit(manImg, (x,y))
    else:
        gameDisplay.blit(manImgt, (x,y))
x =  (display_width * 0.45)
y = (display_height * 0.8)
dx =  (display_width * 0.45)
dy = (display_height * 0.8)
#key response
key_left = False
key_right = False
key_up = False
key_down = False
right_ctrl = False
ctrl_left = False
ctrl_right = False
ctrl_up = False
ctrl_down = False
while not killed:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            crashed = True
            pygame.quit()
            quit()
        ############################
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                key_left = True
                ctrl_left = True
            elif event.key == pygame.K_RIGHT:
                key_right = True
                ctrl_right = True
            elif event.key == pygame.K_UP:
                key_up = True
                ctrl_up = True
            elif event.key == pygame.K_DOWN:
                key_down = True
                ctrl_down = True
            elif event.key == pygame.K_RCTRL:
                right_ctrl = True
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                key_left = False
                ctrl_left = False
            if event.key == pygame.K_RIGHT:
                key_right = False
                ctrl_right = False
            if event.key == pygame.K_UP:
                key_up = False
                ctrl_up = False
            if event.key == pygame.K_DOWN:
                key_down = False
                ctrl_down = False
        ######################
    ##what the keys do
    if key_right == True and x < (display_width - 74):
        x += 2.5
    if key_left == True and x > 0:
        x += -2.5
    if key_up == True and y > 0:
        y += -2.5
    if key_down == True and y < (display_height - 113):
        y += 2.5
    if right_ctrl == True:
        dx += 20
    if ctrl_left == True:
        dx += -2.5
    if ctrl_right == True:
        dx += 2.5
    if ctrl_up == True:
        dy += -2.5
    if ctrl_down == True:
        dy += 2.5
   ##extra logic
    if dx > (display_width) or  dy > (display_height):
        dx = x
        dy = y
        right_ctrl = False
    if dx < (originx) or dy < (originy):
        dx = x
        dy = y
        right_ctrl = False
    gameDisplay.fill(black)
    blueWizard(x,y)
    dollarbill(dx,dy)
    pygame.display.update()
    clock.tick(60)
pygame.quit()
quit() 

2 个答案:

答案 0 :(得分:1)

虽然这个例子可能适用于一个简单的两个图像移动精灵,但你真正想做的是使用精灵表。

精灵表是典型的游戏运动方式(原版NES,Sega等)。

基本的想法是你有一个关于精灵所有可能图像的大图像。然后,您使用代码将该大图像的特定块分配给新图像。然后将这些图像放在一个数组中。当您的播放器移动时,您会增加数组索引,然后在到达结束时重置为0.

您如何选择要显示的图像(索引)可以通过放置在地图上(x或y位置),当前速度或某些其他属性来定义。

您甚至可以根据播放器状态更改您使用的图像阵列。意思是,你可以有一个用于行走的图像阵列,另一个用于跑步的图像,以及用于跳跃的花药。您可以根据标志或状态对象确定哪个数组。

通常,对于良好的步行运动,您需要阵列中至少6张图像。

有关PyGame中精灵表的更多信息,请查看他们的wiki:https://pygame.org/wiki/Spritesheet

有关精灵表的示例,请查看Spriters资源:http://www.spriters-resource.com/

答案 1 :(得分:0)

wfo = False
def blueWizard(x,y):
    if wfo == True:
        gameDisplay.blit(manImg, (x,y))
    else:
        gameDisplay.blit(manImgt, (x,y))

如果这是你对角色的展示,那么你可以这样做:

wfo = False
def set_wfo():
    global wfo #you can now use wfo if any other functions
set_wfo()
def blueWizard(x,y):
    if wfo == True:
        gameDisplay.blit(manImg, (x,y))
        wfo = False
    else:
        gameDisplay.blit(manImgt, (x,y))
        wfo = True

我不在电脑上,所以我无法检查它,但我希望它有效:),也许不行。 现在,当我查看它时,你可能不应该使用这个功能,而只是用你的代码替换你调用它的地方,没有真正使用这个功能它只会使事情变得复杂...... 同时放入if a == True:,您可以使用if a:

而不是

key_left = False
key_right = False
key_up = False
key_down = False
right_ctrl = False
ctrl_left = False
ctrl_right = False
ctrl_up = False
ctrl_down = False

你可以拥有

key_left, key_right, key_up, key_down, right_ctrl, ctrl_left, ctrl_right, ctrl_up, ctrl_down = [False]*9

但是我会把键所做的事情转移到你正在浏览thrue事件的检查系统中,它会更短,没有别的东西会真正改变......

同样看pygame.sprite.Group,它们非常有用。我没有提到的任何事情?