[pygame] progress bar unexpected results

[pygame] progress bar unexpected results

Postby metulburr » Fri May 16, 2014 11:26 am

I am trying to build a progress bar and i thought i had it all good, until i increased the width of the bar and found out the one with 200 px width keeps increasing after 100%. Im not sure why because the 100 px one stops at the end

Code: Select all
import pygame as pg

class ProgressBar:
    def __init__(self, rect, **kwargs):
       
        self.rect = pg.Rect(rect)
        self.maxwidth = self.rect.width
        self.timer = 0.0
        self.time = 1.0
        self.process_kwargs(kwargs)
        self.ratio = self.rect.width / 100.0
        if self.text:
            self.text = self.font.render(self.text,True,self.font_color)
   
    def process_kwargs(self,kwargs):
        """Various optional customization you can change by passing kwargs."""
        settings = {
            'color'      : (0,0,0),
            'bg_color'   : (255,255,255),
            'bg_buff'    : 1,
            'increment'  : 1,
            'percent'   : 0,
           
            'text'       : None,
            'font'       : pg.font.Font(None,20),
            'font_color' : (0,0,0),
            'text_always': False
        }
        for kwarg in kwargs:
            if kwarg in settings:
                settings[kwarg] = kwargs[kwarg]
            else:
                raise AttributeError("{} has no keyword: {}".format(self.__class__.__name__, kwarg))
        self.__dict__.update(settings)
       
    def update(self):
        self.current_time = pg.time.get_ticks()
        if self.current_time-self.timer > 1000/self.time:
            self.percent += self.increment #auto progress
            self.timer = self.current_time
       
    def render(self, screen):
        width =  self.percent*self.ratio
        self.complete = False
        if self.percent >= self.rect.width:
            width = self.rect.width
            self.complete = True

        pg.draw.rect(screen, self.bg_color,
            (self.rect.left-self.bg_buff, self.rect.top-self.bg_buff, self.maxwidth+self.bg_buff*2, self.rect.height+self.bg_buff*2))
        pg.draw.rect(screen, self.color,
            (self.rect.left, self.rect.top, width, self.rect.height))
        if self.text:
            if self.complete or self.text_always:
                text_rect = self.text.get_rect(center=self.rect.center)
                screen.blit(self.text, text_rect)

class Control:
    def __init__(self):
        pg.init()
        self.screen = pg.display.set_mode((800,600))
        self.done = False
        self.clock = pg.time.Clock()
       
        config = {
            'text'       : 'Progressing',
            'color'      : (100,100,100),
            'bg_color'   : (255,255,255),
            'increment'  : 25,
            'text_always': True,
        }
        self.bar = ProgressBar((10,10,100,25), **config)
        self.bar2 = ProgressBar((10,50,200,25), **config)
       
    def events(self):
        for event in pg.event.get():
            if event.type == pg.QUIT:
                self.done = True
            elif event.type == pg.MOUSEBUTTONDOWN:
                if self.bar2.rect.collidepoint(pg.mouse.get_pos()):
                    self.bar2.percent += self.bar2.increment
               
    def update(self):
        self.bar.update()
        self.bar2.update()
       
    def render(self):
        self.bar.render(self.screen)
        self.bar2.render(self.screen)
       
    def run(self):
        while not self.done:
            self.events()
            self.update()
            self.render()
            pg.display.update()
            self.clock.tick(60)
           
app = Control()
app.run()
New Users, Read This
OS Ubuntu 14.04, Arch Linux, Gentoo, Windows 7/8
https://github.com/metulburr
steam
User avatar
metulburr
 
Posts: 1501
Joined: Thu Feb 07, 2013 4:47 pm
Location: Elmira, NY

Re: [pygame] progress bar unexpected results

Postby metulburr » Fri May 16, 2014 1:31 pm

OK figured it out...i forgot to use the new width when checking for if it is complete
Code: Select all
import pygame as pg

