我的平台图像冲突问题如何解决? [英] My Collision With My Platform Images Problem How To Fix?

查看:51
本文介绍了我的平台图像冲突问题如何解决?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题是,当我与我的平台发生碰撞时,它似乎让我比平台更高对我所有的平台都这样做,我知道为什么

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

我的平台碰撞

        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

我的完整代码

# 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()

推荐答案

问题隐藏在 Platform 类中,因为 self.platforms 不一样代码>平台.
注意 self.platforms 被缩放到它的一半大小,因此你在设置矩形时必须使用 self.platforms 而不是 platform (<代码>self.rect
):

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())

无论如何,我建议通过 get_rect() 获取矩形:

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

如果图像的顶部不是可击中,例如散布草,则您必须将击中框缩小草的高度.
enemy 类添加一个方法,该方法返回命中框:

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
         # [...]

这篇关于我的平台图像冲突问题如何解决?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