问:冲突问题平台游戏如何解决? pygame

问题描述 投票:0回答:1

我的问题是,当我与Floor Square碰撞时,它会不断使我摔倒

我做了一个教室地板:为此,将它定义为floor1,然后将其绘制到我的屏幕上,但是我仍然遇到问题,不会让我碰撞并站在上面,只是不断掉下来

我的碰撞

            if playerman.rect.colliderect(floor1.rect):
                collide = True
                playerman.isJump = False
                playerman.JumpCount = 10
                playerman.y = floor1.rect.top - playerman.height + 1
                if playerman.rect.right > floor1.rect.left and playerman.rect.left < floor1.rect.left - playerman.width:
                    playerman.x = floor1.rect.left - playerman.width
                if playerman.rect.left < floor1.rect.right and playerman.rect.right > floor1.rect.right + playerman.width:
                    playerman.x = floor1.rect.right

我的完整代码

# import pygame moduee
import pygame
pygame.init()



# window
window = pygame.display.set_mode((500,500))
pygame.display.set_caption("games")
bg = pygame.image.load("background_02.png")
left_image =  pygame.image.load("Sprite-0002.png")
right_image = pygame.image.load("Sprite-0003.png")
platforms = pygame.image.load("ok.png")
def DrawWindow():
    window.blit(bg, (0,0))

# 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.color = color
        self.speed = 5
        self.fall = 0
        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()*2,self.left_image.get_height()*2))
        self.right_image = pygame.transform.scale(self.right_image,(self.right_image.get_width()*2,self.right_image.get_height()*2))
        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
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("ok.png")
        self.platforms = pygame.transform.scale(self.platforms,(self.platforms.get_width()*5,self.platforms.get_height()*5))

        self.rect = self.platforms.get_rect(topleft = (x, y)) # <---

        self.direction = "left" #set a stating direction
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        window.blit(self.platforms,self.rect)




# coin class
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)
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window, self.color, self.rect)

# floor class

class floor:
    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)
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window, self.color, self.rect)



# FPS
FPS = 60
clock = pygame.time.Clock()

# colors
white = (255,255,255)
green = (0,255,0)
Yellow = (255, 255, 0)
Blue =  (0,255,216)

# define player and enemy class
playerman = player(40,390,30,30, Blue)
floor1 = floor(-9999,490,15000,50, white)
enemy1 = enemy(150,390,150,10, green)
enemy2 = enemy(300,320,150,10, green)
enemy3 = enemy(70,260,150,10, green)
enemies = [enemy1,enemy2,enemy3]


# define cooins
coin1 = coin(210,365,20,20, Yellow)
coin2 = coin(250,365,20,20, Yellow)
coin3 = coin(110,235,20,20, Yellow)
coin4 = coin(360,290,20,20, Yellow)
coin5 = coin(400,290,20,20, Yellow)
Coins_list = [coin1,coin2,coin3,coin4,coin5]
# font + display and eat coins and gain
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)


# main loop
runninggame = True
while runninggame:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            runninggame = False


    DrawWindow()
    window.blit(text,textRect)
    for coin in Coins_list:
        coin.draw()
    for enemy in enemies:
        enemy.draw()
    floor1.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 > 400:
            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
        playerman.isJump = False
        for enemy in enemies:
            if playerman.rect.colliderect(enemy.rect):
                collide = True
                playerman.isJump = False
                playerman.JumpCount = 10
                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 - playerman.width
                if playerman.rect.left < enemy.rect.right and playerman.rect.right > enemy.rect.right + playerman.width:
                    playerman.x = enemy.rect.right

            if playerman.rect.colliderect(floor1.rect):
                collide = True
                playerman.isJump = False
                playerman.JumpCount = 10
                playerman.y = floor1.rect.top - playerman.height + 1
                if playerman.rect.right > floor1.rect.left and playerman.rect.left < floor1.rect.left - playerman.width:
                    playerman.x = floor1.rect.left - playerman.width
                if playerman.rect.left < floor1.rect.right and playerman.rect.right > floor1.rect.right + playerman.width:
                    playerman.x = floor1.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.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.JumpCount = 10
            playerman.isJump = False
    playerman.draw()


    pygame.display.update()
pygame.quit()































































python python-3.x pygame
1个回答
0
投票

问题是滚动。平台在490,当播放器低于450时,您向下滚动。im假设播放器距playerman = player(40,390,30,30, Blue)高30像素。因此,这意味着玩家要站在地板上,他将处于460,这意味着屏幕将滚动。

© www.soinside.com 2019 - 2024. All rights reserved.