Python 我试图添加碰撞,但它不是';行不通 导入pygame 导入操作系统,系统 随机输入 输入数学 img_path=os.path.join(“punch.png”) img_blob=os.path.join(“blob.png”) 类敌人(对象): 定义初始化(self,x,y): 超级(敌人,自己)。\uuuuu init\uuuuuuu() self.image=pygame.Surface([160160]) self.image.set_颜色键(黑色) blit(pygame.image.load(img_blob),(0,0)) self.rect=self.image.get_rect() self.rect.x=x 自校正y=y 自身速度=2 def向玩家移动(自身、角色): dx,dy=character.rect.x-self.rect.x,character.rect.y-self.rect.y 距离=数学形下(dx,dy) dx,dy=dx/dist,dy/dist self.rect.x+=dx*self.speed self.rect.y+=dy*self.speed def绘图(自、表面): blit(self.image,(self.rect.x,self.rect.y)) 类角色(pygame.sprite.sprite): 定义初始化(self,x=275,y=250): 超级(字符,自我)。\uuuu初始化 self.image=pygame.Surface([160160]) self.image.set_颜色键(黑色) self.image.blit(pygame.image.load(img_路径),(0,0)) self.rect=self.image.get_rect() self.rect.x=x 自校正y=y def移动(自): key=pygame.key.get_pressed() 距离=10 如果键[pygame.K_w]: 自整y-=距离 elif key[pygame.K_s]: 自校正y+=距离 如果键[pygame.K_a]: 自校正x-=距离 elif key[pygame.K_d]: self.rect.x+=dist 如果self.rect.x>1110: self.rect.x=1110 如果自校正y710: 自校正y=710 如果self.rect.x300和self.rect.y500且self.rect.x300,self.rect.y500,self.rect.x

Python 我试图添加碰撞,但它不是';行不通 导入pygame 导入操作系统,系统 随机输入 输入数学 img_path=os.path.join(“punch.png”) img_blob=os.path.join(“blob.png”) 类敌人(对象): 定义初始化(self,x,y): 超级(敌人,自己)。\uuuuu init\uuuuuuu() self.image=pygame.Surface([160160]) self.image.set_颜色键(黑色) blit(pygame.image.load(img_blob),(0,0)) self.rect=self.image.get_rect() self.rect.x=x 自校正y=y 自身速度=2 def向玩家移动(自身、角色): dx,dy=character.rect.x-self.rect.x,character.rect.y-self.rect.y 距离=数学形下(dx,dy) dx,dy=dx/dist,dy/dist self.rect.x+=dx*self.speed self.rect.y+=dy*self.speed def绘图(自、表面): blit(self.image,(self.rect.x,self.rect.y)) 类角色(pygame.sprite.sprite): 定义初始化(self,x=275,y=250): 超级(字符,自我)。\uuuu初始化 self.image=pygame.Surface([160160]) self.image.set_颜色键(黑色) self.image.blit(pygame.image.load(img_路径),(0,0)) self.rect=self.image.get_rect() self.rect.x=x 自校正y=y def移动(自): key=pygame.key.get_pressed() 距离=10 如果键[pygame.K_w]: 自整y-=距离 elif key[pygame.K_s]: 自校正y+=距离 如果键[pygame.K_a]: 自校正x-=距离 elif key[pygame.K_d]: self.rect.x+=dist 如果self.rect.x>1110: self.rect.x=1110 如果自校正y710: 自校正y=710 如果self.rect.x300和self.rect.y500且self.rect.x300,self.rect.y500,self.rect.x,python,pygame,collision,Python,Pygame,Collision,当我运行代码时,blob(敌人)不会生成,但是当我在敌人中取出for敌人时,假定是碰撞,blob会生成并跟随。我已经尝试了很多关于碰撞的方法,但这是我第一次在pygame中创建游戏,所以我必须查找所有内容。我想你的问题是,有时你的敌人正好在玩家旁边繁殖,所以碰撞会立即发生。我不知道您使用的图像看起来如何,但请确保它们不会太大,并且有大量的空白空间,因为您的碰撞不是像素完美的,而是使用图像的整个大小/矩形 否则,到目前为止,您的代码应该可以正常工作,但您仍然可以对其进行一些改进。例如,由于您已经为

当我运行代码时,blob(敌人)不会生成,但是当我在敌人中取出for敌人时,假定是碰撞,blob会生成并跟随。我已经尝试了很多关于碰撞的方法,但这是我第一次在pygame中创建游戏,所以我必须查找所有内容。

