【问题标题】:TypeError: Invalid destination position for blit, Pygame类型错误:blit 的目标位置无效,Pygame
【发布时间】:2020-10-02 13:06:11
【问题描述】:

所以我的代码在这里有 2 个goblins() 在游戏窗口左右弹跳,我必须尝试在不触及goblin() 的情况下将player() 带到princess()。但是,当我创建 goblin() 的实例时,它们会向右并从窗口反弹,因为 goblinX_change 设置为 0.3,但是当它们到达窗口的左侧时,游戏崩溃并且我得到 TypeError : blit 的目标位置无效。

import pygame

# Initialize the pygame
pygame.init()

# Setting up the screen and background
screen = pygame.display.set_mode((800,600))

# Title and Icon of window
pygame.display.set_caption("Get Princess")

icon = pygame.image.load('knight.png')
pygame.display.set_icon(icon)

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

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

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, goblinX_change):
        self.goblinX = goblinX
        self.goblinY = goblinY
        self.goblinX_change = goblinX_change
        self.goblinImg = pygame.image.load('goblin.png')
        self.goblinImg = pygame.transform.scale(self.goblinImg,(50,50))
    
    def draw(self):
        screen.blit(self.goblinImg, (self.goblinX, self.goblinY))
        
    
    def movement(self):
        self.goblinX += self.goblinX_change
        if self.goblinX <= 0:
            self.goblinX_change += self.goblinX_change
        elif self.goblinX >= 750:
            self.goblinX_change = -self.goblinX_change


g = goblin(360,250, 0.3)
g1 = goblin(360, 280, 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
    
    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)
    
    
    g.movement()
    g.draw()
    g1.movement()
    g1.draw()


    pygame.display.update()

【问题讨论】:

    标签: python oop pygame


    【解决方案1】:

    goblinX达到0时,需要反转方向:

    def movement(self):
        self.goblinX += self.goblinX_change
        if self.goblinX <= 0:
            self.goblinX_change = -self.goblinX_change   #  update this line
            self.goblinX = 0
        elif self.goblinX >= 750:
            self.goblinX_change = -self.goblinX_change
    

    【讨论】:

    • 嗨@Mike67。所以我尝试实现'-'但是,现在地精只是粘在窗口的左侧并且不会移动。
    • 答案已更新。设置goblinX=0 以确保它脱离边缘。
    【解决方案2】:

    地精在左边界时,运动必须为正(abs(self.goblinX_change)),而当地精在右边界时,运动必须为负(-abs(self.goblinX_change)):

    class goblin():
        # [...]
    
        def movement(self):
            self.goblinX += self.goblinX_change
            if self.goblinX <= 0:
                self.goblinX_change = abs(self.goblinX_change)
            elif self.goblinX >= 750:
                self.goblinX_change = -abs(self.goblinX_change)
    

    或者你可以改变方向,如果妖精在左边界向左移动,或者在右边界向右移动:

    class goblin():
        # [...]
    
        def movement(self):
            self.goblinX += self.goblinX_change
            if (self.goblinX <= 0 and self.goblinX_change < 0) or \
               (self.goblinX >= 750 and self.goblinX_change > 0):
                self.goblinX_change *= -1
    

    【讨论】:

    • 我已经尝试实现你的两个选项,但是,它们仍然坚持一边......
    • @NickA 抱歉,我已经复制了您的代码并应用了建议。它工作正常,至少对我来说。 “Mike67”的答案同样有效。
    • 我会继续推@Rabbid76,再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    相关资源
    最近更新 更多