반응형

pygame  의 스프라이트 충돌체크에 대해서는 한번 간단하게 정리를 따로 해야 할것 같아 따로 정리를 해 둡니다. 전부 상세하게 적지는 않고 중요한 몇가지만(내가 필요한거만....아마도....?) 정리를 해 봅니다.

 

일단 기본적으로 스프라이트 b1 과 b2 는 다음과 같이 만들었습니다. 변수 정리를 좀 더 하면 보기 좋겠지만 귀찮으니 그냥 합니다.

pic = pygame.image.load("images/ball.png").convert_alpha()
pic2 = pygame.transform.scale(pic,(200,200))
pic3 = pygame.transform.scale(pic,(100,100))

b1 = Block(pic2)
b1.rect.center=(400,400)
b1.radius=100

b2 = Block(pic3)
b2.radius = 50

b1 스프라이트는 (400,400) 위치에 고정되어 있고, b2 스프라이트는 마우스를 클릭하면 그 위치로 이동하는 스프라이트 입니다. 따라서 b2 의 경우는 좌표의 초기 값은 없습니다.

 

1. Rect(사각형) 체크

 

가장 기본적인 방법입니다.

    if(pygame.sprite.collide_rect(b1,b2)):
        print("Hit!")

두 스프라이트가 충돌하는지를 검사해서 충돌하면 bool 값 True 를 리턴합니다. 
사용시 주의할 점은(사실 당연한 겁니다만...) 스프라이트의 rect 에 제대로된 값을 넣어줘야 제대로 작동한다는 점 입니다. 
rect.x ,rect.y 혹은 rect.center 에 제대로된 스프라이트의 위치값이 있어야 제대로 작동합니다.

 

위의 스크린샷을 보면 실제로 두개의 스프라이트는 충돌하지 않았습니다. 하지만 사각형체크 방법은 사각형 형태로 충돌을 체크하기 때문에 위와 같은 상황도 충돌로 판정합니다.

 

2. Circle(원) 체크

    if(pygame.sprite.collide_circle(b1,b2)):
        print("Hit!")

원의 형태로 충돌을 체크 합니다. 위의 이미지와 같이 충돌 체크할 부분이 원인 경우 이 방법을 사용하면 됩니다.

제대로 작동시키기 위해선 sprite 객체에 radius(원의 반지름) 값을 넣어줘야 합니다.

위에 b1,b2 를 보면 radius 값을 넣어준걸 보실 수 있습니다.

 

3. Mask 체크

위의 두가지 방법은 사각형과 원의 특정형태로만 충돌체크가 됩니다. 하지만 스프라이트의 경우 더 다양한 모양이 있을 수 있습니다. 즉 특정 도형의 형태가 아니라 스프라이트의 이미지와 이미지가 직접 충돌하였을때(투명한 알파영역 제외), 이미지와 이미지가 서로 겹쳤을때 충돌로 판정해 줍니다.

 

mask 충돌 체크 방법을 쓰기 위해선 sprite 에 mask 를 만들어 줘야 합니다.

    b1.mask = pygame.mask.from_surface(b1.image)
    b2.mask = pygame.mask.from_surface(b2.image)
    if(pygame.sprite.collide_mask(b1,b2)):
	    print("Hit!")

b1 과 b2 이미지를 이용해서 각각 b1 과 b2 의 스프라이트에 mask 를 만든 다음 스프라이트 b1 과 b2 의 충돌체크를 검사합니다.

 

위에선 이해를 위해 저렇게 mask 값을 생성한것이고 실제코딩시에는 sprite 클래스의 생성자에서 이미지를 넘겨 받으면서 mask 를 만들면 됩니다.

mask 체크 방법을 사용할때 주의할 점이 하나 있는데요. 바로 이미지를 컨버트할때 convert_alpha() 를 사용해야 한다는 것입니다.

pic = pygame.image.load("images/ball.png").convert_alpha()

이미지에 특별히 투명한 부분이 없더라도 위와 같이 convert_alpha() 로 해 주지 않으면 mask 체크가 제대로 작동하지 않더군요. 이것때문에 좀 헤맸습니다. ^^;

 

