我学习了一些使用方块的Pygame的基础知识如何开始使用图像?

2024-04-25 19:42:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题是在我的球员身上,我说了一个方向陈述,如果我向右走,然后向右飞,如果我向左飞,然后向左飞,但是 当我没有点击任何我的玩家没有站着的东西时,它会一直向左或向右点击,我不知道为什么这里有一个video

    def draw(self):
        self.rect.topleft = (self.x,self.y)
        if self.direction == "left":
            window.blit(self.painfuls[self.anim_index],self.rect) 
            self.anim_index += 1 
            if self.anim_index == len(self.painfuls):
                self.anim_index = 0
        elif self.direction == "right":
            window.blit(self.painful[self.anim_index],self.rect) 
            self.anim_index += 1 
            if self.anim_index == len(self.painful): 
                self.anim_index = 0
        else:
            window.blit(self.standing[self.anim_index],self.rect) 
            self.anim_index += 1 
            if self.anim_index == len(self.standing):
                self.anim_index = 0

# import pygame
import pygame
pygame.init()


# window
window = pygame.display.set_mode((1000,500))
pygame.display.set_caption("GHames")
painfuls = [
        pygame.image.load("Sprite-0020.png"),
        pygame.image.load("Sprite-0021.png"),
        pygame.image.load("Sprite-0022.png"),
        pygame.image.load("Sprite-0023.png"),
        pygame.image.load("Sprite-0024.png"),
        pygame.image.load("Sprite-0025.png"),
        pygame.image.load("Sprite-0026.png")
        ]


standing = [
        pygame.image.load("Sprite-0056.png"),
        pygame.image.load("Sprite-0057.png"),
        pygame.image.load("Sprite-0058.png"),
        pygame.image.load("Sprite-0059.png")
        ]

standing = [
        pygame.image.load("Sprite-0009.png"),
        pygame.image.load("Sprite-0010.png"),
        pygame.image.load("Sprite-0011.png"),
        pygame.image.load("Sprite-0012.png"),
        pygame.image.load("Sprite-0013.png")
        ]
coins = pygame.image.load("Coin.png")

bg = pygame.image.load("bgrs1.png")





# player class
class player:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width  = width
        self.color = color
        self.isJump = False
        self.JumpCount = 10
        self.speed = 5
        self.fall = 0
        self.rect = pygame.Rect(x,y,height,width)
        self.anim_index = 0
        self.painful = [
        pygame.image.load("Sprite-0009.png"),
        pygame.image.load("Sprite-0010.png"),
        pygame.image.load("Sprite-0011.png"),
        pygame.image.load("Sprite-0012.png"),
        pygame.image.load("Sprite-0013.png")
        ]
        self.painfuls = [
        pygame.image.load("Sprite-0020.png"),
        pygame.image.load("Sprite-0021.png"),
        pygame.image.load("Sprite-0022.png"),
        pygame.image.load("Sprite-0023.png"),
        pygame.image.load("Sprite-0024.png"),
        pygame.image.load("Sprite-0025.png"),
        pygame.image.load("Sprite-0026.png")
        ]
        self.standing = [
        pygame.image.load("Sprite-0056.png"),
        pygame.image.load("Sprite-0057.png"),
        pygame.image.load("Sprite-0058.png"),
        pygame.image.load("Sprite-0059.png")
        ]

        self.direction = "left"
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        if self.direction == "left":
            window.blit(self.painfuls[self.anim_index],self.rect) 
            self.anim_index += 1 
            if self.anim_index == len(self.painfuls):
                self.anim_index = 0
        elif self.direction == "right":
            window.blit(self.painful[self.anim_index],self.rect) 
            self.anim_index += 1 
            if self.anim_index == len(self.painful): 
                self.anim_index = 0
        else:
            window.blit(self.standing[self.anim_index],self.rect) 
            self.anim_index += 1 
            if self.anim_index == len(self.standing):
                self.anim_index = 0


class enemy:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.color = color
        self.rect = pygame.Rect(x,y,height,width)
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window,self.color, self.rect)


class coin:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.color = color
        self.rect = pygame.Rect(x,y,height,width)
        self.coins = pygame.image.load("Coin.png")
        self.rect = pygame.Rect(x,y,coins.get_width(),coins.get_height())
        self.coins = pygame.transform.scale(self.coins,(self.coins.get_width()//2,self.coins.get_height()//2))
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        window.blit(self.coins,self.rect)



class floor:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.color = color
        self.rect = pygame.Rect(x,y,height,width)
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window, self.color, self.rect)


class enemyplayer:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        selfwidth = width
        self.color = color
        self.rect = pygame.Rect(x,y,height,width)
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window,self.color,self.rect)


