Sprite tidak ditambahkan ke grup untuk ditampilkan di layar

Traceback (panggilan terakhir terakhir): File "***/Pcprojects/pygameKCC/kcc-shmup.py", baris 49, di all_sprites.update()

TypeError: metode tidak terikat update() harus dipanggil dengan instance Grup sebagai argumen pertama (bukannya tidak mendapat apa-apa)

Saya mengikuti tutorial yang memiliki kode yang berfungsi (untuknya), dan seumur hidup saya, saya tidak bisa membuat sprite ini dirender. Adakah yang bisa memberi tahu saya apa yang saya lakukan salah? Ini adalah pertama kalinya saya menggunakan sprite selain jenis screen saver bola melenting dasar. Terima kasih!

import pygame
import random
import sys
import math

#global constants
WIDTH = 360
HEIGHT = 480
FPS = 30

#define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
#YELLOW = (X, X, X)


class Player(pygame.sprite.Sprite):
    #sprite for the player.
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        #required image and collision rectangle
        self.image = pygame.Surface((50, 50))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH / 2, HEIGHT / 2)

#itialize pygame
#itialize music mixer
pygame.init()
pygame.mixer.init()

#create screen
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("My Game")
clock = pygame.time.Clock()

#create a group for all sprites to belong to
all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)


running = True
while running:

    clock.tick(FPS)

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

#diperbarui:

    all_sprites.update()
    screen.fill(BLACK)
    all_sprites.draw(screen)
    pygame.display.flip()

pygame.quit()

person DerTier    schedule 10.12.2016    source sumber
comment
setelah menggambar sprite, Anda fill() layar - dengan cara ini Anda menghapus semua sprite sebelum mengirimnya dari buffer di monitor (menggunakan flip()). Anda harus terlebih dahulu fill(), berikutnya draw() dan kemudian menggunakan flip() untuk mengirim buffer pada monitor.   -  person furas    schedule 10.12.2016
comment
Saya menjalankan kode dan saya tidak mendapatkan kesalahan ini.   -  person furas    schedule 10.12.2016
comment
untuk acara di pygame.event.get(): if event.type == pygame.QUIT: running = False #game Keluar di [x] klik #Update all_sprites.update() #Render/Draw screen.fill(BLACK) all_sprites .draw(screen) pygame.display.flip() berikut adalah kutipan yang saya pindahkan, tetapi saya masih mendapatkan kesalahan yang sama. Mungkinkah ini masalah pycharm?_eta: Saya tidak tahu cara Anda memformat kode di komentar, maaf!   -  person DerTier    schedule 10.12.2016
comment
tambahkan ini ke dalam pertanyaan - ini akan lebih mudah dibaca dan semua orang akan membacanya.   -  person furas    schedule 10.12.2016
comment
dan tambahkan pesan kesalahan lengkap (Traceback). Mungkin ada informasi yang lebih berguna.   -  person furas    schedule 10.12.2016
comment
jika menurut Anda ada masalah dengan PyCharm, jalankan kode di luar PyCharm - python script.py - dan Anda akan melihat apakah Anda benar.   -  person furas    schedule 10.12.2016
comment
itu adalah masalah pycharm, terima kasih banyak! Maaf bila membingungkan!   -  person DerTier    schedule 10.12.2016


Jawaban (1)


Anda harus membersihkan layar terlebih dahulu menggunakan fill() dan kemudian menggambar sprite - draw(). Dan setelah itu Anda dapat mengirim buffer pada monitor - flip()

#Render/Draw
screen.fill(BLACK)
all_sprites.draw(screen)
pygame.display.flip()

BTW: untuk memusatkan elemen pada screen dapat Anda gunakan

screen_rect = screen.get_rect()

dan kemudian

 self.rect.center = screen_rect.center

Dengan cara yang sama Anda dapat memusatkan hal-hal lain - mis. tombol teks aktif.

person furas    schedule 10.12.2016