728x90
반응형
728x90
반응형
🙆♂️ 적 생성
먼저 적기로 사용할 png 파일을 해당 경로에 저장합니다.
import random
# 4. 메인 이벤트
.
.
.
#적군 리스트
enemList=[]
# 4.3 입력과 시간에 따른 변화
.
.
.
#랜덤 적기 생성
if random.random() >0.9:
enemy1 = createObj()
enemy1.insertImg(r'image\enemy1.png')
enemy1.setSize(50,80)
enemy1.x = random.randrange(size[0]-enemy1.oX)#-round(hero.oX/2)
enemy1.y = 15
enemy1.move = 10
enemList.append(enemy1)
우선 적기 객체를 위와 같이 생성할 수 있습니다.
전에 했던 총알 만드는 코드와 비슷합니다. 적기의 size와 x좌표 y좌표만 다르고 구조는 비슷합니다.
y좌표는 동일한 y좌표에서 적기가 나와야 해서 15로 고정을 하고
x좌표는 좌우에서 랜덤하게 나와야 하기 때문에 random을 import해서 사용합니다.
그 중에 random 함수 중에 random.randrage(x)를 이용하면 0<= RANGE < x 사이의 정수를 랜덤하게 반환해줍니다.
이를 이용해서 좌우 랜덤한 좌표에서 생성될 수 있도록 합니다.
적기 또한 총알처럼 화면을 벗어난다면 제거해 주는 코드를 짜야 합니다.
#적기가 화면을 벗어나면 제거
delEnemList=[]
for i,v in enumerate(enemList):
v.y += v.move
if v.y > size[1]:#+v.oY
delEnemList.append(i)
for i in delEnemList:
del enemList[i]
총알이 생성되고 제거되는 부분과 비슷하고 차이점은 y좌표에 move를 빼는 것이 아니라 더해주고
총알은 삭제되는 순간도 size[0]과 총알 크기보다 작아지면 사라지는데
적기는 size[1]보다 즉 화면 밑으로 사라지면 사라지도록 합니다. 나머지 코드는 변수명 빼고 같습니다.
#적기 띄우기
for v in enemList:
v.show()
화면 출력도 총알과 같이 출력하면 끝입니다!
시험 운영을 해봤는데 생각보다 빠르게 내려오기도 하고 뭔가 생성 간격도 마음에 안들고 해서 추후에 변경하기로 하고
새로운 아이디어는 스피드 모드를 만들어서 survival 시간에 초점을 두는 모드와
느린 적기를 파괴하면서 점수를 얻는 두 가지 모드를 만들어야 겠다는 아이디어가 생각됐습니다.
import pygame
import random
# 1. 게임 초기화
pygame.init()
# 2. 게임 창 옵션 설정
#크기 설정
size = [800,1000]
screen = pygame.display.set_mode(size)
#제목 설정
title = "Korea 1942"
pygame.display.set_caption(title)
# 3. 게임 내 필요한 설정
#시계 만들기
clock = pygame.time.Clock()
#배경 색 지정
gray = (80,80,80)
color = gray
#클래스 생성
class createObj:
#생성자
def __init__(self):
self.x = 0
self.y = 0
self.move = 0
#캐릭터 입력
def insertImg(self, addr):
if addr[-3:] == 'png':
self.obj = pygame.image.load(addr).convert_alpha()
else:
self.obj = pygame.image.load(addr)
#캐릭터 x길이, y길이 받아오기
self.oX, self.oY = self.obj.get_size()
#사진 사이즈 설정
def setSize(self, oX, oY):
self.obj = pygame.transform.scale(self.obj, (oX, oY))
#캐릭터 x길이, y길이 받아오기
self.oX, self.oY = self.obj.get_size()
#blit
def show(self):
screen.blit(self.obj, (self.x, self.y))
hero = createObj()
#캐릭터 경로 설정
hero.insertImg(r'image\blackEagle.png')
#캐릭터 크기 설정
hero.setSize(40,70)
#캐릭터 위치 설정
hero.x = round(size[0]/2 - hero.oX/2)
hero.y = size[1] - 50 - hero.oY
hero.move = 6
# 4. 메인 이벤트
# 변수 설정
#버튼 누르면 XB값이 0이되어 종료
XB = 1
k=0
###초기화 설정###
#이동 값(bool) 초기화
leftMove=False
rightMove=False
topMove = False
bottomMove = False
#슈팅 여부
shot = False
#총알 리스트
bulList=[]
#적군 리스트
enemList=[]
#XB가 1이 아니라면 while문 종료
while XB == 1:
# 4-1. FPS 설정
#FPS 설정 초당 반응 수
clock.tick(60)
# 4-2. 각종 입력 감지
#입력 감지
for event in pygame.event.get():
#입력이 들어오면 종료
if event.type == pygame.QUIT:
XB=0
#wasd or 방향키 입력 or 슈팅 입력(space bar or k) 감지
#KeyDown되면 활성화
if event.type == pygame.KEYDOWN:
if event.key == 97 or event.key == 1073741904:
leftMove = True
if event.key == 100 or event.key == 1073741903:
rightMove = True
if event.key == 115 or event.key == 1073741905:
bottomMove = True
if event.key == 119 or event.key == 1073741906:
topMove = True
if event.key == 32 or event.key == 107:
shot = True
k=0
#KeyUp 되면 비활성화
elif event.type == pygame.KEYUP:
if event.key == 97 or event.key == 1073741904:
leftMove = False
if event.key == 100 or event.key == 1073741903:
rightMove = False
if event.key == 115 or event.key == 1073741905:
bottomMove = False
if event.key == 119 or event.key == 1073741906:
topMove = False
if event.key == 32 or event.key == 107:
shot = False
# 4.3 입력과 시간에 따른 변화
#해당 키가 눌리면 이동
#좌측 이동
if leftMove == True:
hero.x -= hero.move
#화면에 벗어나지 않도록
if hero.x <= 0:
hero.x = 0
#우측 이동
if rightMove == True:
hero.x += hero.move
#화면에 벗어나지 않도록
if hero.x >=size[0]-hero.oX:
hero.x = size[0]-hero.oX
#위로 이동
if topMove == True:
hero.y -= hero.move
#화면에 벗어나지 않도록
if hero.y <= 0 :
hero.y = 0
#아래로 이동
if bottomMove == True:
hero.y += hero.move
#화면에 벗어나지 않도록
if hero.y >= size[1]-hero.oY:
hero.y = size[1]-hero.oY
#총알 쏠 때
if shot == True and k%7 == 0:
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)
k+=1
#총알이 화면을 벗어나면 제거
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]
#랜덤 적기 생성
if random.random() >0.9:
enemy1 = createObj()
enemy1.insertImg(r'image\enemy1.png')
enemy1.setSize(50,80)
enemy1.x = random.randrange(size[0]-enemy1.oX)#-round(hero.oX/2)
enemy1.y = 15
enemy1.move = 10
enemList.append(enemy1)
#적기가 화면을 벗어나면 제거
delEnemList=[]
for i,v in enumerate(enemList):
v.y += v.move
if v.y > size[1]:#+v.oY
delEnemList.append(i)
for i in delEnemList:
del enemList[i]
# 4-4 그리기
#화면 색 채우기
screen.fill(color)
#캐릭터 띄우기
hero.show()
#총알 띄우기
for v in bulList:
v.show()
#적기 띄우기
for v in enemList:
v.show()
# 4-5 업데이트
#screen 상태 업데이트
pygame.display.flip()
# 5 게임 종료
pygame.quit()
현재까지의 코드 입니다.
728x90
반응형
'앱 개발 > pygame' 카테고리의 다른 글
[pygame] 09. 텍스트 사용 (0) | 2022.11.09 |
---|---|
[pygame] 08. 피격 판정 (0) | 2022.09.29 |
[pygame] 06. 총알 쏘기 (1) | 2022.09.22 |
[pygame] 05. 캐릭터 움직이기 (0) | 2022.09.22 |
[pygame] 04. 코드 클래스화 (1) | 2022.09.19 |