# score for coins
font = pygame.font.Font("freesansbold.ttf", 32)
score = 0
text = font.render("score = " + str(score), True, (255,255,0))
textRect = text.get_rect()
textRect.center = (100,40)

# color
yellow = (255,255,0)
white = (255,255,255)
Green = (0,255,0)


# FPS
FPS  = 60
clock = pygame.time.Clock()



# defiine player class
enemyplayer1 = enemyplayer(280,390,40,40, Green)
enemos = [enemyplayer1]


playerman = player(50,390,30,30, Green)
enemy1 = enemy(150,390,150,10, white)
enemy2 = enemy(300,310,150,10, white)
enemy3 = enemy(50,260,150,10, white)
enemies = [enemy1,enemy2,enemy3]

# define floor class
floor1 = floor(-1000,510,1500,50, white)
flories = [floor1]
# coin class
coin1 = coin(180,370,20,20, yellow)
coin2 = coin(250,370,20,20, yellow)
coin3 = coin(360,290,20,20, yellow)
coin4 = coin(140,240,20,20, yellow)
Coins_list = [coin1,coin2,coin3,coin4]

# main loop

bullets = []
runninggame = True
while runninggame:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            runninggame = False




    if playerman.y < 150:
        playerman.y += 1
        for enemy in enemies:
            enemy.y += playerman.speed
        for coin in Coins_list:
            coin.y += playerman.speed
        for floor in flories:
            floor.y += playerman.speed
        for enemyplayer in enemos:
            enemyplayer.y += playerman.speed

    if playerman.y > 450:
        playerman.y -= playerman.fall
        for enemy in enemies:
            enemy.y -= playerman.fall
        for coin in Coins_list:
            coin.y -= playerman.fall
        for floor in flories:
            floor.y -= playerman.fall
        for enemyplayer in enemos:
            enemyplayer.y -= playerman.fall




    if enemyplayer1.x > 150:
        enemyplayer1.x -= playerman.speed
    else:
        enemyplayer1.x < 250
        enemyplayer1.x += playerman.speed
    if playerman.rect.colliderect(enemyplayer1.rect):
        playerman.x = 50
        playerman.y = 390



    keys = pygame.key.get_pressed()





    if keys[pygame.K_LEFT]:
        playerman.direction = "left"
        playerman.x -= playerman.speed
        if playerman.x < 100:
            playerman.x += playerman.speed
            for enemy in enemies:
                enemy.x += playerman.speed
            for coin in Coins_list:
                coin.x += playerman.speed




    if keys[pygame.K_RIGHT]:
        playerman.direction = "right"
        playerman.x += playerman.speed
        if playerman.x > 400:
            playerman.x -= playerman.speed
            for enemy in enemies:
                enemy.x -= playerman.speed
            for coin in Coins_list:
                coin.x -= playerman.speed




    if not playerman.isJump:
        playerman.y += playerman.fall
        playerman.fall += 1
        collide = False
        for enemy in enemies:
            if playerman.rect.colliderect(enemy.rect):
                collide = True
                playerman.y = enemy.rect.top - playerman.height + 1
                if playerman.rect.right > enemy.rect.left and playerman.rect.left < enemy.rect.left - playerman.width:
                    playerman.x = enemy.rect.left - playerman.width
                if playerman.rect.left < enemy.rect.right and playerman.rect.right > enemy.rect.right + playerman.width:
                     playerman.x = enemy.rect.right
            if playerman.rect.colliderect(enemyplayer1.rect):
                collide = True
                playerman.y = enemyplayer1.rect.top - playerman.height + 1
                if playerman.rect.right > enemyplayer1.rect.left and playerman.rect.left < enemyplayer1.rect.left - playerman.width:
                    playerman.x = enemyplayer1.rect.left - playerman.width
                if playerman.rect.left < enemyplayer1.rect.right and playerman.rect.right > enemyplayer1.rect.right + playerman.width:
                     playerman.x = enemyplayer1.rect.right


            for one in range(len(Coins_list)-1,-1,-1):
                if playerman.rect.colliderect(Coins_list[one].rect):
                    del Coins_list[one]
                    score += 1
                    text = font.render("score = " + str(score), True, (255,255,0))
                    textRect = text.get_rect()
                    textRect.center = (100,40)   
            if playerman.rect.colliderect(floor1.rect):
                collide = True
                playerman.isJump = False
                playerman.y = floor1.rect.top - playerman.height  + 1
                if playerman.rect.right > floor1.rect.left and playerman.rect.left < floor1.rect.left - playerman.width:
                    playerman.x = floor1.rect.left - playerman.width
                if playerman.rect.left < floor1.rect.right and playerman.rect.right > floor1.rect.right + playerman.width:
                    playerman.x = floor1.rect.right





            if playerman.rect.bottom >= 500:
                collide = True
                playerman.isJump = False
                playerman.JumpCount = 10
                playerman.y = 500- playerman.height

            if collide:
                if keys[pygame.K_SPACE]:
                    playerman.isJump = True
                playerman.fall = 0


    else:
        if playerman.JumpCount > 0:
            playerman.y -= (playerman.JumpCount * abs(playerman.JumpCount))*0.5
            playerman.JumpCount -= 1
        else:
            playerman.isJump = False
            playerman.JumpCount = 10




    window.fill((130,0,0))

    for enemyplayer in enemos:
        enemyplayer.draw()
    for floor in flories:
        floor.draw()
    playerman.draw()
    window.blit(text,textRect)


    for coin in Coins_list:
        coin.draw()

    for enemy in enemies:
        enemy.draw()



    pygame.display.update()
