为什么我的碰撞类型和 y 速度的更新速度不够快?

问题描述

我已经对它进行了编码,以便当我跳跃时我的播放器类的底部碰撞应该为真,并且当我与地板碰撞时它将被设置为真,并且我在更新开始时将碰撞类型重置为假功能。但是为什么底部碰撞类型不保持为真,有时会变为假。 谢谢!


游戏文件

class Game:
    def __init__(self):
        self.screen_size = (1280,720)
        self.window = pygame.display.set_mode(self.screen_size)
        self.screen = pygame.Surface((int(self.screen_size[0]/3),int(self.screen_size[1]/3)))
        self.fps = 60
        self.running = True
        self.bgcolor = (0,0)
        self.clock = pygame.time.Clock()
        self.handler = Handler("D:/PyCharm/pythonGame/dev/nils/pythonGame/game/levelDesign/map.txt",self.screen,self.screen_size)

    def events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.running = False

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_a: self.handler.objects["player"].dir["l"] = True
                if event.key == pygame.K_d: self.handler.objects["player"].dir["r"] = True
                if event.key == pygame.K_SPACE and self.handler.objects["player"].collisionTypes["bottom"]: self.handler.objects["player"].yVel = -5.5

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_a: self.handler.objects["player"].dir["l"] = False
                if event.key == pygame.K_d: self.handler.objects["player"].dir["r"] = False

    def update(self):
        self.handler.update()

播放器文件

class Player(PhysicsObject):
    def __init__(self,x:int,y:int,xSize:int,ySize:int):
        PhysicsObject.__init__(self,x,y,xSize,ySize)
        self.dir = {"l":False,"r":False}
        self.playerSpeed = 3

    def update(self,tileList:[],getCollisionList,screen_size:()):
        self.collisionTypes = {"left": False,"right": False,"top": False,"bottom": False}
        self.collisions2D(self.rect,tileList,getCollisionList)
        if self.dir["l"]: self.xVel = -self.playerSpeed
        elif self.dir["r"]: self.xVel = self.playerSpeed
        else: self.xVel = 0

        Camera.xScroll += int(self.rect.x - Camera.xScroll - screen_size[0] / 8) / 20
        Camera.yScroll += int(self.rect.y - Camera.yScroll - screen_size[1] / 8) / 20

物理对象文件

    def __init__(self,ySize:int):
        self.xVel = 0.0
        self.yVel = 0.0
        self.gravity = 0.2
        self.xSize = xSize
        self.ySize = ySize
        self.rect = pygame.Rect(x*self.xSize,y*self.ySize,ySize)
        self.collisionTypes = {"left":False,"right":False,"top":False,"bottom":False}

    def collisions2D(self,objectRect:pygame.Rect,getCollisionList):
        self.rect.x += self.xVel
        collisionList = getCollisionList(objectRect,tileList)
        for object in collisionList:
            if self.xVel > 0:
                self.rect.right = object[1].rect.left
                self.collisionTypes["left"] = True
            if self.xVel < 0:
                self.rect.left = object[1].rect.right
                self.collisionTypes["right"] = True

        self.rect.y += self.yVel
        collisionList = getCollisionList(objectRect,tileList)
        for object in collisionList:
            if self.yVel > 0:
                self.collisionTypes["bottom"] = True
                self.yVel = 0
                self.rect.bottom = object[1].rect.top
            if self.yVel < 0:
                self.yVel = 0
                self.rect.top = object[1].rect.bottom
                self.collisionTypes["top"] = True

        if self.yVel != 3:
            self.yVel += self.gravity

ObjectHandler 文件

import pygame
from dev.nils.pythonGame.game.objects.tile import *
from dev.nils.pythonGame.game.objects.player import *
from dev.nils.pythonGame.framework.physicsObject import *
from dev.nils.pythonGame.game.objects.enemy import *


class Handler:
    def __init__(self,path: str,screen: pygame.Surface,screen_size:()):
        self.path = path
        self.objects = {
            "player":Player(0,16,32)
        }
        self.screen = screen
        self.tileList = self.getTileList()
        self.screen_size = screen_size

        self.enemyHandler = EnemyHandler()

    def update(self):
        for object in self.objects.values():
            self.enemyHandler.update(self.tileList,self.getCollisionList,self.objects["player"])
            object.update(self.tileList,self.screen_size)

def getTileList(self):
        tiles = []
        x = 0
        y = 0
        with open(self.path) as map:
            map = list(map)
            for row in map:
                x = 0
                for tile in row:
                    if tile != "0":
                        tiles.append([tile,PhysicsObject(x,16)])
                    x += 1
                y += 1
        return tiles

    def getCollisionList(self,tileList:[]):
        collisions = []
        for tile in tileList:
            if objectRect.colliderect(tile[1].rect):
                collisions.append(tile)
        return collisions

我想要它以便我可以使用collisionTypes字典来检查碰撞是否真的是真的,我认为它与physicsObject类中的collisions2D函数有关,我将yVel变量设置为0并将底部变量设置为碰撞类型列表为真

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)