🙆♂️ 총알 쏘기
먼저 저는 총알로 사용할 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로 나눴을 때 값으로 수정했습니다.
'앱 개발 > 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 |