My Collision With My Platform Images Problem How To Fix?

冷暖自知 提交于 2020-05-15 21:31:48

问题


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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!