对象在pygame中使用重力时穿过屏幕

  • 本文关键字:屏幕 pygame 对象 python pygame
  • 更新时间 :
  • 英文 :


我是一名五年级学生,我正在制作一款平台游戏。当我使用重力时,我试图阻止我的球员穿过屏幕。我还需要帮助跳跃一次与点击和2次点击跳两倍高。我还使用了一些我在网上找到的代码片段。这是我的代码:

import pygame
canvas_width = 1000
canvas_height = 500
pygame.init()
screen = pygame.display.set_mode([canvas_width,canvas_height])
screen_rect = screen.get_rect()
clock = pygame.time.Clock()
red = (255,0,0)
blue = (0,0,255)
green = (0,255,0)
white = (255,255,255)
black = (0,0,0)

class Ground:
def __init__ (self,position,size,color):
self.xPos = position[0]
self.yPos = position[1]
self.width = size[0]
self.height = size[1]
self.color = color
self.rect = pygame.rect.Rect(position,size)
#class Enemyline:
#    def __init__ (self,position,size,color):
#        self.xPos = position[0]
#        self.yPos = position[1]
#        self.width = size[0]
#        self.height = size[1]
#        self.color = color
#        self.rect = pygame.rect.Rect(position,size)
#        #self.rect[(xPos,yPos),(width,height)]

#     def __init__(self, xsize, ysize,  color):
#         self.color = color
#         self.xsize = xsize
#         self.ysize = ysize
#         self.pos = [0, 10]
#         self.rect = pygame.rect.Rect(self.pos, (xsize, ysize))
class Ball:

def __init__(self,position,size,color):
self.xPos = position[0]
self.yPos = position[1]
self.width = size[0]
self.height = size[1]
self.color = color
#self.size = size
#self.pos = [10, 450]
self.speed = [0.001, 0.001]
#speed [xSpeed,ySpeed]
self.rect = pygame.rect.Rect(position,size)
#self.rect = pygame.rect.Rect(self.pos,(size,size))
def move (self):
self.keymove()
#self.hitRect(Enemyline)
self.gravity()
#self.edge()
self.rect.move_ip(self.speed)
#self.pos = self.rect[0:2]
pygame.draw.rect(screen, self.color,self.rect)

def touchRect(self,Enemyline, Ground):
#if self.rect.colliderect(Enemyline):
#self.speed[1] = self.speed[1] * -1

if self.rect.colliderect(Ground):
self.speed[1] = self.speed[1] * 0


def gravity(self):
self.speed[1] = self.speed[1] + 0.5

#     def edge(self):
#         spot = self.rect[0:2]
#         xPos = spot[0]
#         yPos = spot[1]
#         if xPos <= 0 or xPos >= (canvas_width - self.size):
#             self.speed[0] = self.speed[0] + 0
#         
#         if yPos <= 0 or yPos >= (canvas_height - self.size):
#             self.speed[1] = self.speed[1] + 0

def keymove(self):
spot = self.rect[0:2]
xPos = spot[0]
yPos = spot[1]


key = pygame.key.get_pressed()

if key[pygame.K_LEFT]:
self.speed[0] = self.speed[0] - 0.5

#RIGHT
if key[pygame.K_RIGHT]:
self.speed[0] = self.speed[0] + 0.5

#UP
if key[pygame.K_UP]:
self.speed[1] = self.speed[1] - 0.5
#DOWN
if key[pygame.K_DOWN]:
self.speed[1] = self.speed[1] + 0.5

if xPos <= 0 or xPos >= (canvas_width - (self.width + self.height)):
self.speed[0] = self.speed[0] * -1

if yPos <= 0 or yPos >= (canvas_height - (self.width + self.height)):
self.speed[1] = self.speed[1] * -1


#     def stop(self):
#         self.speed[0] = 0
#         self.speed[1] = 0
#         
#     def key_up(self):
#         if [pygame.K_LEFT] == pygame.KEYUP:
#             stop()



ball = Ball ([500,250],[30,30],blue)
ground = Ground ([0,470],[1000,10],green)
#L1enemy1 = Enemyline ([0,10], [1000,10],red)
Game = True
while Game:
for event in pygame.event.get():
if event.type == pygame.QUIT:
Game = False


ball.move()
#     if (ball.hitRect(L1enemy1) == True):
#         self.speed = [0.001, 0.001]
#         self.speed[1] = self.speed[1] * -1
screen.fill(black)
pygame.draw.rect(screen, ball.color, ball.rect)
pygame.draw.rect(screen, ground.color, ground.rect)
#    pygame.draw.rect(screen, L2enemy2.color, L2enemy2.rect)

pygame.display.update()
clock.tick(60)
pygame.quit()```
Is there anything you could do?
Thank you.

我玩了你的游戏,得到了相同的行为。在测试了各种代码块之后,我确定在与地面碰撞的过程中,"球"位置往往会在地面以下的位置切换时从"+";速度到"负"速度会出现。所以在球向上移动之前,它的位置会被检查。而且,由于它的位置仍然低于地面,这将再次使速度逆转为正值。因此,它显示了"在流沙中沉没"。的效果。一旦位置低于地面,它就会一直下沉。

你可能想要探索其他选项,但我让它停止在正负速度值之间振荡的方法是,当对象看起来在地面或地面以下时,改变以下代码行:

if yPos <= 0 or yPos >= (canvas_height - (self.width + self.height)):

:

if yPos <= 0 or yPos >= (canvas_height - (self.width + self.height)) and self.speed[1] > 0:

只有当所记录的速度为正时,才进行从正到负的速度切换,似乎提供了"减震器";抵消球的定位和着地测试之间的任何滞后的效果。

试一试,看看是否对你有帮助。

致意。

条件

if yPos <= 0 or yPos >= (canvas_height - (self.width + self.height)):

没有意义。把宽度和高度加在一起是毫无意义的。宽度是沿x轴的尺寸,高度是沿y轴的尺寸。您的代码工作是偶然的,因为self.width等于从窗口底部到绿线顶部的距离。你真正想做的是:

if yPos <= 0 or yPos >= ground.rect.top - self.height:

不管怎样,这并不能解决你的问题。这个问题与这里描述的问题类似:在乒乓球游戏中,有时球不会从球拍上弹开。真正的问题是速度降低了。如果物体在线以下,向上的速度不足以将物体提升到线以上,物体就会被卡住。

你有两个选择来解决这个问题

  1. 确保只要物体在地面以下,运动就向上。你可以用self.speed[1] = -abs(self.speed[1])来代替self.speed[1] = self.speed[1] * -1
if yPos <= 0:
self.speed[1] = abs(self.speed[1])
elif yPos >= ground.rect.top - self.height:
self.speed[1] = -abs(self.speed[1])
  1. 当物体落地时,将物体的底部限制在地面的顶部(self.rect[1] = ground.rect.top - self.height):
if yPos <= 0:
self.speed[1] = self.speed[1] * -1
elif yPos >= ground.rect.top - self.height:
self.speed[1] = self.speed[1] * -1
yPos = ground.rect.top - self.height
self.rect[1] = yPos

最新更新