💡 외계인과 미사일 충돌을 판정해봅시다
충돌 함수 작성하기
# 충돌 함수 정의
def crash(a,b):
if (a.x - b.sx <= b.x) and (b.x <= a.x + a.sx):
if (a.y - b.sy <= b.y) and (b.y <= a.y + a.sy):
return True
else:
return False
else:
return False
전체 코드
# 7강 - 미사일과 외계인 충돌 (외계인 사라짐)
import pygame
import random
# 이미지 관리 클래스 정의
class imageManager:
def __init__(self):
self.x = 0
self.y = 0
self.move = 0
def put_img(self, address):
if address[-3:] == "png":
self.image = pygame.image.load(address).convert_alpha()
else:
self.image = pygame.image.load(address)
self.sx, self.sy = self.image.get_size()
def change_size(self, sx, sy):
self.image = pygame.transform.scale(self.image, (sx, sy))
self.sx, self.sy = self.image.get_size()
def show(self):
screen.blit(self.image, (self.x, self.y))
# 충돌 함수 정의
def crash(a,b):
if (a.x - b.sx <= b.x) and (b.x <= a.x + a.sx):
if (a.y - b.sy <= b.y) and (b.y <= a.y + a.sy):
return True
else:
return False
else:
return False
# 1. 게임 초기화
pygame.init()
# 2. 게임창 옵션 설정
size = [500, 700]
screen = pygame.display.set_mode(size)
title = "미사일 게임"
pygame.display.set_caption(title)
# 3. 게임 내 필요한 설정
clock = pygame.time.Clock() # FPS를 위한 변수
ss = imageManager()
ss.put_img("/Users/js/Desktop/수업자료/python/비행기_원본.png")
ss.change_size(80, 80)
ss.x = round(size[0]/2) - ss.sx / 2
ss.y = size[1] - ss.sy - 15
ss.move = 10
black = (0,0,0)
left_go = False
right_go = False
space_go = False
# 4. 메인 이벤트
SB = 0
k = 0
a_list = []
m_list = []
while SB == 0:
# 4-1. FPS 설정
clock.tick(60) # 1초에 60번 while문 반복
# 4-2. 각종 입력 감지
for event in pygame.event.get():# 키보드나 마우스의 동작을 받아옴
if event.type == pygame.QUIT: # 게임 종료
SB = 1
if event.type == pygame.KEYDOWN: # 키가 눌렸을 때
if event.key == pygame.K_LEFT: # 키가 왼쪽키이면
left_go = True
if event.key == pygame.K_RIGHT:
right_go = True
if event.key == pygame.K_SPACE:
space_go = True
k = 0
elif event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT: # 키가 왼쪽키이면
left_go = False
if event.key == pygame.K_RIGHT:
right_go = False
if event.key == pygame.K_SPACE:
space_go = False
# 4-3. 입력, 시간에 따른 변화
if left_go == True:
ss.x -= ss.move
if ss.x <= 0:
ss.x = 0
elif right_go == True:
ss.x += ss.move
if ss.x >= size[0] - ss.sx:
ss.x = size[0] - ss.sx
# 미사일 생성하기
if space_go == True and k % 6 == 0:
mm = imageManager()
mm.put_img("/Users/js/Desktop/수업자료/python/미사일_원본.png")
mm.change_size(20, 40)
mm.x = round(ss.x + ss.sx/2 - mm.sx/2)
mm.y = ss.y - mm.sy - 10 # 총알의 크기만큼 위로 올라가야함
mm.move = 15
m_list.append(mm)
k += 1
# 화면에서 나간 미사일 지우기
d_list = []
for i in range(len(m_list)):
m = m_list[i]
m.y -= m.move
if m.y < -m.sy:
d_list.append(i)
for d in d_list:
del m_list[d]
# 외계인 등장
if random.random() > 0.98:
aa = imageManager()
aa.put_img("/Users/js/Desktop/수업자료/python/외계인.png")
aa.change_size(50, 50)
aa.x = random.randrange(0, size[0] - aa.sx - round(ss.sx/2)) # 외계인의 크기만큼 빼줌
aa.y = 10
aa.move = 1
a_list.append(aa)
for i in range(len(a_list)):
a = a_list[i]
a.y += a.move
if a.y >= size[1]:
d_list.append(i)
dd_list = []
for d in dd_list:
del a_list[d]
# 외계인 vs 미사일 충돌하는 경우 제거
dm_list = []
da_list = []
for i in range(len(m_list)):
for j in range(len(a_list)):
m = m_list[i]
a = a_list[j]
if crash(m,a) == True:
dm_list.append(i)
da_list.append(j)
dm_list = list(set(dm_list)) # 중복제거
da_list = list(set(da_list)) # 중복제거
for d in dm_list:
del m_list[d]
for a in da_list:
del a_list[a]
# 4-4. 그리기
screen.fill(black)
ss.show()
for m in m_list:
m.show()
for a in a_list:
a.show()
# 4-5. 업데이트
pygame.display.flip()
# 5. 게임 종료
pygame.quit()
'Python > Pygame' 카테고리의 다른 글
[Pygame] Python(파이썬)으로 비행기 게임만들기 - (9) 텍스트 표시하기(1) - Kill, Loss, 시간 (0) | 2022.12.13 |
---|---|
[Pygame] Python(파이썬)으로 비행기 게임만들기 - (8) 외계인 vs 비행기 충돌 (게임 끝) (0) | 2022.12.13 |
[Pygame] Python(파이썬)으로 비행기 게임만들기 - (6) 외계인 생성 (0) | 2022.12.11 |
[Pygame] Python(파이썬)으로 비행기 게임만들기 - (5) 미사일 발사하기 (0) | 2022.12.11 |
[Pygame] Python(파이썬)으로 비행기 게임만들기 - (4) 비행기 움직이기 (0) | 2022.12.09 |
댓글