[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