微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我做了一个平台游戏,但瓷砖物理不起作用

如何解决我做了一个平台游戏,但瓷砖物理不起作用

截至目前,我的代码将呈现瓷砖​​地图和背景。它还将渲染播放器并根据您按下的按键显示其行走动画。如果您击中了尖刺瓷砖,您将被传送回起点。但就是这样,其余的瓷砖没有任何物理/地面。我的玩家会穿过块,基本上一直在漂浮。我在 youtube 和一些在线资源上尝试了几个不同的教程,但找不到任何有意义或适用于我的代码的教程。我对 pygame 也很陌生,所以你们认为我可以/应该怎么做才能在我的代码中加入一些瓷砖物理? 这是我尝试使用的另一种方法,使其成为某种形式的墙:

if key_press[pygame.K_LEFT] and player.x>player.veLocity:
        if pygame.Rect.colliderect(player.rect,grasscliffleft1):
            player.x += 0
        else:
            player.left = True
            player.x-=player.veLocity
            player.right=False
            player.left=True

这是我的主要代码

   import pygame
    pygame.init()
        
    pygame.mixer.music.load('music.mp3')
    pygame.mixer.music.play(-1)
    
    window=pygame.display.set_mode((1200,800))
    background=pygame.image.load('background.png')
    background=pygame.transform.scale(background,(1200,800))
    
    #This loads the images for the walking right animation
    walk_right=[pygame.image.load('Right/Right (1).png'),pygame.image.load('Right/Right (2).png'),pygame.image.load('Right/Right (3).png'),pygame.image.load('Right/Right (4).png'),pygame.image.load('Right/Right (5).png'),pygame.image.load('Right/Right (6).png'),pygame.image.load('Right/Right (7).png'),pygame.image.load('Right/Right (8).png'),pygame.image.load('Right/Right (9).png'),pygame.image.load('Right/Right (10).png'),pygame.image.load('Right/Right (11).png'),pygame.image.load('Right/Right (12).png'),pygame.image.load('Right/Right (13).png'),pygame.image.load('Right/Right (14).png'),pygame.image.load('Right/Right (15).png')]
    #This loads the images for the walking left animation
    walk_left=[pygame.image.load('Left/Left (1).png'),pygame.image.load('Left/Left (2).png'),pygame.image.load('Left/Left (3).png'),pygame.image.load('Left/Left (4).png'),pygame.image.load('Left/Left (5).png'),pygame.image.load('Left/Left (6).png'),pygame.image.load('Left/Left (7).png'),pygame.image.load('Left/Left (8).png'),pygame.image.load('Left/Left (9).png'),pygame.image.load('Left/Left (10).png'),pygame.image.load('Left/Left (11).png'),pygame.image.load('Left/Left (12).png'),pygame.image.load('Left/Left (13).png'),pygame.image.load('Left/Left (14).png'),pygame.image.load('Left/Left (15).png')]
    
    idle=pygame.image.load('idle.png')
    
    fps=pygame.time.Clock()
    
    #This class saves information for the player such as their x,y,veLocity 
    class Player(object):
        def __init__(self,x,y):
            self.veLocity=4
            self.x = x
            self.y = y
            self.jumping=False
            self.right=False
            self.left=False
            self.jumptotal=10
            self.walkcount=0
            self.player_hitBox=(self.x+1,self.y,60,60)
        #This will be used to create the player walking animations
        def draw(self,window):
            if player.walkcount + 1 > 45:
                player.walkcount = 0
            if player.right:
                window.blit(walk_right[player.walkcount // 3],(player.x,player.y))
                player.walkcount += 1
            elif player.left:
                window.blit(walk_left[player.walkcount // 3],(player.x - 50,player.y))
                player.walkcount += 1
            else:
                window.blit(idle,player.y))
        #This displays the players hitBox that will be used for collisions with the tiles
        def hitBox(self,window):
            self.player_hitBox = (self.x,47,83)
            self.rect=pygame.draw.rect(window,(255,255,255),self.player_hitBox,2)
    
    
    
    running=True
    
    player=Player(20,600)
    coin_visible=True
    #This draws the background,the player
    def draw_game():
        global player
        window.blit(background,(0,0))
        player.draw(window)
        player.hitBox(window)
    
    #This will render and display the tiles onto the screen. It also gets each individual rect information and stores them in a list(incase I can use the list for something?)
    def draw_tiles():
        global dirt1
        global dirtdown1
        global grasscliffleft1
        global grasscliffright1
        global grasscliffmid1
        global grass1
        global coin1
        global spikerright1
        global spike_down1
        global spike_left1
        global spikeup1   
        global tile_list
        tile_list=[]
        y = 0
        for row in game_map:
            x = 0
            for tile in row:
                if tile == '1':
                    window.blit(dirt,(x * tile_size,y * tile_size))
                    dirt1=dirt.get_rect(topleft=(x * tile_size,y * tile_size))
                    tile=(dirt,dirt1)
                    tile_list.append(tile)
                elif tile == '2':
                    window.blit(dirtdown,y * tile_size))
                    dirtdown1=dirtdown.get_rect(topleft=(x * tile_size,y * tile_size))
                    tile = (dirtdown,dirtdown1)
                    tile_list.append(tile)
                elif tile == '3':
                    window.blit(grasscliffleft,y * tile_size))
                    grasscliffleft1=grasscliffleft.get_rect(topleft=(x * tile_size,y * tile_size))
                    tile = (grasscliffleft,grasscliffleft)
                    tile_list.append(tile)
                elif tile == '4':
                    window.blit(grasscliffright,y * tile_size))
                    grasscliffright1 = grasscliffright.get_rect(topleft=(x * tile_size,y * tile_size))
                    tile = (grasscliffright,grasscliffright1)
                    tile_list.append(tile)
                elif tile == '5':
                    window.blit(grasscliffmid,y * tile_size))
                    grasscliffmid1=grasscliffmid.get_rect(topleft=(x * tile_size,y * tile_size))
                    tile = (grasscliffmid,grasscliffmid1)
                    tile_list.append(tile)
                elif tile == '6':
                    window.blit(grass,y * tile_size))
                    grass1 =grass.get_rect(topleft=(x * tile_size,y * tile_size))
                    tile = (grass,grass1)
                    tile_list.append(tile)
                elif tile == '7':
                    if coin_visible:
                        window.blit(coin,y * tile_size))
                    coin1=coin.get_rect(topleft=(x * tile_size,y * tile_size))
                    tile = (coin,coin1)
                    tile_list.append(tile)
                elif tile == '8':
                    window.blit(spikerright,y * tile_size))
                    spikerright1=spikerright.get_rect(topleft=(x * tile_size,y * tile_size))
                    tile = (spikerright,spikerright1)
                    tile_list.append(tile)
                elif tile == '9':
                    window.blit(spike_down,y * tile_size))
                    spike_down1=spike_down.get_rect(topleft=(x * tile_size,y * tile_size))
                    tile = (spike_down,spike_down1)
                    tile_list.append(tile)
                elif tile == '10':
                    window.blit(spike_left,y * tile_size))
                    spike_left1=spike_left.get_rect(topleft=(x * tile_size,y * tile_size))
                    tile = (spike_left,spike_left1)
                    tile_list.append(tile)
                elif tile == '11':
                    window.blit(spikeup,y * tile_size))
                    spikeup1=spikeup.get_rect(topleft=(x * tile_size,y * tile_size))
                    tile = (spikeup,spikeup1)
                    tile_list.append(tile)
                x += 1
            y += 1
    #This will be used to detect collisions and create an impact. This is what isnt working. The only tiles that have any form of a physics are the spikes,when I hit the spikes,the player gets sent back to the starting point
    def collision():
        global dirt1
        global dirtdown1
        global grasscliffleft1
        global grasscliffright1
        global grasscliffmid1
        global grass1
        global coin1
        global spikerright1
        global spike_down1
        global spike_left1
        global spikeup1
        global tile_list
    
        if pygame.Rect.colliderect(player.rect,dirt1):
            player.x=dirt1.left-player.rect.left
        elif pygame.Rect.colliderect(player.rect,dirtdown1):
            player.rect.left=dirtdown1.right
        elif pygame.Rect.colliderect(player.rect,grasscliffleft1):
            player.rect.right=grasscliffleft1.left
            player.rect.top=grasscliffleft1.bottom
            player.rect.bottom=grasscliffleft1.top
        elif pygame.Rect.colliderect(player.rect,grasscliffright1):
            player.rect.left = grasscliffright1.right
            player.rect.top = grasscliffright1.bottom
            player.rect.bottom = grasscliffright1.top
        elif pygame.Rect.colliderect(player.rect,grasscliffmid1):
            player.rect.top = grasscliffmid1.bottom
            player.rect.bottom = grasscliffmid1.top
        elif pygame.Rect.colliderect(player.rect,grass1):
            player.rect.top=grass1.bottom
            player.rect.bottom = grass1.top
            player.rect.right = grass1.left
            player.rect.left = grass1.right
        elif pygame.Rect.colliderect(player.rect,coin1):
            coin_visible=False
        elif pygame.Rect.colliderect(player.rect,spikerright1):
            player.jumping=False
            player.jumptotal = 10
            player.x=20
            player.y=600
        elif pygame.Rect.colliderect(player.rect,spike_down1):
            player.jumping = False
            player.jumptotal = 10
            player.x=20
            player.y=600
        elif pygame.Rect.colliderect(player.rect,spike_left1):
            player.jumping = False
            player.jumptotal = 10
            player.x=20
            player.y=600
        elif pygame.Rect.colliderect(player.rect,spikeup1):
            player.jumping = False
            player.jumptotal = 10
            player.x=20
            player.y=600
    
    
    
    #We are loading all of the tile images and resizing them
    dirt=pygame.image.load('Tiles/Dirt.png')  # 1
    dirt=pygame.transform.scale(dirt,(40,40))
    
    dirtdown = pygame.image.load('Tiles/DirtDown.png')  # 2
    dirtdown=pygame.transform.scale(dirtdown,40))
    
    grasscliffleft = pygame.image.load('Tiles/GrassCliffLeft.png')  # 3
    grasscliffleft=pygame.transform.scale(grasscliffleft,40))
    
    grasscliffright = pygame.image.load('Tiles/GrassCliffMid.png')  # 4
    grasscliffright=pygame.transform.scale(grasscliffright,40))
    
    grasscliffmid = pygame.image.load('Tiles/GrassCliffRight.png')  # 5
    grasscliffmid=pygame.transform.scale(grasscliffmid,40))
    
    grass = pygame.image.load('Tiles/GrassJoinHillLeft.png')  # 6
    grass=pygame.transform.scale(grass,40))
    
    coin = pygame.image.load('Tiles/image 1.png')  # 7
    coin=pygame.transform.scale(coin,40))
    
    spike_left = pygame.image.load('Tiles/Spike_Left&down.png')  # 8
    spike_left=pygame.transform.scale(spike_left,40))
    
    spikerright=pygame.transform.flip(spike_left,True,False)# 10
    spikerright=pygame.transform.scale(spikerright,40))
    
    spike_down = pygame.image.load('Tiles/Spike_Down.png')  # 9
    spike_down=pygame.transform.scale(spike_down,40))
    
    spikeup = pygame.image.load('Tiles/spikeup.png')  #  11
    spikeup=pygame.transform.scale(spikeup,40))
    
    #This is the tilemap used to determine which tile is displayed where on the screen
    game_map=[['0','0','0'],['0','7','3','5','4','6','8','9',['6',['2','2','10','11','6'],['1','1','1'],'2']]
    
    #This is the main loop that is being ran. 
    tile_size=dirt.get_width()
    while running:
        fps.tick(45)
        draw_game()
    
        draw_tiles()
    
        collision()
    
        for event in pygame.event.get():
          if event.type==pygame.QUIT:
            running=False
        #Moves the player in the designated direction depending on the key press
        key_press=pygame.key.get_pressed()
        if key_press[pygame.K_LEFT] and player.x>player.veLocity:
            player.x-=player.veLocity
            player.right=False
            player.left=True
        elif key_press[pygame.K_RIGHT] and player.x<2300-player.x-player.veLocity:
            player.x+=player.veLocity
            player.right = True
            player.left = False
        else:
            player.right=False
            player.left=False
            player.walkcount=0
    
        if key_press[pygame.K_UP]:
           player.jumping=True
        #This is used to make the player jump 
        if not (player.jumping):
            if key_press[pygame.K_UP]:
                player.isJump = True
    
        else:
            if player.jumptotal >= -10:
                neg = 1
                if player.jumptotal < 0:
                    neg = -1
    
                player.y -= (player.jumptotal ** 2) * 0.25 * neg
                player.jumptotal -= 1
            else:
                player.jumping = False
                player.jumptotal = 10
    
        pygame.display.update()
    
    
    pygame.quit()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。