4. SpriteGroup 과 Sprite 의 충돌체크

pic = []
pic.append(pygame.image.load("images/bb.png").convert_alpha())
pic.append(pygame.image.load("images/gb.png").convert_alpha())
pic.append(pygame.image.load("images/pb.png").convert_alpha())
pic.append(pygame.image.load("images/rb.png").convert_alpha())
pic.append(pygame.image.load("images/yb.png").convert_alpha())

block_list = pygame.sprite.Group()

for j in range(0,5):
    for i in range(1,9):    
        block = Block(pic[random.randrange(5)])
        block.rect.x = i * 91 - 50
        block.rect.y = 50 + 37*j
        block.mask = pygame.mask.from_surface(block.image)
        block_list.add(block)

ball_pic = pygame.image.load("images/ball.png").convert_alpha()
ball_pic = pygame.transform.scale(ball_pic,(15,15))
ball = Block(ball_pic)
ball.rect.center = (410,680)
ball.mask = pygame.mask.from_surface(ball.image)

스프라이트 ball 과 스프라이트그룹 block_list 를 위와 같이 만들어 줬습니다.

 

hit_list = pygame.sprite.spritecollide(ball,block_list,True,pygame.sprite.collide_mask)
for h in hit_list:
    score +=1

위와 같이 충돌체크를 하면 됩니다.

 

리턴값 hit_list 는 충돌한 스프라이트들의 리스트입니다. 각 인자들을 설명하자면...
첫번째가 스프라이트, 두번째가 스프라이트 그룹, 세번째는 충돌한 스프라이트를 스프라이트 그룹에서 제거할것인지, 마지막이 충돌을 체크하는 방법입니다. 위의 예는 mask 를 이용한 체크 방법이고 collide_rect 나 collide_circle 도 가능합니다.

 

이 테스트 프로그램은 공을 마우스로 마음대로 움직일수 있게 했습니다. 마우스로 공을 이동시켜 블럭과 충돌시키면 해당 블럭은 스프라이트 그룹에서 삭제되기 때문에 위와 같이 공과 충돌된 블럭은 사라지게 됩니다.

 

>

 

모든 충돌체크를 다 설명하지는 않았지만, 나머지는 이 정도만 이해하면 이해하기 어렵지 않을거라 생각합니다.

반응형

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

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

 

일단 아래쪽 공을 받아낼 막대를 마우스를 이용해서 움직이는 것을 했고요. 위에 블록을 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 변수가 존재한다는 사실을 알고 내용을 수정했습니다. 게임에선 좌표가 이미지의 중심일 필요가 있습니다.(일반적인 경우 좌측 상단임)

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

반응형

snap 으로 설치된 프로그램의 업데이트에 대해 포스팅 해 보겠습니다.

 

뭐...일단 간단히 말씀드리면 업데이트에 대해 신경 쓸 필요가 없습니다. 자동으로 업데이트 해 줍니다.

터미널에서 업데이트에 대해 알아보기 위해 입력해 본 결과 입니다.

 

타이머 부분을 보시면 24시간이 적혀있고 /4 라고 되어 있는데요. 다시 말하면 하루에 4번 체크해 보겠다는 겁니다.

 

>

 

수동으로 업데이트 할 수도 있습니다.

 

"sudo snap refresh" 로 모든 프로그램을 업데이트 할 수 있고 뒤에 프로그램명을 적어서 특정 프로그램만 업데이트 할 수도 있습니다.

위 스크린샷에 "sudo snap refresh retroarch" 를 입력해 봤더니 업데이트가 없다는 메시지가 나온게 보입니다.(이미 업데이트가 되었으니....)

"snap list" 를 입력해 보니 retroarch 가 업데이트 된게 보입니다. 처음 설치했을때 retroarch revision 이 200 이었거든요.

 

참고로 "snap changes" 라고 입력하면 refresh 된 대강의 내역이 나옵니다. 맨 앞에 ID 번호가 있는데 "snap change ID번호" 식으로 입력하면 작업의 더 상세한 내용을 볼 수 있습니다.

 

 

반응형

