Pygame-窗口和精灵类-python

Pygame-窗口和精灵类-python,python,pygame,Python,Pygame,我试图建立一个窗口类,它类似于精灵居住的类。在window类中,我希望有以下内容: set_background() 设置大小() 添加精灵() 移除_sprite() 在sprite类中,我需要以下方法: 画精灵() 现在我会有一个精灵,但我最终会想要一个精灵列表 我已经试着通过在主类的实例上调用这些方法来运行我在主类中拥有的东西 window = Window(200,200) sprite = Sprite(Window) window.set_Background() spri

我试图建立一个窗口类,它类似于精灵居住的类。在window类中,我希望有以下内容:

  • set_background()
  • 设置大小()
  • 添加精灵()
  • 移除_sprite()
在sprite类中,我需要以下方法:

  • 画精灵()
现在我会有一个精灵,但我最终会想要一个精灵列表

我已经试着通过在主类的实例上调用这些方法来运行我在主类中拥有的东西

window = Window(200,200)
sprite = Sprite(Window)

window.set_Background()
sprite.draw_sprite()
这是我的密码:

精灵类:

import pygame

pygame.init()

class Sprite(object):
    def __init__(self, World =None, sprite=[]):
        self.Window = window

    def draw_sprite(self,sprite,x,y):
        sprite=pygame.image.load(sprite)
        self.World.window.blit(sprite,(x,y))
        pygame.display.update()

        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
from Sprite import * 
from window import *

sprite = Sprite() 

window=Window()
sprite.draw_sprite("sprite.png",100,200)
window.set_background("bg.png")
窗口类:

import pygame,sys,os from pygame.locals import *

from Window import *

class Panel:
  def __init__(self, width=None,height=None):
      self.width= width
      self.height = height
      self.foreground=pygame.Surface((width, height))
      self.background= pygame.Surface((width, height))
      self.rect= self.foreground.get_rect()

  def clear(self):
      self.foreground.blit(self.background,(0,0))

  def set_background(self, image=None):
      if sky is not None:
          bg = Window.draw_world(self,image)
          self.background.blit(bg,(width,height))

class Window(Panel):
  pygame.init()
  def __init__(self,width,height):
      self.window = pygame.display.set_mode((width,height))
      self.width=width
      self.height=height
      Panel.__init__(self, width, height)
      self._foreground = self.window
      self.set_background()

  def draw_world(self,image):
      image=pygame.image.load(image)
      for x in range(0,(290/image.get_width()+1)):
          for y in range(0,(230/image.get_height()+1)):
              self.background.blit(image,(x*200,y*200))
              pygame.display.update()

      while True:
          for event in pygame.event.get():
              if event.type == pygame.QUIT:
                  pygame.quit()


  def window_setSize(width,height):
      self.width=width
      self.heght =height
主类:

import pygame

pygame.init()

class Sprite(object):
    def __init__(self, World =None, sprite=[]):
        self.Window = window

    def draw_sprite(self,sprite,x,y):
        sprite=pygame.image.load(sprite)
        self.World.window.blit(sprite,(x,y))
        pygame.display.update()

        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
from Sprite import * 
from window import *

sprite = Sprite() 

window=Window()
sprite.draw_sprite("sprite.png",100,200)
window.set_background("bg.png")
有人知道为什么精灵在显示,而我的背景却没有?它只是显示一个黑色背景

我正在使用python 3和pygame 3.3
谢谢

您在
draw\u sprite()
中有事件循环,因此它将运行到游戏结束和
窗口。set\u background
永远不会执行

您的代码构造不正确

我尝试更正它并稍后发送代码


顺便说一下:请参阅:


编辑:

import pygame

pygame.init()

class Sprite(object):
    def __init__(self, World =None, sprite=[]):
        self.Window = window

    def draw_sprite(self,sprite,x,y):
        sprite=pygame.image.load(sprite)
        self.World.window.blit(sprite,(x,y))
        pygame.display.update()

        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
from Sprite import * 
from window import *

sprite = Sprite() 

window=Window()
sprite.draw_sprite("sprite.png",100,200)
window.set_background("bg.png")
如何组织代码的简单示例

现在它在一个文件中。在Pygame中,始终只有一个窗口,因此无需立即创建Panel+Widnow。在
run()
中有一个事件循环。所有代码都在窗口内(创建精灵、更改背景、绘图等)

我将精灵添加到(python)列表中,并从列表中绘制所有精灵-player是例外-所以我只能从列表中删除最后一个精灵:/若您需要更好的内容,请参见和

