Program mulai normal dan menampilkan jendela dengan gambar yang bergerak ketika saya mengkliknya dengan fungsi buat di dalamnya (bagian kode memiliki 2 komentar di sampingnya):

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, 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)

Dan di bawah Recon fonction kelas (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")

Kemudian kode yang sama dengan font kelas yang tidak memindahkan gambar ketika saya mengkliknya:

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, 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)

Dan kelas dengan fonction kelas (Units_sol_1):

import pygame

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, posx, 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)

Masalah saya adalah saya tidak tahu cara membuat fungsi kelas berfungsi; Idk mengapa fungsi kelas tidak memindahkan gambar ketika saya mengkliknya.

0
Nixi 13 Mei 2021, 17:54

1 menjawab

Jawaban Terbaik

Anda harus membuat instance Recon sebelum loop aplikasi. Namun Anda harus menggambar objek secara terus menerus dalam loop aplikasi. Selain itu Anda harus mengubah atribut posisi self.pos[0] dan self.pos[1] saat Anda memindahkan objek.
pygame.event.get() dapatkan semua pesan dan menghapus mereka dari antrian. Lihat dokumentasi:

Ini akan mendapatkan semua pesan dan menghapusnya dari antrian. [...]

Jika pygame.event.get() dipanggil dalam beberapa loop peristiwa, hanya satu loop yang menerima peristiwa, tetapi tidak semua loop menerima semua peristiwa. Alhasil, beberapa acara tampak terlewatkan.

Dapatkan acara sekali per bingkai dan gunakan dalam beberapa loop atau teruskan daftar acara ke fungsi dan metode tempat mereka ditangani:

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, 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()
1
Rabbid76 13 Mei 2021, 16:46