我想你的问题是,有时你的敌人正好在玩家旁边繁殖,所以碰撞会立即发生。我不知道您使用的图像看起来如何,但请确保它们不会太大,并且有大量的空白空间,因为您的碰撞不是像素完美的,而是使用图像的整个大小/矩形

否则,到目前为止,您的代码应该可以正常工作,但您仍然可以对其进行一些改进。例如,由于您已经为
角色
使用了
Sprite
类,因此还可以使用Group类使代码更简单一些(绘制/移动/碰撞检测)

下面是它的样子:

import pygame
import os,sys
import random
import math

img_path = os.path.join("punch.png")
img_blob = os.path.join("blob.png")

class Enemy(object):
    def __init__(self,x,y):
        super(Enemy,self).__init__()
        self.image = pygame.Surface([160,160])
        self.image.set_colorkey(black)
        self.image.blit(pygame.image.load(img_blob),(0,0))
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.speed = 2
    def move_towards_player(self,character):
        dx,dy = character.rect.x - self.rect.x,character.rect.y - self.rect.y
        dist = math.hypot(dx,dy)
        dx,dy = dx / dist,dy / dist
        self.rect.x += dx * self.speed
        self.rect.y += dy * self.speed
    def draw(self,surface):

        surface.blit(self.image,(self.rect.x,self.rect.y))
class character(pygame.sprite.Sprite):

    def __init__(self, x = 275, y = 250):

        super(character,self).__init__()
        self.image = pygame.Surface([160,160])
        self.image.set_colorkey(black)
        self.image.blit(pygame.image.load(img_path),(0,0))
        self.rect = self.image.get_rect()
        self.rect.x = x

        self.rect.y = y



    def movement(self):

        key = pygame.key.get_pressed()

        dist = 10

        if key[pygame.K_w]:

            self.rect.y -= dist

        elif key[pygame.K_s]:

            self.rect.y += dist

        if key[pygame.K_a]:

            self.rect.x -= dist

        elif key[pygame.K_d]:

            self.rect.x += dist


        if self.rect.x > 1110:

            self.rect.x = 1110

        if self.rect.y < 20:

            self.rect.y = 20

        elif self.rect.y > 710:

            self.rect.y = 710
        if self.rect.x <20:
            self.rect.x = 20
        elif self.rect.x == 1110 and self.rect.y > 300 and self.rect.y < 400:
            self.rect.x = 25
        if self.rect.y == 20 and self.rect.x >500 and self.rect.x < 600:
            self.rect.y = 715
        elif self.rect.x == 20 and self.rect.y > 300 and self.rect.y < 400:
            self.rect.x = 1090
        if self.rect.y == 710 and self.rect.x >500 and self.rect.x < 600:
            self.rect.y = 25

# top of left and right doors are y = 220, bottom of left and right doors are y = 240 # right side of top and bottom doors are x = 285, left of top and bottom doors are x = 260
def collide(self,enemy,enemy_list):
    if self.rect.colliderect(enemy.rect):
        enemy_list.remove(enemy)

def draw(self,surface):

    surface.blit(self.image,(self.rect.x,self.rect.y))






pygame.init()                               # Pygame is initialised (starts running)

players = pygame.sprite.Group()

screen = pygame.display.set_mode([1250,850]) # Set the width and height of the screen [width,height]

pygame.display.set_caption("My Game")       # Name your window

background_image = pygame.image.load("untilted.png")


done = False                                # Loop until the user clicks the close button.

clock = pygame.time.Clock()                 # Used to manage how fast the screen updates

black    = (   0,   0,   0)                 # Define some colors using rgb values.  These can be

white    = ( 255, 255, 255)                 # used throughout the game instead of using rgb values.



# Define additional Functions and Procedures here
score = 0
bird = character()
blob = Enemy(random.randint(10,700),random.randint(10,400))
enemies = [blob]

# -------- Main Program Loop -----------

while done == False:



    for event in pygame.event.get():        # Check for an event (mouse click, key press)

        if event.type == pygame.QUIT:       # If user clicked close window

            done = True                     # Flag that we are done so we exit this loop

# Update sprites here
    for blob in enemies:
        blob.move_towards_player(bird)
        bird.collide(blob,enemies)
        blob.draw(screen)
    bird.movement()

    screen.blit(background_image,[0,0])

    bird.draw(screen)
    blob.draw(screen)



    pygame.display.update()                   # Go ahead and update the screen with what we've drawn.

    clock.tick(20)                        # Limit to 20 frames per second
    score += 1
