python - 有没有办法在pygame中对多个图像或图像列表进行blit
问题描述
我整天都在试图弄清楚这一点,并搜索了无数的帖子。我试图弄清楚如何让我的精灵执行攻击动画,但实际上没有关于如何在线执行此操作的文档或信息。如果我向右移动,我已经将它带到了他将执行旋转攻击动画的位置,但是经过这么多旋转后,游戏将崩溃并显示“列表索引超出范围”。此外,如果角色静止不动,按攻击键“w”绝对没有任何作用。我已经包含了我的代码的副本。任何帮助将不胜感激。
import pygame
import os
os.chdir('C:\\Users\\Name\\Desktop\\Character Animation\\')
pygame.init()
pygame.mixer.init()
WIDTH = 1920
HEIGHT = 1080
FPS = 60
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Game')
''' IMAGE RESIZING___________________________________________________________'''
wRight1 = pygame.image.load('row2_1.png')
wRight1 = pygame.transform.scale(wRight1, (80,80))
wRight2 = pygame.image.load('row2_2.png')
wRight2 = pygame.transform.scale(wRight2, (80,80))
wRight3 = pygame.image.load('row2_3.png')
wRight3 = pygame.transform.scale(wRight3, (80,80))
wRight4 = pygame.image.load('row2_4.png')
wRight4 = pygame.transform.scale(wRight4, (80,80))
wRight5 = pygame.image.load('row2_5.png')
wRight5 = pygame.transform.scale(wRight5, (80,80))
wRight6 = pygame.image.load('row2_6.png')
wRight6 = pygame.transform.scale(wRight6, (80,80))
wRight7 = pygame.image.load('row2_7.png')
wRight7 = pygame.transform.scale(wRight7, (80,80))``
wRight8 = pygame.image.load('row2_8.png')
wRight8 = pygame.transform.scale(wRight8, (80,80))
wLeft1 = pygame.image.load('row10_1.png')
wLeft1 = pygame.transform.scale(wLeft1, (80,80))
wLeft2 = pygame.image.load('row10_2.png')
wLeft2 = pygame.transform.scale(wLeft2, (80,80))
wLeft3 = pygame.image.load('row10_3.png')
wLeft3 = pygame.transform.scale(wLeft3, (80,80))
wLeft4 = pygame.image.load('row10_4.png')
wLeft4 = pygame.transform.scale(wLeft4, (80,80))
wLeft5 = pygame.image.load('row10_5.png')
wLeft5 = pygame.transform.scale(wLeft5, (80,80))
wLeft6 = pygame.image.load('row10_6.png')
wLeft6 = pygame.transform.scale(wLeft6, (80,80))
wLeft7 = pygame.image.load('row10_7.png')
wLeft7 = pygame.transform.scale(wLeft7, (80,80))
wLeft8 = pygame.image.load('row10_8.png')
wLeft8 = pygame.transform.scale(wLeft8, (80,80))
spinAttackR1 = pygame.image.load('spinattackright1.png')
spinAttackR1 = pygame.transform.scale(spinAttackR1, (90,90))
spinAttackR2 = pygame.image.load('spinattackright2.png')
spinAttackR2 = pygame.transform.scale(spinAttackR2, (90,90))
standStill1 = pygame.image.load('standStill1.png')
standStill1 = pygame.transform.scale(standStill1, (80,80))
standStill2 = pygame.image.load('standStill2.png')
standStill2 = pygame.transform.scale(standStill2, (80,80))
standStill3 = pygame.image.load('standStill3.png')
standStill3 = pygame.transform.scale(standStill3, (80,80))
standStill4 = pygame.image.load('standStill4.png')
standStill4 = pygame.transform.scale(standStill4, (80,80))
'''_________________________________________________________________________'''
bg = pygame.image.load('bg.png')
spinAttackList = [spinAttackR1, spinAttackR2, spinAttackR1, spinAttackR2,
spinAttackR1, spinAttackR2, spinAttackR1, spinAttackR2,
spinAttackR1, spinAttackR2, spinAttackR1, spinAttackR2,
spinAttackR1, spinAttackR2, spinAttackR1, spinAttackR2,
spinAttackR1, spinAttackR2, spinAttackR1, spinAttackR2,
spinAttackR1, spinAttackR2, spinAttackR1, spinAttackR2,
spinAttackR1, spinAttackR2, spinAttackR1, spinAttackR2,
spinAttackR1, spinAttackR2, spinAttackR1, spinAttackR2]
walkRight = [wRight1, wRight2,
wRight3, wRight4,
wRight5, wRight6,
wRight7, wRight8]
walkLeft = [wLeft1, wLeft2,
wLeft3, wLeft4,
wLeft5, wLeft6,
wLeft7, wLeft8]
#char = [standStill1, standStill2, standStill3, standStill4]
char = pygame.image.load('topDownattackRight3.png')
char = pygame.transform.scale(char, (80,80))
#R = char.get_rect()
clock = pygame.time.Clock()
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
x = 50
y = 770
width = 64
height = 64
vel = 5
isJump = False
jumpCount = 10
spin = False
left = False
right = False
walkCount = 0
attackCount = 0
'''DRAWING SECTION___________________________________________________________'''
def redrawGameWindow():
global walkCount
global attackCount
screen.blit(bg, (0,0))
if walkCount + 1 >= 24:
walkCount = 0
if left:
screen.blit(walkLeft[walkCount//3], (x,y))
walkCount += 1
attackCount += 1
elif right:
screen.blit(walkRight[walkCount//3], (x,y))
walkCount += 1
attackCount += 1
else:
screen.blit(char, (x,y))
if spin:
screen.blit(spinAttackList[attackCount//3], (x,y))
pygame.display.update()
#mainloop
run = True
while run:
clock.tick(30)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
#_________________________________________________________________________
if keys[pygame.K_w]:
spin = True
if keys[pygame.K_LEFT] and x > vel:
x -= vel
left = True
right = False
elif keys[pygame.K_RIGHT] and x < WIDTH - 40:
x += vel
right = True
left = False
else:
right = False
left = False
walkCount = 0
spin = False
if not(isJump):
if keys[pygame.K_SPACE]:
isJump = True
right = False
left = False
walkCount = 0
else:
if jumpCount >= -10:
neg = 1
if jumpCount < 0:
neg = -1
y -= (jumpCount ** 2) * 0.5 * neg
jumpCount -= 1
else:
isJump = False
jumpCount = 10
redrawGameWindow()
pygame.quit()
解决方案
尝试这个。它对我有用:
#x, y, w, h are for position and no is number of images
def ims(no, x, y, w, h):
idt = True
pino = 0
while idt:
ec()
if pino != no:
file = str("xyz") + str(pino) + ".png" #filepath, with image names as 0.png, 1.png so on
pino += 1
pic = pygame.image.load(file).convert_alpha()
pygame.draw.rect(screen, bgc, (x, y, w, h)
pygame.display.update()
clock.tick(15)
推荐阅读
- java - SpringBoot doesn't work after Appengine deployment: "2 counts of InaccessibleWSDLException" error
- javascript - 如何过滤可观察数组?
- java - How can I start a service in a different thread without affecting debbuging?
- dask - 混淆矩阵与 dask
- javascript - 您可以“自定义”非内置元素吗?
- firebase-realtime-database - 为什么我会收到堆栈溢出错误?
- php - 在 PHP 中对从 .NET 加密的 SHA512 密码进行身份验证
- sql - 如何在 admin 表中添加管理员的姓名和电话,同时使用存储过程从分支表中添加 branch_name 到 admin 表中?
- sql-server - 左连接表 A 和表 B
- javascript - Plot geometry of longitude and latitude coordinates using javascript