2017-12-29 9 views
0

2d 사격 게임의 총알을 만들려고합니다.그룹에 이미있는 개체 업데이트

나는 총알을 만들었고 사용자가 마우스 왼쪽 버튼을 눌렀을 때 화면에 표시되지만 움직여야합니다.

각 글 머리 기호가 글 머리 기호 그룹에 추가됩니다.

글 머리 기호의 위치를 ​​업데이트하는 가장 쉬운 방법은 무엇입니까?

이것은 while 루프입니다. GameClass.Game.getevent가 호출됩니다. lmb가 눌려지면 그 아래의 코드가 실행됩니다. 다음

while play: 
    display.fill(WHITE) 
    GameClass.Game.getevent(player1) 
    platforms.draw(display) 
    sprites.draw(display) 
    bullets.draw(display) 
    pygame.display.update() 

다른 파일의 일부입니다. 촬영 기능은 '플레이어'클래스의 일부로, 부적절한 이유로 잘 렸습니다.

def shoot(self): 
     bullet=Bullet(5,self.bullets,self.x,self.y) 
     self.bullets.add(bullet) 


class Bullet(pygame.sprite.Sprite): 

    def __init__(self,speed,bullets,x,y): 
     super().__init__() 

     self.speed=speed 
     self.image=pygame.Surface((10,10)) 
     self.rect=self.image.get_rect() 
     self.bullets=bullets 

     self.x=x 
     self.y=y 

     Bullet.movebullet(self) 

    def movebullet(self): 
     self.rect.center=((self.x+self.speed),self.y) 

것은 무엇 그룹의 각 개별 총알의 위치를 ​​업데이트하는 가장 좋은 방법은 될 것이라고?

+1

당신의'Bullet' 클래스를 먼저'self.x'와'self.y' 속성을 업데이트하여 스프라이트를 이동 한 후'self.rect 이러한 속성을 지정하는에'update' 방법을 지정 .center'. 스프라이트를 업데이트하려면 각 프레임의'update' 메소드를 호출하면 모든 포함 된 스프라이트의'update' 메소드가 호출됩니다. 총알이 모두 같은 방향이나 임의의 방향으로 움직여야합니까? – skrx

+0

버튼'{}'을 사용하여 코드 – furas

+0

을 올바르게 포맷하려면 모든 스프라이트에'self.x'가 필요하지 않습니다.이 경우'self.rect.x'가 필요합니다. 그리고 나서 'Bullet'대신'self.rect.center = ((self.x + self.speed), self.y)' – furas

답변

0

다음은 완벽한 해결책입니다. 플레이어는 direction 속성을 가지고 있으며 플레이어가 해당 키 중 하나를 누르면 'left' 또는 'right'으로 변경됩니다. 총알이 생성되면 총알 인스턴스에 player.direction을 전달한 다음 방향에 따라 이미지와 속도를 설정합니다.

스프라이트를 이동하려면 위치에 속도를 추가하고 (이 예제에서는 목록) 최종적으로 blitting 및 충돌 감지에 필요하므로 rect를 업데이트합니다. 사실 posvelocitypygame.math.Vector2을 사용하고 싶지만 벡터에 익숙한 지 잘 모르겠습니다.

import pygame as pg 


pg.init() 
screen = pg.display.set_mode((640, 480)) 
screen_rect = screen.get_rect() 
PLAYER_IMG = pg.Surface((30, 50)) 
PLAYER_IMG.fill(pg.Color('dodgerblue1')) 
BULLET_IMG = pg.Surface((16, 8)) 
pg.draw.polygon(BULLET_IMG, pg.Color('sienna1'), [(0, 0), (16, 4), (0, 8)]) 
BULLET_IMG_LEFT = pg.transform.flip(BULLET_IMG, True, False) 


class Player(pg.sprite.Sprite): 

    def __init__(self, pos): 
     super().__init__() 
     self.image = PLAYER_IMG 
     self.rect = self.image.get_rect(center=pos) 
     self.velocity = [0, 0] 
     self.pos = [pos[0], pos[1]] 
     self.direction = 'right' 

    def update(self): 
     self.pos[0] += self.velocity[0] 
     self.pos[1] += self.velocity[1] 
     self.rect.center = self.pos 


class Bullet(pg.sprite.Sprite): 

    def __init__(self, pos, direction): 
     super().__init__() 
     if direction == 'right': 
      self.image = BULLET_IMG 
      self.velocity = [9, 0] 
     else: 
      self.image = BULLET_IMG_LEFT 
      self.velocity = [-9, 0] 
     self.rect = self.image.get_rect(center=pos) 
     self.pos = [pos[0], pos[1]] 

    def update(self): 
     # Add the velocity to the pos to move the sprite. 
     self.pos[0] += self.velocity[0] 
     self.pos[1] += self.velocity[1] 
     self.rect.center = self.pos # Update the rect as well. 
     # Remove bullets if they're outside of the screen area. 
     if not screen_rect.contains(self.rect): 
      self.kill() 


def main(): 
    clock = pg.time.Clock() 
    all_sprites = pg.sprite.Group() 
    bullets = pg.sprite.Group() 
    player = Player((100, 300)) 
    all_sprites.add(player) 

    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 
      elif event.type == pg.MOUSEBUTTONDOWN: 
       if event.button == 1: 
        bullet = Bullet(player.rect.center, player.direction) 
        bullets.add(bullet) 
        all_sprites.add(bullet) 
      elif event.type == pg.KEYDOWN: 
       if event.key == pg.K_d: 
        player.velocity[0] = 5 
        player.direction = 'right' 
       elif event.key == pg.K_a: 
        player.velocity[0] = -5 
        player.direction = 'left' 
      elif event.type == pg.KEYUP: 
       if event.key == pg.K_d and player.velocity[0] > 0: 
        player.velocity[0] = 0 
       elif event.key == pg.K_a and player.velocity[0] < 0: 
        player.velocity[0] = 0 

     all_sprites.update() 
     screen.fill((30, 30, 30)) 
     all_sprites.draw(screen) 

     pg.display.flip() 
     clock.tick(30) 


if __name__ == '__main__': 
    main() 
    pg.quit() 
+0

벡터 및 회전식 건이있는 [예제] (https://stackoverflow.com/a/42281315/6220679)를 참조하십시오. – skrx