pygame.quit()                               # Close the window and quit.
导入pygame
导入操作系统,系统
随机输入
输入数学
img_path=os.path.join(“punch.png”)
img_blob=os.path.join(“blob.png”)
班级演员(pygame.sprite.sprite):
定义初始化(self,x,y):
超级(演员,自我)。\uuuuu init\uuuuuuu()
self.image=pygame.Surface([160160])
self.image.set_颜色键(黑色)
self.image.blit(pygame.image.load(img_路径),(0,0))
self.rect=self.image.get_rect()
self.rect.x=x
自校正y=y
自身速度=2
班级敌人(演员):
定义初始化(self,x,y):
超级(敌人,自己)。\uuuu初始(x,y)
self.target=None
def更新(自身、敌人):
如果自我目标:
dx,dy=self.target.rect.x-self.rect.x,self.target.rect.y-self.rect.y
距离=数学形下(dx,dy)
dx,dy=
import pygame
import os,sys
import random
import math

img_path = os.path.join("punch.png")
img_blob = os.path.join("blob.png")

class Actor(pygame.sprite.Sprite):

    def __init__(self, x, y):
        super(Actor,self).__init__()
        self.image = pygame.Surface([160,160])
        self.image.set_colorkey(black)
        self.image.blit(pygame.image.load(img_path),(0,0))
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.speed = 2

class Enemy(Actor):

    def __init__(self, x, y):
         super(Enemy, self).__init__(x, y)
         self.target = None

    def update(self, enemies):
        if self.target:
            dx,dy =  self.target.rect.x - self.rect.x,  self.target.rect.y - self.rect.y
            dist = math.hypot(dx,dy)
            dx,dy = dx / dist,dy / dist
            self.rect.x += dx * self.speed
            self.rect.y += dy * self.speed

class Character(Actor):

    def __init__(self, x = 275, y = 250):
        super(Character, self).__init__(x, y)
        self.speed = 10

    def update(self, enemies):

        pygame.sprite.spritecollide(self, enemies, True)

        key = pygame.key.get_pressed()

        if key[pygame.K_w]:
            self.rect.y -= self.speed
        elif key[pygame.K_s]:
            self.rect.y += self.speed
        if key[pygame.K_a]:
            self.rect.x -= self.speed
        elif key[pygame.K_d]:
            self.rect.x += self.speed

        if self.rect.x > 1110:
            self.rect.x = 1110

        if self.rect.y < 20:
            self.rect.y = 20

        elif self.rect.y > 710:
            self.rect.y = 710
        if self.rect.x <20:
            self.rect.x = 20
        elif self.rect.x == 1110 and self.rect.y > 300 and self.rect.y < 400:
            self.rect.x = 25
        if self.rect.y == 20 and self.rect.x >500 and self.rect.x < 600:
            self.rect.y = 715
        elif self.rect.x == 20 and self.rect.y > 300 and self.rect.y < 400:
            self.rect.x = 1090
        if self.rect.y == 710 and self.rect.x >500 and self.rect.x < 600:
            self.rect.y = 25


pygame.init()                               # Pygame is initialised (starts running)

players = pygame.sprite.Group()
screen = pygame.display.set_mode([1250,850]) # Set the width and height of the screen [width,height]
pygame.display.set_caption("My Game")       # Name your window
background_image = pygame.image.load("untilted.png")

done = False                                # Loop until the user clicks the close button.

clock = pygame.time.Clock()                 # Used to manage how fast the screen updates
black    = (   0,   0,   0)                 # Define some colors using rgb values.  These can be
white    = ( 255, 255, 255)                 # used throughout the game instead of using rgb values.

# Define additional Functions and Procedures here
score = 0
bird = Character()
blob = Enemy(random.randint(500,700),random.randint(300,400))
blob.target=bird
all_sprites = pygame.sprite.Group([blob, bird])
enemies = pygame.sprite.Group([blob])

# -------- Main Program Loop -----------
while done == False:

    for event in pygame.event.get():        # Check for an event (mouse click, key press)
        if event.type == pygame.QUIT:       # If user clicked close window
            done = True                     # Flag that we are done so we exit this loop

    screen.blit(background_image, (0, 0))

    all_sprites.update(enemies)
    all_sprites.draw(screen)

    pygame.display.update()                   # Go ahead and update the screen with what we've drawn.

    clock.tick(20)                        # Limit to 20 frames per second
    score += 1
pygame.quit()