파이썬 파이 게임 모듈 범용 게임 프레임을 구성 (3)

사용 파이 게임은 게임 캐릭터를 이동

파이 게임이 당신이 컨트롤의 다른 유형을 추가 할 수있는 몇 가지 기능이 있지만, 우리가 사용하는 것입니다 키보드가 있어야 파이썬 코드를 입력합니다.

이 일련의 원칙과 같은 운동의 두 번째 기사에서 게임을 종료하는 키를 만듭니다. 그러나 캐릭터가 더 복잡한 이동하자.

이제 간단한 부분에서 시작하자 : 컨트롤러 키를 설정합니다.

스프라이트의 플레이어 설정 키를 제어

IDLE, 닌자-IDE 또는 텍스트 편집기에서 게임 파이썬 스크립트를 엽니 다.

게임이 키보드 이벤트를 "수신"을 계속해야하기 때문에, 그래서 당신은 지속적으로 실행하는 코드를 작성해야합니다. 당신은 당신이 어디에 넣어 실행하는 데 필요한 자주 게임을하는 동안 코드를 생각할 수 있는가?

라고 대답하면 "메인 루프에서"당신은 옳다! 이 사용되지 않습니다 클래스 또는 함수에 숨겨진 경우, 그것은 실행되지 않을 수 있습니다 - 루프의 코드하지 않는 한, 그렇지 않은 경우는 한 번만 실행됩니다 기억하십시오.

입력 키 파이썬를 모니터링하려면 메인 루프에이 코드를 추가합니다. 어떤 코드는 아무것도 일어날 수 있도록, 그래서 사용할 수있는 print성공을 표시하기 위해 문을. 이것은 일반적인 디버깅 기술이다.


而主要== 真:
    对于事件的 pygame的。事件。get ():
        if event。type == pygame。退出:
            pygame。退出(); SYS。exit ()
            main = 如果是事件则为False。type == pygame。KEYDOWN:if event。key == pygame。K_LEFT 或事件。

            key == ord ('a' ):
                print ('left' )
            if event。key == pygame。K_RIGHT 或事件。key == ord ('d' ):
                print ('right' )
            if event。key == pygame。K_UP 或事件。key == ord ('w' ):
            print ('jump' )

        if event。type ==pygame的。KEYUP:
            if event。key == pygame。K_LEFT 或事件。key == ord ('a' ):
                print ('left stop' )
            if event。key == pygame。K_RIGHT 或事件。key == ord ('d' ):
                print ('right stop' )
            if event。key == ord ('q' ):
                pygame的。quit ()
                sys。exit ()
                main = False    

어떤 사람들은 다른 사람들이 화살표 키를 사용하는 것을 선호하면서, 플레이어 캐릭터를 제어하기 위해 키보드 문자 W, A, S 및 D를 사용하는 것을 선호합니다. 포함해야 이 두 가지 옵션을.

** 참고 : ** 모든 사용자를 고려하여 프로그램 작성시 중요합니다. 당신이 코드를 작성하는 경우에만 그때는 아마에만 응용 프로그램의 코드를 사용하는 경우에 적용됩니다. 당신이 작동하는 코드를 작성하는 돈을 찾고 있다면 더 중요한 것은, 당신은 모두를위한 코드를 작성해야한다. 같은 화살표 키 또는 사용하는 WASD 옵션으로 선택을 사용자에게 제공하기 위해, 좋은 프로그래머의 표시이다.

사용 파이썬은 게임을 시작하고 출력 콘솔 좌측 창 위쪽 화살표 또는 A, D와 W 키를보고 오른쪽을 누르면.


$ python ./your-name_game。PY
  左
  左边停止
  右
  右停止
  跳跃

이 파이 게임이 제대로 버튼을 감지 확인합니다. 이제 영의 이동의 노력을 할 수있는 시간입니다.

플레이어 이동 코딩 함수

마법사를 이동하려면 속성이 움직이는 정신 작성해야합니다. 당신의 영혼이 이동하지 않을 경우,이 변수가 설정됩니다 0.

