【问题标题】:how to use collide direct for multiple sprites如何将碰撞直接用于多个精灵
【发布时间】:2018-04-06 12:56:31
【问题描述】:
#sprites

import random, sys, time, math, pygame
from pygame.locals import *
from pygame import mixer # Load the required library

FPS = 30 # frames per second to update the screen
fpsClock = pygame.time.Clock()
WINWIDTH = 1500 # width of the program's window, in pixels
WINHEIGHT = 1000 # height in pixels
HALF_WINWIDTH = int(WINWIDTH / 2)
HALF_WINHEIGHT = int(WINHEIGHT / 2)


moveX,moveY=0,0
move2X,move2Y=0,0


GRASSCOLOR = (24, 255, 0)
WHITE = (255, 255, 255)
PURPLE = (128, 0, 128)
RED = (255, 0, 0)
pygame.init()


global FPSCLOCK, DISPLAYSURF, self
DISPLAYSURF = pygame.display.set_mode((WINWIDTH, WINHEIGHT))
pygame.display.set_icon(pygame.image.load('god.png'))
pygame.display.set_caption('Smash Bros Melee')
BASICFONT = pygame.font.Font('freesansbold.ttf', 32)

class Sprite:
    def __init__(self,x,y):

        self.x=x
        self.y=y
        self.width=50
        self.height=50
        self.i0= pygame.image.load('ryanrenolds.jpeg')

        self.timeTarget=10
        self.timeNum=0
        self.currentImage=0

    def render(self):

            DISPLAYSURF.blit(self.i0, (self.x, self.y))

player=Sprite(0,0)

class Sprite2:
    def __init__(self,x,y):

        self.x=x
        self.y=y
        self.width=50
        self.height=50
        self.i0= pygame.image.load('ArkhamKnight.png')
        self.i1= pygame.image.load('Black-Panther.png')
        self.timeTarget=10
        self.timeNum=0
        self.currentImage=0

    def update(self):

        self.timeNum+=1

        if (self.timeNum==self.timeTarget):

            if (self.currentImage==0):
                self.currentImage+=1
            else:
                self.currentImage=0
            self.timeNum=0
        self.render()

    def render(self):

        if(self.currentImage==0):
            DISPLAYSURF.blit(self.i0, (self.x, self.y))

        else:
            DISPLAYSURF.blit(self.i1, (self.x, self.y))

player2=Sprite2(200,300)

def checkCollision(Sprite, Sprite2):
  col = Sprite.rect.colliderect(Sprite2.rect)
  if col == True:
    sys.exit()


while True:

        for event in pygame.event.get():


                if event.type == KEYUP:
                    if event.key == K_a:
                       moveX = moveX - 0
                    elif event.key == K_d:
                       moveX == False
                    elif event.key == K_w:
                       moveY == False
                    elif event.key == K_s:
                       moveY == False

                if (event.type==pygame.KEYDOWN):
                   if (event.key==pygame.K_a):
                      moveX = moveX - 5
                   elif (event.key==pygame.K_d):
                       moveX = moveX + 5
                   elif (event.key==pygame.K_w):
                       moveY = moveY - 5
                   elif (event.key==pygame.K_s):
                       moveY = moveY + 5
                   elif (event.key==pygame.K_ESCAPE):
                       pygame.quit()
                       sys.exit()


                if event.type == KEYUP:
                    if event.key == K_LEFT:
                       move2X = move2X - 0
                    elif event.key == K_RIGHT:
                        move2X == False
                    elif event.key == K_UP:
                        move2Y == False
                    elif event.key == K_DOWN:
                        move2Y == False

                if (event.type==pygame.KEYDOWN):
                    if (event.key==pygame.K_LEFT):
                        move2X = move2X - 5
                    elif (event.key==pygame.K_RIGHT):
                        move2X = move2X + 5
                    elif (event.key==pygame.K_UP):
                        move2Y = move2Y - 5
                    elif (event.key==pygame.K_DOWN):
                        move2Y = move2Y + 5
                    elif (event.key==pygame.K_o):
                        player=Sprite(0,0)
                        player2=Sprite2(200,300)
                    elif (event.key==pygame.K_ESCAPE):
                        pygame.quit()
                        sys.exit()

         DISPLAYSURF.fill(PURPLE)
         player.x+=moveX
         player.y+=moveY
         player2.x+=move2X
         player2.y+=move2Y
         player.render()
         player2.update()
         checkCollision(Sprite, Sprite2)
         pygame.display.update()
         fpsClock.tick(FPS)

 pygame.quit()
 sys.exit()

我如何穿上我的精灵会碰撞我的碰撞直接代码在我在参数中使用 self 时要求三个参数但是当我拿出 self 时它说类 Sprite 没有属性 'rect'

这是我不断收到的错误我该如何解决这个问题,我的游戏在哪里运行,如果我的精灵相互碰撞,我的精灵将退出游戏

Traceback(最近一次调用最后一次): 文件“C:\Python27\Sprites\sprites.py”,第 159 行,在 checkCollision(Sprite, Sprite2) 文件“C:\Python27\Sprites\sprites.py”,第 88 行,在 checkCollision 中 col = Sprite.rect.colliderect(Sprite2.rect) AttributeError: 类 Sprite 没有属性 'rect'

【问题讨论】:

  • 你能修复代码中的缩进吗...
  • 是的,你需要修正缩进吗
  • 但是那个错误告诉你问题是什么!查看您对Sprite2 的(?)定义。它是否定义了成员rect?不,所以添加它(如果你认为你需要它)或更改使用它的行中的代码。
  • 那么我需要初始化rect等于self.x,slef.y吗?对于我的两个精灵@usr2564301

标签: python python-3.x python-2.7 pygame


【解决方案1】:

您的 Sprite 类中没有属性 rect,这导致了这个问题。您还需要在 Sprite2 类中添加一个属性 rect。您可以使用get_rect() 方法来做到这一点。

您可以在您的 Sprite 类中执行此操作,方法是在 __init__(self) 中输入此内容

self.rect = self.i0.get_rect()

对于 Sprite2 类,您可以这样做(因为显示的图像可以更改,请将其放在 update() 中。)

if self.currentImage == 0:
    self.rect = self.i0.get_rect()
elif self.currentImage == 1:
    self.rect = self.i1.get_rect()

我希望这会有所帮助。

【讨论】:

  • 嘿@Ethanol 我使用了你的 get_rect() 代码,它给了我一个新错误,我将分享我的代码并向你展示我的新错误
猜你喜欢
  • 1970-01-01
  • 2012-11-29
  • 2021-11-26
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多