Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pygame上的文本问题_Python_Text_Pygame - Fatal编程技术网

Python pygame上的文本问题

Python pygame上的文本问题,python,text,pygame,Python,Text,Pygame,我正在做一个乒乓球游戏,根据屏幕宽度显示玩家和敌人的得分。这两个分数应该与屏幕中间保持20像素的距离,一切正常,但我遇到了一些问题: 首先,我以一种玩家可以在左右两边的方式进行游戏。当分数初始化时,一些属性被传递到文本类(如top或centerx),这些属性将定义它应该放置的位置。我试着这样做: self.player_score = Text(self.player.score, 32, WHITE, top = 10, right = SCR

我正在做一个乒乓球游戏,根据屏幕宽度显示玩家和敌人的得分。这两个分数应该与屏幕中间保持20像素的距离,一切正常,但我遇到了一些问题:

首先,我以一种玩家可以在左右两边的方式进行游戏。当分数初始化时,一些属性被传递到文本类(如topcenterx),这些属性将定义它应该放置的位置。我试着这样做:

self.player_score = Text(self.player.score, 32, WHITE,
                         top = 10, right = SCREEN_WIDTH/2 - 20)
self.enemy_score = Text(self.player.score, 32, WHITE,
                         top = 10, left = SCREEN_WIDTH/2 + 20)
但是由于球员和球队可以改变,这不是一个好的解决方案

第二个,我希望文本始终与屏幕中心保持相同的距离,但当分数增加到两位数或更多位数时,文本会占用更多空间。对于右侧来说,这不是问题,但是对于左侧来说,文本越来越靠近屏幕中央。下面是我的文本类中的set_value方法:

def set_value(self, new_value):
        if new_value != self._value: 
            self._value = new_value
            self.image = self._create_surface()
            self.rect = self.image.get_rect(top     = self.rect.top,
                                            bottom  = self.rect.bottom,
                                            left    = self.rect.left,
                                            right   = self.rect.right,
                                            centerx = self.rect.centerx,
                                            centery = self.rect.centery)

如何解决这些问题?

为什么不将它们称为
self.score\u left
self.score\u right
,并根据玩家的不同,将值放在左边或右边的实例中:

# prepare the Text fields
self.score_right = Text(left, 32, WHITE, top = 10, right=SCREEN_WIDTH/2-20)
self.score_left = Text(right, 32, WHITE, top= 10, left=SCREEN_WIDTH/2+20)

# then, when updating:
a, b = playerScore, enemyScore
if playerSide == "right": a, b = b, a   # swap `a` and `b`
self.score_left.text = a
self.score_right.text = b
对于第二个,要右对齐文本,可以在
x=right-textWidth
处渲染它(其x坐标原点位于左侧)。您可以使用

我希望文本始终与屏幕中心保持相同的距离,但当分数增加到两位数或更多位数时,文本会占用更多空间

要相对于矩形的中心偏移,可以使用虚拟属性。确保在重新渲染缓存文本时更新rect,并获取它的新rect宽度

对于左侧的分数:

left_score.rect.centery = screen_rect.centery
left_score.rect.right = screen_rect.centerx - 20

如果
player.side==right
,这将前后交换
a
b
,当然不是。在交换之前,您设置了
a
b
,因此它将在每个勾号之间交换它们——这无关紧要,因为您在下一个勾号之前重置了它们。。。因此,在需要时,它们将始终交换。