우분투는 snap 이라는 프로그램 설치 방법을 지원합니다. snap 은 apt 와 같은 프로그램 설치 방법과 달리, 프로그램 실행에 필요한 라이브러리등을 모두 포함하고 있기 때문에 우분투뿐 아니라 다른 리눅스 배포판에서도 프로그램을 설치하고 실행할 수 있습니다.

이러한 프로그램 설치 방법은 snap 외에도 flatpak 과 appimage 가 있습니다.

flatpak 은 이전에 포스팅 한적이 있기 때문에 이번에는 snap 에 대해 적어볼까 합니다. (flatpak 에 대한 포스팅 보기)

 

예전에 Retroarch 는 flatpak 패키지만 있었는데 언제부턴가 snap 패키지도 있더군요. 그래서 이번엔 Retroarch 를 snap 으로 설치하는 걸로 진행하겠습니다.

 

>

 

우분투에서 snap 으로 프로그램을 설치하는 가장 간단한 방법은 소프트웨어센터 프로그램을 이용하는 것입니다.

 

소프트웨어 센터

소프트웨어 센터에서 Retroarch 를 검색해 보면 결과가 최소 2개는 나옵니다. 하나는 일반 우분투 패키지 프로그램이고(apt 로 설치하는) 나머지 하나는 snap 패키지 입니다. 스크린샷 아래 '자세히 보기' 부분을 보면 '공급원' 이 snap 스토어로 되어 있습니다.

이 프로그램으로 간단히 snap 프로그램을 설치 할 수 있습니다.

 

>

 

대부분의 분들은 위의 방법으로 충분하긴 한데 사실 이렇게 끝내면 심심하기도 하고 해서 터미널에서 설치하는 방법도 적어 보겠습니다. 개인적으론 이 방법을 더 좋아합니다. 내부에서 뭔짓을 하는지 볼 수도 있고요. ^^;

 

snap 으로 find 를 이용해 retroarch 를 검색해 봅니다. 뭐...바로 나오네요.

자세한 내용을 보기 위해 snap info retroarch 를 이용해 보니 프로그램 설명과 아래 채널에 대해서 나옵니다.

채널은 간단하게 설명하면 여러 다른 버전의 설치가 가능한 방법입니다. 스크린샷에 보이는 것처럼 베타 버전을 설치한다거나 하는 것 입니다. 설치시에 채널을 설정해 주면 설치가 가능한데, 따로 채널을 지정해 주지 않으면 stable 버전이 설치됩니다.

 

>

 

설명을 봤으니 이제 설치를 합니다. sudo 를 사용하는 점이 flatpak 과 다릅니다.

그런데 같은 메시지가 반복해서 나오는데...이게 원래 이런건지 버그인건지 모르겠네요. 설치에 문제는 없습니다.

 

>

 

retroarch 홈페이지의 snap 설명에 보면 설치후에 2가지 커맨드를 실행 하라고 합니다.

 

sudo snap connect retroarch:raw-usb

sudo snap connect retroarch:joystick

 

입니다.

 

실제로 저 명령을 직접 사용해야 하는지 궁금해서 connection 을 조사해 봅니다.

그랬더니 joystick 은 이미 연결되어 있는데 raw-usb 는 연결되어 있지 않네요. bluez 도 연결되어 있지 않는데 블루투스 장치를 retroarch 에서 사용하려면 연결을 해야 되지 않을까 싶습니다.(저는 블루투스 장치가 없어서.....)

저 connections 는 일종의 사용권한 개념입니다. 조이스틱을 사용하려면 connect 를 해야 합니다. 보통은 프로그램 설치시에 connect 해 놓습니다만...수동으로 해 줘야 하는 경우도 있을 수 있습니다.

이런 권한 설정은 보안때문이겠죠. 번거로울순 있으나.....반드시 필요한 것입니다.

 

제 경우 retroarch 를 실행해 보니 조이패드가 작동하지 않습니다. 그래서 혹시나 하고 raw-usb 를 연결해 봅니다.

 

>

 

아무래도 저 '연결하십시오' 라는 번역은 뭔가 오역이 아닌가 싶은데.....음...

 

뭐...어쨌던 raw-usb 를 연결해 봤습니다.

