어떻게 pygame 을 이용 하여 비행기 게임 을 실현 합 니까?

효과 미리 보기
최근 에 실습 시간 에 이렇게 간단 한 물건 을 썼 다.실행 효 과 는 다음 과 같 습 니 다.
在这里插入图片描述
프로젝트 구조
在这里插入图片描述
화면 에 맞 는 게임
제 가 노트북 을 사 용 했 기 때문에 화면 크기 를 조정 하 였 습 니 다.예 를 들 어 제 노트북 크기 는 125%입 니 다.
在这里插入图片描述
문 제 는 우리 의 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

실현 의 구체 적 인 방법 은 다음 과 같다.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
비행기 류 의 실현
이것 은 내 가 정의 한 것 이기 때문에 그 자체 의 충돌 검 사 를 직접 사용 할 방법 이 없다.나 는 충돌 검 측 방법 도 정의 했다.
在这里插入图片描述
비행기의 이동
이것 은 게임 류 의 이벤트 검 측 과 협조 합 니 다.
구체 적 인 사 고 는 pygame.event.get()으로 사건 검 사 를 하 는 것 입 니 다.그 후에 어떤 버튼 을 누 르 는 것 이 감지 되 었 다.예 를 들 어 앞으로 이동 하면 앞으로 이동 하 는 신 호 를 설정 하고 이때 비행 기 는 계속 앞으로 간다.풀 리 면 신 호 를 가짜 로 설정 하면 비행기 가 멈춘다.비행 기 는 그 앞 을 누 르 고 있 는 지 계속 순환 하고 있 기 때문에 당신 이 길 게 누 르 면 비행 기 는 당신 이 풀 릴 때 까지 계속 앞으로 갑 니 다.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
탄알 과 적기 류
이 총알 과 적 기 는 모두 정령 파생 류 의 자 류 이다.그 러 니까 같이 얘 기해.
중요 한 것 은 총알 류 의 충돌 검 측 과 적기 의 충돌 검 측 이다.이것 은 적기 와 유사 하기 때문에 주로 총알 류 를 말한다.그냥 디 테 일이 좀 달라 서 요.

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 의 사건 으로 검 측 할 수 없다(자체 적 으로 가지 고 있다).
적기 의 폭발
이것 은 사실 비행기의 폭발 과 유사 하 다.
주로 비행기 에 부 딪 혔 는 지 안 부 딪 혔 는 지 확인 한 뒤 사진 을 바 꾸 면 된다.물론 이때 나 는 스 레 드 를 켰 다.그렇지 않 으 면 곧 지나 갈 것 이다.바 뀌 었 는 지 안 바 뀌 었 는 지 너 는 효 과 를 볼 수 없다.
그림 을 전환 하 는 함수,전환 이 완료 되 었 습 니 다.이 적기 류 를 삭제 하여 메모리 소 모 를 감소 합 니 다.
在这里插入图片描述
在这里插入图片描述
게임 달걀
이게 사실 자기 뒤에 있어 요.
구체 적 인 역할 은 자신의 비행기의 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 비행기 게임 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기