【问题标题】:Pygame object won't move when I take an OOP approach当我采用 OOP 方法时,Pygame 对象不会移动
【发布时间】:2020-09-30 13:57:59
【问题描述】:

我正在学习 pygame,并创建了一个小游戏,其中骑士必须在不碰到移动的妖精的情况下到达公主。我能够很好地完成这项工作,但是,当我尝试采用 OOP 方法以便以后可以有效地添加更多地精等时,地精没有移动,它是静止的。注释掉的部分是该程序在不使用 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()

【问题讨论】:

    标签: python class oop pygame


    【解决方案1】:

    你在每帧的主循环中实例化地精。

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

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

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

    地精没有出现是因为你正在绘制__init__,但只调用了一次。给你的地精类一个名为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()
    

    【讨论】:

    • 所以我试过这个,现在妖精根本没有出现。我所做的只是将实例完全按照您显示的方式放置,甚至尝试在使用和不使用循环内的原始实例的情况下运行它。没有运气...
    • 它已经开始运动了!谢谢!现在的问题是它不会影响我在 move() 函数中设置的边界。我会尝试自己解决这个问题,但我感谢您提供的任何帮助!
    • @NickA 是的,最好尽可能自己做:-)。不过只是一个提示,您正在更改错误的变量。
    • 我已经看过这个该死的东西有一段时间了,但我仍然不明白为什么我必须更改一个不同的变量。我肯定被卡住了......
    • @NickA 好吧,我不能确定,但​​我认为您的位置值由 self.goblinX 表示,但您正在更改 self.goblinX_change
    猜你喜欢
    • 2021-05-03
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多