首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的sprite实例没有正确显示。

我的sprite实例没有正确显示。
EN

Stack Overflow用户
提问于 2021-05-27 06:36:19
回答 1查看 56关注 0票数 1

我正在尝试实现一个设计,其中砖块列在操作屏幕的左边和右侧,数据/得分屏幕在顶部。砖类绘制一个具有适当大小的直冲填充砖柱空间。我为两边做了两个实例,但是只有左边的实例显示,它比我想要的地方低一半,如果我打印rect实例的坐标,它们就在正确的位置。有人能帮我理解我错过了什么/做错了什么吗?提前感谢您的帮助!

settings.py (游戏的控制面板类)

代码语言:javascript
复制
class Settings():
    def __init__(self):
        
        self.BLACK = (0,0,0)
        self.GREEN = (0,255,0)
        # Game Screen
        self.screen_h = 600
        self.screen_w= int(self.screen_h * .6)
        self.size = (self.screen_w, self.screen_h)
        
        
        #Game layout--------------------

        # DataScreen specs
        self.data_h= int(self.screen_h/4)
        self.data_w= self.screen_w
        self.data_color = (255,255,0)# yellow
        
        # ActionScreen specs------------
        self.action_h = self.screen_h
        self.action_w = self.screen_w * .85
        
        self.action_x = int(self.screen_w * .15)
        self.action_y = self.data_h
       
        self.action_color = (173,216,230)# light blue

        # brick specs--------------

        self.brick_fill_h = int(self.screen_h - self.data_h)
        self.brick_fill_w = int(self.action_x)

        self.brick_inside_color =(252, 106, 3) # Tiger Orange  

game_layout.py (显示精灵类文件)

代码语言:javascript
复制
import pygame as pg
from settings import Settings

from pygame.sprite import Group,Sprite

BLACK=(0,0,0)

class DataScreen():
    def __init__(self,ai_set):
        self.width = ai_set.data_w
        self.height = ai_set.data_h
        self.image = pg.Surface([self.width,self.height])
        self.rect = self.image.get_rect()
        pg.draw.rect(self.image, ai_set.data_color, [0,0, self.width,self.height],5)

class ActionScreen():
    def __init__(self,ai_set):
        self.width = ai_set.action_w
        self.height = ai_set.action_h
        self.x = ai_set.action_x
        self.y = ai_set.action_y
        self.image = pg.Surface([self.width,self.height])
        self.rect = self.image.get_rect()
        pg.draw.rect(self.image, ai_set.action_color, [self.x,self.y, self.width,self.height])

class Brick(Sprite):
    def __init__(self,ai_set,x,y):
        super().__init__()
        self.width= ai_set.brick_fill_w
        self.height= ai_set.brick_fill_h #int(ai_set.screen_h)
        self.x = x
        self.y = y
        self.image = pg.Surface([self.width,self.height])
        self.image.set_colorkey(ai_set.BLACK)
        self.rect = self.image.get_rect(topleft=(x,y))
        pg.draw.rect(self.image,ai_set.brick_inside_color, [x,y,self.width,self.height])

Game_fxn.py(运行游戏所需的功能)

代码语言:javascript
复制
import pygame as pg
import sys
def check_events():
    for event in pg.event.get():
        if event.type == pg.QUIT:
            sys.exit()
        if event.type == pg.KEYDOWN:
            if event.key == pg.K_ESCAPE:
                sys.exit()

def update(ai_set,screen,data_s,action_s,brick,brick2):#,bricks
    screen.fill(ai_set.BLACK)
    screen.blit(action_s.image, action_s.rect)
    screen.blit(data_s.image,data_s.rect)
    screen.blit(brick.image,brick.rect)
    screen.blit(brick2.image,brick2.rect)
    pg.display.update()

main.py (主游戏文件)

代码语言:javascript
复制
import pygame as pg
import random
from settings import Settings
from platforms import Tile, Spike
from player import Player
from game_layout import DataScreen, ActionScreen, Brick
import game_fxn as gf
from pygame.sprite import Group

pg.init()

ai_set=Settings()
screen = pg.display.set_mode(ai_set.size)

pg.display.set_caption  = "Game 1"
data_s = DataScreen(ai_set)
action_s = ActionScreen(ai_set)

def main():
    brick = Brick(ai_set,0,ai_set.data_h)
    brick2 = Brick(ai_set,(ai_set.action_x+ai_set.action_w),ai_set.data_h-ai_set.data_h/2)
    while True:
        gf.check_events() 
        gf.update(ai_set,screen, data_s, action_s,brick,brick2)

if __name__ == '__main__':
    main()

我得到的是:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-27 15:34:35

ActionScreenBrick的左上角坐标保存在xy属性中。但是,当您在image上绘图时,您必须使用相对于Surface的坐标,而不是相对于屏幕的坐标。曲面的左上角坐标总是(0,0):

代码语言:javascript
复制
class ActionScreen():
    def __init__(self,ai_set):
        # [...]

        pg.draw.rect(self.image, ai_set.action_color, [0, 0, self.width, self.height])

class Brick(Sprite):
    def __init__(self,ai_set,x,y):
        # [...]

        pg.draw.rect(self.image,ai_set.brick_inside_color, [0, 0, self.width, self.height])

brick2的坐标是错误的:

代码语言:javascript
复制
def main():
    brick = Brick(ai_set, 0, ai_set.data_h)
    brick2 = Brick(ai_set, ai_set.action_w, ai_set.data_h)
    while True:
        gf_check_events() 
        gf_update(ai_set,screen, data_s, action_s, brick, brick2)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67716866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档