Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pygame
- '''
- !!!!!!!!!!!!!!!!!
- So here is a major issue here.
- All of your _init_ constructor declarations have only ONE underscore _
- on the edges rather than two. So all of your constructors are not being run.
- I have fixed all the errors I've seen and left some notes. Hopefully the code
- runs perfectly fine for you now.
- '''
- ###################################################################
- pygame.init()
- ###################################################################
- WHITE=(255,255,255)
- RED=(255,0,0)
- BLUE=(0,0,255)
- screenWidth=800
- screenHeight=600
- BlockSize=50
- FPS=30
- # !!!!!!!!!!!!!!!!!!
- # This FPS is low, I would have expected 60. Is this what you would like?
- screen=pygame.display.set_mode((screenWidth,screenHeight))
- Clock=pygame.time.Clock()
- class Player(pygame.sprite.Sprite):
- def __init__(self, color=RED, width=64, height=64):
- super(Player,self).__init__()
- self.image=pygame.Surface((width,height))
- self.image.fill(color)
- self.rect=self.image.get_rect()
- self.hs=0
- self.vs=0
- self.speed=20
- self.level=0
- def applyGravity(self, gravity=.9):
- if self.vs==0: self.vs=1
- else: self.vs+=gravity
- def set_position(self,x,y):
- self.rect.x=x
- self.rect.y=y
- def set_image(self,filename=None):
- if (filename!=None):
- self.image=pygame.image.load(filename)
- self.rect=self.image.get_rect()
- def change_speed(self, fhs, fvs):
- self.hs+= fhs
- self.vs+= fvs
- def update(self, collidable=pygame.sprite.Group(), event=None):
- self.applyGravity()
- self.rect.x += self.hs
- collisionList=pygame.sprite.spritecollide(self,collidable,False)
- for collided_object in collisionList:
- if self.hs > 0:
- self.rect.right=collided_object.rect.left
- elif self.hs<0:
- self.rect.left=collided_object.rect.right
- self.rect.y += self.vs
- collisionList=pygame.sprite.spritecollide(self,collidable,False)
- for collided_object in collisionList:
- if self.vs > 0:
- self.rect.bottom=collided_object.rect.top
- self.vs=0
- elif self.vs<0:
- self.rect.top=collided_object.rect.bottom
- self.vs=0
- if not (event==None):
- if event.type==pygame.KEYDOWN:
- print self.speed
- if event.key==pygame.K_RIGHT:
- print("key pressed")
- self.hs=self.speed
- if event.key==pygame.K_LEFT:
- self.hs= -self.speed
- if event.key==pygame.K_UP:
- if self.vs==0:
- self.vs=-self.speed
- if event.key==pygame.K_DOWN:
- pass
- #self.change_speed(0,SPEED)
- if event.type==pygame.KEYUP:
- if event.key==pygame.K_RIGHT:
- if self.hs!=0: self.hs=0
- if event.key==pygame.K_LEFT:
- if self.hs!=0: self.hs=0
- if event.key==pygame.K_UP:
- pass
- #if self.vs!=0: self.vs=0
- if event.key==pygame.K_DOWN:
- pass
- #if self.vs!=0: self.vs=0
- #copy above for vert
- class cBlock(pygame.sprite.Sprite):
- def __init__ (self, x, y, width, height, color=RED):
- super(cBlock,self).__init__()
- self.image=pygame.Surface((width,height))
- self.image.fill(color)
- self.rect=self.image.get_rect()
- self.rect.x=x
- self.rect.y=y
- '''
- !!!!!!!!!!!!!
- I have changed the object class names to be capitalized, so to avoid
- variable name confusion when you actually use a 'level' list in that
- object. I recommend always using a capitalized class name.
- '''
- class Level(object):
- def __init__(self, player_object):
- self.object_list=pygame.sprite.Group()
- self.player_object=player_object
- def update(self):
- self.object_list.update()
- def draw(self, screen):
- screen.fill(BLUE)
- self.object_list.draw(screen)
- class Level_01(Level):
- def __init__(self, player_object):
- super(Level_01, self).__init__(player_object)
- level = [
- #[x,y,width,height,color]
- [100,500,400,10,WHITE],
- ]
- for block in level:
- block=cBlock(block[0],block[1],block[2],block[3],block[4])
- self.object_list.add(block)
- ###################################################################
- ###################################################################
- '''
- !!!!!!!!!!!!!!!!!!!!!!!!!
- Remember to take all of these initialization functions
- OUTSIDE of the while loop! That way everything is not overwrote every
- single frame -- that's a big unnecessary thing and even takes away from
- everything we try to do -- it would just revert it back to the original
- state.
- This was the exact same problem you had in the code that you sent me,
- and it's the same problem here. I've fixed it, but it seems to be a
- reoccuring issue.
- I just recommend taking all of the initialization things and the functions
- that should only be called ONCE should come BEFORE and OUTSIDE the while loop.
- '''
- active_object_list=pygame.sprite.Group()
- player=Player()
- player.set_position(100,100)
- active_object_list.add(player)
- level_list=[]
- level_list.append(Level_01(player))
- current_level_number=0
- current_level=level_list[current_level_number]
- player.level=current_level
- GameExit=False
- while not GameExit:
- #screen.fill(WHITE)
- # You don't particularly need this line, since you make the background screen blue inside your level object.
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- GameExit=True
- pygame.quit()
- #update functions
- player.update(current_level.object_list, event)
- event=None
- current_level.update()
- #logic
- #Draw
- current_level.draw(screen)
- active_object_list.draw(screen)
- #delay Frames
- Clock.tick(FPS)
- #update screen
- pygame.display.update()
- ##################################################################
- pygame.quit()
- ##################################################################
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement