2013-05-09 2 views
-2

여기가 소행성 게임의 소스 코드입니다. 나는이 튜토리얼을 http://comp4431.wordpress.com/2010/08/11/tut-wk-3-asteroids/ 에 가깝게 따라 다녔다. 화재와 같은 누락 된 물질 이외에 무엇이 잘못 되었나요? starmap을 제외하고는 아무 것도 표시하지 않습니다. BTW - 디스플레이가 메인 루프 내부에, 대신 뒤에해야 업데이트 할파이썬에서 소행성 게임 만들기 - 뭐가 잘못 되었나요?

import pygame, random, math 
from pygame.locals import * 
from math import * 

WINFLAGS=0 
SCREENRECT=Rect(0,0,800,600) #screen res 
NSTARS=100 
NASTEROIDS=10 

#colors 
BLACK=(0,0,0) 
WHITE=(255,255,255) 
YELLOW=(255,255,0) 
TRANSPARENT=(1,2,3) 

clock=pygame.time.Clock() 
while True: 
     clock.tick(30) 

class Player(pygame.sprite.Sprite): 

    color=YELLOW 
    thrust_value=1.0 
    turn_speed=5 
    max_speed=10.0 

    base_image=pygame.Surface((21,11)) 
    base_image.fill(TRANSPARENT) 
    base_image.set_colorkey(TRANSPARENT) 
    pointlist=[(0,0),(0,10),(20,5)] 
    pygame.draw.polygon(base_image,color,pointlist) 

    def __init__(self): 
      pygame.sprite.Sprite.__init__(self) 

      self.image=self.base_image.copy() 

      self.rect=self.image.get_rect(center=SCREENRECT.center) 

      self.vx=0 
      self.vy=0 
      self.angle=0 

    def update(self): 
      self.rect.move_ip(self.vx,self.vy) 
      self.wrap() 

    def wrap(self): 
      if (self.rect.center[0]<0): 
        self.rect.move_ip(SCREENRECT.width,0) 
      elif (self.rect.center[0]>=SCREENRECT.width): 
        self.rect.move_ip(-SCREENRECT.width,0) 
      if (self.rect.center[1]<0): 
        self.rect.move_ip(SCREENRECT.height,0) 
      elif (self.rect.center[1]>=SCREENRECT.height): 
        self.rect.move_ip(0,-SCREENRECT.height) 

    def thrust(self): 
      a=radians(self.angle) 
      self.vx+=self.thrust_value*cos(a) 
      self.vy+=self.thrust_value*sin(a) 

      vel=sqrt(self.vx*self.vx+self.vy*self.vy) 
      if (vel>self.max_speed): 
        self.vx=self.vx*self.max_speed/vel 
        self.vy=self.vy*self.max_speed/vel 

    def turn(self,direction): 
      self.angle+=self.turn_speed*direction 
      while (self.angle<0): 
        self.angle+=360 
      while (self.angle>=360): 
        self.angle-=360 

      self.image=pygame.transform.rotate(self.base_image,-self.angle) 
      self.rect=self.image.get_rect(center=self.rect.center) 

    def fire(self): 
      print 'fire' 

class Asteroid(pygame.sprite.Sprite): 

    color=YELLOW 
    min_speed=2 
    max_speed=6 

    base_image = pygame.Surface((40,50)) 
    base_image.fill(TRANSPARENT) 
    base_image.set_colorkey(TRANSPARENT) 
    pointlist=[(10,0),(30,0),(40,15),(35,25),(20,50),(5,50),(0,25)] 
    pygame.draw.polygon(base_image,color,pointlist) 

    def __init__(self): 
      pygame.sprite.Sprite.__init__(self) 

      self.image=self.base_image.copy() 

      x=int(SCREENRECT.width*random.random()) 
      y=int(SCREENRECT.height*random.random()) 
      self.rect=self.image.get_rect(center=(x,y)) 

      velocity=random.randint(self.min_speed, self.max_speed) 
      angle=2.0*pi*random.random()#radians 
      self.vx=cos(angle)*velocity 
      self.vy=sin(angle)*velocity 

    def update(self): 
      self.rect.move_ip(self.vx,self.vy) 
      self.wrap() 

    def wrap(self): 
      if (self.rect.center[0]<0): 
        self.rect.move_ip(SCREENRECT.width,0) 
      elif (self.rect.center[0]>=SCREENRECT.width): 
        self.rect.move_ip(-SCREENRECT.width,0) 
      if (self.rect.center[1]<0): 
        self.rect.move_ip(0,SCREENRECT.height) 
      elif (self.rect.center[1]>=SCREENRECT.height): 
        self.rect.move_ip(0,-SCREENRECT.height) 

def main(): 
    #init python 
    pygame.init() 

    #create window 
    screen=pygame.display.set_mode(SCREENRECT.size,WINFLAGS) 

    #starmap 
    background=pygame.Surface(SCREENRECT.size) 
    background.fill(BLACK) 
    for i in range(0,NSTARS): 
      x=random.randint(0,SCREENRECT.width-1) 
      y=random.randint(0,SCREENRECT.height-1) 
      pygame.draw.circle(background,WHITE,(x,y),0) 

    #blit to screen 
    screen.blit(background,(0,0)) 

    pygame.display.update() 

    player=Player() 

    render=pygame.sprite.RenderUpdates() 
    render.add(player) 

    asteroids=pygame.sprite.Group() 
    for i in range(0,NASTEROIDS): 
      asteroid=Asteroid() 
      render.add(asteroid) 
      asteroids.add(asteroid) 

    while True: 
      for event in pygame.event.get(): 
        if event.type == QUIT or \ 
        (event.type == KEYDOWN and event.key == K_ESCAPE): 
         return 
      keystate=pygame.key.get_pressed() 
      if (keystate[K_UP]): 
        player.thrust() 
      direction=keystate[K_RIGHT]-keystate[K_LEFT] 
      if (direction !=0): 
        player.turn(direction) 
      if (keystate[K_SPACE]): 
        player.fire() 
      for asteroid in pygame.sprite.spritecollide(player,asteroids,False): 
        asteroid.kill() 

    render.update() 
    render.clear(screen,background) 
    dirty=render.draw(screen) 
    pygame.display.update(dirty) 

#run main() 
if __name__=="__main__": main() 
+3

가능하면 근처에서이 무한 루프 주어진 아무것도 편집해야 않습니다 놀랐어요 코드는 화면에 XYZ를 표시해야하지만 그렇지 않습니다. 여기에는 그 밖의 것은 수행하지 않는 코드 예제가 있습니다.) – Patashu

+1

이것은이 사이트를 유용하게 사용하지 않습니다. "X에 문제가 있습니다."와 같은 질문을하고 접근법의 예를 제시 할 수 있지만 여기에 전체 프로젝트를 버리고 문제 해결을 요청하는 것은 당신을 멀게하지 않을 것입니다. – magi182

답변

3

이 문을 파이썬 새. 또한

render.update() 
render.clear(screen,background) 
dirty=render.draw(screen) 
pygame.display.update(dirty) 

, 나는 (예를 들어,이 프로그램은, 당신은 문제 만 표시 부분에 아래 코드를 시작

while True: 
    clock.tick(30) 
관련 문제