python - 如何在碰撞时更新玩家 Sprite - Pygame

标签 python pygame

好吧,目前当我的玩家与敌人(生物)碰撞时,生命值会减少 10 点并播放声音。现在我想在同一个 for 循环中更改 Sprite ,但它似乎没有按照我想要的方式工作。 这是我尝试更改 Sprite 的部分:(顺便说一句,玩家 Sprite 已经定义)

collided_mobs = pygame.sprite.spritecollide(player, mobs, True)
    for mob_sprite in collided_mobs:

        playersprite == pygame.image.load("triangleDMG.png")

        player_health = player_health - 10
        pygame.mixer.Sound.play(HITSOUND)

        m = Mob()
        sprites.add(m)
        mobs.add(m)

这是完整的代码,目前非常困惑,对此表示抱歉。:

from pygame import *
import random as rand
from colors import *
import os
import time
from timeit import default_timer as timer
# START TIMER
start = timer()

pygame.mixer.pre_init(44100, 16, 2, 4096)
pygame.init()

fps = 60
window_size = window_width, window_height = 800, 600

font = pygame.font.SysFont( "Power Green, Times New Roman, Arial", 25  )
font2 = pygame.font.SysFont( "Power Green, Times New Roman, Arial", 100  )

#all sprites load
playersprite = pygame.image.load( "triangle.png" )
playerspritedmg = pygame.image.load("triangleDMG.png")
lifeimg = pygame.image.load("health.png")
#bulletsprite = pygame.image.load(nothingyet)
'''
circle_sprites = []
circle_list = ["orange_circle.png", "purple_circle.png", "red_circle.png"]

for img in circle_list:
    circle_sprites.append(pygame.image.load(img))
    '''



zap = pygame.mixer.Sound("zap.wav")
GAMEOVER = pygame.mixer.Sound("gameover.wav")
secret = pygame.mixer.Sound("secret.wav")
HITSOUND = pygame.mixer.Sound("jab.wav")
pew = pygame.mixer.Sound("pew.wav")

overmsg = font2.render( 'GAME OVER', True, white )

score = 0

pygame.mixer.music.load('music.wav')
pygame.mixer.music.play(-1)

explode = pygame.mixer.Sound("explode.wav")


class Player(pygame.sprite.Sprite):
    #sprite for player
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = (playersprite)
        self.rect = self.image.get_rect()
        self.setprop()
        self.xspeed = 0
        self.delay = 100
        self.last_shot = pygame.time.get_ticks()




    def setprop( self ):

        self.rect = self.image.get_rect()

        self.orgin_x = self.rect.centerx
        self.orgin_y = self.rect.centery

    def set_position(self, x, y):
        self.rect.x = x - self.orgin_x
        self.rect.y = y - self.orgin_y

    def update(self):
        self.xspeed = 0
        keystate = pygame.key.get_pressed()
        '''
        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_LEFT]:
            #speed left
            self.xspeed = -9
        if keystate[pygame.K_RIGHT]:
            #speed right
            self.xspeed = 9
        self.rect.x += self.xspeed
        '''
        if keystate[pygame.MOUSEBUTTONDOWN]:
            self.shoot()

        if self.rect.right > window_width:
            self.rect.right = window_width

        if self.rect.left < 0:
            self.rect.left = 0

    def shoot(self):
        now = pygame.time.get_ticks()
        if now - self.last_shot > self.delay:
            self.last_shot = now
            bullet = Bullet(self.rect.centerx, self.rect.top)
            sprites.add(bullet)
            bullets.add(bullet)