당신은 당신이 애니메이션을 미래에 결정하는 경우 스프라이트 애니메이션, 또는 싶은 경우에, 당신은 또한 정상적인 순환을 유지하기 위해 도보 트랙 프레임을해야합니다.

플레이어 클래스의 변수를 만듭니다. 컨텍스트에 대한 처음 두 줄은, 그래서 그냥 마지막 세 줄을 추가, (당신이 따라왔다, 당신은 코드를 사용했다)


    def __init__ (self ):
        pygame。精灵。雪碧。__init__ (自我)
        自我。movex = 0 #沿X 
        self 移动。movey = 0 #沿着Y 
        self 移动。frame = 0 #counts frames

이러한 변수를 설정 한 후, 당신은 스포츠의 정신을 인코딩 할 수 있습니다.

플레이어는 항상 마법사 제어에 응답하지 필요, 때로는 이동하지 않습니다. 따라서, 제어 마법사 코드는 플레이어 스프라이트에 의해 수행 모든 일의 단지 작은 부분이다. 당신은 독립적으로 코드, 함수의 새로운 코드의 나머지, 파이썬에서 객체를 생성 할 때. 파이썬 기능은 키워드로 시작하는 def대신, 정의 .

당신의 플레이어 클래스에서 함수를 작성 화면에 스프라이트 위치를 추가 의 일부 픽셀 수를 . 추가 얼마나 많은 픽셀에 대해 걱정하지 마십시오, 이것은 나중에 코드에서 결정됩니다.

    def控制(自我, x , y ):
        ''' 
        控制球员运动
        ''' 
        自我。movex + = x 
        self。movey + = y

새 위치의 위치 - 파이 게임에서 스프라이트를 이동하려면 새 위치에서 파이썬 다시 그려 스프라이트를 알려야합니다.

플레이어 때문에 엘프는 업데이트 기능 플레이어의 경우 단순히 클래스 항상 이동 없으므로. 에서 control이전에 만든 기능 후이 기능을 추가.

도보 (또는 비행 또는 무엇이든 당신의 스프라이트가해야 할) 같은 스프라이트의 모양을 만들려면, 당신은 적절한 키를 누르면 화면에 위치를 변경해야합니다. 당신이 (속성에 의해 위치를 설정할 수 있습니다, 그것은 화면을 가로 질러 이동하려면 self.rect.xself.rect.y지정된 속성)의 현재 위치를 더한 숫자로 재정의 movex또는 movey위치 응용 프로그램. (이후에 이동하는데 필요한 화소 수를 설정한다.)


    def update (self ):
        ''' 
        更新精灵位置
        ''' 
        self。RECT。x = 自我。RECT。x + 自我。的Movex        

y 위치에 같은 일을 수행합니다


        自我。RECT。y = 自我。RECT。y + 自我。movey