connections 을 확인해 보니 raw-usb 가 수동으로 연결 되었다고 'manual' 로 표시가 되는 군요.

그런데 조이패드는 여전히 작동을 안합니다. 아무래도 저거랑 상관 없는듯 하군요.

 

>

 

입력설정에서 보니 xbox360 패드가 기본이 아니더군요. 그래서 위와 같이 xbox360 패드로 설정을 바꿔주니 잘 됩니다. 설정 먼저 확인해 봤어야 했는데....쓸데없이 머리를 썼네요. ㅡㅡ;

 

>

 

그래도 혹시나 싶어 raw-usb 를 disconnect 시키고 retroarch 를 실행해 봤는데 잘 됩니다. raw-usb 와는 상관이 없었습니다. 위 스크린샷에 연결이 안되어 있는게 보입니다.

 

제 추측엔 리눅스에서 특정 joystick 으로 인식이 안되는 usb 패드등의 설정을 위해서 해당 설정이 필요한게 아닌가 싶습니다.

어쨌던 xbox360 패드의 경우는 raw-usb 설정이 필요없었습니다. 자신의 게임패드가 인식이 안되는 경우에만 raw-usb 설정을 해보시길 바랍니다.

 

>

 

제가 좋아하는 메가드라이브의 베어너클 2 를 실행해 봤습니다. 뭐...아주 잘 실행되네요.

 

>

 

snap 으로 설치할 수 있는 프로그램을 쉽게 찾아볼 수 있는 사이트가 있습니다.

https://snapcraft.io/

 

Snapcraft - Snaps are universal Linux packages

Snaps are containerised software packages that are simple to create and install. They auto-update and are safe to run. And because they bundle their dependencies, they work on all major Linux systems without modification.

snapcraft.io

이곳에서 snap 프로그램을 찾아보고 설치 할 수 있습니다.

 

제가 윈도우에서 사용했던 에디터 인데 이게 리눅스용도 있었군요. ^^;

 

install 버튼을 누르니 데스크탑 프로그램(소프트웨어센터)으로 표시되도록 하는 버튼과 터미널에서 설치할 수 있는 커맨드를 알려 줍니다. 편하신대로 사용하시면 되겠습니다.

 

>

 

flatpak 이나 snap 같은 프로그램들은 리눅스 배포판과 상관없이 프로그램을 설치/실행할 수 있어 유용한 프로그램 배포방법입니다.

ppa 로 프로그램을 설치할 경우 우분투가 업그레이드 될때 마다 ppa 를 수정해 줘야 하고 해당 버전으로 ppa 버전이 나올때까지 기다려야 하는 경우도 있는데 flatpak 이나 snap 으로 프로그램을 설치한 경우는 그런걸 신경쓸 필요가 없어서 편리합니다.

 

단...프로그램 하나하나 마다 필요한 라이브러리를 모두 갖고 있기 때문에 다운받아야 하는 프로그램의 크기가 커지는 단점이 있습니다. 하지만....요즘 저장용량의 크기나 인터넷 속도로 보면 그게 문제가 될 일은 아니라고 봅니다.

 

우분투 리눅스를 사용하신다면 flatpak 은 기본 설치 작업이 필요하지만, snap 은 기본적으로 설치되어 있으니 사용해 보시기 바랍니다.

뭐...하긴 snap 이 나온지도 오래되어서 이미 많이들 사용하고 계시겠지만..... ^^;

 

반응형

최근 디스토리 블로그의 에디터가 신버전으로 바뀌었습니다. 메뉴를 보던 도중 코드블럭 기능이 생겨서 한번 사용해 봤는데요. 소스코드는 입력이 되긴 하지만 그냥 밋밋하더군요. 그래서 이번에 다시 syntax highlight 기능이 되도록 설정을 해 봤습니다.

 

예전에 syntaxhighlighter 라는 스크립트를 설치한 적이 있었지만 이번에는 다른 스크립트를 찾아 봤습니다.

 

highlight.js 입니다. https://highlightjs.org/ 에서 다운 받을 수 있습니다.

 

이 스크립트를 추가하는 방법은 CDN 을 이용하는 방법과 직접 소스를 다운받아 자신의 블로그에 업로드하고 설정하는 방법이 있습니다.

