[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[pygame] Flickering Sprite



Hi all,

I am very new to PyGame. I created a little arena with some 'tanks' in it to
drive around and hopefully shoot around. I've got a lot of it working, but
the thing that i'm noticing is a 'extra' flickering sprite in the topleft
corner. This only happens when i use more then 4 sprites. I am probably
doing something wrong here. please take a look at the source below if you
will, some parts of it are from the chimp tutorial :D

thanx a lot in advance,
Guyon


"""
battleBots

Author   : Guyon Morée <gumuz@looze.net>
Created   : 23 October 2002
Filename  : battleBots.py

Description  : Let robot-tanks fight eachother

"""

import os, pygame, random, time, sha, thread
from pygame.locals import *
from baseBot import *


if not pygame.font: print 'Warning, fonts disabled'
if not pygame.mixer: print 'Warning, sound disabled'

class Main:
    def __init__ (self):
        pygame.init()
        self.screen = pygame.display.set_mode((468, 500))
        pygame.display.set_caption('battleBots')
        pygame.mouse.set_visible(1)
        self.background = pygame.Surface(self.screen.get_size())
        self.background = self.background.convert()
        self.background.fill((0, 0, 0))

        if pygame.font:
            self.font = pygame.font.Font(None, 36)
            self.text = self.font.render("battleBots!!!", 1, (255, 255,
255))
            textpos = self.text.get_rect()
            textpos.centerx = self.background.get_rect().centerx
            self.background.blit(self.text, textpos)

        self.screen.blit(self.background, (0, 0))
        pygame.display.flip()

        self.Bots = []
        self.clock = pygame.time.Clock()
        for i in range(4):
         self.Bots.append(baseBot())

        print tuple(self.Bots)
        allsprites = pygame.sprite.RenderPlain(tuple(self.Bots))

        for Bot in self.Bots:
            thread.start_new_thread(Bot.Run, ())

        while 1:
            clock = pygame.time.Clock()
            clock.tick(60)
            for event in pygame.event.get():
                if event.type == QUIT:
                    return
                elif event.type == KEYDOWN and event.key == K_UP:
                    pos = battleBot.rect.midtop
                    battleBot.rect.midtop = (pos[0],pos[1]-5)

            #allsprites.update()
            self.screen.blit(self.background, (0, 0))
            allsprites.draw(self.screen)
            pygame.display.flip()



if __name__ == '__main__': newGame = Main()

----------------------------------------------------------------------------
--------------------

"""
battleBots

Author   : Guyon Morée <gumuz@looze.net>
Created   : 23 October
Filename  : baseBot.py

Description  : Baseclass for battle robot-tank

"""

import os, pygame, random, time, sha, math
from pygame.locals import *

if not pygame.font: print 'Warning, fonts disabled'
if not pygame.mixer: print 'Warning, sound disabled'

class baseBot(pygame.sprite.Sprite):
    def __init__ (self):
        pygame.sprite.Sprite.__init__(self)
        try:
            fullname = os.path.join('data', 'bot1.bmp')
            print fullname
            image = pygame.image.load(fullname)
            image = image.convert()
            colorkey = image.get_at((0,0))
            image.set_colorkey(colorkey, RLEACCEL)
            self.generate_rotations(image, 5)
        except pygame.error, message:
            print 'Cannot load image:', fullname
            raise SystemExit, message
        time.sleep(0.5)
        self.hash = sha.new(str(time.time()))
        self.randGenerator = random.Random(eval('0x%sL' %
self.hash.hexdigest()))
        self.angle = self.randGenerator.choice(range(1000))
        randX = self.randGenerator.choice(range(468))
        randY = self.randGenerator.choice(range(500))
        self.rect.midtop = (randX, randY)

    def Run(self):
        while 1:
            self.Rotate(-173)
            self.Drive(20)
            self.Drive(10)
            self.Rotate(58)
            self.Rotate(-173)
            self.Drive(30)
            self.Rotate(58)

    def Rotate(self, Degrees):
        Max = self.angle+Degrees
        if Max > self.angle:
            while self.angle < Max:
                time.sleep(0.001)
                self.angle += 1
                self.update_rotation()
                self.update()
                #print self.angle, self.angle+Degrees
        else:
            while self.angle > Max:
                time.sleep(0.001)
                self.angle += -1
                self.update_rotation()
                self.update()
                #print self.angle, self.angle+Degrees

    def Drive(self, Distance):
        Angle = (self.angle % 360)
        Angle = Angle / (360 / (2 * math.pi))
        Steps = 1
        while Distance > Steps:
            time.sleep(0.05)
            newX = Steps * math.sin(Angle) + self.rect.midtop[0]
            newY = Steps * math.cos(Angle) + self.rect.midtop[1]
            self.rect.midtop = (newX, newY)
            self.update()
            Steps += 1

    def generate_rotations(self, image, numsteps=5):
        self.rotates = []
        for angle in range(0, 360, numsteps):
            rot = pygame.transform.rotate(image, angle)
            self.rotates.append(rot)
        self.angle = random.choice(range(355))
        self.image = self.rotates[0]
        self.rect = self.image.get_rect()
        self.numsteps = numsteps

    def update_rotation(self):
        oldcenter = self.rect.center
        pick = (self.angle % 360) / self.numsteps
        self.image = self.rotates[pick]
        self.rect = self.image.get_rect()
        self.rect.center = oldcenter

    def update(self): #simple animation
        pass


____________________________________
pygame mailing list
pygame-users@seul.org
http://pygame.seul.org