pygame教程添加第二个精灵不起作用

亚科夫·NNNNM

我一直在使用本教程中的这段代码https://opensource.com/article/18/5/pygame-enemy,但是我不能仅仅通过使用添加更多敌人

enemy   = Enemy(40,100,'spr.png')# spawn enemy
enemy_list = pygame.sprite.Group()   # create enemy group
enemy_list.add(enemy)                # add enemy to group

原始图像来自此处https://opengameart.org/sites/default/files/opp2_sprites.zip,但为了便于说明,我在imgur中进行了分隔:

内容文件夹图像

yeti.png: https ://imgur.com/GNNcU6z

stage.png: https ://imgur.com/YyiEJ0q

以及我想放置的第二个敌人(精神)的图像

spr.png: https ://imgur.com/1fYXa7Y

我尝试使用类似问题的解决方案,如何在pygame中添加敌人?,但只有错误或没有结果。

我的代码:

import pygame
import sys
import os
'''
Objects
'''

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.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 = 20
        speed = 8

        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


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

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.frame = 0
        self.images = []
        for i in range(1, 5):
            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 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 > 3 * ani:
                self.frame = 0
            self.image = self.images[self.frame // ani]
        # collisions
        enemy_hit_list = pygame.sprite.spritecollide(self, enemy_list, False)
        for enemy in enemy_hit_list:
            self.health -= 1
            print(self.health)

        # moving right
        if self.movex > 0:
            self.frame += 1
            if self.frame > 3 * ani:
                self.frame = 0
            self.image = self.images[(self.frame // ani)]


'''
Setup
'''

worldx = 560
worldy = 520

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  # how fast to move
eloc = []
eloc = [200,20]
enemy_list = Level.bad( 1, eloc )
'''
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'):
                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'):
                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 == ord('q'):
                pygame.quit()
                sys.exit()
                main = False

#    world.fill(BLACK)
    world.blit(backdrop, backdropbox)
    player.update()
    player_list.draw(world)  #refresh player position
    enemy_list.draw(world)
    for e in enemy_list:
        e.move()
    pygame.display.flip()
    clock.tick(fps)

在您的代码上有很多问题要注意。

看一下Level类。您需要在类中使用self来引用类的函数和变量。我添加了第二个函数来添加第二个敌人(spr.png),因此我在类级别将敌人列表放在了函数之外,因此两个函数都可以访问它。

class Level:

    def __init__(self):
        self.enemy_list = pygame.sprite.Group()  # create enemy group

    def bad_1(self, lvl, eloc):
        if lvl == 1:
            enemy = Enemy(eloc[0],eloc[1],'yeti.png') # spawn enemy
            self.enemy_list.add(enemy)              # add enemy to group
        if lvl == 2:
            print("Level " + str(lvl) )

        return self.enemy_list

    def bad_2(self, lvl, eloc):
        if lvl == 1:
            enemy = Enemy(eloc[0],eloc[1],'spr.png') # spawn enemy
            self.enemy_list.add(enemy)              # add enemy to group
        if lvl == 2:
            print("Level " + str(lvl) )

        return self.enemy_list

我也更改了这部分。首先,您需要实例化该类(请参见l = Level()),然后可以使用其函数和变量。请注意,您仅调用一次Level.bad(),所以只有一个敌人!

steps = 10  # how fast to move
l = Level()
eloc = [200,20]
enemy_list = l.bad_1(1, eloc)
eloc = [100,10]
enemy_list = l.bad_2(1, eloc)

我的代码相当“黑客”,可以快速看到,但是现在可以使用了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

第二个 JQuery 代码不起作用

来自分类Dev

在.htacces中添加第二个重写规则不起作用

来自分类Dev

多个jQuery-当添加第二个jQuery库时,Plupload不起作用

来自分类Dev

实体框架5,代码优先和使用第二个DbContext的添加迁移不起作用

来自分类Dev

向 jQuery UI 日期选择器添加第二个日期格式不起作用

来自分类Dev

C ++中两个连续的for循环,第二个循环不起作用

来自分类Dev

两个jQuery的插件,第二个不起作用

来自分类Dev

我正在编写2个查询,但第二个查询不起作用

来自分类Dev

NGINX第二个limit_req在重写后不起作用

来自分类Dev

第二个面板中的ScrollView不起作用

来自分类Dev

过滤器的第二个参数不起作用

来自分类Dev

第二个对话框上的C ++ MFC按钮不起作用

来自分类Dev

TinyMCE在第二个初始化上不起作用

来自分类Dev

jQuery:多个getJSON请求,第二个不起作用

来自分类Dev

Angular.js第二个控制器不起作用。

来自分类Dev

Spring Security,为什么第二个WebSecurityConfigurerAdapter不起作用?

来自分类Dev

GUI:第二个窗口的setSize()方法不起作用

来自分类Dev

为什么tk.IntVar在第二个tk窗口中不起作用?

来自分类Dev

代码在第二个宏中不起作用

来自分类Dev

为什么连接内的第二个命令不起作用?

来自分类Dev

第二个产量在JavaScript Generator函数中不起作用

来自分类Dev

第二个对话框上的C ++ MFC按钮不起作用

来自分类Dev

尝试在字符串中查找第二个整数-不起作用

来自分类Dev

为什么我的JavaScript第二个计数器不起作用?

来自分类Dev

第二个容器中的Xcode Swift按钮不起作用

来自分类Dev

如果第二个参数是数字,则bisectLeft函数不起作用

来自分类Dev

htaccess第二个重写规则不起作用

来自分类Dev

CSS Media查询-链接到第二个样式表不起作用

来自分类Dev

MATLAB,嵌套的For Loop在第二个迭代中不起作用

Related 相关文章

  1. 1

    第二个 JQuery 代码不起作用

  2. 2

    在.htacces中添加第二个重写规则不起作用

  3. 3

    多个jQuery-当添加第二个jQuery库时,Plupload不起作用

  4. 4

    实体框架5,代码优先和使用第二个DbContext的添加迁移不起作用

  5. 5

    向 jQuery UI 日期选择器添加第二个日期格式不起作用

  6. 6

    C ++中两个连续的for循环,第二个循环不起作用

  7. 7

    两个jQuery的插件,第二个不起作用

  8. 8

    我正在编写2个查询,但第二个查询不起作用

  9. 9

    NGINX第二个limit_req在重写后不起作用

  10. 10

    第二个面板中的ScrollView不起作用

  11. 11

    过滤器的第二个参数不起作用

  12. 12

    第二个对话框上的C ++ MFC按钮不起作用

  13. 13

    TinyMCE在第二个初始化上不起作用

  14. 14

    jQuery:多个getJSON请求,第二个不起作用

  15. 15

    Angular.js第二个控制器不起作用。

  16. 16

    Spring Security,为什么第二个WebSecurityConfigurerAdapter不起作用?

  17. 17

    GUI:第二个窗口的setSize()方法不起作用

  18. 18

    为什么tk.IntVar在第二个tk窗口中不起作用?

  19. 19

    代码在第二个宏中不起作用

  20. 20

    为什么连接内的第二个命令不起作用?

  21. 21

    第二个产量在JavaScript Generator函数中不起作用

  22. 22

    第二个对话框上的C ++ MFC按钮不起作用

  23. 23

    尝试在字符串中查找第二个整数-不起作用

  24. 24

    为什么我的JavaScript第二个计数器不起作用?

  25. 25

    第二个容器中的Xcode Swift按钮不起作用

  26. 26

    如果第二个参数是数字,则bisectLeft函数不起作用

  27. 27

    htaccess第二个重写规则不起作用

  28. 28

    CSS Media查询-链接到第二个样式表不起作用

  29. 29

    MATLAB,嵌套的For Loop在第二个迭代中不起作用

热门标签

归档