자신의 블로그에 직접 파일을 업로드 할 수 없다면 CDN 을 이용한 설치만 가능합니다. 그리고 블로그의 HTML 직접 수정도 가능해야 이 스크립트를 설치할 수 있습니다.

 

위 스크린샷 화면의 "Get version XXXX" 라고 되어 있는 부분을 클릭하면 다음과 같은 화면이 나옵니다.

 

>

 

페이지의 상단부분에는 CDN 설정방법이 나와있습니다. 저는 아래쪽 jsdelivr 거를 썼는데 작동만 잘 되면 어느걸 써도 상관없습니다.

스크린샷 맨 아래 "style directory" 라는 곳을 클릭하면 style css 가 여러개 있는데 이중 자신의 맘에드는 css 를 선택해서 설치할 수 있습니다. 단 CDN 설치의 경우엔 .css 앞에 .min 을 붙여야 합니다.

예를 들어 내가 vs.css 라는 스타일을 쓰고 싶다면 첫째 줄 뒷부분에 있는 default.min.css 부분에  vs.min.css 라고 입력해 주면 됩니다. 메인페이지에서 여러 스타일을 직접 확인해 볼 수 있으니 참고하세요.

 

>

 

CDN 링크도 알았겠다. 이젠 블로그 스킨에서 HTML 만 수정해 주면 됩니다.

관리자 페이지에서 스킨편집 --> HTML 편집으로 들어 갑니다.

 

제가 추가한 소스코드 입니다.  CDN 부분은 그대로 복사해 넣은거고 마지막 줄만 추가 해 넣었습니다.

 

티스토리 에디터에서 '코드블럭' 을 선택해서 소스코드를 넣어준 경우 설치가 완료되면 바로 적용됩니다.

 

만일 CDN 을 이용하지 않고 직접 파일을 다운받아 설정해 준다면 위 스크린샷에서 보이는 '파일 업로드' 를 통해 파일을 업로드 하고 아래 처럼 설정 해 주면 됩니다.

<link rel="stylesheet" href="./images/atom-one-dark.css">
<script src="./images/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>

(바로 위의 html 이 바로 highlight 가 적용된겁니다. 참고삼아 보세요.)

 

업로드할 파일은 highlight.pack.js 파일과 자신이 사용할 스타일 파일만 업로드 하면 됩니다.

위 예의 atom-one-dark.css 는 제 블로그에서 쓰는 스타일입니다. 다운받은 파일의 styles 디렉토리에서 자신이 사용할 스타일 파일을 업로드 하면 됩니다.

 

CDN 을 사용하지 않고 직접 파일을 블로그에 업로드해서 쓰는것의 장점은 좀 더 다양한 언어의 syntax highlight 가 가능하다는 것입니다.

CDN 으로 사용시 지원하는 프로그램언어는 24가지라고 합니다.

 

다운로드 페이지에서 사용할 언어를 선택해 다운로드 합니다

위 스크린샷이 다운로드 페이지 하단 부분입니다. 자신이 사용할 언어를 체크하고 아래의 다운로드 버튼을 누르면 프로그램을 다운 받을 수 있습니다. 상당히 많은 언어를 지원합니다.

 

많이 쓰이는 프로그램언어를 사용한다면 CDN 을 사용하는 방법으로 충분합니다만....직접 파일을 업로드 해서 설정한다고 해도 설정이 무척 간단해서 어렵지 않게 사용할 수 있을 겁니다.

 

반응형

pygame 은 이름대로 파이썬으로 게임제작을 할 수 있도록 만들어진 라이브러리 입니다.

 

아무래도 사용법을 익히려면 간단한거 하나 만들어 보는게 좋을꺼 같아 뭘 할까 하다가 벽돌깨기 게임을 만들어 보기로 했습니다.

딱히 강좌도 아니고....제대로 된 게임을 만드는것 자체도 목적이 아니라, 어디까지나 pygame 을 익히고 기록을 남겨두는게 목적이기 때문에 소스의 깔끔함이라던가 정돈이라던가 그딴거 없이 대충 갑니다.(파이썬도 사실 아직 잘 모릅니다)