pygame.quit()



Tags: rectimageselfforindexifpngload
1条回答
网友
1楼 · 发布于 2024-04-25 19:42:03

将每个对象更改为图像很容易,您可以使用pygame.image.load(filename)加载图像,然后将其显示在屏幕上

在player类中,加载图像并更改

class player:
    def __init__(self,x,y,height,width,color):
        self.left_image = pygame.image.load("whatever_the_image_is_called.png")
        self.right_image = pygame.image.load("whatever_the_image_is_called.png")
        ...
        self.rect = pygame.Rect(x,y,left_image.get_width(), left_image.get_height())
        self.direction = "left" #set a stating direction

然后,要将它们放到屏幕上,请单击它们

def draw(self):
    self.rect.topleft = (self.x,self.y)
    if self.direction == "left":
        screen.blit(self.left_image,self.rect)
    else:
        screen.blit(self.right_image,self.rect)

然后当你改变方向时

if keys[pygame.K_LEFT]:
    playerman.direction = "left"

if keys[pygame.K_RIGHT]:
    playerman.direction = "right"

对于其他类,您不需要self.direction,它们只有一个方向,所以只需blit一个图像

如您所见,我使用了图像宽度和高度,而不是作为self.rect的参数传递的wh,因此您可以去掉这些,您还必须确保图像的大小正确

您可以使用pygame.transform.scale(image,size)将图像大小调整到正确的大小

例如self.left_image = pygame.transform.scale(self.left_image,(100,100))。这会将图像更改为100x100,但可能会因此而失真

self.left_image = pygame.transform.scale(self.left_image,(self.left_image.get_width()//2,self.left_image.get_height()//2))

这会将图像缩放到一半大小,保持纵横比

对于动画,我发现最好使用一个列表,然后获得每个精灵,幸运的是,您已经很好地命名了它们,您可以这样做

self.left_anim = []
for i in range(2,10,1):
    self.left_anim.append(pygame.image.load("Sprite" + str(i).zfill(4)))

str(i).zfill(4)使其前面有3个零

然后通过动画有一个计数器

self.anim_index = 0

def draw(self):
    screen.blit(self.left_anim[self.anim_index]) #put the current frame on screen
    self.anim_index += 1 #go to next frame
    if self.anim_index == len(self.left_anim): #if reached end of animation
        self.anim_index = 0 #reset

for i in range(2,10,1):
    self.painful.append[pygame.image.load("dots1.png"),[pygame.image.load("dots2.png"),[pygame.image.load("dots3.png"),[pygame.image.load("dots4.png"),[pygame.image.load("dots5.png")

循环是这样的,你不需要为每个图像都有一个pygame.image.load(),你只需要一个

for i in range(1,5,1):
    self.painful.append(pygame.image.load("dots%d.png" %(str(1)))

或者只是没有循环

self.painful = [
    pygame.image.load("dots1.png"),
    pygame.image.load("dots2.png"),
    pygame.image.load("dots3.png"),
    pygame.image.load("dots4.png"),
    pygame.image.load("dots5.png")
]

然后确保self.rect.topleft =位于if语句之外,因为您希望它在每一帧发生,而不仅仅是在动画结束时发生

def draw(self):
    screen.blit(self.painful[self.anim_index],self.rect)) #put the current frame on screen
    self.anim_index += 1 #go to next frame
    if self.anim_index == len(self.painful): #if reached end of animation
        self.anim_index = 0 #reset
    self.rect.topleft = (self.x,self.y) #***** this part here ******
    pygame.draw.rect(window,self.color,self.rect)

相关问题 更多 >