Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pygame平台碰撞_Python_Pygame - Fatal编程技术网

Python pygame平台碰撞

Python pygame平台碰撞,python,pygame,Python,Pygame,我正在pygame中制作一个平台,学习引擎 我让它创建块的多个实例,我有一个玩家对象,它可以以更快的速度下落。我怎样才能使它在球员击中拦网时不会掉下来?这是我的密码: #imports import pygame, sys from pygame.locals import * #init game pygame.init() screen = pygame.display.set_mode((640,480)) pygame.key.set_repeat(True) clock = pyg

我正在pygame中制作一个平台,学习引擎

我让它创建块的多个实例,我有一个玩家对象,它可以以更快的速度下落。我怎样才能使它在球员击中拦网时不会掉下来?这是我的密码:

#imports
import pygame, sys
from pygame.locals import *

#init game
pygame.init()
screen = pygame.display.set_mode((640,480))
pygame.key.set_repeat(True) 
clock = pygame.time.Clock()

#classes
class playerClass:
    x = 100
    y = 100
    boundingBox_x = 32
    boundingBox_y = 32
    sprite = pygame.image.load("Image2.png").convert_alpha()

class Block(object):

    sprite = None

    def __init__(self, x, y):
        if not Block.sprite:
            Block.sprite = pygame.image.load("Image1.png").convert_alpha()
        self.rect = Block.sprite.get_rect(top=y, left=x)

#objects
playerObject = playerClass()
blocks = []
blocks.append(Block(0, 14*32))
blocks.append(Block(1*32, 14*32))
blocks.append(Block(2*32, 14*32))
blocks.append(Block(3*32, 14*32))
blocks.append(Block(4*32, 14*32))
blocks.append(Block(5*32, 14*32))
blocks.append(Block(6*32, 14*32))
blocks.append(Block(7*32, 14*32))
blocks.append(Block(8*32, 14*32))
blocks.append(Block(9*32, 14*32))
blocks.append(Block(10*32, 14*32))
blocks.append(Block(11*32, 14*32))
blocks.append(Block(12*32, 14*32))
blocks.append(Block(13*32, 14*32))
blocks.append(Block(14*32, 14*32))
blocks.append(Block(15*32, 14*32))
blocks.append(Block(16*32, 14*32))
blocks.append(Block(17*32, 14*32))
blocks.append(Block(18*32, 14*32))
blocks.append(Block(19*32, 14*32))

blocks.append(Block(0, 13*32))
blocks.append(Block(19*32, 13*32))
blocks.append(Block(0, 13*32))
blocks.append(Block(19*32, 13*32))
blocks.append(Block(0, 12*32))
blocks.append(Block(19*32, 12*32))
blocks.append(Block(0, 11*32))
blocks.append(Block(19*32, 11*32))
#colors
white = 255,255,255

#variables
up = False
down = False
right = False
left = False

xspeed = 0
yspeed = 0
gspeed = 0.2
#functions

#main loop
quitting = False
while quitting == False:
    for event in pygame.event.get():

#event processing
        if event.type == pygame.QUIT:
            quitting = True

#game logic
    yspeed += gspeed
    playerObject.y += yspeed
#drawing
    screen.fill((white))

    screen.blit(playerObject.sprite,(playerObject.x,playerObject.y))
    for block in blocks:
        screen.blit(block.sprite, block.rect)

    pygame.display.flip()

#ending
    clock.tick(60)

此外,我知道我正在使用大量代码来构建该级别。我正在开发一个系统来读取txt文件的级别。感谢

实现这一点的简单方法是使用模块,该模块正是为这类事情而设计的

该页面上的示例显示了您想做的大部分事情;pygame附带的示例显示了所有细节

但简单地说:将
Block
Player
作为
sprite.sprite
的两个子类,将所有
Block
放入一个sprite组,而不仅仅是一个列表,然后使用
spritecollizeany(Player,Block\u group)
,这就是它的全部内容


如果你想手动操作,那就没那么难了。您需要像跟踪每个方块一样跟踪玩家的边界矩形,然后代替此:

spritecollideany(player, block_group)
…您可以这样做:

player.rect.collidelist([block.rect for block in blocks]) != -1

一般来说,sprite所做的每件事,你都可以用大约两倍的代码来完成。当然,你必须弄清楚你需要用
sprite
做的所有事情,这个简单的sprite和groups API告诉你在大多数游戏中你要用它们做的所有事情。

如果你使用这个模块,它可以帮你完成大部分艰苦的工作。如果你只是使用图像,并尝试自己做这一切,有更多的工作要做。你想要哪一个答案?顺便说一句,你的代码似乎有一个不同的严重问题:几乎所有东西都使用类属性而不是实例属性。这意味着该类的所有实例将共享相同的值。您通常不想使用类属性,除了常数或全局行为标志之类的东西。@abarnert:好的。我该怎么处理?你说的“处理”是什么意思?切换到pygame.sprite?仅使用普通图像和坐标手动执行碰撞检测?是否将类属性更改为实例属性?@abarnert:我已经解决了其余的问题,但是需要帮助将类属性更改为实例属性