Yes, if you're not getting it then an example is probably better than more
explanation. Here's your program with the changes I had in mind.

""" MoveCircleSizeCircle.py
Makes a circle that changes
it's position and size by the
keyboard, 10/3/10"""

import pygame
pygame.init()

screen = pygame.display.set_mode((640, 480))

class Circle(pygame.sprite.Sprite):
    def __init__(self, startPos, direction):
        pygame.sprite.Sprite.__init__(self)
        self.rect = pygame.Rect(0,0,50,50)
        self._base_image = self._make_image()
        self.image = self._base_image
        self.rect.center = startPos
        self.dx,self.dy = direction
        self.dw,self.dh = 0,0

    def update(self):
        """update size and position of sprite each frame"""
        if (self.dw,self.dh) != (0,0):
            self.resize(self.dw, self.dh)

        self.rect.centerx += self.dx           #move rect (x, y)
        self.rect.centery += self.dy

        if self.rect.right > screen.get_width():
            self.rect.left = screen.get_width() - 50
        if self.rect.left < 0:
            self.rect.right = 50
        if self.rect.bottom > screen.get_height():
            self.rect.top = screen.get_height() - 50
        if self.rect.top < 0:
            self.rect.bottom = 50

    def resize(self, x=0, y=0):
        """resize sprite once"""
        if (x,y) == (0,0):
            return
        r = self.rect
        save_center = r.center
        r.size = r.width+x, r.height+y
        if r.height > 200:
            r.height = 200
        if r.width > 200:
            r.width = 200
        if r.height < 2:
            r.height = 2
        if r.width < 2:
            r.width = 2
        r.center = save_center
        ## CHOICE: either remake or scale the image
        if False:
            self.image = self._make_image()
        else:
            ## but scaled images do not look as neat
            self._inflate_image()

    def _inflate_image(self):
        """use transform on base image"""
        self.image = pygame.transform.smoothscale(
            self._base_image, (self.rect.size))

    def _make_image(self):
        """make image from scratch"""
        image = pygame.Surface(self.rect.size)
        image.fill((255, 255, 255))
        rect = image.get_rect()
        w,h = self.rect.size
        radius = min(w, h) / 2
        pygame.draw.circle(image, (0, 0, 255), rect.center, radius)
        return image

def main():
    pygame.display.set_caption("Move the Circle with Arrows, Resize it
with(0)+(9)-")

    background = pygame.Surface(screen.get_size())
    background.fill((255, 255, 255))
    screen.blit(background, (0, 0))

    circle = Circle([320, 240], [0, 0])
    pygame.mouse.set_visible(False)
    allSprites = pygame.sprite.Group(circle)
    clock = pygame.time.Clock()
    keepGoing = True

    while keepGoing:
        clock.tick(30)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                keepGoing = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_DOWN:
                    circle.dy = 2
                if event.key == pygame.K_UP:
                    circle.dy = -2
                if event.key == pygame.K_RIGHT:
                    circle.dx = 2
                if event.key == pygame.K_LEFT:
                    circle.dx = -2
                if event.key == pygame.K_ESCAPE:
                    keepGoing = False
                if event.key == pygame.K_9:           #resize by -2
                    circle.dw,circle.dh = (-2, -2)
                if event.key == pygame.K_0:
                    circle.dw,circle.dh = (2, 2)      #resize by +2

            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_DOWN:
                    circle.dy = 0
                if event.key == pygame.K_UP:
                    circle.dy = 0
                if event.key == pygame.K_LEFT:
                    circle.dx = 0
                if event.key == pygame.K_RIGHT:
                    circle.dx = 0
                if event.key == pygame.K_9:          #stop resize
                    circle.dw,circle.dh = (0,0)
                if event.key == pygame.K_0:
                    circle.dw,circle.dh = (0,0)      #stop resize

        allSprites.clear(screen, background)
        allSprites.update()
        allSprites.draw(screen)

        pygame.display.flip()

    pygame.mouse.set_visible(True)

if __name__ == "__main__":
    main()
    pygame.quit()

Gumm

On Thu, Oct 7, 2010 at 8:08 PM, kevin hayes <kevino...@gmail.com> wrote:

> I put some thought into your suggestions, but I'm still not piecing it
> together. I tried to use the inflate, transform.scale in my update function,
> but that didn't work. Also, I don't understand your hint (hint: move some
> of the constructor code to a resize method and call that from in
> constructor, as well as the main) By constructor you mean the first
> __init__( variable, variable...) ?  This stuff doesn't come naturally to me,
> but I find it fascinating.  If you could just show me (more explicitly) how
> to do this, that would help.
> Thanks for the links, I will check them out.
> On Wed, Oct 6, 2010 at 10:02 PM, B W <stabbingfin...@gmail.com> wrote:
>
>> You have to resize the rect *and* the image. You can use pygame functions
>> Rect.inflate* and transform.scale, respectively, or you can do-it-yerself
>> (hint: move some of the constructor code to a resize method and call that
>> from in constructor, as well as the main loop).
>>
>> Also, the += and -= in the event handler cases are probably not doing what
>> you intend. If you get the resize working so you can see the circle change
>> and it grows or moves at a strange rate, re-examine those calculations.
>>
>> Gumm
>>
>>

Reply via email to