앱 개발/pygame

[pygame] 06. 총알 쏘기

내만 2022. 9. 22. 10:54
728x90
반응형

728x90
반응형

 

 

 

 

🙆‍♂️ 총알 쏘기


먼저 저는 총알로 사용할 png 파일을 이 프로젝트 파일 밑에 있는 image 폴더에 넣었습니다.

 

코드를 작성해보면 먼저 키 입력 부분을 설정해줍니다.

 

        #KeyDown되면 활성화
        if event.type == pygame.KEYDOWN:
			
            .
            .
            .
            
            if event.key == 32 or event.key == 107:
                shot = True
        #KeyUp 되면 비활성화
        elif event.type == pygame.KEYUP:
			
            .
            .
            .
        
            
            if event.key == 32 or event.key == 107:
                shot = False

키 입력하는 부분에 space bar가 입력될 때(event.key==32)와 k가 입력될 때(event.key==107)를 변수 설정을 해줍니다.

 

###초기화 설정###
.
.

shot = False

물론 while문 밖에 변수 초기값 설정하는 부분에서도 설정해줘야 합니다.

 

이제 키가 눌렸을 때 즉 shot이 True가 됐을 때 총알이 생성되고 움직이게 하는 그런 코드를 작성해보겠습니다.

 

 

###초기화 설정###
.
.

bulList=[]

    #총알 쏠 때
    if shot == True:
        bullet = createObj()
        bullet.insertImg(r'image\bullet.png')
        bullet.setSize(30,50)
        bullet.x = round(hero.x + hero.oX/2 - bullet.oX/2)
        bullet.y = hero.y - bullet.oY - 10
        bullet.move = 20
        bulList.append(bullet)

총알이 하나만 나가는 것이 아니기 때문에 

bulList라는 리스트를 선언해서 객체들을 저장하고 누를 때마다 저장된 객체를 불러오는 방식을 사용할 것입니다.

 

그리고 이제 이동시켜야 합니다.

 

    for i,v in enumerate(bulList):
        v.y -= v.move

이렇게 하면 됩니다. 사실 enumerate를 사용하지 않아도 되는데 쓴 이유는

이 총알이 화면을 벗어났을 때 지워주는 코드를 작성하기 위해서 입니다.

 

총알이 계속해서 화면 밖을 벗어나도 쌓인다면 메모리를 크게 잡아먹기 때문에 무조건 지워줘야 합니다.

    for i,v in enumerate(bulList):
        v.y -= v.move
        if v.y <= -v.oY:
            del v

그래서 만약 객체의 y좌표 값이 0보다 작으면서 자신의 세로 길이보다 작아지면 지우는 것인데

사실 이렇게 하면 돌아가고 있던 for문의 타겟의 값이 변경되기 때문에 오류가 발생합니다.

 

그래서 따로 삭제 리스트를 두고 그 리스트에 저장 후 for문이 다 돌았을 때 지우는 방법을 사용할 것입니다.

 

    delBulList=[]
    for i,v in enumerate(bulList):
        v.y -= v.move
        if v.y <= -v.oY:
            delBulList.append(i)
    for i in delBulList:
        del bulList[i]

이렇게 진행할 수 있겠습니다.

삭제될 인덱스를 delBulList 리스트에 저장하고 총알 움직이는 for문이 종료되면 삭제하는 for문을 돌려서

del을 사용해서 저장된 인덱스 값에 해당하는 총알을 지워줍니다.

 

 

    #총알 띄우기
    for v in bulList:
        v.show()

총알은 이렇게 bulList에 해당하는 값들을 출력하도록 합니다.

총알은 잘 나오긴하는데 너무 많이 나옵니다. 총알 수를 줄이려면 매번 총알이 생성되는 것이 아닌

몇번에 한번만 나오도록 하면 됩니다.

# 변수 설정
.
.
k=0

    #총알 쏠 때
    if shot == True and k%2 == 0:
        .
        .
        .

    k+=1

k+=1을 하고 k가 2의 배수가 될 때 마다 생성하는 걸로 하면

 

.여전히 많습니다. 극단적으로 10의 배수일 때로 가보겠습니다.

 

    #총알 쏠 때
    if shot == True and k%10 == 0:
        .
        .
        .

    k+=1

.

.느려 터졌습니다. 5로 가보겠습니다.

    #총알 쏠 때
    if shot == True and k%5 == 0:
        .
        .
        .

    k+=1

나쁘지 않긴 한데 3이나 4로 해야할 것 같습니다.

근데 3이나 4 해봤는데 5도 괜찮습니다. 5로 가겠습니다.

 

근데 문제가 스페이스를 꾹누르면 상관이 없는데 한번 씩 누를 때 우연히 조건 성립이 되지 않아서 총알이 안나가는 버그가 생깁니다.

해결 방법은 위에 k=0초기화 한 건 나두고 따로  스페이스 바가 눌릴 때마다 k=0으로 초기화 하는 것 입니다.

 

        #KeyDown되면 활성화
        if event.type == pygame.KEYDOWN:
            .
            .
            .

            if event.key == 32 or event.key == 107:
                shot = True
                k=0

이렇게 되겠죠? 그리고 그 총알 나가는 개수는 7로 나눴을 때 값으로 수정했습니다.

728x90
반응형

'앱 개발 > pygame' 카테고리의 다른 글

[pygame] 08. 피격 판정  (0) 2022.09.29
[pygame] 07. 적 생성  (0) 2022.09.27
[pygame] 05. 캐릭터 움직이기  (0) 2022.09.22
[pygame] 04. 코드 클래스화  (1) 2022.09.19
[pygame] 03. 캐릭터 넣기  (0) 2022.09.17