问题描述
我已经对它进行了编码,以便当我跳跃时我的播放器类的底部碰撞应该为真,并且当我与地板碰撞时它将被设置为真,并且我在更新开始时将碰撞类型重置为假功能。但是为什么底部碰撞类型不保持为真,有时会变为假。 谢谢!
游戏文件:
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 (将#修改为@)