使用
箭头
移动红球,
空格
暂停游戏,
ESC
退出

最后,我附加了我的位图

import pygame

#from pygame.locals import *

#--------------------------------------------------------------------
# class for single sprite
#--------------------------------------------------------------------

class MySprite():

    def __init__(self, image, x, y):

        self.image = pygame.image.load(image)
        image_rect = self.image.get_rect()

        # Rect class to use "Sprite collision detect" - in the future
        # In rect you have sprite position and size 
        # You can use self.rect.x, self.rect.y, self.rect.width, self.rect.height
        # and self.rect.center, self.rect.centerx, self.rect.top, self.rect.bottomright etc.

        self.rect = pygame.rect.Rect(x, y, image_rect.width, image_rect.height)

    def draw(self, screen):
        screen.blit(self.image, self.rect)


#--------------------------------------------------------------------
# class for player
#--------------------------------------------------------------------

class MyPlayer(MySprite):

    def __init__(self, image, x, y):
        # parent constructor always as a first in __init__
        MySprite.__init__(self, image, x, y)

        self.speed_x = self.speed_y = 0

    #-----------------------------

    def set_speed(self, x, y):
        self.speed_x = x
        self.speed_y = y

    #-----------------------------

    def update(self):
        self.rect.x += self.speed_x
        self.rect.y += self.speed_y

        if self.rect.centerx < 0 :
            self.rect.centerx = 800
        elif self.rect.centerx > 800 :
            self.rect.centerx = 0

        if self.rect.centery < 0 :
            self.rect.centery = 600
        elif self.rect.centery > 600 :
            self.rect.centery = 0

#--------------------------------------------------------------------

class Window():

    def __init__(self, width, height):

        #--------------------
        self.rect = pygame.Rect(0, 0, width, height)
        # or
        self.width, self.height = width, height
        #--------------------

        pygame.init()

        # most users and tutorials call it "screen"
        self.screen = pygame.display.set_mode(self.rect.size)

        #############################################################

        self.foreground = None
        self.background = None

        self.set_background("background.jpg")                          
        self.set_foreground("ball3.png")                          

        #################################################

        self.player = MyPlayer("ball1.png", 100, 200)

        self.sprites_list = []

        self.add_sprite(MySprite("ball2.png", 100, 400))
        self.add_sprite(MySprite("ball2.png", 300, 500))
        self.add_sprite(MySprite("ball2.png", 300, 200))

        self.remove_last_sprite()

        #-----------------------------

        # red text "PAUSE"
        font = pygame.font.SysFont("", 72)
        self.text_pause = font.render("PAUSE", True, (255, 0, 0))

        # center text on screen
        screen_center = self.screen.get_rect().center
        self.text_pause_rect = self.text_pause.get_rect(center=screen_center) 

    #--------------------------

    def add_sprite(self, sprite):
        self.sprites_list.append(sprite)

    #--------------------------

    def remove_last_sprite(self):
        if self.sprites_list:
            del self.sprites_list[-1]

    #--------------------------

    def draw_sprites(self, screen):
        for sprite in self.sprites_list:
            sprite.draw(screen)

    #--------------------------

    def draw_background(self, screen):
        screen.fill((0,64,0)) # clear screen to green
        if self.background:
            screen.blit(self.background, (0,0))

    #--------------------------

    def draw_foreground(self, screen):
        if self.foreground:
            screen.blit(self.foreground, (0,0))

    #--------------------------

    def draw_world(self, image):
        temp = pygame.Surface(self.rect.size, pygame.SRCALPHA, 32).convert_alpha()
        image_rect = image.get_rect()

        for x in range(0, self.rect.width, 60):
            for y in range(0,self.rect.width, 60):
                temp.blit(image,(x,y))

        return temp

    #--------------------------

    def set_foreground(self, image=None):
        if image: 
            img = pygame.image.load(image)
            self.foreground = self.draw_world(img)

    #--------------------------

    def set_background(self, image=None):
        if image: 
            self.background = pygame.image.load(image)

    #--------------------------

    def run(self):

        clock = pygame.time.Clock()

        RUNNING = True
        PAUSED = False

        while RUNNING:

            #--- events ---

            for event in pygame.event.get():

                if event.type == pygame.QUIT:
                    RUNNING = False

                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_ESCAPE:
                        RUNNING = False
                    elif event.key == pygame.K_SPACE:
                        PAUSED = not PAUSED

                    if event.key == pygame.K_UP:
                        self.player.set_speed(0,-10)
                    elif event.key == pygame.K_DOWN:
                        self.player.set_speed(0,10)
                    elif event.key == pygame.K_LEFT:
                        self.player.set_speed(-10,0)
                    elif event.key == pygame.K_RIGHT:
                        self.player.set_speed(10,0)

                if event.type == pygame.KEYUP:
                    if event.key in (pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT):
                        self.player.set_speed(0,0)

            #--- changes ----

            if not PAUSED:
                # change elements position
                self.player.update()

            #--- draws ---

            self.draw_background(self.screen)
            self.draw_foreground(self.screen)
            self.draw_sprites(self.screen) 
            self.player.draw(self.screen)

            if PAUSED:
                # draw pause string
                self.screen.blit(self.text_pause, self.text_pause_rect.topleft)

            pygame.display.update()

            #--- FPS ---

            clock.tick(25) # 25 Frames Per Seconds

        #--- finish ---

        pygame.quit()

