我正在尝试实现一个设计,其中砖块列在操作屏幕的左边和右侧,数据/得分屏幕在顶部。砖类绘制一个具有适当大小的直冲填充砖柱空间。我为两边做了两个实例,但是只有左边的实例显示,它比我想要的地方低一半,如果我打印rect实例的坐标,它们就在正确的位置。有人能帮我理解我错过了什么/做错了什么吗?提前感谢您的帮助!
settings.py (游戏的控制面板类)
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 (显示精灵类文件)
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(运行游戏所需的功能)
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 (主游戏文件)
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()我得到的是:

发布于 2021-05-27 15:34:35
ActionScreen和Brick的左上角坐标保存在x和y属性中。但是,当您在image上绘图时,您必须使用相对于Surface的坐标,而不是相对于屏幕的坐标。曲面的左上角坐标总是(0,0):
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的坐标是错误的:
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)https://stackoverflow.com/questions/67716866
复制相似问题