当我采用OOP方法时,Pygame对象不会移动

2024-09-27 23:16:13 发布

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

我正在学习pygame,并创建了一个小游戏,在这个游戏中,骑士必须在不撞到移动的地精的情况下接近公主。不过,当我尝试采用面向对象的方法,以便以后能够高效地添加更多的地精时,我能够使这项工作正常进行。地精没有移动,它是静止的。注释掉的部分是该程序在不使用OOP方法的情况下工作的格式

import pygame


pygame.init()


screen = pygame.display.set_mode((800,600))


pygame.display.set_caption("Get Princess")

icon = pygame.image.load('card-game.png')
pygame.display.set_icon(icon)


playerImg = pygame.image.load('knight.png')
playerImg = pygame.transform.scale(playerImg, (50,50))
playerX = 360
playerY = 520
playerX_change = 0
playerY_change = 0


princessImg = pygame.image.load('princess.png')
princessImg = pygame.transform.scale(princessImg, (50,50))
princessX = 360
princessY = 20

#Goblin Image
#goblinImg = pygame.image.load('goblin.png')
#goblinImg = pygame.transform.scale(goblinImg,(50,50))
#goblinX = 360
#goblinY = 250
#goblinX_change = 0.3

def player(x,y):
    screen.blit(playerImg, (x, y))

def princess(x,y):
    screen.blit(princessImg, (x, y))


class goblin():
    def __init__(self, goblinX, goblinY):
        self.goblinX = goblinX
        self.goblinY = goblinY
        goblinImg = pygame.image.load('goblin.png')
        goblinImg = pygame.transform.scale(goblinImg,(50,50))
        screen.blit(goblinImg, (self.goblinX, self.goblinY))
        
    
    def movement(self, goblinX_change):
        self.goblinX_change = goblinX_change
        self.goblinX += self.goblinX_change
        if self.goblinX <= 0:
            self.goblinX_change += 0.3
        elif self.goblinX >= 750:
            self.goblinX_change = -0.3

    
running = True
while running:

    screen.fill((50,0,0))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
                    

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                playerY_change = -0.4
            if event.key == pygame.K_DOWN:
                playerY_change = 0.4
            if event.key == pygame.K_LEFT:
                playerX_change = -0.4
            if event.key == pygame.K_RIGHT:
                playerX_change = 0.4
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                playerX_change = 0
            elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                playerY_change = 0

    playerX += playerX_change
    playerY += playerY_change


    #goblinX += goblinX_change
    #if goblinX <= 0:
        #goblinX_change += 0.3
    #elif goblinX >= 750:
        #goblinX_change = -0.3
    
    if playerX <= 0:
        playerX = 0
    elif playerX >= 750:
        playerX = 750
    if playerY <= 0:
        playerY = 0
    elif playerY >= 550:
        playerY = 550

    player(playerX,playerY)
    princess(princessX, princessY)
    #goblin(goblinX, goblinY)
    
    g = goblin(360,250)
    g.movement(0.3)

    pygame.display.update()

Tags: keyimageselfeventifpngloadchange
1条回答
网友
1楼 · 发布于 2024-09-27 23:16:13

每一帧你都在主循环中实例化地精

while running:  
    #ommited code
    g = goblin(360,250)

这意味着您正在将位置设置为每帧(360, 250)。简单修复,在循环外创建一个实例

g = goblin(360,250)
running = True
while running:
    #...

小妖精不会出现,因为您正在__init__中绘制,但只调用它一次。给你的goblin类一个叫做draw()的新方法,然后用这个方法绘制所有的图形。然后在主循环中调用该方法

class goblin():
    def __init__(self, goblinX, goblinY):
        self.goblinX = goblinX
        self.goblinY = goblinY
        self.goblinImg = pygame.image.load('goblin.png')
        self.goblinImg = pygame.transform.scale(goblinImg,(50,50))

    def draw(self):
        screen.blit(self.goblinImg, (self.goblinX, self.goblinY))
    
    def movement(self, goblinX_change):
        self.goblinX_change = goblinX_change
        self.goblinX += self.goblinX_change
        if self.goblinX <= 0:
            self.goblinX += 0.3
        elif self.goblinX >= 750:
            self.goblinX = -0.3

g = goblin()
running = True
while running:
    #...
    g.movement()
    g.draw()

相关问题 更多 >

    热门问题