어떻게 pygame 을 이용 하여 비행기 게임 을 실현 합 니까?
최근 에 실습 시간 에 이렇게 간단 한 물건 을 썼 다.실행 효 과 는 다음 과 같 습 니 다.
![在这里插入图片描述](https://s1.md5.ltd/image/ee341a3bd7851ef8ed77fbca6a02d044.gif)
프로젝트 구조
![在这里插入图片描述](https://s1.md5.ltd/image/92c9a3a71a40f5f0b81454f572a1f300.png)
화면 에 맞 는 게임
제 가 노트북 을 사 용 했 기 때문에 화면 크기 를 조정 하 였 습 니 다.예 를 들 어 제 노트북 크기 는 125%입 니 다.
![在这里插入图片描述](https://s1.md5.ltd/image/3347863fe7d0a57a0cb32a66487c11c6.png)
문 제 는 우리 의 pygame 과 다른 라 이브 러 리,예 를 들 어 selenium 은 사실 100%표 시 된 픽 셀 로 계산 된다 는 것 이다.그래서 이 럴 때 우 리 는 환산 을 해 야 한다.
이것 도 좋 습 니 다:현재 디 스 플레이 픽 셀 비=100%디 스 플레이 픽 셀 비 X 크기 조정 비
우 리 는 단지 환산 만 하면 된다.여기 서 나 는 우리 의 수 요 를 실현 하고 우리 컴퓨터 의 화면 크기 를 자동 으로 감지 한 후에 환산 하 는 종 류 를 정의 했다.
from win32 import win32api, win32gui, win32print
from win32.lib import win32con
from win32.win32api import GetSystemMetrics
class ChangeRealSize(object):
'''
, 100%
:
RealSize = ChangeRealSize()
x=RealSize.getreal_xy(500)
'''
def get_real_resolution(self):
""" """
hDC = win32gui.GetDC(0)
w = win32print.GetDeviceCaps(hDC, win32con.DESKTOPHORZRES)
h = win32print.GetDeviceCaps(hDC, win32con.DESKTOPVERTRES)
return w, h
def get_screen_size(self):
""" """
w = GetSystemMetrics (0)
h = GetSystemMetrics (1)
return w, h
def getreal_xy(self,x):
''' 100% '''
real_resolution = self.get_real_resolution()
screen_size = self.get_screen_size()
screen_scale_rate = round(real_resolution[0] / screen_size[0], 2)
try:
x = x/screen_scale_rate
except:
# , 100% x
x=1.25
return int(x)
게임 화면의 그리 기와 비행기 생 성화면 그리 기 직접 사용 pygame.display.setmode()의 bitl()그리 기 방법 으로 그립 니 다.물론 이곳 의 배경 은 움 직 일 것 이다.그래서 한 정령 의 파생 류 에 사용 되 었 다.
import pygame,random
from ChangeRealSize import ChangeRealSize
GetReal = ChangeRealSize()
class GameSprite(pygame.sprite.Sprite):
def __init__(self,image_path,speed=1):
super().__init__()
self.image = pygame.image.load(image_path)
self.rect = self.image.get_rect()
self.speed = speed
def update(self):
self.rect.y+=self.speed
class Background(GameSprite):
def __init__(self, image_path="./Plane_Img/background1.png",flag=False):
super().__init__(image_path)
if flag:
self.rect.y = -self.rect.height
def update(self):
self.rect.y+=1
if self.rect.y >= self.rect.height:
self.rect.y = -self.rect.height
실현 의 구체 적 인 방법 은 다음 과 같다.![在这里插入图片描述](https://s1.md5.ltd/image/b0e47fc47d28cb7f86f45f25c75c2dc2.png)
![在这里插入图片描述](https://s1.md5.ltd/image/0764630e19de86e9f3d6f831671b0e58.png)
![在这里插入图片描述](https://s1.md5.ltd/image/0638c48936f7e0c490b0339af8869ba2.png)
비행기 류 의 실현
이것 은 내 가 정의 한 것 이기 때문에 그 자체 의 충돌 검 사 를 직접 사용 할 방법 이 없다.나 는 충돌 검 측 방법 도 정의 했다.
![在这里插入图片描述](https://s1.md5.ltd/image/a19b916aa5bfa7749ad596093eb6eb29.png)
비행기의 이동
이것 은 게임 류 의 이벤트 검 측 과 협조 합 니 다.
구체 적 인 사 고 는 pygame.event.get()으로 사건 검 사 를 하 는 것 입 니 다.그 후에 어떤 버튼 을 누 르 는 것 이 감지 되 었 다.예 를 들 어 앞으로 이동 하면 앞으로 이동 하 는 신 호 를 설정 하고 이때 비행 기 는 계속 앞으로 간다.풀 리 면 신 호 를 가짜 로 설정 하면 비행기 가 멈춘다.비행 기 는 그 앞 을 누 르 고 있 는 지 계속 순환 하고 있 기 때문에 당신 이 길 게 누 르 면 비행 기 는 당신 이 풀 릴 때 까지 계속 앞으로 갑 니 다.
![在这里插入图片描述](https://s1.md5.ltd/image/be34f1668ddf155d98fd5e9104a3e18d.png)
![在这里插入图片描述](https://s1.md5.ltd/image/ade2252b39198ec5ecee2239fd9a3d1b.png)
![在这里插入图片描述](https://s1.md5.ltd/image/8484437b55ff540e2de3a6e5073e514d.png)
탄알 과 적기 류
이 총알 과 적 기 는 모두 정령 파생 류 의 자 류 이다.그 러 니까 같이 얘 기해.
중요 한 것 은 총알 류 의 충돌 검 측 과 적기 의 충돌 검 측 이다.이것 은 적기 와 유사 하기 때문에 주로 총알 류 를 말한다.그냥 디 테 일이 좀 달라 서 요.
class Bullet(GameSprite):
def __init__(self,P_rect,is_hero=False,bullet_image = "./Plane_Img/bullet-3.gif",hero_rect=None):
self.hero_rect = hero_rect
self.bullet_image = bullet_image
self.speed = 4
self.is_hero = is_hero
self.P_rect = P_rect
self.screen_height = GetReal.getreal_xy(800)
self.screen_width = GetReal.getreal_xy(500)
self.actarct_plan = False
self.actract_hero=[]
super().__init__(self.bullet_image,self.speed)
self.rect.x = self.P_rect.x+((self.P_rect.width-self.rect.width)/2)
self.rect.y = self.P_rect.y
def enemy_bullet(self):
#
# 5
if not self.is_hero:
bullet_x = self.rect.x + int(self.rect.width / 2)
bullet_y = self.rect.y + int(self.rect.height / 2)
hero_plane_x = self.hero_rect.x + int(self.hero_rect.width / 2)
hero_plane_y = self.hero_rect.y + int(self.hero_rect.height / 2)
subtract_y = abs(int(bullet_y - hero_plane_y))
subtract_x = abs(int(bullet_x - hero_plane_x))
if subtract_y <= int((self.rect.height + self.hero_rect.height) / 2) and \
subtract_x <= int((self.rect.width + self.hero_rect.height) / 2):
self.actract_hero.append(1)
return True
def update(self):
if self.enemy_bullet():
# 5
global HERO_PLANE_HP
HERO_PLANE_HP-=5
# print(HERO_PLANE_HP)
self.kill()
if self.is_hero:
self.rect.y-=self.speed
else:
super().update()
if self.rect.bottom >=self.screen_height-3 :
self.kill()
총알 은 두 가지 로 나 뉘 는데 하 나 는 비행기 총알 이 고 하 나 는 적기 총알 이 며 적기 의 자체 테이프 검사 충돌 이다.한편 으로 는 편리 점수 통계(적기 가 비행 기 를 몇 번 맞 혔 다)이 고,다른 한편 으로 는 비행기 가 사용자 정의 이기 때문에 pygame 의 사건 으로 검 측 할 수 없다(자체 적 으로 가지 고 있다).적기 의 폭발
이것 은 사실 비행기의 폭발 과 유사 하 다.
주로 비행기 에 부 딪 혔 는 지 안 부 딪 혔 는 지 확인 한 뒤 사진 을 바 꾸 면 된다.물론 이때 나 는 스 레 드 를 켰 다.그렇지 않 으 면 곧 지나 갈 것 이다.바 뀌 었 는 지 안 바 뀌 었 는 지 너 는 효 과 를 볼 수 없다.
그림 을 전환 하 는 함수,전환 이 완료 되 었 습 니 다.이 적기 류 를 삭제 하여 메모리 소 모 를 감소 합 니 다.
![在这里插入图片描述](https://s1.md5.ltd/image/27fe16302371a6f0f8a7e9c2627a2791.png)
![在这里插入图片描述](https://s1.md5.ltd/image/efb06c0cb67b87133d5e25b7ff17157b.png)
게임 달걀
이게 사실 자기 뒤에 있어 요.
구체 적 인 역할 은 자신의 비행기의 HP 값 을 99 만 으로 수정 하 는 것 이다.
물론 이 작은 게임 은 아직 끝나 지 않 았 고 무적 도 좀 지루 하 다.오래 놀 면.
def CheatEngine():
global HERO_PLANE_HP
print("HP is %d" % HERO_PLANE_HP)
while 1:
key = input("maybe you can input something:")
if key=='break':
print("enjoy your game please Bye~")
return
elif key=="Huterox is best":
HERO_PLANE_HP=999999
print("Now your HP is %d!!!"%HERO_PLANE_HP)
return
전체 코드
import pygame,random
from ChangeRealSize import ChangeRealSize
GetReal = ChangeRealSize()
class GameSprite(pygame.sprite.Sprite):
def __init__(self,image_path,speed=1):
super().__init__()
self.image = pygame.image.load(image_path)
self.rect = self.image.get_rect()
self.speed = speed
def update(self):
self.rect.y+=self.speed
class Background(GameSprite):
def __init__(self, image_path="./Plane_Img/background1.png",flag=False):
super().__init__(image_path)
if flag:
self.rect.y = -self.rect.height
def update(self):
self.rect.y+=1
if self.rect.y >= self.rect.height:
self.rect.y = -self.rect.height
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
import pygame,random,time,threading,os
from ChangeRealSize import ChangeRealSize
from GameSprite import GameSprite,Background
GetReal = ChangeRealSize()
GREATE_ENMEY_EVENT = pygame.USEREVENT#
HERO_FIRE_BULLTE = pygame.USEREVENT+1 #
HERO_PLANE_HP = 300
def CheatEngine():
global HERO_PLANE_HP
print("HP is %d" % HERO_PLANE_HP)
while 1:
key = input("maybe you can input something:")
if key=='break':
print("enjoy your game please Bye~")
return
elif key=="Huterox is best":
HERO_PLANE_HP=999999
print("Now your HP is %d!!!"%HERO_PLANE_HP)
return
class Base():
''' , '''
def __init__(self,x,y,width,height,path):
self.x = GetReal.getreal_xy(x)
self.y = GetReal.getreal_xy(y)
self.width = GetReal.getreal_xy(width)
self.height = GetReal.getreal_xy(height)
self.image = pygame.image.load(path)
self.rect = pygame.Rect(self.x,self.y,self.height,self.width)
class Planer(Base):
def __init__(self,x,y,width,height,path,screen):
Base.__init__(self,x,y,width,height,path)
self.Killed = False
self.screen = screen
self.GoStrange=False
self.TurnLeft = False
self.TurnRight =False
self.GoBack = False
self.Fire_flag = False
self.Boom_path="./Plane_Img/hero_blowup_n{}.png"
self.bullet_group=pygame.sprite.Group()
pygame.time.set_timer(HERO_FIRE_BULLTE,250)
self.Plane_need_Killed=[]#
def Move(self):
if self.Killed:
self.rect=pygame.Rect(0,0,0,0)
return
if self.GoStrange:
if self.rect.bottom <= 300:
self.show()
return
else:
self.rect.y -= 3
self.show()
if self.TurnLeft:
if self.rect.x<=3:
self.show()
return
else:
self.rect.x-=2
self.show()
if self.TurnRight:
if self.rect.x>=Game.screen_x-self.rect.width-3:
self.show()
return
else:
self.rect.x+=2
self.show()
if self.GoBack:
if self.rect.bottom>=Game.screen_y-30:
self.show()
return
else:
self.rect.y +=2
self.show()
self.show()
def Get_bullet(self):
#
if self.Killed:
return
if self.Fire_flag:
MusicPlay().PlayPlanSound()
bullet = Bullet(self.rect,True)
self.bullet_group.add(bullet)
def Fire(self):
#
if self.Killed:
return
self.bullet_group.update()
self.bullet_group.draw(self.screen)
def Goal(self):
pass
def show(self):
if self.Killed:
return
Game.screen.blit(self.image,self.rect)
# pygame.display.update()
def __plane_Boom(self):
if self.Killed:
return
for i in range(1, 5):
self.image_path = self.Boom_path.format(i)
self.image = pygame.image.load(self.image_path)
time.sleep(0.3)
time.sleep(1)
self.Killed =True
def Plane_Live(self):
if self.Killed:
return
global HERO_PLANE_HP
if HERO_PLANE_HP<=0:
HERO_PLANE_HP =0
self.Plane_need_Killed.append(1)
if len(self.Plane_need_Killed)==1:
t = threading.Thread(target=self.__plane_Boom)
t.start()
#
class MusicPlay():
def __init__(self):
self.bgmusic = pygame.mixer.music
def PlayBg(self):
self.bgmusic.load("./music/PlaneWarsBackgroundMusic.mp3")
self.bgmusic.set_volume(0.3)
self.bgmusic.play(-1)
def StarBg(self):
self.bgmusic.stop()
def PlayPlanSound(self):
self.PlayPlaneMusic = pygame.mixer.Sound("./music/hero_fire.wav")
self.PlayPlaneMusic.set_volume(0.2)
self.PlayPlaneMusic.play()
def StopPlayPlanSound(self):
pass
#
class Bullet(GameSprite):
def __init__(self,P_rect,is_hero=False,bullet_image = "./Plane_Img/bullet-3.gif",hero_rect=None):
self.hero_rect = hero_rect
self.bullet_image = bullet_image
self.speed = 4
self.is_hero = is_hero
self.P_rect = P_rect
self.screen_height = GetReal.getreal_xy(800)
self.screen_width = GetReal.getreal_xy(500)
self.actarct_plan = False
self.actract_hero=[]
super().__init__(self.bullet_image,self.speed)
self.rect.x = self.P_rect.x+((self.P_rect.width-self.rect.width)/2)
self.rect.y = self.P_rect.y
def enemy_bullet(self):
#
# 5
if not self.is_hero:
bullet_x = self.rect.x + int(self.rect.width / 2)
bullet_y = self.rect.y + int(self.rect.height / 2)
hero_plane_x = self.hero_rect.x + int(self.hero_rect.width / 2)
hero_plane_y = self.hero_rect.y + int(self.hero_rect.height / 2)
subtract_y = abs(int(bullet_y - hero_plane_y))
subtract_x = abs(int(bullet_x - hero_plane_x))
if subtract_y <= int((self.rect.height + self.hero_rect.height) / 2) and \
subtract_x <= int((self.rect.width + self.hero_rect.height) / 2):
self.actract_hero.append(1)
return True
def update(self):
if self.enemy_bullet():
# 5
global HERO_PLANE_HP
HERO_PLANE_HP-=5
# print(HERO_PLANE_HP)
self.kill()
if self.is_hero:
self.rect.y-=self.speed
else:
super().update()
if self.rect.bottom >=self.screen_height-3 :
self.kill()
#
class Enemy(GameSprite):
def __init__(self,hero_plane,screen,image_path="./Plane_Img/enemy0.png"):
self.speed = random.randint(1,3)
self.image_path =image_path
self.screen = screen
self.hero_plane = hero_plane
self.hero_bullet = self.hero_plane.bullet_group
self.fire_interval = False
#
self.collied_with_plan = []
super().__init__(self.image_path,self.speed)
self.screen_height = GetReal.getreal_xy(800)
self.screen_width = GetReal.getreal_xy(500)
self.Turn_L_Flag = True
self.Boom_path = "./Plane_Img/enemy0_down{}.png"
self.rect.y = GetReal.getreal_xy(self.rect.top-self.rect.bottom)
self.rect.x = random.randint(0, self.screen_width - self.rect.width)
self.bullet_group = pygame.sprite.Group()
def __Boom(self):
#
#
flag_killed_by_bullet = pygame.sprite.spritecollide(self,self.hero_bullet,True)
if flag_killed_by_bullet or self.__IS_collied_with_plan():
# HP 20
global HERO_PLANE_HP
if len(self.collied_with_plan)==1:
HERO_PLANE_HP -=20
t = threading.Thread(target=self.Boom_ing)
t.start()
pass
def Boom_ing(self):
for i in range(1, 5):
self.image_path = self.Boom_path.format(i)
self.image = pygame.image.load(self.image_path)
time.sleep(0.2)
self.kill()
def __IS_collied_with_plan(self):
#
center_enemy_x = self.rect.x +int(self.rect.width/2)
center_enemy_y = self.rect.y +int(self.rect.height/2)
center_plane_x = self.hero_plane.rect.x+int(self.hero_plane.rect.width/2)
center_plane_y = self.hero_plane.rect.y+int(self.hero_plane.rect.height/2)
subtract_y = abs(int(center_enemy_y-center_plane_y))
subtract_x = abs(int(center_enemy_x-center_plane_x))
if subtract_y <= int((self.rect.height+self.hero_plane.rect.height)/2) and\
subtract_x <= int((self.rect.width+self.hero_plane.rect.height)/2):
self.collied_with_plan.append(1)
return True
def __Bullet_building(self):
if self.rect.y% 50 ==0:
buttle = Bullet(self.rect,bullet_image="./Plane_Img/bullet-1.gif",hero_rect=self.hero_plane.rect)
self.bullet_group.add(buttle)
def __Shut(self):
self.bullet_group.update()
self.bullet_group.draw(self.screen)
def update(self):
super().update()
#
self.__Boom()#
self.__Bullet_building()
self.__Shut()
if self.rect.top >= self.screen_height + 3:
#//
# self.rect.y = -20
self.kill()
if self.Turn_L_Flag:
self.rect.x += random.randint(1,2)
if self.rect.right >= self.screen_width - 3:
self.Turn_L_Flag = False
else:
self.rect.x -= random.randint(2, 3)
if self.rect.left <= 3:
self.Turn_L_Flag = True
class PlayGame(object):
def __init__(self):
pygame.init()
self.screen_x, self.screen_y = GetReal.getreal_xy(500), GetReal.getreal_xy(800)
self.screen = pygame.display.set_mode((self.screen_x, self.screen_y))
self.Flush_Clcok = pygame.time.Clock()
pygame.display.set_caption(' !!!')
self.enemy_group = pygame.sprite.Group()
self.hero_palne = Planer(200, 500, 100, 125, "./Plane_Img/hero1.png", self.screen)
pygame.time.set_timer(GREATE_ENMEY_EVENT,1000)#
def __game_over(self):
global HERO_PLANE_HP
if self.hero_palne.Killed:
while True:
bye = pygame.image.load("./Plane_Img/gameover_.png")
self.screen.blit(bye,(0,0))
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
os._exit(0)
def __Listening_keyboard(self,hero_palne):
''' '''
'''hero_palne
'''
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
os._exit(0)
elif event.type == pygame.KEYDOWN:
#
if event.key == pygame.K_w or event.key == pygame.K_UP:
hero_palne.GoStrange = True
if event.key == pygame.K_a or event.key == pygame.K_LEFT:
hero_palne.TurnLeft = True
if event.key == pygame.K_d or event.key == pygame.K_RIGHT:
hero_palne.TurnRight = True
if event.key == pygame.K_s or event.key == pygame.K_DOWN:
hero_palne.GoBack = True
if event.key == pygame.K_SPACE:
hero_palne.Fire_flag= True
if event.type == HERO_FIRE_BULLTE:
hero_palne.Get_bullet()
elif event.type == pygame.KEYUP:
#
if event.key == pygame.K_w or event.key == pygame.K_UP:
hero_palne.GoStrange = False
elif event.key == pygame.K_a or event.key == pygame.K_LEFT:
hero_palne.TurnLeft = False
elif event.key == pygame.K_d or event.key == pygame.K_RIGHT:
hero_palne.TurnRight = False
elif event.key == pygame.K_s or event.key == pygame.K_DOWN:
hero_palne.GoBack = False
if event.key == pygame.K_SPACE:
hero_palne.Fire_flag = False
#
elif event.type == GREATE_ENMEY_EVENT:
self.__Enemy_init()
def __doc__(self):
pass
def __BackGround_init(self):
bg1 = Background()
bg2 = Background(flag=True)
self.back_ground = pygame.sprite.Group(bg1,bg2)
def __ShowBackGround(self):
self.back_ground.update()
self.back_ground.draw(self.screen)
def __Enemy_init(self):
#
enemy = Enemy(self.hero_palne,self.screen)
self.enemy_group.add(enemy)
def __Show_enemy(self):
if self.enemy_group:
self.enemy_group.update()
self.enemy_group.draw(self.screen)
def __Check_planecollied_enemy(self):
pass
def star_game(self):
PlayerMusic = MusicPlay()
PlayerMusic.PlayBg()
hero_palne = Planer(200, 500, 100, 125, "./Plane_Img/hero1.png", self.screen)
self.__BackGround_init()#
self.__Enemy_init()#
while 1:
self.__ShowBackGround()
self.__Show_enemy()
self.__Listening_keyboard(self.hero_palne )
self.hero_palne.Move()
self.hero_palne.Fire()
self.hero_palne.Plane_Live()
self.__game_over()
pygame.display.update() # ,
self.Flush_Clcok.tick(60)
if __name__ == '__main__':
t = threading.Thread(target=CheatEngine)
t.start()
Game = PlayGame()
Game.star_game()
항목 가 져 오기(git 못 하 는 고통!!!)
여 기 를 클릭 하여 다운로드
총결산
pygame 을 이용 하여 비행기 게임 을 어떻게 실현 하 는 지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 pygame 비행기 게임 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
완전히 처음부터 시작하는 보드 게임의 프로그래밍과 기계 학습 [4 일째]평소 Python의 기본적인 사용법을 배웠으므로, 드디어 Pygame을 사용하여 게임 제작의 입구로 발길을 가고 싶습니다. Pygame은 Simple DirectMedia Layer (SDL)라고 불리는 다른 게임 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.