From 57930a5094c5282267cdea32d9bf496b0a914cb7 Mon Sep 17 00:00:00 2001 From: Xingyu Wang Date: Sat, 25 Jan 2020 13:59:43 +0800 Subject: [PATCH 1/3] PRF @wxy --- .../20200119 What-s your favorite Linux terminal trick.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/translated/tech/20200119 What-s your favorite Linux terminal trick.md b/translated/tech/20200119 What-s your favorite Linux terminal trick.md index fc6f0a8ae2..5acd642ad5 100644 --- a/translated/tech/20200119 What-s your favorite Linux terminal trick.md +++ b/translated/tech/20200119 What-s your favorite Linux terminal trick.md @@ -1,6 +1,6 @@ [#]: collector: (lujun9972) [#]: translator: (wxy) -[#]: reviewer: ( ) +[#]: reviewer: (wxy) [#]: publisher: ( ) [#]: url: ( ) [#]: subject: (What's your favorite Linux terminal trick?) @@ -12,7 +12,7 @@ > 告诉我们你最喜欢的终端技巧,无论是提高生产率的快捷方式还是有趣的彩蛋。 -![Terminal command prompt on orange background][1] +![](https://img.linux.net.cn/data/attachment/album/202001/25/135858accxc70tfxuifxx1.jpg) 新年伊始始终是评估提高效率的新方法的好时机。许多人尝试使用新的生产力工具,或者想找出如何优化其最常用的流程。终端是一个需要评估的领域,尤其是在开源世界中,有无数种方法可以通过快捷键和命令使终端上的生活更加高效(又有趣!)。 @@ -46,7 +46,7 @@ via: https://opensource.com/article/20/1/linux-terminal-trick 作者:[Opensource.com][a] 选题:[lujun9972][b] 译者:[wxy](https://github.com/wxy) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 6b88060a2ca2a553c173c52d76f3b12eefa296b1 Mon Sep 17 00:00:00 2001 From: Xingyu Wang Date: Sat, 25 Jan 2020 14:00:31 +0800 Subject: [PATCH 2/3] PUB @wxy https://linux.cn/article-11817-1.html --- .../20200119 What-s your favorite Linux terminal trick.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename {translated/tech => published}/20200119 What-s your favorite Linux terminal trick.md (98%) diff --git a/translated/tech/20200119 What-s your favorite Linux terminal trick.md b/published/20200119 What-s your favorite Linux terminal trick.md similarity index 98% rename from translated/tech/20200119 What-s your favorite Linux terminal trick.md rename to published/20200119 What-s your favorite Linux terminal trick.md index 5acd642ad5..675f36a935 100644 --- a/translated/tech/20200119 What-s your favorite Linux terminal trick.md +++ b/published/20200119 What-s your favorite Linux terminal trick.md @@ -1,8 +1,8 @@ [#]: collector: (lujun9972) [#]: translator: (wxy) [#]: reviewer: (wxy) -[#]: publisher: ( ) -[#]: url: ( ) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-11817-1.html) [#]: subject: (What's your favorite Linux terminal trick?) [#]: via: (https://opensource.com/article/20/1/linux-terminal-trick) [#]: author: (Opensource.com https://opensource.com/users/admin) From d52a68e3c20ae227f4cc62080fd77786b081f6ca Mon Sep 17 00:00:00 2001 From: Xingyu Wang Date: Sat, 25 Jan 2020 21:16:29 +0800 Subject: [PATCH 3/3] TSL @robsean --- ...game player to run forward and backward.md | 949 +++++++++--------- 1 file changed, 475 insertions(+), 474 deletions(-) rename {sources => translated}/tech/20191211 Enable your Python game player to run forward and backward.md (73%) diff --git a/sources/tech/20191211 Enable your Python game player to run forward and backward.md b/translated/tech/20191211 Enable your Python game player to run forward and backward.md similarity index 73% rename from sources/tech/20191211 Enable your Python game player to run forward and backward.md rename to translated/tech/20191211 Enable your Python game player to run forward and backward.md index bde74f1526..e55d24d051 100644 --- a/sources/tech/20191211 Enable your Python game player to run forward and backward.md +++ b/translated/tech/20191211 Enable your Python game player to run forward and backward.md @@ -1,474 +1,475 @@ -[#]: collector: (lujun9972) -[#]: translator: (robsean) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) -[#]: subject: (Enable your Python game player to run forward and backward) -[#]: via: (https://opensource.com/article/19/12/python-platformer-game-run) -[#]: author: (Seth Kenlon https://opensource.com/users/seth) - -Enable your Python game player to run forward and backward -====== -Let your player run free by enabling the side-scroller effect in your -Python platformer using the Pygame module. -![Gaming artifacts with joystick, GameBoy, paddle][1] - -This is part 8 in an ongoing series about creating video games in Python 3 using the Pygame module. Previous articles are: - - * [Learn how to program in Python by building a simple dice game][2] - * [Build a game framework with Python using the Pygame module][3] - * [How to add a player to your Python game][4] - * [Using Pygame to move your game character around][5] - * [What's a hero without a villain? How to add one to your Python game][6] - * [Simulate gravity in your Python game][7] - * [Add jumping to your Python platformer game][8] - - - -In previous entries in this series about creating video games in [Python 3][9] using the [Pygame][10] module, you designed your level-design layout, but some portion of your level probably extended past your viewable screen. The ubiquitous solution to that problem in platformer games is, as the term "side-scroller" suggests, scrolling. - -The key to scrolling is to make the platforms around the player sprite move when the player sprite gets close to the edge of the screen. This provides the illusion that the screen is a "camera" panning across the game world. - -This scrolling trick requires two dead zones at either edge of the screen, at which point your avatar stands still while the world scrolls by. - -### Putting the scroll in side-scroller - -You need one trigger point to go forward and another if you want your player to be able to go backward. These two points are simply two variables. Set them each about 100 or 200 pixels from each screen edge. Create the variables in your **setup** section. In the following code, the first two lines are for context, so just add the last two lines: - - -``` -player_list.add(player) -steps = 10 -forwardX  = 600 -backwardX = 230 -``` - -In the main loop, check to see if your player sprite is at the **forwardx** or **backwardx** scroll point. If so, move all platforms either left or right, depending on whether the world is moving forward or backward. In the following code, the final three lines of code are only for your reference: - - -``` -        # scroll the world forward -        if player.rect.x >= forwardx: -                scroll = player.rect.x - forwardx -                player.rect.x = forwardx -                for p in plat_list: -                        p.rect.x -= scroll - -        # scroll the world backward -        if player.rect.x <= backwardx: -                scroll = backwardx - player.rect.x -                player.rect.x = backwardx -                for p in plat_list: -                        p.rect.x += scroll - -        ## scrolling code above -    world.blit(backdrop, backdropbox) -    player.gravity() # check gravity -    player.update() -``` - -Launch your game and try it out. - -![Scrolling the world in Pygame][11] - -Scrolling works as expected, but you may notice a small problem that happens when you scroll the world around your player and non-player sprites: the enemy sprite doesn't scroll along with the world. Unless you want - -your enemy sprite to pursue your player endlessly, you need to modify the enemy code so that when your player makes an expeditious retreat, the enemy is left behind. - -### Enemy scroll - -In your main loop, you must apply the same rules for scrolling platforms to your enemy's position. Because your game world will (presumably) have more than one enemy in it, the rules are applied to your enemy list rather than an individual enemy sprite. That's one of the advantages of grouping similar elements into lists. - -The first two lines are for context, so just add the final two to your main loop: - - -``` -    # scroll the world forward -    if player.rect.x >= forwardx: -        scroll = player.rect.x - forwardx -        player.rect.x = forwardx -        for p in plat_list: -            p.rect.x -= scroll -        for e in enemy_list: -            e.rect.x -= scroll -``` - -To scroll in the other direction: - - -``` -    # scroll the world backward -    if player.rect.x <= backwardx: -        scroll = backwardx - player.rect.x -        player.rect.x = backwardx -        for p in plat_list: -            p.rect.x += scroll -        for e in enemy_list: -            e.rect.x += scroll -``` - -Launch the game again and see what happens. - -Here's all the code you've written for this Python platformer so far: - - -``` -#!/usr/bin/env python3 -# draw a world -# add a player and player control -# add player movement -# add enemy and basic collision -# add platform -# add gravity -# add jumping -# add scrolling - -# GNU All-Permissive License -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved.  This file is offered as-is, -# without any warranty. - -import pygame -import sys -import os - -''' -Objects -''' - -class Platform(pygame.sprite.Sprite): -    # x location, y location, img width, img height, img file     -    def __init__(self,xloc,yloc,imgw,imgh,img): -        pygame.sprite.Sprite.__init__(self) -        self.image = pygame.image.load(os.path.join('images',img)).convert() -        self.image.convert_alpha() -        self.rect = self.image.get_rect() -        self.rect.y = yloc -        self.rect.x = xloc - -class Player(pygame.sprite.Sprite): -    ''' -    Spawn a player -    ''' -    def __init__(self): -        pygame.sprite.Sprite.__init__(self) -        self.movex = 0 -        self.movey = 0 -        self.frame = 0 -        self.health = 10 -        self.collide_delta = 0 -        self.jump_delta = 6 -        self.score = 1 -        self.images = [] -        for i in range(1,9): -            img = pygame.image.load(os.path.join('images','hero' + str(i) + '.png')).convert() -            img.convert_alpha() -            img.set_colorkey(ALPHA) -            self.images.append(img) -            self.image = self.images[0] -            self.rect  = self.image.get_rect() - -    def jump(self,platform_list): -        self.jump_delta = 0 - -    def gravity(self): -        self.movey += 3.2 # how fast player falls -        -        if self.rect.y > worldy and self.movey >= 0: -            self.movey = 0 -            self.rect.y = worldy-ty -        -    def control(self,x,y): -        ''' -        control player movement -        ''' -        self.movex += x -        self.movey += y -        -    def update(self): -        ''' -        Update sprite position -        ''' -        -        self.rect.x = self.rect.x + self.movex -        self.rect.y = self.rect.y + self.movey - -        # moving left -        if self.movex < 0: -            self.frame += 1 -            if self.frame > ani*3: -                self.frame = 0 -            self.image = self.images[self.frame//ani] - -        # moving right -        if self.movex > 0: -            self.frame += 1 -            if self.frame > ani*3: -                self.frame = 0 -            self.image = self.images[(self.frame//ani)+4] - -        # collisions -        enemy_hit_list = pygame.sprite.spritecollide(self, enemy_list, False) -        for enemy in enemy_hit_list: -            self.health -= 1 -            #print(self.health) - -        plat_hit_list = pygame.sprite.spritecollide(self, plat_list, False) -        for p in plat_hit_list: -            self.collide_delta = 0 # stop jumping -            self.movey = 0 -            if self.rect.y > p.rect.y: -                self.rect.y = p.rect.y+ty -            else: -                self.rect.y = p.rect.y-ty -            -        ground_hit_list = pygame.sprite.spritecollide(self, ground_list, False) -        for g in ground_hit_list: -            self.movey = 0 -            self.rect.y = worldy-ty-ty -            self.collide_delta = 0 # stop jumping -            if self.rect.y > g.rect.y: -                self.health -=1 -                print(self.health) -                -        if self.collide_delta < 6 and self.jump_delta < 6: -            self.jump_delta = 6*2 -            self.movey -= 33  # how high to jump -            self.collide_delta += 6 -            self.jump_delta    += 6 -            -class Enemy(pygame.sprite.Sprite): -    ''' -    Spawn an enemy -    ''' -    def __init__(self,x,y,img): -        pygame.sprite.Sprite.__init__(self) -        self.image = pygame.image.load(os.path.join('images',img)) -        self.movey = 0 -        #self.image.convert_alpha() -        #self.image.set_colorkey(ALPHA) -        self.rect = self.image.get_rect() -        self.rect.x = x -        self.rect.y = y -        self.counter = 0 - -                -    def move(self): -        ''' -        enemy movement -        ''' -        distance = 80 -        speed = 8 - -        self.movey += 3.2 -        -        if self.counter >= 0 and self.counter <= distance: -            self.rect.x += speed -        elif self.counter >= distance and self.counter <= distance*2: -            self.rect.x -= speed -        else: -            self.counter = 0 -        -        self.counter += 1 - -        if not self.rect.y >= worldy-ty-ty: -            self.rect.y += self.movey - -        plat_hit_list = pygame.sprite.spritecollide(self, plat_list, False) -        for p in plat_hit_list: -            self.movey = 0 -            if self.rect.y > p.rect.y: -                self.rect.y = p.rect.y+ty -            else: -                self.rect.y = p.rect.y-ty - -        ground_hit_list = pygame.sprite.spritecollide(self, ground_list, False) -        for g in ground_hit_list: -            self.rect.y = worldy-ty-ty - -        -class Level(): -    def bad(lvl,eloc): -        if lvl == 1: -            enemy = Enemy(eloc[0],eloc[1],'yeti.png') # spawn enemy -            enemy_list = pygame.sprite.Group() # create enemy group -            enemy_list.add(enemy)              # add enemy to group -            -        if lvl == 2: -            print("Level " + str(lvl) ) - -        return enemy_list - -    def loot(lvl,lloc): -        print(lvl) - -    def ground(lvl,gloc,tx,ty): -        ground_list = pygame.sprite.Group() -        i=0 -        if lvl == 1: -            while i < len(gloc): -                ground = Platform(gloc[i],worldy-ty,tx,ty,'ground.png') -                ground_list.add(ground) -                i=i+1 - -        if lvl == 2: -            print("Level " + str(lvl) ) - -        return ground_list - -    def platform(lvl,tx,ty): -        plat_list = pygame.sprite.Group() -        ploc = [] -        i=0 -        if lvl == 1: -            ploc.append((0,worldy-ty-128,3)) -            ploc.append((300,worldy-ty-256,3)) -            ploc.append((500,worldy-ty-128,4)) - -            while i < len(ploc): -                j=0 -                while j <= ploc[i][2]: -                    plat = Platform((ploc[i][0]+(j*tx)),ploc[i][1],tx,ty,'ground.png') -                    plat_list.add(plat) -                    j=j+1 -                print('run' + str(i) + str(ploc[i])) -                i=i+1 - -        if lvl == 2: -            print("Level " + str(lvl) ) - -        return plat_list - -''' -Setup -''' -worldx = 960 -worldy = 720 - -fps = 40 # frame rate -ani = 4  # animation cycles -clock = pygame.time.Clock() -pygame.init() -main = True - -BLUE  = (25,25,200) -BLACK = (23,23,23 ) -WHITE = (254,254,254) -ALPHA = (0,255,0) - -world = pygame.display.set_mode([worldx,worldy]) -backdrop = pygame.image.load(os.path.join('images','stage.png')).convert() -backdropbox = world.get_rect() -player = Player() # spawn player -player.rect.x = 0 -player.rect.y = 0 -player_list = pygame.sprite.Group() -player_list.add(player) -steps = 10 -forwardx = 600 -backwardx = 230 - -eloc = [] -eloc = [200,20] -gloc = [] -#gloc = [0,630,64,630,128,630,192,630,256,630,320,630,384,630] -tx = 64 #tile size -ty = 64 #tile size - -i=0 -while i <= (worldx/tx)+tx: -    gloc.append(i*tx) -    i=i+1 - -enemy_list = Level.bad( 1, eloc ) -ground_list = Level.ground( 1,gloc,tx,ty ) -plat_list = Level.platform( 1,tx,ty ) - -''' -Main loop -''' -while main == True: -    for event in pygame.event.get(): -        if event.type == pygame.QUIT: -            pygame.quit(); sys.exit() -            main = False - -        if event.type == pygame.KEYDOWN: -            if event.key == pygame.K_LEFT or event.key == ord('a'): -                print("LEFT") -                player.control(-steps,0) -            if event.key == pygame.K_RIGHT or event.key == ord('d'): -                print("RIGHT") -                player.control(steps,0) -            if event.key == pygame.K_UP or event.key == ord('w'): -                print('jump') - -        if event.type == pygame.KEYUP: -            if event.key == pygame.K_LEFT or event.key == ord('a'): -                player.control(steps,0) -            if event.key == pygame.K_RIGHT or event.key == ord('d'): -                player.control(-steps,0) -            if event.key == pygame.K_UP or event.key == ord('w'): -                player.jump(plat_list) - -            if event.key == ord('q'): -                pygame.quit() -                sys.exit() -                main = False - -    # scroll the world forward -    if player.rect.x >= forwardx: -        scroll = player.rect.x - forwardx -        player.rect.x = forwardx -        for p in plat_list: -            p.rect.x -= scroll -        for e in enemy_list: -            e.rect.x -= scroll -                -    # scroll the world backward -    if player.rect.x <= backwardx: -        scroll = backwardx - player.rect.x -        player.rect.x = backwardx -        for p in plat_list: -            p.rect.x += scroll -        for e in enemy_list: -            e.rect.x += scroll - -    world.blit(backdrop, backdropbox) -    player.gravity() # check gravity -    player.update() -    player_list.draw(world) #refresh player position -    enemy_list.draw(world)  # refresh enemies -    ground_list.draw(world)  # refresh enemies -    plat_list.draw(world)   # refresh platforms -    for e in enemy_list: -        e.move() -    pygame.display.flip() -    clock.tick(fps) -``` - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/19/12/python-platformer-game-run - -作者:[Seth Kenlon][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/seth -[b]: https://github.com/lujun9972 -[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/open_gaming_games_roundup_news.png?itok=KM0ViL0f (Gaming artifacts with joystick, GameBoy, paddle) -[2]: https://opensource.com/article/17/10/python-101 -[3]: https://opensource.com/article/17/12/game-framework-python -[4]: https://opensource.com/article/17/12/game-python-add-a-player -[5]: https://opensource.com/article/17/12/game-python-moving-player -[6]: https://opensource.com/article/18/5/pygame-enemy -[7]: https://opensource.com/article/19/11/simulate-gravity-python -[8]: https://opensource.com/article/19/12/jumping-python-platformer-game -[9]: https://www.python.org/ -[10]: https://www.pygame.org/news -[11]: https://opensource.com/sites/default/files/uploads/pygame-scroll.jpg (Scrolling the world in Pygame) +[#]: collector: (lujun9972) +[#]: translator: (robsean) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) +[#]: subject: (Enable your Python game player to run forward and backward) +[#]: via: (https://opensource.com/article/19/12/python-platformer-game-run) +[#]: author: (Seth Kenlon https://opensource.com/users/seth) + +使你的 Python 游戏玩家能够向前和向后跑 +====== +使用 Pygame 模块来使你的 Python 平台开启侧滚效果,来让你的玩家自由奔跑。 +![Gaming artifacts with joystick, GameBoy, paddle][1] + +这是仍在进行中的关于使用 Pygame 模块来在 Python 3 中在创建电脑游戏的第八部分。先前的文章是: + + * [通过构建一个简单的掷骰子游戏去学习怎么用 Python 编程][2] + * [使用 Python 和 Pygame 模块构建一个游戏框架][3] + * [如何在你的 Python 游戏中添加一个玩家][4] + * [用 Pygame 使你的游戏角色移动起来][5] + * [如何向你的 Python 游戏中添加一个敌人][6] + * [在 Pygame 游戏中放置平台][12] + * [在你的 Python 游戏中模拟引力][7] + * [为你的 Python 平台类游戏添加跳跃功能][8] + + + +在这一系列关于使用 [Pygame][10] 模块来在 [Python 3][9]中创建电脑游戏的先前条目中,你已经设计了你的层设计布局,但是你的层的一些部分可能已近超出你的可视屏幕。在平台类游戏中,这个问题的普遍解决方案是,像术语"侧滚动"表明的一样,滚动。 + +滚动的关键是当玩家精灵接近屏的幕边缘时,使在玩家精灵周围的平台移动。这样给予一种错觉,屏幕是一个在游戏世界中穿梭追拍的"摄像机"。 + +这个滚动技巧需要两个在屏幕边缘的绝对区域,在绝对区域内的点处,在世界滚动期间,你的化身静止不动。 + +### 在侧滚动条中放置卷轴 + +如果你希望你的玩家能够后退,你需要一个触发点来向前和向后。这两个点仅仅是两个变量。设置它们各个距各个屏幕边缘大约 100 或 200 像素。在你的 **setup** 部分中创建变量。在下面的代码中,前两行用于背景说明,所以仅需要添加这行后的代码: + + +``` +player_list.add(player) +steps = 10 +forwardX  = 600 +backwardX = 230 +``` + +在主循环中,查看你的玩家精灵是否在 **前进** 或 **后退** 滚动点处。如果是这样,向左或向右移动使用的平台,取决于世界是向前或向后移动。在下面的代码中,代码的最后三行仅供你参考: + + +``` +        # scroll the world forward +        if player.rect.x >= forwardx: +                scroll = player.rect.x - forwardx +                player.rect.x = forwardx +                for p in plat_list: +                        p.rect.x -= scroll + +        # scroll the world backward +        if player.rect.x <= backwardx: +                scroll = backwardx - player.rect.x +                player.rect.x = backwardx +                for p in plat_list: +                        p.rect.x += scroll + +        ## scrolling code above +    world.blit(backdrop, backdropbox) +    player.gravity() # check gravity +    player.update() +``` + +启动你的游戏,并尝试它。 + +![Scrolling the world in Pygame][11] + +滚动工作像预期的一样,但是你可能注意到一个发生的小问题,当你滚动你的玩家和非玩家精灵周围的世界时:敌人精灵不随同世界滚动。除非你愿意。 + +你的敌人精灵要无休止地追逐你的玩家,你需要修改敌人代码,以便当你的玩家快速撤退时,敌人被留在hz后面。 + +### 敌人卷轴 + +在你的主循环中,你必需为你的敌人的位置的卷轴平台应用相同的规则。因为你的游戏世界将(很可能)有不止一个敌人在其中,该规则被应用于你的敌人列表,而不是一个单独的敌人精灵。 这是分组类似元素到列表中的优点之一。 + +前两行用于背景注释,所以只需添加这两行后面的代码到你的主循环中: + + +``` +    # scroll the world forward +    if player.rect.x >= forwardx: +        scroll = player.rect.x - forwardx +        player.rect.x = forwardx +        for p in plat_list: +            p.rect.x -= scroll +        for e in enemy_list: +            e.rect.x -= scroll +``` + +来滚向另一个方向: + + +``` +    # scroll the world backward +    if player.rect.x <= backwardx: +        scroll = backwardx - player.rect.x +        player.rect.x = backwardx +        for p in plat_list: +            p.rect.x += scroll +        for e in enemy_list: +            e.rect.x += scroll +``` + +再次启动游戏,看看发生什么。 + +这里是到目前为止你已经为这个 Python 平台所写所有的代码: + + +``` +#!/usr/bin/env python3 +# draw a world +# add a player and player control +# add player movement +# add enemy and basic collision +# add platform +# add gravity +# add jumping +# add scrolling + +# GNU All-Permissive License +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved.  This file is offered as-is, +# without any warranty. + +import pygame +import sys +import os + +''' +Objects +''' + +class Platform(pygame.sprite.Sprite): +    # x location, y location, img width, img height, img file     +    def __init__(self,xloc,yloc,imgw,imgh,img): +        pygame.sprite.Sprite.__init__(self) +        self.image = pygame.image.load(os.path.join('images',img)).convert() +        self.image.convert_alpha() +        self.rect = self.image.get_rect() +        self.rect.y = yloc +        self.rect.x = xloc + +class Player(pygame.sprite.Sprite): +    ''' +    Spawn a player +    ''' +    def __init__(self): +        pygame.sprite.Sprite.__init__(self) +        self.movex = 0 +        self.movey = 0 +        self.frame = 0 +        self.health = 10 +        self.collide_delta = 0 +        self.jump_delta = 6 +        self.score = 1 +        self.images = [] +        for i in range(1,9): +            img = pygame.image.load(os.path.join('images','hero' + str(i) + '.png')).convert() +            img.convert_alpha() +            img.set_colorkey(ALPHA) +            self.images.append(img) +            self.image = self.images[0] +            self.rect  = self.image.get_rect() + +    def jump(self,platform_list): +        self.jump_delta = 0 + +    def gravity(self): +        self.movey += 3.2 # how fast player falls +        +        if self.rect.y > worldy and self.movey >= 0: +            self.movey = 0 +            self.rect.y = worldy-ty +        +    def control(self,x,y): +        ''' +        control player movement +        ''' +        self.movex += x +        self.movey += y +        +    def update(self): +        ''' +        Update sprite position +        ''' +        +        self.rect.x = self.rect.x + self.movex +        self.rect.y = self.rect.y + self.movey + +        # moving left +        if self.movex < 0: +            self.frame += 1 +            if self.frame > ani*3: +                self.frame = 0 +            self.image = self.images[self.frame//ani] + +        # moving right +        if self.movex > 0: +            self.frame += 1 +            if self.frame > ani*3: +                self.frame = 0 +            self.image = self.images[(self.frame//ani)+4] + +        # collisions +        enemy_hit_list = pygame.sprite.spritecollide(self, enemy_list, False) +        for enemy in enemy_hit_list: +            self.health -= 1 +            #print(self.health) + +        plat_hit_list = pygame.sprite.spritecollide(self, plat_list, False) +        for p in plat_hit_list: +            self.collide_delta = 0 # stop jumping +            self.movey = 0 +            if self.rect.y > p.rect.y: +                self.rect.y = p.rect.y+ty +            else: +                self.rect.y = p.rect.y-ty +            +        ground_hit_list = pygame.sprite.spritecollide(self, ground_list, False) +        for g in ground_hit_list: +            self.movey = 0 +            self.rect.y = worldy-ty-ty +            self.collide_delta = 0 # stop jumping +            if self.rect.y > g.rect.y: +                self.health -=1 +                print(self.health) +                +        if self.collide_delta < 6 and self.jump_delta < 6: +            self.jump_delta = 6*2 +            self.movey -= 33  # how high to jump +            self.collide_delta += 6 +            self.jump_delta    += 6 +            +class Enemy(pygame.sprite.Sprite): +    ''' +    Spawn an enemy +    ''' +    def __init__(self,x,y,img): +        pygame.sprite.Sprite.__init__(self) +        self.image = pygame.image.load(os.path.join('images',img)) +        self.movey = 0 +        #self.image.convert_alpha() +        #self.image.set_colorkey(ALPHA) +        self.rect = self.image.get_rect() +        self.rect.x = x +        self.rect.y = y +        self.counter = 0 + +                +    def move(self): +        ''' +        enemy movement +        ''' +        distance = 80 +        speed = 8 + +        self.movey += 3.2 +        +        if self.counter >= 0 and self.counter <= distance: +            self.rect.x += speed +        elif self.counter >= distance and self.counter <= distance*2: +            self.rect.x -= speed +        else: +            self.counter = 0 +        +        self.counter += 1 + +        if not self.rect.y >= worldy-ty-ty: +            self.rect.y += self.movey + +        plat_hit_list = pygame.sprite.spritecollide(self, plat_list, False) +        for p in plat_hit_list: +            self.movey = 0 +            if self.rect.y > p.rect.y: +                self.rect.y = p.rect.y+ty +            else: +                self.rect.y = p.rect.y-ty + +        ground_hit_list = pygame.sprite.spritecollide(self, ground_list, False) +        for g in ground_hit_list: +            self.rect.y = worldy-ty-ty + +        +class Level(): +    def bad(lvl,eloc): +        if lvl == 1: +            enemy = Enemy(eloc[0],eloc[1],'yeti.png') # spawn enemy +            enemy_list = pygame.sprite.Group() # create enemy group +            enemy_list.add(enemy)              # add enemy to group +            +        if lvl == 2: +            print("Level " + str(lvl) ) + +        return enemy_list + +    def loot(lvl,lloc): +        print(lvl) + +    def ground(lvl,gloc,tx,ty): +        ground_list = pygame.sprite.Group() +        i=0 +        if lvl == 1: +            while i < len(gloc): +                ground = Platform(gloc[i],worldy-ty,tx,ty,'ground.png') +                ground_list.add(ground) +                i=i+1 + +        if lvl == 2: +            print("Level " + str(lvl) ) + +        return ground_list + +    def platform(lvl,tx,ty): +        plat_list = pygame.sprite.Group() +        ploc = [] +        i=0 +        if lvl == 1: +            ploc.append((0,worldy-ty-128,3)) +            ploc.append((300,worldy-ty-256,3)) +            ploc.append((500,worldy-ty-128,4)) + +            while i < len(ploc): +                j=0 +                while j <= ploc[i][2]: +                    plat = Platform((ploc[i][0]+(j*tx)),ploc[i][1],tx,ty,'ground.png') +                    plat_list.add(plat) +                    j=j+1 +                print('run' + str(i) + str(ploc[i])) +                i=i+1 + +        if lvl == 2: +            print("Level " + str(lvl) ) + +        return plat_list + +''' +Setup +''' +worldx = 960 +worldy = 720 + +fps = 40 # frame rate +ani = 4  # animation cycles +clock = pygame.time.Clock() +pygame.init() +main = True + +BLUE  = (25,25,200) +BLACK = (23,23,23 ) +WHITE = (254,254,254) +ALPHA = (0,255,0) + +world = pygame.display.set_mode([worldx,worldy]) +backdrop = pygame.image.load(os.path.join('images','stage.png')).convert() +backdropbox = world.get_rect() +player = Player() # spawn player +player.rect.x = 0 +player.rect.y = 0 +player_list = pygame.sprite.Group() +player_list.add(player) +steps = 10 +forwardx = 600 +backwardx = 230 + +eloc = [] +eloc = [200,20] +gloc = [] +#gloc = [0,630,64,630,128,630,192,630,256,630,320,630,384,630] +tx = 64 #tile size +ty = 64 #tile size + +i=0 +while i <= (worldx/tx)+tx: +    gloc.append(i*tx) +    i=i+1 + +enemy_list = Level.bad( 1, eloc ) +ground_list = Level.ground( 1,gloc,tx,ty ) +plat_list = Level.platform( 1,tx,ty ) + +''' +Main loop +''' +while main == True: +    for event in pygame.event.get(): +        if event.type == pygame.QUIT: +            pygame.quit(); sys.exit() +            main = False + +        if event.type == pygame.KEYDOWN: +            if event.key == pygame.K_LEFT or event.key == ord('a'): +                print("LEFT") +                player.control(-steps,0) +            if event.key == pygame.K_RIGHT or event.key == ord('d'): +                print("RIGHT") +                player.control(steps,0) +            if event.key == pygame.K_UP or event.key == ord('w'): +                print('jump') + +        if event.type == pygame.KEYUP: +            if event.key == pygame.K_LEFT or event.key == ord('a'): +                player.control(steps,0) +            if event.key == pygame.K_RIGHT or event.key == ord('d'): +                player.control(-steps,0) +            if event.key == pygame.K_UP or event.key == ord('w'): +                player.jump(plat_list) + +            if event.key == ord('q'): +                pygame.quit() +                sys.exit() +                main = False + +    # scroll the world forward +    if player.rect.x >= forwardx: +        scroll = player.rect.x - forwardx +        player.rect.x = forwardx +        for p in plat_list: +            p.rect.x -= scroll +        for e in enemy_list: +            e.rect.x -= scroll +                +    # scroll the world backward +    if player.rect.x <= backwardx: +        scroll = backwardx - player.rect.x +        player.rect.x = backwardx +        for p in plat_list: +            p.rect.x += scroll +        for e in enemy_list: +            e.rect.x += scroll + +    world.blit(backdrop, backdropbox) +    player.gravity() # check gravity +    player.update() +    player_list.draw(world) #refresh player position +    enemy_list.draw(world)  # refresh enemies +    ground_list.draw(world)  # refresh enemies +    plat_list.draw(world)   # refresh platforms +    for e in enemy_list: +        e.move() +    pygame.display.flip() +    clock.tick(fps) +``` + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/19/12/python-platformer-game-run + +作者:[Seth Kenlon][a] +选题:[lujun9972][b] +译者:[robsean](https://github.com/robsean) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/seth +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/open_gaming_games_roundup_news.png?itok=KM0ViL0f (Gaming artifacts with joystick, GameBoy, paddle) +[2]: https://opensource.com/article/17/10/python-101 +[3]: https://opensource.com/article/17/12/game-framework-python +[4]: https://opensource.com/article/17/12/game-python-add-a-player +[5]: https://opensource.com/article/17/12/game-python-moving-player +[6]: https://opensource.com/article/18/5/pygame-enemy +[7]: https://opensource.com/article/19/11/simulate-gravity-python +[8]: https://opensource.com/article/19/12/jumping-python-platformer-game +[9]: https://www.python.org/ +[10]: https://www.pygame.org/news +[11]: https://opensource.com/sites/default/files/uploads/pygame-scroll.jpg (Scrolling the world in Pygame) +[12]:https://opensource.com/article/18/7/put-platforms-python-game