pygame 의 문서만 보고 하는거라 잘못 아는것도 있을 수 있고, 더 좋은 방법이 있는데 어렵게 하는 것도 있을 수 있음을 미리 알려드립니다.

파이썬은 당연히 python 3.x 버전을 사용할 것 입니다.

 

>

 

첫번째는 그냥 기본적인 라이브러리 사용방법에 대한것이라 화면에 블럭을 한줄 표시하는 소스입니다.

import pygame
from block import *

SCREEN_X = 1024
SCREEN_Y = 768

pygame.init()   #pygame 라이브러리 초기화
screen = pygame.display.set_mode((SCREEN_X,SCREEN_Y))   #특정크기의 스크린 생성
background = pygame.Surface(screen.get_size())#스크린과 동일크기의 surface 생성. 
                                              #이곳에 실제 그림을 그린후 원래 스크린에 복사함

#소스코드 위치 아래 images 폴더에 그림파일을 보관함. 
#convert 는 좀 더 빠른속도를 낼수 있게 이미지를 변환한다고 함.
pic = pygame.image.load("images/bb.png").convert()
#pic = pygame.transform.scale(pic,(nx,ny))    #이미지 크기를 바꾸고 싶을때 사용함
block_list = pygame.sprite.Group()

#스프라이트를 생성하여 SpriteGroup 에 추가함. 스프라이트의 위치 좌표도 만들어 넣어준다
for i in range(1,9):    
    block = Block(pic)      #블럭객체 생성. 파라미터는 그림파일
    block.rect.x = i * 91   #화면상에 표시될 x 좌표
    block.rect.y = 100      #화면상에 표시될 y 좌표 
    block_list.add(block)   #객체를 sprite.group 에 추가

done = True

#게임의 메인루프. 루프에서 빠져나오면 게임은 종료됨
while done:        
    ev = pygame.event.get()
    for event in ev:
        if event.type ==pygame.QUIT:     #창의 종료버튼이 눌렸을때 게임종료
            done = False                 #false 값을 줌으로서 루프를 빠져나와 게임종료
        if event.type == pygame.MOUSEBUTTONDOWN:    #마우스가 눌렸을때 마우스의 위치 얻음
            pos = pygame.mouse.get_pos()            #현재 마우스 포인트의 위치좌표
        break

    block_list.draw(background)   #SpriteGroup 에 있는 스프라이트를 
                                  #background surface 에 모두 그림
    screen.blit(background,(0,0)) #background 를 screen 에 복사해 줌
    pygame.display.flip()          #화면 갱신 

대략적 설명은 소스에 주석으로 달려있으니 길게 설명할 건 없겠고요.

 

화면에 이미지(스프라이트)를 표시하는 방법은 sprite class 를 상속받은 block 클래스를 만들고 이 block 클래스의 객체를 생성해서 Sprite.Group 클래스에 추가합니다. 추가할때 각 이미지가 표시될 화면상 좌표를 block.rect.x 와 block.rect.y 에 넣어줍니다.

sprite.group 클래스의 draw 를 이용하면 sprite.group 에 추가된 스프라이트들을 모두 화면에 그려줍니다.

 

 

다음은 block 스프라이트 클래스 입니다.

import pygame

class Block(pygame.sprite.Sprite):
    def __init__(self,img):
        super().__init__()
        self.image = img
        self.rect = img.get_rect()
       

별건 없습니다. sprite 객체를 상속해서 block 클래스를 만듭니다. 사용할 이미지와 크기와 위치를 지정할 rect 변수를 지정해 줍니다.

 

 

실행화면

화면에 block 이미지를 8개 출력했습니다. 아래로 몇줄 더 출력하고 벽돌을 깰 공과 공을 튕겨낼 캐릭터 정도까지만 할 계획입니다. 공이 튕길 벽도 만들긴 해야 겠네요. ^^;

 

시험적으로 이것저것 해 볼 것이라 소스는 점점 엉망이 될것이고 짜투리 시간에 천천히 하는 거라 언제 끝날지 모릅니다. 1년이 될지 2년이 될지....

 

pygame 의 공식 홈페이지는 https://www.pygame.org 입니다.

 

+ Recent posts