试图在 pygame 中制作一个 "solid" 块,但它不起作用
Trying to make a "solid" block in pygame but it doesnt work
希望你能帮助我,
在过去的几天里,我一直在为这个问题而苦苦挣扎。
我想为我正在开发的 2d 平台游戏制作一个 "solid" 方块,但是当我进入那个 "solid" 方块时,我传送到另一边或方块底部,我不知道为什么,希望你知道为什么
所以这是我的代码:
class Block(pygame.sprite.Sprite):
def __init__(self, color = blue,widht = 64, height = 64):
super(Block, self).__init__()
self.image = pygame.Surface((widht, height))
self.image.fill(color)
self.rect = self.image.get_rect()
self.sound = pygame.mixer.Sound("2dSounds/Walk.wav")
self.hspeed = 0
self.vspeed = 0
def update(self, collidable):
self.rect.x += self.hspeed
collision_list = pygame.sprite.spritecollide(self, collidable, False)
for collided_object in collision_list:
if (self.hspeed > 0):
# right direction
self.rect.right = collided_object.rect.left
elif (self.hspeed < 0):
# left direction
self.rect.left = collided_object.rect.right
self.rect.y += self.vspeed
collision_list = pygame.sprite.spritecollide(self, collidable, False)
for collided_object in collision_list:
if (self.vspeed > 0):
# down direction
self.rect.bottom = collided_object.rect.top
elif (self.vspeed < 0):
# up direction
self.rect.top = collided_object.rect.bottom
def change_speed(self, hspeed, vspeed):
self.hspeed += hspeed
self.vspeed += vspeed
def set_position(self, x, y):
self.rect.x = x
self.rect.y = y
非常感谢! :)
抱歉,我的代码不是基于您的代码,我实际上只是在过去 5 分钟内将它拼凑在一起,所以它不是很漂亮,但它是:
from pygame.locals import *
import pygame
import sys
GRAVITY = 1.2
class Player:
def __init__(self, x, y):
self.rect = pygame.Rect(x, y, 25, 25)
self.yvel = 0
def tick(self):
self.yvel += GRAVITY
self.rect.y += int(self.yvel)
if self.rect.y >= 475:
self.rect.y = 475
self.yvel = 0
def set(self, y):
if y:
self.yvel = y
class Block:
def __init__(self, x, y, w, h):
self.rect = pygame.Rect(x, y, w, h)
class Game:
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((500, 500))
self.player = Player(0, 0)
self.block = Block(225, 400, 50, 50)
def main(self):
right = left = False
while True:
self.screen.fill((230, 230, 230))
pygame.draw.rect(self.screen, (40, 40, 40), self.block.rect)
pygame.draw.rect(self.screen, (100, 200, 100), self.player.rect)
pygame.display.flip()
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit(0)
elif event.type == KEYDOWN:
if event.key == K_SPACE:
self.player.set(-20)
elif event.key == K_RIGHT:
right = True
elif event.key == K_LEFT:
left = True
elif event.type == KEYUP:
if event.key == K_RIGHT:
right = False
elif event.key == K_LEFT:
left = False
if right:
self.player.rect.x += 5
while self.player.rect.colliderect(self.block.rect):
self.player.rect.x -= 1
if left:
self.player.rect.x -= 5
while self.player.rect.colliderect(self.block.rect):
self.player.rect.x += 1
self.player.tick()
if self.player.yvel > 0:
while self.player.rect.colliderect(self.block.rect):
self.player.rect.y -= 1
self.player.yvel = 0
elif self.player.yvel < 0:
while self.player.rect.colliderect(self.block.rect):
self.player.rect.y += 1
self.player.yvel = 0
game = Game()
game.main()
播放器速度还是挺快的,不过可以在以下几行改:
self.player.rect.x -= 5
和
self.player.rect.x += 5
接近底部。
它的工作方式是每当你要移动时,它都会移动玩家,然后查看是否与方块发生碰撞。如果是,则玩家向相反方向移动,直到确信不再发生碰撞为止。
跳跃是通过速度完成的,因此 Player.yvel
和 GRAVITY
。 GRAVITY
可以更改,但如果它更高,跳跃将更短,反之亦然。
尝试一下代码并尝试方块位置 (self.block = Block(225, 400, 50, 50)
) 和玩家的凝视位置 (self.player = Player(0, 0)
)
如果您在代码中发现任何错误,请告诉我,我会尽力修复它们。
希望你能帮助我, 在过去的几天里,我一直在为这个问题而苦苦挣扎。 我想为我正在开发的 2d 平台游戏制作一个 "solid" 方块,但是当我进入那个 "solid" 方块时,我传送到另一边或方块底部,我不知道为什么,希望你知道为什么 所以这是我的代码:
class Block(pygame.sprite.Sprite):
def __init__(self, color = blue,widht = 64, height = 64):
super(Block, self).__init__()
self.image = pygame.Surface((widht, height))
self.image.fill(color)
self.rect = self.image.get_rect()
self.sound = pygame.mixer.Sound("2dSounds/Walk.wav")
self.hspeed = 0
self.vspeed = 0
def update(self, collidable):
self.rect.x += self.hspeed
collision_list = pygame.sprite.spritecollide(self, collidable, False)
for collided_object in collision_list:
if (self.hspeed > 0):
# right direction
self.rect.right = collided_object.rect.left
elif (self.hspeed < 0):
# left direction
self.rect.left = collided_object.rect.right
self.rect.y += self.vspeed
collision_list = pygame.sprite.spritecollide(self, collidable, False)
for collided_object in collision_list:
if (self.vspeed > 0):
# down direction
self.rect.bottom = collided_object.rect.top
elif (self.vspeed < 0):
# up direction
self.rect.top = collided_object.rect.bottom
def change_speed(self, hspeed, vspeed):
self.hspeed += hspeed
self.vspeed += vspeed
def set_position(self, x, y):
self.rect.x = x
self.rect.y = y
非常感谢! :)
抱歉,我的代码不是基于您的代码,我实际上只是在过去 5 分钟内将它拼凑在一起,所以它不是很漂亮,但它是:
from pygame.locals import *
import pygame
import sys
GRAVITY = 1.2
class Player:
def __init__(self, x, y):
self.rect = pygame.Rect(x, y, 25, 25)
self.yvel = 0
def tick(self):
self.yvel += GRAVITY
self.rect.y += int(self.yvel)
if self.rect.y >= 475:
self.rect.y = 475
self.yvel = 0
def set(self, y):
if y:
self.yvel = y
class Block:
def __init__(self, x, y, w, h):
self.rect = pygame.Rect(x, y, w, h)
class Game:
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((500, 500))
self.player = Player(0, 0)
self.block = Block(225, 400, 50, 50)
def main(self):
right = left = False
while True:
self.screen.fill((230, 230, 230))
pygame.draw.rect(self.screen, (40, 40, 40), self.block.rect)
pygame.draw.rect(self.screen, (100, 200, 100), self.player.rect)
pygame.display.flip()
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit(0)
elif event.type == KEYDOWN:
if event.key == K_SPACE:
self.player.set(-20)
elif event.key == K_RIGHT:
right = True
elif event.key == K_LEFT:
left = True
elif event.type == KEYUP:
if event.key == K_RIGHT:
right = False
elif event.key == K_LEFT:
left = False
if right:
self.player.rect.x += 5
while self.player.rect.colliderect(self.block.rect):
self.player.rect.x -= 1
if left:
self.player.rect.x -= 5
while self.player.rect.colliderect(self.block.rect):
self.player.rect.x += 1
self.player.tick()
if self.player.yvel > 0:
while self.player.rect.colliderect(self.block.rect):
self.player.rect.y -= 1
self.player.yvel = 0
elif self.player.yvel < 0:
while self.player.rect.colliderect(self.block.rect):
self.player.rect.y += 1
self.player.yvel = 0
game = Game()
game.main()
播放器速度还是挺快的,不过可以在以下几行改:
self.player.rect.x -= 5
和
self.player.rect.x += 5
接近底部。
它的工作方式是每当你要移动时,它都会移动玩家,然后查看是否与方块发生碰撞。如果是,则玩家向相反方向移动,直到确信不再发生碰撞为止。
跳跃是通过速度完成的,因此 Player.yvel
和 GRAVITY
。 GRAVITY
可以更改,但如果它更高,跳跃将更短,反之亦然。
尝试一下代码并尝试方块位置 (self.block = Block(225, 400, 50, 50)
) 和玩家的凝视位置 (self.player = Player(0, 0)
)
如果您在代码中发现任何错误,请告诉我,我会尽力修复它们。