问题
the problem is that when I collide with my platform it seems to put me way higher then the platform it does this for all my platforms and idk why
my collision for platform
for enemy in enemies:
if playerman.rect.colliderect(enemy.rect):
collide = True
playerman.y = enemy.rect.top - playerman.height + 1
if playerman.rect.right > enemy.rect.left and playerman.rect.left < enemy.rect.left - playerman.width:
playerman.x = enemy.rect.left - player.width
if playerman.rect.left < enemy.rect.right and playerman.rect.right > enemy.rect.right + playerman.width:
playerman.x = enemy.rect.right
my full code
# import module
import pygame
pygame.init()
# window
window = pygame.display.set_mode((500,470))
pygame.display.set_caption("YELOLL")
background = pygame.image.load("bg.jpg")
left_image = pygame.image.load("Sprite-0003.png")
right_image = pygame.image.load("Sprite-0002.png")
Right_Coins = pygame.image.load("Coin.png")
platforms = pygame.image.load("rat.png")
def Redraw():
window.blit(background, (0,0))
# draw the player
class player:
def __init__(self,x,y,height,width,color):
self.x = x
self.y = y
self.height = height
self.width = width
self.isJump = False
self.JumpCount = 10
self.fall = 0
self.left_image = False
self.right_image = False
self.speed = 5
self.color = color
self.rect = pygame.Rect(x,y,height,width)
self.left_image = pygame.image.load("Sprite-0002.png")
self.right_image = pygame.image.load("Sprite-0003.png")
self.left_image = pygame.transform.scale(self.left_image,(self.left_image.get_width()//1,self.left_image.get_height()//1))
self.right_image = pygame.transform.scale(self.right_image,(self.right_image.get_width()//1,self.right_image.get_height()//1))
...
self.rect = pygame.Rect(x,y,left_image.get_width(), left_image.get_height())
self.direction = "left" #set a stating direction
def draw(self):
self.rect.topleft = (self.x,self.y)
if self.direction == "left":
window.blit(self.left_image,self.rect)
else:
window.blit(self.right_image,self.rect)
# enemy
class enemy:
def __init__(self,x,y,height,width,color):
self.x = x
self.y = y
self.height = height
self.width = width
self.color = color
self.rect = pygame.Rect(x,y,height,width)
self.platforms = pygame.image.load("rat.png")
self.platforms = pygame.transform.scale(self.platforms,(self.platforms.get_width()//2,self.platforms.get_height()//2))
self.rect = pygame.Rect(x,y,platforms.get_width(), platforms.get_height())
self.direction = "left" #set a stating direction
def draw(self):
self.rect.topleft = (self.x,self.y)
window.blit(self.platforms,self.rect)
# coins
class coin:
def __init__(self,x,y,height,width,color):
self.x = x
self.y = y
self.height = height
self.width = width
self.color = color
self.rect = pygame.Rect(x,y,height,width)
self.Right_Coins = pygame.image.load("Coin.png")
self.Right_Coins = pygame.transform.scale(self.Right_Coins,(self.Right_Coins.get_width()//2,self.Right_Coins.get_height()//2))
self.rect = pygame.Rect(x,y,Right_Coins.get_width(), Right_Coins.get_height())
self.direction = "left" #set a stating direction
def draw(self):
self.rect.topleft = (self.x,self.y)
window.blit(self.Right_Coins,self.rect)
class botts:
def __init__(self,x,y,height,width,color):
self.x = x
self.y = y
self.color = color
self.height = height
self.width = width
self.rect = pygame.Rect(x,y,height,width)
def draw(self):
self.rect.topleft = (self.x,self.y)
pygame.draw.rect(window, self.color, self.rect)
font = pygame.font.Font('freesansbold.ttf', 32)
score = 0
text = font.render('Score = ' + str(score), True, (255,255,255))
textRect = text.get_rect()
textRect.center = (100, 40)
# FPS
FPS = 60
clock = pygame.time.Clock()
# colors
Green = (0,255,2)
white = (255,255,255)
Yellow = (248,255,0)
Blue = (0,255,201)
# define player and enemy
playerman = player(50,390,30,30, Blue)
enemy1 = enemy(180,390,150,10, Green)
enemy2 = enemy(300,290,150,10, Green)
enemy3 = enemy(70,250,150,10, Green)
enemy4 = botts(-10000,490,150000,50, white)
teleport = enemy(390,390,40,80, white)
enemies = [enemy1,enemy2,enemy3,enemy4]
# define coins
coin1 = coin(230,370,10,10, Yellow)
coin2 = coin(350,270,10,10, Yellow)
coin3 = coin(150,230,10,10, Yellow)
coin4 = coin(250,450,10,10, Yellow)
Coins_list = [coin1,coin2,coin3,coin4,teleport]
# main loop
runninggame = True
while runninggame:
for event in pygame.event.get():
if event.type == pygame.QUIT:
runninggame = False
Redraw()
clock.tick(FPS)
teleport.draw()
window.blit(text,textRect)
playerman.draw()
for enemy in enemies:
enemy.draw()
for coin in Coins_list:
coin.draw()
if playerman.y < 250:
playerman.y += 1
for enemy in enemies:
enemy.y += playerman.speed
for coin in Coins_list:
coin.y += playerman.speed
if playerman.y > 450:
playerman.y -= playerman.fall
for enemy in enemies:
enemy.y -= playerman.fall
for coin in Coins_list:
coin.y -= playerman.fall
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
playerman.direction = "left"
playerman.x -= playerman.speed
if playerman.x < 100:
playerman.x += playerman.speed
for enemy in enemies:
enemy.x += playerman.speed
for coin in Coins_list:
coin.x += playerman.speed
if keys[pygame.K_RIGHT]:
playerman.direction = "right"
playerman.x += playerman.speed
if playerman.x > 450:
playerman.x -= playerman.speed
for enemy in enemies:
enemy.x -= playerman.speed
for coin in Coins_list:
coin.x -= playerman.speed
if not playerman.isJump:
playerman.y += playerman.fall
playerman.fall += 1
collide = False
for enemy in enemies:
if playerman.rect.colliderect(enemy.rect):
collide = True
playerman.y = enemy.rect.top - playerman.height + 1
if playerman.rect.right > enemy.rect.left and playerman.rect.left < enemy.rect.left - playerman.width:
playerman.x = enemy.rect.left - player.width
if playerman.rect.left < enemy.rect.right and playerman.rect.right > enemy.rect.right + playerman.width:
playerman.x = enemy.rect.right
for i in range(len(Coins_list)-1,-1,-1):
if playerman.rect.colliderect(Coins_list[i].rect):
del Coins_list[i]
score += 1
text = font.render('Score = ' + str(score), True, (255,255,255))
textRect = text.get_rect()
textRect.center = (100,40)
if playerman.rect.colliderect(teleport.rect):
for enemy in enemies:
if playerman.rect.centerx:
playerman.x = 50
playerman.y = 150
if playerman.rect.bottom >= 500:
collide = True
playerman.isJump = False
playerman.JumpCount = 10
playerman.y = 500 - playerman.height
if collide:
if keys[pygame.K_SPACE]:
playerman.isJump = True
playerman.fall = 0
else:
if playerman.JumpCount > 0:
playerman.y -= (playerman.JumpCount*abs(playerman.JumpCount))*0.4
playerman.JumpCount -= 1
else:
playerman.isJump = False
playerman.JumpCount = 10
pygame.display.update()
pygame.quit()
回答1:
The issue is hidden in the class Platform, because self.platforms is not the same as platform.
Note self.platforms is scaled to its half size, thus you have to use self.platforms rather than platform when you setup the rectangle (self.rect):
self.rect = pygame.Rect(x,y,platforms.get_width(), platforms.get_height())
self.rect = pygame.Rect(x,y, self.platforms.get_width(), self.platforms.get_height())
Anyway, I recommend to get the rectangle by get_rect():
self.rect = self.platforms.get_rect(topleft = (x, y))
class Paltform:
class enemy:
def __init__(self,x,y,height,width,color):
self.x = x
self.y = y
self.height = height
self.width = width
self.color = color
self.rect = pygame.Rect(x,y,height,width)
self.platforms = pygame.image.load("rat.png")
self.platforms = pygame.transform.scale(self.platforms,(self.platforms.get_width()//2,self.platforms.get_height()//2))
self.rect = self.platforms.get_rect(topleft = (x, y)) # <---
self.direction = "left" #set a stating direction
If the top of the image is not hittable, like spread grass, the you have to shrink the hitbox by the height of the grass.
Add a method to the class enemy, which returns the hitbox:
class enemy:
# [...]
def get_hitbox(self):
grass_height = 25
hitboxb = self.rect
hitboxb.top += grass_height
return hitboxb
class botts:
# [...]
def get_hitbox(self):
return self.rect
Use the hit box for the collision detection:
for enemy in enemies:
enemy_hitbox = enemy.get_hitbox()
if playerman.rect.colliderect(enemy_hitbox):
collide = True
playerman.y = enemy_hitbox.top - playerman.height + 1
# [...]
来源:https://stackoverflow.com/questions/61754777/my-collision-with-my-platform-images-problem-how-to-fix