[Tutor] affecting all classes if one class is affected by an event - pygame

ted b phpmoonlighter at yahoo.com
Fri Nov 16 08:54:14 CET 2007


I am trying to figure out how to make a class instance
respond the same way as another class instance if the
other is affected by some event. I have been playing
around with inheritance, and have tried other stuff,
but i am somewhat of a newbie and I have been having
difficulty (but you guys, particularly Kent, have
really been helping me a lot :))))

For example, in the pygame code below, i have set it
up so that the boxes will stop if they are above the
barrier and hit it. Well, that's what i want to
happen, but if one of the boxes hits the barrier, the
other box keeps going. Is there a way i can have both
boxes stop if either of them hit the barrier. I was
hoping there was a way that i could have the info from
one class get passed to the other classes so i could
stop the other box (or stop all  or only some other
boxes if i add lots more). Should i make another
class? Another method? Globals?

Here's the code:

#/usr/bin/env python

import pygame

from pygame.locals import *

pygame.init()

class testBox1(pygame.sprite.Sprite):
   def __init__(self):
      pygame.sprite.Sprite.__init__(self)
      self.image=pygame.Surface((25,25))
      self.image.fill((255,0,0))
      self.rect=self.image.get_rect()
      self.rect.center = (30,90)

   def update(self):
      # check for user input and move left, right, up
or down
      keys = pygame.key.get_pressed()
      if keys[pygame.K_w]:
         self.rect.center = (self.rect.centerx,
self.rect.centery-4)
      if keys[pygame.K_s]:
         self.rect.center = (self.rect.centerx,
self.rect.centery+4)
      if keys[pygame.K_a]:
         self.rect.center = (self.rect.centerx-4,
self.rect.centery)
      if keys[pygame.K_d]:
         self.rect.center = (self.rect.centerx+4,
self.rect.centery)
      # see if the rect hit the barrier
      self.checkPos()

   def checkPos(self):
      # if box rect moves below barrier's rect, halt
box's position
      if ((self.rect.bottom > testBarrier().rect.top)
and (self.rect.top < testBarrier().rect.top)):
         if ((testBarrier().rect.right >
self.rect.right > testBarrier().rect.left) or
(testBarrier().rect.right > self.rect.left >
testBarrier().rect.left)):
            self.rect.bottom = testBarrier().rect.top
     
class testBox2(testBox1):
   def __init__(self):
      pygame.sprite.Sprite.__init__(self)
      self.image=pygame.Surface((25,25))
      self.image.fill((0,0,255))
      self.rect=self.image.get_rect()
      self.rect.center = (80,50)

class testBarrier(pygame.sprite.Sprite):
   def __init__(self):
      pygame.sprite.Sprite.__init__(self)
      self.image=pygame.Surface((30,4))
      self.image.fill((0,0,0))
      self.rect=self.image.get_rect()
      self.rect.center = (50,150)

def main():
   screen = pygame.display.set_mode((100,300))

   pygame.display.set_caption("testing")

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

   box1=testBox1()
   box2=testBox2()
   barrier=testBarrier()

   allSprites=pygame.sprite.Group(box1, box2, barrier)
   
   clock=pygame.time.Clock()
   keepGoing=True
   while keepGoing:
      clock.tick(30)
      for event in pygame.event.get():
         if event.type==pygame.QUIT:
            keepGoing=False

      allSprites.clear(screen, background)
      allSprites = pygame.sprite.OrderedUpdates
(barrier, box1, box2)
      allSprites.update()
      allSprites.draw(screen)
      
      pygame.display.flip()

if __name__ == "__main__":
   main()

Thanks for all your help!!! :)))))
-ted


      ____________________________________________________________________________________
Be a better sports nut!  Let your teams follow you 
with Yahoo Mobile. Try it now.  http://mobile.yahoo.com/sports;_ylt=At9_qDKvtAbMuh1G1SQtBI7ntAcJ


More information about the Tutor mailing list