class ProgressBar:
    def __init__(self, rect, **kwargs):
       
        self.rect = pg.Rect(rect)
        self.maxwidth = self.rect.width
        self.timer = 0.0
        self.process_kwargs(kwargs)
        self.complete = False
        if self.text:
            self.text = self.font.render(self.text,True,self.font_color)
   
    def process_kwargs(self,kwargs):
        settings = {
            'color'       : (0,0,0),
            'bg_color'    : (255,255,255),
            'border_color': (255,255,0),
            'border_buff' : 1,
            'increment'   : 10,
            'time'        : 1.0,
            'percent'     : 0,
            'repetitive'  : False,
           
            'text'        : None,
            'font'        : pg.font.Font(None,20),
            'font_color'  : (0,0,0),
            'text_always' : False
        }
        for kwarg in kwargs:
            if kwarg in settings:
                settings[kwarg] = kwargs[kwarg]
            else:
                raise AttributeError("{} has no keyword: {}".format(self.__class__.__name__, kwarg))
        self.__dict__.update(settings)
       
    def progress(self):
        if not self.complete:
            self.percent += self.increment
        else:
            if self.repetitive:
                self.percent = 0
       
    def update(self):
        self.current_time = pg.time.get_ticks()
        if self.current_time-self.timer > 1000/self.time: #auto progress
            self.progress()
            self.timer = self.current_time
       
    def render(self, screen):
        width =  self.percent*self.rect.width/100
        if width >= self.rect.width:
            width = self.rect.width
            self.complete = True
        else:
            self.complete = False
        pg.draw.rect(screen, self.border_color,
            (self.rect.left-self.border_buff, self.rect.top-self.border_buff,
            self.rect.width+self.border_buff*2, self.rect.height+self.border_buff*2))
        pg.draw.rect(screen, self.bg_color,
            (self.rect.left, self.rect.top, self.rect.width, self.rect.height))
        pg.draw.rect(screen, self.color,
            (self.rect.left, self.rect.top, width, self.rect.height))
        if self.text:
            if self.complete or self.text_always:
                text_rect = self.text.get_rect(center=self.rect.center)
                screen.blit(self.text, text_rect)

class Control:
    def __init__(self):
        pg.init()
        self.screen = pg.display.set_mode((800,600))
        self.done = False
        self.clock = pg.time.Clock()
       
        config = {
            'text'       : 'PBar',
            'color'      : (100,100,100),
            'bg_color'   : (255,255,255),
            'increment'  : .1,
            'time'       : 100,
            'text_always': True,
        }
        self.bar = ProgressBar((10,10,100,25), **config)
        self.bar3 = ProgressBar((10,90,50,25), **config)
        self.bar2 = ProgressBar((10,50,200,25), **config)
        self.bar4 = ProgressBar((10,130,500,25), **config)
        self.bars = [self.bar, self.bar2, self.bar3, self.bar4]
       
    def events(self):
        for event in pg.event.get():
            if event.type == pg.QUIT:
                self.done = True
            elif event.type == pg.MOUSEBUTTONDOWN:
                if self.bar2.rect.collidepoint(pg.mouse.get_pos()):
                    self.bar2.progress()
               
    def update(self):
        for bar in self.bars:
            bar.update()
       
    def render(self):
        for bar in self.bars:
            bar.render(self.screen)
       
    def run(self):
        while not self.done:
            self.events()
            self.update()
            self.render()
            pg.display.update()
            self.clock.tick(60)
           
app = Control()
app.run()
New Users, Read This
OS Ubuntu 14.04, Arch Linux, Gentoo, Windows 7/8
https://github.com/metulburr
steam
User avatar
metulburr
 
Posts: 1501
Joined: Thu Feb 07, 2013 4:47 pm
Location: Elmira, NY


Return to Game Development

Who is online

Users browsing this forum: No registered users and 1 guest