반응형

공 움직이는것 까진 해 볼려고 했는데 시간 관계상 일단 여기까지 하고 일단 정리 합니다.

뭐....대략 스크린샷은 아래에....

 

일단 아래쪽 공을 받아낼 막대를 마우스를 이용해서 움직이는 것을 했고요. 위에 블록을 8x5 로 그렸습니다.

블록은 색깔별로 5개의 png 파일을 만들었고요. 이미지의 선택은 랜덤입니다.

전체 소스는 넣지 않고 부분적으로만 적어봅니다.

 

>

background.fill((70,70,255))                            #배경을 파란색으로 칠함

pygame.draw.rect(background,(0,0,0),(20,20,800,720))    #게임이 진행될 공간 검은색으로 칠함

가운데의 검은 게임이 진행될 공간을 만들기 위해 전체 배경을 파란색으로 칠하고 가운데는 안을 검은색으로 채운 사각형을 그렸습니다.

 

>

#블럭이미지를 읽어 리스트에 저장
pic = []
pic.append(pygame.image.load("images/bb.png").convert())
pic.append(pygame.image.load("images/gb.png").convert())
pic.append(pygame.image.load("images/pb.png").convert())
pic.append(pygame.image.load("images/rb.png").convert())
pic.append(pygame.image.load("images/yb.png").convert())

이미지를 5개 읽어들여 저장합니다. 나중에 랜덤 함수를 이용해서, 스프라이트 객체를 생성할때 랜덤하게 이미지를 선택합니다.

 

>

#스프라이트를 생성하여 SpriteGroup 에 추가함. 스프라이트의 위치 좌표도 만들어 넣어준다. 블럭의 색은 랜덤하게
for j in range(0,5):
    for i in range(1,9):    
        block = Block(pic[random.randrange(5)]) #스프라이트 이미지 랜덤으로 선택
        block.rect.x = i * 91 - 50              #블럭의 x 좌표
        block.rect.y = 50 + 37*j                #블럭의 y 좌표
        block_list.add(block)                   #스프라이트 그룹에 추가 

블럭 객체를 만들때 랜덤으로 이미지를 선택해서 인자로 넘겨줍니다. 한줄에 8개의 블록을 5줄을 그립니다. 뭐...아주 단순하게요.

 

>

 

#공을 튕겨낼 막대 이미지
BAR_X = 144       #막대의 길이
BAR_Y = 26        #막대의 폭

#png 이미지가 투명한 부분이 있는 이미지이기 때문에 convert_alpha 를 이용해 이미지를 변환해야 합니다.
bar_pic = pygame.image.load("images/bar.png").convert_alpha()
bar_pic = pygame.transform.scale(bar_pic,(BAR_X,BAR_Y)) #막대의 크기를 원하는 크기로 변경

#막대 스프라이트를 만듬
bar = Block(bar_pic)
bar.rect.center = (410,700)

공을 튕겨낼 막대는 끝부분이 각지지 않고 둥글게 그렸습니다.

 

표시해 놓은 부분이 투명한 부분 입니다. 이 부분이 제대로 표현되기 위해서는 이미지를 convert_alpha 를 이용해 알파값을 살려서(?) 변환해야 png 이미지의 투명한 부분이 제대로 표시 됩니다.

 

bar.rect.center = (410,700) 이라고 되어 있는 부분이 있는데 rect 에는 center 라는 tuple 변수가 있습니다. 시험해 본 결과 blit 로 이미지를 표시할때 center 값이 있으면 rect.x 나 rect.y 를 무시하고 center 값을 이용합니다.

rect.center 값이 존재하면 rect.center 의 좌표에 이미지의 중심이 위치하도록 이미지를 표시합니다.

 

>

    if bar.rect.center[0] < 72+20 : bar.rect.center = (72+20,700) #막대의 좌측이동제한
    if bar.rect.center[0] > 820-72 : bar.rect.center = (820-72,700)#막대의 우측이동제한
    pygame.draw.rect(background,(0,0,0),(20,20,800,720))  #게임이 진행될 공간 검은색으로 칠함

공을 튕겨낼 막대의 이동 범위를 제한 합니다. 

게임이 진행될 공간은 맨 아래 게임이 진행될 공간을 검게 칠하는 부분에서 나오는데요.

막대는 x 좌표로만 이동하므로 x 좌표만 제한합니다. 20 부터 시작해서 폭이 800 이니, 좌표로는 x=20-->x=820 사이로 움직임을 제한하는데, 막대의 길이가 144 이기 때문에 그 절반인 72 를 더하거나 빼서 가동범의를 지정해 준 것입니다.

좀 예쁘게(?) 잘 하자면 바의 길이는 BAR_X =144 로 정의되어 있으므로, 숫자 72 대신 BAR_X/2 로 해 주면 나중에 막대의 크기가 달라졌을때도 대응 할 수 있습니다. 나중에 다 수정해 놓을 예정입니다.

 

>

    ev = pygame.event.get()
    for event in ev:
        if event.type ==pygame.QUIT:     #창의 종료버튼이 눌렸을때 게임종료
            done = False    
        if event.type == pygame.MOUSEMOTION:    # 마우스를 움직였을때 
        #마우스의 x 좌표를 얻어 막대의 x 값으로 넣어준다. 좌우로만 움직이므로 y 값은 고정
            bar.rect.center =  (pygame.mouse.get_pos()[0],700)
        break
    

마지막으로 마우스 이동시에 마우스의 좌표를 얻어서 막대의 좌표로 넣어 줍니다. get_pos()  에서 마우스의 x,y 좌표를 얻을 수 있지만 우리는 x 좌표만 필요하므로 리스트에서 첫번째 값인 x 값만 읽어서 넣어 주고 y 값은 고정합니다.

그러면 이제 막대는 마우스를 좌우로 움직을때 같이 움직이게 됩니다.

 

>

 

이번은 pygame 과 관련된 부분은 많지 않습니다. 진행상황 정도이고....다음엔 공이 이리저리 튕겨야 하니  스프라이트 충돌 부분을 처리해야 해서 좀 보고 이것저것 테스트 해보고 해야되서 시간은 좀 걸릴 예정입니다. ^^;

 

2019년 5월 26일 수정사항

 

sprite.rect.center 라는 tuple 변수가 존재한다는 사실을 알고 내용을 수정했습니다. 게임에선 좌표가 이미지의 중심일 필요가 있습니다.(일반적인 경우 좌측 상단임)

앞으로도 수정할 내용이 있으면 수정하고 하단에 수정 내용을 간단히 적어 놓겠습니다.

+ Recent posts