दूसरा स्प्राइट जोड़ना pygame ट्यूटोरियल साथ काम नहीं करता

वोट
0

मैं इस से इस कोड का उपयोग किया गया है ट्यूटोरियल 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)
14/01/2020 को 00:03
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


1 जवाब

वोट
2

अपने कोड पर ध्यान देने के लिए मुद्दों की एक संख्या हैं।

स्तर वर्ग के लिए एक नजर डालें। आप अपने वर्ग में स्वयं उपयोग करने के लिए वर्ग कार्यों और चर का उल्लेख करने की जरूरत है। मैं एक दूसरे दुश्मन (spr.png) जोड़ने के लिए एक दूसरे समारोह को शामिल किया है, इसलिए मैं समारोह के बाहर enemy_list शब्दों में कहें, श्रेणी स्तर पर है, इसलिए यह दोनों कार्यों के द्वारा पहुँचा जा सकता है।

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

मैं भी इस हिस्से को बदल दिया। सबसे पहले, आप (देखें एल = स्तर ()) वर्ग का दृष्टांत करने की जरूरत है, तो आप अपने कार्यों और चर का उपयोग कर सकते हैं। ध्यान दें कि आप 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)

मेरे कोड काफी "हैक", कुछ जल्दी और आसानी से देखने-में-है, लेकिन यह अब काम करता है ...

14/01/2020 को 00:32
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more