#----------------------------------------------------------------------

Window(800,600).run()
导入pygame
#从pygame.locals导入*
#--------------------------------------------------------------------
#单人雪碧课
#--------------------------------------------------------------------
类MySprite():
定义初始化(自、图像、x、y):
self.image=pygame.image.load(image)
image\u rect=self.image.get\u rect()
#Rect类将在将来使用“Sprite碰撞检测”
#在rect中有精灵的位置和大小
#可以使用self.rect.x、self.rect.y、self.rect.width、self.rect.height
#和self.rect.center、self.rect.centerx、self.rect.top、self.rect.bottomright等。
self.rect=pygame.rect.rect(x,y,image\u rect.width,image\u rect.height)
def提取(自身,屏幕):
screen.blit(self.image,self.rect)
#--------------------------------------------------------------------
#为运动员上课
#--------------------------------------------------------------------
类MyPlayer(MySprite):
定义初始化(自、图像、x、y):
#父构造函数始终作为_init中的第一个__
MySprite.\uuuu init\uuuuu(self,image,x,y)
self.speed_x=self.speed_y=0
#-----------------------------
def设置_速度(自身、x、y):
自速度_x=x
自速度_y=y
#-----------------------------
def更新(自我):
self.rect.x+=self.speed\u x
self.rect.y+=self.speed\u y
如果self.rect.centerx<0:
self.rect.centerx=800
elif self.rect.centerx>800:
self.rect.centerx=0
如果self.rect.centery<0:
self.rect.centery=600
如果self.rect.centery>600:
self.rect.centery=0
#--------------------------------------------------------------------
类窗口():
定义初始值(自身、宽度、高度):
#--------------------
self.rect=pygame.rect(0,0,宽度,高度)
#或
self.width,self.height=宽度,高度
#--------------------
pygame.init()
#大多数用户和教程称之为“屏幕”
self.screen=pygame.display.set_模式(self.rect.size)
#############################################################
self.前台=无
self.background=None
self.set_background(“background.jpg”)
self.set_前景(“ball3.png”)
#################################################
self.player=MyPlayer(“ball1.png”,100200)
self.sprites_list=[]
添加精灵(MySprite(“ball2.png”,100400))
添加精灵(MySprite(“ball2.png”,300500))
添加精灵(MySprite(“ball2.png”,300200))
self.remove_last_sprite()
#-----------------------------
#红色文本“暂停”
font=pygame.font.SysFont(“,72)
self.text_pause=font.render(“暂停”,真,(255,0,0))
#在屏幕上居中显示文本
screen\u center=self.screen.get\u rect().center
self.text\u pause\u rect=self.text\u pause.get\u rect(中心=屏幕中心)
#--------------------------
def添加精灵(自我,精灵):
self.sprite\u list.append(精灵)
#--------------------------
def移除最后一个精灵(自我):
如果self.sprites\u列表:
del self.sprites_列表[-1]
#--------------------------
def draw_精灵(自身,屏幕):
对于self.sprites\u列表中的精灵:
精灵绘制(屏幕)
#--------------------------
def draw_背景(自身,屏幕):
屏幕。填充((0,64,0))#将屏幕清除为绿色
如果自我介绍背景:
屏幕blit(self.background,(0,0))
#--------------------------
def draw_前台(自身,屏幕):
如果self.前台:
屏幕光点(自我前景,(0,0))
#--------------------------
def draw_world(自我、图像):
temp=pygame.Surface(self.rect.size,pygame.SRCALPHA,32).convert_alpha()
image\u rect=image.get\u rect()
对于范围内的x(0,self.rect.width,60):
对于范围内的y(0,self.rect.width,60):
温度闪电(图像,(x,y))
返回温度
#--------------------------
判定元件