程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使矩形对象可滚动大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决使矩形对象可滚动?

开发过程中遇到使矩形对象可滚动的问题如何解决?下面主要结合日常开发的经验,给出你关于使矩形对象可滚动的解决方法建议,希望对你解决使矩形对象可滚动有所启发或帮助;

我正在将国际象棋移动日志绘制到矩形对象上 - 但是在某个点之后,文本从底部脱离并被切断。我想知道是否可以使矩形表面滚动,以便我可以看到整个移动日志。

这是绘制移动日志的代码:

这就是我的意思

使矩形对象可滚动

正如您在第 21 次移动后所看到的 - 日志离开移动日志区域的底部

def drawMoveLog(screen,gs,Font): #draws move log
    moveLogArea = p.Rect(BOARD_WIDTH,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

解决方法

创建一个函数,以足够高的透明 pygame.Surface 呈现文本以包含全文。要创建一个透明的 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 创建一个新表面,该表面引用高度为 @H_490_18@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,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_HEIGHT)
        sub_text_surface = text_surface.subsurface(sub_rect)
        screen.blit(sub_text_surface,moveLogArea)

    else:
        screen.blit(text_surface,moveLogArea)

对比

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

带有 scroll = 0.0scroll = 1.0

使矩形对象可滚动

大佬总结

以上是大佬教程为你收集整理的使矩形对象可滚动全部内容,希望文章能够帮你解决使矩形对象可滚动所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。