dialog_box.py

Created by loic-azavant

Created on February 20, 2023

2.78 KB

permet de faire des boite de textes, assez customisables. Utilisé dans mon rpg.py


from math import *
from kandinsky import *
from ion_plus import *

def getLines(text,limit):
  words = iter(text.split())
  lines, current = [], next(words)
  for word in words:
    if len(current) + 1 + len(word) > limit:
      lines.append(current)
      current = word
    else:
      current += " " + word
  lines.append(current)
  return "\n".join(lines)


class DialogBox:
  def __init__(self,p1,p2,**kwargs):
    self.x = p1[0]
    self.xSide = p2[0]-p1[0]
    self.y = p1[1]
    self.ySide = p2[1]-p1[1]
    self.sx = p1[2]
    self.sxSide = p2[2]-p1[2]
    self.sy = p1[3]
    self.sySide = p2[3]-p1[3]
    self.textXSize = (p1[2]-14)//10
    self.textXSizeSide = ((p2[2]-14)//10)-((p1[2]-14)//10)
    self.textYSize = (p1[3]-12)//18
    self.textYSizeSide = ((p2[3]-12)//18)-((p1[3]-12)//18)


    self.initfunc = lambda x: 1
    self.drwfunc = lambda x: 1
    self.hidefunc = lambda x: 1
    
    for key,value in kwargs.items():
      setattr(self,key,value)
  
  def init(s,side):
    s.initfunc(side)
    fill_rect(s.x+s.xSide*side,s.y+s.ySide*side,s.sx+s.sxSide*side,s.sy+s.sySide*side,(0,)*3)

  def drw(s,text,side):
    s.drwfunc(side)
    fill_rect(s.x+s.xSide*side+3,s.y+s.ySide*side+3,s.sx+s.sxSide*side-6,s.sy+s.sySide*side-6,(255,)*3)
    bttrTxt = getLines(text,s.textXSize+s.textXSizeSide*side).split("\n")
    textIndex = 0
    for i in range(min(s.textYSize+s.textYSizeSide*side,len(bttrTxt))):
      for j in range(len(bttrTxt[i])):
        draw_string(bttrTxt[i+textIndex][0:j+1],s.x+s.xSide*side+6,s.y+s.ySide*side+i*18+6)
        sleep(0.01)

    if len(bttrTxt)<s.textYSize+s.textYSizeSide*side:
      while not keyinput(4): pass
      return

    for k in range(len(bttrTxt)-s.textYSize-s.textYSizeSide*side+1):
      for j in range(len(bttrTxt[textIndex+s.textYSize+s.textYSizeSide*side-1])):
        draw_string(bttrTxt[min(s.textYSize+s.textYSizeSide*side,len(bttrTxt))-1+textIndex][0:j+1],s.x+s.xSide*side+6,s.y+s.ySide*side+(s.textYSize+s.textYSizeSide*side-1)*18+6)
        sleep(0.01)
      while not keyinput(4): pass
      if textIndex == len(bttrTxt)-s.textYSize-s.textYSizeSide*side:
        break
      textIndex += 1
      fill_rect(s.x+s.xSide*side+6,s.y+s.ySide*side+6,s.sx+s.sySide*side-12,18,(255,)*3)
      for i in range(3):
        fill_rect(s.x+s.xSide*side+3,s.y+s.ySide*side+3,s.sx+s.sxSide*side-6,s.sy+s.sySide*side-6,(255,)*3)
        for j in range(s.textYSize+s.textYSizeSide*side-1):
          draw_string(bttrTxt[j+textIndex],s.x+s.xSide*side+6,s.y+s.ySide*side+j*18+6+(2-i)*6)
        sleep(0.05)

  def hide(s,side):
    fill_rect(s.x+s.xSide*side,s.y+s.ySide*side,s.sx+s.sxSide*side,s.sy+s.sySide*side,(255,)*3)
    s.hidefunc(side)

"""
a = DialogBox((10,10,120,80),(30,30,120,120))
a.init(0)
a.drw("Hello hhhhhhhh hhhhhh hhhhhh hhhhh hhhhh aaaaa",0)
a.hide(0)
"""

During your visit to our site, NumWorks needs to install "cookies" or use other technologies to collect data about you in order to:

With the exception of Cookies essential to the operation of the site, NumWorks leaves you the choice: you can accept Cookies for audience measurement by clicking on the "Accept and continue" button, or refuse these Cookies by clicking on the "Continue without accepting" button or by continuing your browsing. You can update your choice at any time by clicking on the link "Manage my cookies" at the bottom of the page. For more information, please consult our cookies policy.