微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pygame Python:函数显示运动但与类函数一起使用时不显示

如何解决Pygame Python:函数显示运动但与类函数一起使用时不显示

程序正常启动并显示带有图像的窗口,当我用里面的创建函数单击它时会移动图像(代码部分旁边有2条注释):

import Units_sol_1
import pygame
import sys

pygame.init()

clock = pygame.time.Clock()

resolution = (1080,720)
pygame.display.set_caption("AWO")
surface = pygame.display.set_mode((1080,720))


recon1_x = 0
recon1_y = 0

running = True

while running:

    for event in pygame.event.get():
        surface.fill((0,0))
        if event.type == pygame.QUIT:
            running = False
            pygame.quit()
            sys.exit()

        recon1 = Units_sol_1.Recon(recon1_x,recon1_y)

        pygame.display.update()

        surface.blit(recon1.icon,recon1.pos)

#this is the code below

        if recon1.pos <= pygame.mouse.get_pos() <= (recon1_x + recon1.w_icon,recon1_y + recon1.h_icon):
            print("work1")
            if event.type == pygame.MOUSEBUTTONDOWN:
                recon1_x += 1
                recon1_y += 1
                recon1.w_icon += 1
                recon1.h_icon += 1
                print(recon1.pos)

#this is the code upside

pygame.display.flip()
clock.tick(60)

在类函数 Recon (Units_sol_1) 下方:

import pygame

class Recon(Vehicule1,pygame.sprite.Sprite):
def __init__(self,posx,posy):
    super().__init__(posx,posy)
    self.pos = (posx,posy)
    self.w_icon = 33
    self.h_icon = 33

    self.icon = pygame.image.load("Unité/recon_l.png")

然后与类功能相同的代码,当我点击它时不移动图像:

import Units_sol_1
import pygame
import sys

pygame.init()

clock = pygame.time.Clock()

resolution = (1080,720))

recon1_x = 0
recon1_y = 0

running = True

while running:

for event in pygame.event.get():
    surface.fill((0,0))
    if event.type == pygame.QUIT:
        running = False
        pygame.quit()
        sys.exit()

    recon1 = Units_sol_1.Recon(recon1_x,recon1_y)

    pygame.display.update()

    surface.blit(recon1.icon,recon1.pos)

    recon1.icon_moving(recon1_x,recon_y)

pygame.display.flip()
horloge.tick(60)

以及具有类函数 (Units_sol_1) 的类:

import pygame

class Recon(Vehicule1,pygame.sprite.Sprite):
    def __init__(self,posy):
        self.pos = (posx,posy)
        self.w_icon = 33
        self.h_icon = 33

        self.icon = pygame.image.load("Unité/recon_l.png")

    def icon_moving(self,posy):

        for event in pygame.event.get():
            if self.pos <= pygame.mouse.get_pos() <= (posx + self.w_icon,posy + self.h_icon):
                print("ok 1")
                if event.type == pygame.MOUSEBUTTONDOWN:
                    print("ok 2")
                    posx += 1
                    posy += 1
                    self.w_icon += 1
                    self.h_icon += 1
                    print(self.pos)

我的问题是我不知道如何使类函数起作用;我知道为什么类函数在我点击它时不移动图像。

解决方法

您必须在应用程序循环之前创建 Recon 的实例。但是,您必须在应用程序循环中连续绘制对象。 此外,您必须在移动对象时更改位置属性 self.pos[0]self.pos[1]
pygame.event.get() 获取所有消息并将它们从队列中删除。请参阅文档:

这将获取所有消息并将它们从队列中删除。 [...]

如果在多个事件循环中调用 pygame.event.get(),则只有一个循环接收事件,但不会所有循环都接收所有事件。因此,似乎错过了一些事件。

每帧获取一次事件并在多个循环中使用它们或将事件列表传递给处理它们的函数和方法:

class Recon(Vehicule1,pygame.sprite.Sprite):
    def __init__(self,posx,posy):
        self.pos = [posx,posy]
        self.w_icon = 33
        self.h_icon = 33
        self.icon = pygame.image.load("Unité/recon_l.png")

    def icon_moving(self,event_list):
        for event in event_list:
            if event.type == pygame.MOUSEBUTTONDOWN:
                rect = pygame.Rect(*self.pos,self.w_icon,self.h_icon)
                if rect.collidepoint(event.pos):
                    self.pos[0] += 1
                    self.pos[1] += 1
recon1 = Units_sol_1.Recon(recon1_x,recon1_y)

running = True
while running:

    event_list = pygame.event.get()
    for event in event_list:
        surface.fill((0,0))
        if event.type == pygame.QUIT:
            running = False
           
    recon1.icon_moving(event_list)
        
    surface.fill(0)
    surface.blit(recon1.icon,recon1.pos)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
sys.exit()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。