class Mob(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image  = pygame.image.load('circle.png')
        self.rect   = self.image.get_rect()
        self.rect.x = rand.randrange(window_width - self.rect.width)
        self.rect.y = rand.randrange( -100, -40 )
        self.speedy  = rand.randrange(6, 8)
        self.speedx = rand.randrange( -3, 3 )

    def play_sound(self):
        self.sound.play()

    def update(self):
        self.rect.x += self.speedx
        self.rect.y += self.speedy
        if self.rect.top > window_height + 10 or self.rect.left < -20 or self.rect.right > window_width + 20:
            self.rect.x = rand.randrange(window_width - self.rect.width)
            self.rect.y = rand.randrange( -100, -40 )
            #enemy speed range
            self.speedy  = rand.randrange(6, 10 )



class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((10, 20))
        self.image.fill(red)
        self.rect = self.image.get_rect()
        self.rect.bottom = y
        self.rect.centerx = x
        self.speedy = -10

    def update(self):
        self.rect.y += self.speedy
        if self.rect.bottom > 0:
            self.kill

class Pow(pygame.sprite.Sprite):
    def __init__(self, center):
        pygame.sprite.Sprite.__init__(self)
        self.image = lifeimg
        self.rect = self.image.get_rect()
        self.rect.center = center
        self.speedy = 5

    def update(self):
        self.rect.y += self.speedy
        if self.rect.top > window_height:
            self.kill


def health_bars(player_health):
    if player_health > 75:
        player_health_color = green
    elif player_health > 50: 
        player_health_color = yellow
    else:
        player_health_color = red

    pygame.draw.rect(window, player_health_color, (20,20, player_health, 25))

def set_message(text):
    global message, previous_message
    message = font.render( 'HEALTH:' + str(player_health), True, white )
    previous_message = message

def set_score(text):
    global scoremsg
    scoremsg = font.render( 'SCORE:' + str(score), True, white )








#SPRITES
sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
bullets = pygame.sprite.Group()
player = Player()
sprites.add(player)
powerups = pygame.sprite.Group()
for i in range(8):
    m = Mob()
    sprites.add(m)
    mobs.add(m)
player.set_position( window_width/2, window_height/2 +215 )       


#main variables so window is a thing
window = pygame.display.set_mode( window_size, pygame.RESIZABLE )
pygame.display.set_caption('Dodge the boulders or shoot them (shooting gets you score)')
clock = pygame.time.Clock()


player_health = 100
running = True

#game loop
while ( running ):
    for event in pygame.event.get():
        if( event.type == pygame.QUIT ):
            running = False
        if( event.type == pygame.MOUSEMOTION ):
            mpos = pygame.mouse.get_pos()
            player.set_position(mpos[0], mpos[1])
        if( event.type == pygame.MOUSEBUTTONDOWN ):
            player.shoot()
            pygame.mixer.Sound.play(pew)
            print('pew')

    clock.tick( fps )
    set_message( player_health)
    set_score(set_score)


    window.fill(black)
    sprites.update()
    health_bars(player_health)

    #collide group with group
    hits = pygame.sprite.groupcollide(mobs, bullets, True, True)
    if hits:
        pygame.mixer.Sound.play(zap)
        score += 1
        if rand.random() > 0.9:
            pow = Pow(hit.rect.center)
            sprites.add(pow)
            powerups.add(pow)

    for hit in hits:
        m = Mob()
        sprites.add(m)
        mobs.add(m)

    #sprite with powerup
    hits = pygame.sprite.spritecollide(player, powerups, True)
    for hit in hits:
        player_health = player_health + 5




    #sprite with group
    collided_mobs = pygame.sprite.spritecollide(player, mobs, True)
    for mob_sprite in collided_mobs:

        playersprite == pygame.image.load("triangleDMG.png")

        player_health = player_health - 10
        pygame.mixer.Sound.play(HITSOUND)

        m = Mob()
        sprites.add(m)
        mobs.add(m)



    sprites.draw(window)
    window.blit( message, (20, 50) )
    window.blit( scoremsg, (window_width/2 + 310, window_height - 35) )

    #blits how long you lasted for
    if (player_health == 0):
        pygame.mixer.Sound.play(explode)
        pygame.mixer.music.stop()     
        pygame.mixer.Sound.play(GAMEOVER)
        #need the -1 so timeset wont go up until you get hit again
        player_health = player_health - 1
        elapsed_time = timer() - start # in seconds
        print ("You lasted " + (str(elapsed_time)) + " seconds!")
        timeset = font.render( "You lasted " + (str(elapsed_time)) + " seconds!", True, white )
        window.blit(timeset, (window_width / 2 - 160, window_height / 2 + 100))

    if (player_health == (-5)):
        pygame.mixer.Sound.play(explode)
        pygame.mixer.music.stop()     
        pygame.mixer.Sound.play(GAMEOVER)
        elapsed_time = timer() - start # in seconds
        timeset = font.render( "You lasted " + (str(elapsed_time)) + " seconds!", True, white )

    if (player_health <= 0):



        window.blit(overmsg, (window_width / 2 - 160, window_height / 2 -75))
        #timer msg
        window.blit(timeset, (window_width / 2 - 170, window_height / 2 + 100))


        '''SECRET
        if (player_health <= (-1000)):

            pygame.mixer.Sound.play(secret)

            if (player_health <= (-1150)):
                running = False
                '''



    pygame.display.update()


pygame.display.quit()
pygame.quit()

最佳答案

playersprite == pygame.image.load("triangleDMG.png") 是一个 bool 表达式。

您在 Player 类构造函数中将 player.image 属性设置为默认为 triangle.png

class Player(pygame.sprite.Sprite):
    #sprite for player
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        self.image = (playersprite) # You define this to be the image.

        self.rect = self.image.get_rect()
        self.setprop()
        self.xspeed = 0
        self.delay = 100
        self.last_shot = pygame.time.get_ticks()

为了更改玩家图像的值,您需要更改 player.image 而不是 playersprite

collided_mobs = pygame.sprite.spritecollide(player, mobs, True)
    for mob_sprite in collided_mobs:

        player.image = pygame.image.load("triangleDMG.png")

        player_health = player_health - 10
        pygame.mixer.Sound.play(HITSOUND)

        m = Mob()
        sprites.add(m)
        mobs.add(m)

关于python - 如何在碰撞时更新玩家 Sprite - Pygame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45177861/

相关文章:

python - Pygame 不允许我为 rect.move 使用 float ,但我需要它

python - 为什么三个 R、G 和 B 圆不能正确混合?

python - Pygame-检测是否按下了一个键?

python - 跟踪/记录您当前从事的编程项目的最佳方式是什么

python - 使用 groupby 和 pd.isnull 在 Pandas 系列上应用自定义函数

jquery - 如何使用 Django + jQuery 修复 XSS?

python - Pygame-transform.rotate 结果使用大量 RAM

python - 兰德指数函数(聚类性能评估)

python - Google Colab 花费太多时间来训练分类器。如何解决这个问题?

python - pygame 屏幕仅在我将窗口移出屏幕时才起作用