我是一个新的python和pygame,我想学习crashm,但我只知道如何检测冲突。
如何添加碰撞,使我可以在小方块移动的同时站在大方块上。我不知道如何使其站在另一个正方形上而不是被扔掉。在脚本的底部,我添加了碰撞检测,但是在不将其扔到侧面,顶部和底部的情况下,无法弄清楚如何使其真正站立在我的大块上。
pygame.init()
win = pygame.display.set_mode((500,500))
pygame.display.set_caption("THIS GAME IS KINDA ASS")
# first squrae
x = 50
y = 50
height= 50
width = 50
speed = 5
isJump = False
JumpCount = 10
# square 2
cordx = 100
cordy = 200
cordheight = 100
cordwidth = 100
# First Square
# main loop
runningame = True
while runningame:
pygame.time.delay(50)
for event in pygame.event.get():
if event.type == pygame.QUIT:
runningame = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
x -= speed
if keys[pygame.K_RIGHT]:
x += speed
if not(isJump):
if keys[pygame.K_UP]:
y -= speed
if keys[pygame.K_DOWN]:
y += speed
if keys[pygame.K_SPACE]:
isJump = True
else:
if JumpCount >= -10:
y -= (JumpCount *abs(JumpCount))
JumpCount -= 1
else:
isJump = False
JumpCount = 10
win.fill((0,0,0))
# I added a varabial to my player square
Player = pygame.draw.rect(win, (115, 235, 174), (x,y, height,width))
# second square
# this is the big box and its the enemy square that I want my script to stand on
Enemy = pygame.draw.rect(win, (202, 185 , 241), (cordx, cordy, cordheight,cordwidth))
if Player.colliderect(Enemy):
pygame.draw.rect(win, (140, 101, 211), (50,50,50,50))
pygame.display.update()
pygame.quit()
所以您有Player.colliderect(Enemy)
,所以您知道它发生碰撞时,您只需要从哪里弄清楚并相应地移动播放器即可。
一种不完美的简单方法是让玩家移动方向,如果玩家向下移动,则将玩家移动到敌人上方。
在您的代码中,您需要一个指示
direction = "not moving"
...
if keys[pygame.K_LEFT]:
x -= speed
direction = "left"
if keys[pygame.K_RIGHT]:
x += speed
direction = "right"
...
else:
if JumpCount >= -10:
y -= (JumpCount *abs(JumpCount))
JumpCount -= 1
if (JumpCount *abs(JumpCount)) > 0:
direction = "down"
else:
direction = "up"
...
if Player.colliderect(Enemy):
if direction == "down":
y -= player.bottom - enemy.top #get the amount that that the player is overlapping the enemy and take it off y so it no longer overlapping
elif direction == "up":
y += player.top - enemy.bottom
#do the same for left and right
另一种方法是使玩家和敌人Rects
并用它们代替x
和y
so
# first squrae
x = 50
y = 50
height= 50
width = 50
player = pygame.Rect(x,y,width,height)
speed = 5
isJump = False
JumpCount = 10
# square 2
cordx = 100
cordy = 200
cordheight = 100
cordwidth = 100
enemy = pygame.Rect(cordc,cordy,cordwidth,cordheight)
然后可以用它们绘制它们
win.fill((0,0,0))
# I added a varabial to my player square
pygame.draw.rect(win, (115, 235, 174),player)
# second square
# this is the big box and its the enemy square that I want my script to stand on
pygame.draw.rect(win, (202, 185 , 241), enemy)
并使用]更新职位>
if keys[pygame.K_LEFT]: player.x -= speed if keys[pygame.K_RIGHT]: player.x += speed
和碰撞
if player.colliderect(enemy): if player.centerx < enemy.left: #if the center of player is left of the enemy player.right = enemy.left if player.centerx > enemy.right: player.left = enemy.right if player.centery < enemy.top: player.bottom = enemy.top if player.centery > enemy.bottom: player.top = enemy.bottom
两种工作方式都不是完美的,还有更多的方式可以做,但是我想我推荐第一种方法,因为它更容易理解,也更容易添加到您的代码中。如果您需要有关其工作原理或更多方法的更多解释,请发表评论
import pygame pygame.init() win = pygame.display.set_mode((500,500)) pygame.display.set_caption("THIS GAME IS KINDA ASS") class Player(pygame.sprite.Sprite): def __init__(self, x, y, w, h, col): pygame.sprite.Sprite.__init__(self) self.rect = pygame.Rect(x,y,w,h) self.image = pygame.Surface((w,h)) self.image.fill(col) self.isJump = False self.JumpCount = 8 def update(self): if self.isJump: if self.JumpCount >= -8: self.rect.y -= (self.JumpCount *abs(self.JumpCount)) self.JumpCount -= 1 else: self.isJump = False self.JumpCount = 8 class Platform(pygame.sprite.Sprite): def __init__(self, x, y, w, h, col): pygame.sprite.Sprite.__init__(self) self.rect = pygame.Rect(x,y,w,h) self.image = pygame.Surface((w,h)) self.image.fill(col) # first squrae x = 50 y = 50 height= 50 width = 50 speed = 5 player = Player(x,y,width, height, (115, 235, 174)) # square 2 cordx = 100 cordy = 200 cordheight = 100 cordwidth = 100 enemy1 = Platform(cordx,cordy,cordwidth, cordheight, (202, 185 , 241)) #square 3 enemy2 = Platform(300,90,100,30,(202, 185 , 241)) all_sprites = pygame.sprite.Group() all_sprites.add(player) all_sprites.add(enemy1) all_sprites.add(enemy2) enemy_sprites = pygame.sprite.Group() enemy_sprites.add(enemy1, enemy2) clock = pygame.time.Clock() # main loop runningame = True while runningame: clock.tick(50) for event in pygame.event.get(): if event.type == pygame.QUIT: runningame = False keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: player.rect.x -= speed if keys[pygame.K_RIGHT]: player.rect.x += speed if not(player.isJump): if keys[pygame.K_UP]: player.rect.y -= speed if keys[pygame.K_DOWN]: player.rect.y += speed if keys[pygame.K_SPACE]: player.isJump = True for enemy in enemy_sprites.sprites(): if player.rect.colliderect(enemy.rect): if player.rect.centerx < enemy.rect.left: #if the center of player is left of the enemy player.rect.right = enemy.rect.left if player.rect.centerx > enemy.rect.right: player.rect.left = enemy.rect.right if player.rect.centery < enemy.rect.top: player.rect.bottom = enemy.rect.top if player.rect.centery > enemy.rect.bottom: player.rect.top = enemy.rect.bottom all_sprites.update() win.fill((0,0,0)) all_sprites.draw(win) pygame.display.update() pygame.quit()
这是您的程序,但使用精灵
如您所见,我已将与正方形有关的所有代码移至其类。每个子画面都有一个rect
和一个image
。 rect的用法与上面显示的rect相同。图像是一个表面,因为pygame将其显示在屏幕上的方式。使其具有相同的大小并填充颜色,使其与以前完全相同。
我有2个Sprite群组,all_sprites
群组包含所有精灵群组,enemy_sprites
群组仅包含敌人(可以站立的平台)。我可以通过调用all_sprites.draw(win)
绘制所有精灵。
对于碰撞,完全一样,除了我想绕过每个敌人(因为我现在有2个)。所以我可以打电话给enemy_sprites.sprites()
来获取每个精灵。
如果您需要更多说明或示例,请开始聊天。