使rect对象可滚动

9udxz4iz  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(343)

我画了一个象棋移动日志到一个矩形对象-然而,在一个特定的点后,文本离开底部,并被切断。我想知道是否有可能使矩形表面滚动,以便我可以看到整个移动日志。
下面是绘制移动日志的代码:
这就是我的意思

正如您在第21次移动后所看到的,日志从移动日志区域的底部脱落

def drawMoveLog(screen, gs, font): #draws move log
    moveLogArea = p.Rect(BOARD_WIDTH, 0, MOVE_LOG_PANEL_WIDTH, MOVE_LOG_PANEL_HEIGHT)
    p.draw.rect(screen , p.Color("gray"), moveLogArea)
    moveLog = gs.moveLog
    moveText = []
    for i in range(0, len(moveLog), 2): #go through move log 2 at a time
        moveString = "|| " + str(i//2 + 1) + ". " + str(moveLog[i]) + " "# to keep move 2 and 2 the same
        if i + 1 < len(moveLog): # before i continue want to make sure black moved
            moveString += str(moveLog[i + 1]) + " "
        moveText.append(moveString)

    movesPerRow = 1
    padding = 5
    lineSpacing = 4
    textY = padding
    #make 3 moves go in 1 line
    for i in range(0, len(moveText), movesPerRow):
        text = ""
        for j in range (movesPerRow):
            if i + j < len(moveText):
                text += moveText[i+j]
        textObject = font.render(text, True, p.Color('Black'))
        textLocation = moveLogArea.move(padding, textY)
        screen.blit(textObject, textLocation)
        textY += textObject.get_height() + lineSpacing
vwoqyblh

vwoqyblh1#

创建一个函数,以透明方式呈现文本 pygame.Surface 高到足以容纳全文。要创建透明曲面对象,必须设置标志 pygame.SRCALPHA :

def createMoveLog(gs, font): #draws move log
    moveLog = gs.moveLog
    moveText = []
    for i in range(0, len(moveLog), 2): #go through move log 2 at a time
        moveString = "|| " + str(i//2 + 1) + ". " + str(moveLog[i]) + " "# to keep move 2 and 2 the same
        if i + 1 < len(moveLog): # before i continue want to make sure black moved
            moveString += str(moveLog[i + 1]) + " "
        moveText.append(moveString)

    movesPerRow = 1
    padding = 5
    lineSpacing = 4
    no_of_lines = (len(moveText)+movesPerRow-1) // movesPerRow
    line_height = font.get_height() + lineSpacing 
    text_size = (MOVE_LOG_PANEL_WIDTH, no_of_lines * line_height + 2*padding)
    text_surface = p.Surface(text_size, p.SRCALPHA)

    textY = padding
    #make 3 moves go in 1 line
    for i in range(0, len(moveText), movesPerRow):
        text = ""
        for j in range (movesPerRow):
            if i + j < len(moveText):
                text += moveText[i+j]
        textObject = font.render(text, True, p.Color('Black'))
        text_surface.blit(textObject, (0, textY))
        textY += textObject.get_height() + lineSpacing

    return text_surface

呈现全文并使用 pygame.Surface.subsurface 创建参照高度为的矩形区域的新曲面的步骤 MOVE_LOG_PANEL_HEIGHT .
scroll参数是[0.0,1.0]范围内的值,用于线性滚动文本。当滚动为0.0时,显示文本的顶部,当滚动为1.0时,显示文本的底部:

def drawMoveLog(screen, gs, font, scroll): #draws move log
    moveLogArea = p.Rect(BOARD_WIDTH, 0, MOVE_LOG_PANEL_WIDTH, MOVE_LOG_PANEL_HEIGHT)
    p.draw.rect(screen , p.Color("gray"), moveLogArea)

    text_surface = createMoveLog(gs, font)
    dy = text_surface.get_height() - MOVE_LOG_PANEL_HEIGHT
    if dy > 0:
        text_offset = int(dy * scroll) 
        test_rect = text_surface.get_rect()
        sub_rect = p.Rect(0, text_offset, MOVE_LOG_PANEL_WIDTH, MOVE_LOG_PANEL_HEIGHT)
        sub_text_surface = text_surface.subsurface(sub_rect)
        screen.blit(sub_text_surface, moveLogArea)

    else:
        screen.blit(text_surface, moveLogArea)

比较

moveLog = ["d3", "Nh6", "e3", "Rg8", "f3", "b6", "g3", "a5", "h3", "Ra6", "c3", "g6", "b3", "a4"]

scroll = 0.0 以及 scroll = 1.0 .

相关问题