애니메이션마다 스프라이트 애니메이션 프레임은 전진하고, 선수로서 해당 애니메이션 프레임 영상을 사용

        #向左移动
        ,如果 自我。movex < 0:
            自我。帧 + = 1 
            如果 自己。frame > 3 * ani:
                self。frame = 0 
            self。image = self。图像[ 自我。帧 // ANI ] 

        #向右移动
        ,如果 自我。movex > 0:
            自我。帧 + = 1 
            如果 自我。frame > 3 * ani:
                self。frame = 0 
            self。image = self。图像[ (自我。帧 // ANI ) + 4 ]

태그를 설정함으로써 스프라이트 위치의 픽셀의 수를 추가 한 다음 플레이어 마법사 기능을 트리거 그 변수를 사용하는 코드를 말한다.

첫째, 설정 섹션에서 변수를 만들 수 있습니다. 이 코드에서, 문맥의 처음 두 행은, 따라서 단순히 스크립트로 세 번째 줄을 추가합니다 :


player_list = pygame。精灵。Group ()
player_list。add ( player )
steps = 10  #要移动的像素数

이제 당신은 적절한 함수와 변수를 가지고, 당신의 엘프로 전송 함수와 변수를 트리거하기 위해 키를 사용합니다.

함으로써 print플레이어 스프라이트 (플레이어)의 이름을 사용하는 함수 (.control)는 주 루프 문이 작업을 수행 할 수있는 X 축 및 Y 축 이동 사이클 따라 각 스프라이트 단계와 플레이어의 원하는 번호를 교체한다.

        如果事件。type == pygame。KEYDOWN:
            if event。key == pygame。K_LEFT 或事件。key == ord ('a' ):
                玩家。控制( -steps ,0 )
            if event。key == pygame。K_RIGHT 或事件。key == ord ('d' ):
                玩家。控制(步骤,0 )
            如果事件。key == pygame。K_UP 或事件。key == ord ('w' ):
                print ('jump' )

        if event。type == pygame。KEYUP:
            if event。key == pygame。K_LEFT 或事件。key == ord ('a' ):
                玩家。控制(步骤,0 )
            如果事件。key == pygame。K_RIGHT 或事件。key == ord ('d' ):
                玩家。控制( -steps ,0 )
            if event。key == ord ('q' ):
                pygame。quit ()
                sys。exit ()
                main = False

명심, steps그것은 키를 누르면 픽셀 스프라이트 이동의 수를 나타내는 변수이다. 오른쪽 화살표 또는 D를 누를 때 플레이어 스프라이트의 위치에 10 개 픽셀을 추가하는 경우,이 버튼을 누르면 중지, 당신은 빼야한다 10 ( -steps)는 0에 모멘텀 마법사를 복원하는.

지금 게임을보십시오. 경고 : 예상대로 수행하지 않습니다.

왜 엘프를 이동하지? 기본 루프는 호출하지 않기 때문에 update기능.

위치 파이썬 플레이어 스프라이트를 업데이트 알려 메인 루프에 코드를 추가합니다. 주석 행을 추가합니다 :


    播放器。update ()  #
    upcate player position player_list。画(世界)
    pygame。显示。翻转()
    时钟。tick ( fps )

플레이어 스프라이트 입찰가에 화면을 이동할 수 있는지 확인하기 위해 게임을 다시 시작합니다. 어떤 수직 이동하지, 이러한 기능은 중력에 의해 제어,하지만 그건 다른 기사에 대한 또 다른 교훈되기 때문.

한편, 조이스틱에 액세스 할 수있는 경우는 파이 게임 읽어보세요 조이스틱 당신이 당신의 스프라이트 이동 얻을 수 있는지, 모듈 문서를. 당신이 할 수있는 경우 또는 볼 마우스 정신으로 상호 작용할 수 있습니다.

가장 중요한 재미를!

이 튜토리얼에 사용 된 모든 코드

참고로,이 사용하는 기사의이 시리즈는 지금까지 모든 코드입니다.


#!/ usr / bin / env python3 
#画一个世界
#添加玩家和玩家控制
#add player movement 

#GNU All-Permissive License 
#复制和分发此文件,无论有没有修改,
#都允许在任何媒体中使用#版税提供版权
#通知,此通知保留。此文件按原样提供,
#没有任何保证。

进口 pygame的
进口 SYS 
进口 OS 

“”“ 
对象
‘’” 

类的播放器(。pygame的精灵。精灵):
    ‘’“ 
    生成一个播放器
    ‘’”
    def __init__ (self ):
        pygame。精灵。雪碧。__init__ (自我)
        自我。movex = 0 
        self。movey = 0 
        self。frame = 0 
        self。图像 = [ ] 
        为我在 范围(1 ,5 ):
            IMG = pygame的。图像。负载(操作系统。路径。加入('images' ,'hero' + str ( i ) + '。png' ))。convert ()
            img。convert_alpha ()
            img。set_colorkey ( ALPHA )
            self。图像。追加( img )
            自我。image = self。图像[ 0 ] 
            自我。矩形  = 自我。图像。get_rect ()

    def控制(self , x , y ):
        ''' 
        控制玩家运动
        ''' 
        自我。movex + = x 
        self。movey + = y 

    def update (self ):
        ''' 
        更新精灵位置
        ''' 

        self。RECT。x = 自我。RECT。x + 自我。movex 
        self。RECT。y = 自我。RECT。y + 自我。movey 

        #向左移动
        ,如果 自我。movex < 0:
            自我。帧 + = 1 
            如果 自己。frame > 3 * ani:
                self。frame = 0 
            self。image = self。图像[ 自我。帧 // ANI ] 

        #向右移动
        ,如果 自我。movex > 0:
            自我。帧 + = 1 
            如果 自己。frame > 3 * ani:
                self。frame = 0 
            self。image = self。图像[ (自我。帧 // ANI ) + 4 ] 

'' ' 
设置
'''
worldx = 960
worldy = 720

fps = 40        #frame rate
ani = 4        #animation cycles
clock = pygame。时间。时钟()
pygame。初始化()
主要= 真

BLUE   = (25 ,25 ,200 )
BLACK = (23 ,23 ,23 )
WHITE = (254 ,254 ,254 )
ALPHA = (0 ,255 ,0 )

世界= pygame的。显示。set_mode ([ worldx , worldy ] )
backdrop = pygame。图像。负载(OS。路径。加入('图像' ,'stage.png' ))。convert ()
backdropbox = world。get_rect()
player = Player ()   #profen player
player。RECT。x = 0
玩家。RECT。y = 0
player_list = pygame。精灵。Group ()
player_list。添加(播放器)
步骤= 10      #如何快速移动

“”“ 
主回路
‘’” 
而主要== 真:
    对于事件的 pygame的。事件。get ():
        if event。type == pygame。退出:
            pygame。退出(); SYS。exit ()
            main = 如果是事件则为False。type == pygame。KEYDOWN:if event。key == pygame。K_LEFT 或事件。key == ord ('a' ):                 玩家。

控制( -steps ,0 )
            if event。key == pygame。K_RIGHT 或事件。key == ord ('d' ):
                玩家。控制(步骤,0 )
            如果事件。key == pygame。K_UP 或事件。key == ord ('w' ):
                print ('jump' )

        if event。type ==pygame的。KEYUP:
            if event。key == pygame。K_LEFT 或事件。key == ord ('a' ):
                玩家。控制(步骤,0 )
            如果事件。key == pygame。K_RIGHT 或事件。key == ord ('d' ):
                玩家。控制( -steps ,0 )
            if event。键 == ord ('q' ):
                pygame。quit ()
                sys。exit ()
                main = False 

#world.fill(黑色)
    世界。blit (背景, backgroundbox )
    播放器。update ()
    player_list。draw ( world ) #refresh player position
    pygame。显示。翻转()
    时钟。打勾( fps)

당신은 아주 멀리 갈 필요, 많은 것을 배웠습니다,하지만 할 일이 많이있다. 다음 몇 기사에서는 등등 엘프의 적, 시뮬레이션 중력 등을 추가 할 수 있습니다. 동시에, 파이썬 연습에!

파이썬을 배울 때 우리는 분명 새로운 기술의 추구뿐만 아니라, 많은 문제가 발생할 것입니다, 우리가 파이썬 버클 쿤을 학습하는 것이 좋습니다 무엇 : 784758214, 여기에 파이썬 학습자 모임 장소입니다! ! 동시에 그는 제로 데이터가 마무리된다 대처하기 위해 웹 개발, 파충류, 장고, 데이터 마이닝 및 기타 프로젝트에 기본에서 수석 개발 엔지니어 파이썬, 파이썬 스크립트이었다. 모든 작은 파이썬 파트너에게 주어! 매일 주 학습의 몇 가지 방법 작은 세부 사항에주의를 지불 할 필요

클릭 파이썬 교환 기술 공유

추천

출처blog.csdn.net/zhizhun88/article/details/90707108