截至目前,我的代码将呈现瓷砖地图和背景。它还将渲染播放器并根据您按下的按键显示其行走动画。如果您击中了尖刺瓷砖,您将被传送回起点。但就是这样,其余的瓷砖没有任何物理/地面。我的玩家会穿过块,基本上一直在漂浮。我在 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.x, 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, self.y, 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, (x * tile_size, 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, (x * tile_size, 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, (x * tile_size, 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, (x * tile_size, 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, (x * tile_size, 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, (x * tile_size, 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, (x * tile_size, 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, (x * tile_size, 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, (x * tile_size, 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, (x * tile_size, 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,40))
grasscliffleft = pygame.image.load('Tiles/GrassCliffLeft.png') # 3
grasscliffleft=pygame.transform.scale(grasscliffleft,(40,40))
grasscliffright = pygame.image.load('Tiles/GrassCliffMid.png') # 4
grasscliffright=pygame.transform.scale(grasscliffright,(40,40))
grasscliffmid = pygame.image.load('Tiles/GrassCliffRight.png') # 5
grasscliffmid=pygame.transform.scale(grasscliffmid,(40,40))
grass = pygame.image.load('Tiles/GrassJoinHillLeft.png') # 6
grass=pygame.transform.scale(grass,(40,40))
coin = pygame.image.load('Tiles/image 1.png') # 7
coin=pygame.transform.scale(coin,(40,40))
spike_left = pygame.image.load('Tiles/Spike_Left&down.png') # 8
spike_left=pygame.transform.scale(spike_left,(40,40))
spikerright=pygame.transform.flip(spike_left,True,False)# 10
spikerright=pygame.transform.scale(spikerright,(40,40))
spike_down = pygame.image.load('Tiles/Spike_Down.png') # 9
spike_down=pygame.transform.scale(spike_down,(40,40))
spikeup = pygame.image.load('Tiles/spikeup.png') # 11
spikeup=pygame.transform.scale(spikeup,(40,40))
#This is the tilemap used to determine which tile is displayed where on the screen
game_map=[['0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'],
['0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','7','0','0','0'],
['0','0','0','0','0','0','0','0','3','5','4','0','0','0','0','7','0','0','0','0','6','0','8','6','0','8','4','5','0','0'],
['0','0','7','0','0','0','0','0','9','0','0','0','0','0','3','5','4','0','0','0','0','0','0','0','0','0','0','0','0','0'],
['6','6','6','6','6','6','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'],
['2','2','2','2','2','2','10','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'],
['0','0','0','0','0','0','0','6','0','0','0','0','0','0','0','0','0','0','0','0','7','0','0','0','0','0','0','0','0','0'],
['0','0','0','0','0','0','0','9','0','3','5','5','4','0','0','8','6','0','0','8','6','0','0','0','0','0','0','0','0','0'],
['0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','7','0','0','0','0','0'],
['0','0','0','0','0','0','7','0','0','0','0','0','0','0','0','0','0','0','7','0','0','0','0','3','5','4','0','0','0','0'],
['0','0','0','0','0','3','5','5','4','0','0','0','0','0','0','0','0','0','6','0','0','6','0','0','0','0','0','0','0','0'],
['0','0','0','0','0','0','0','0','0','0','6','0','0','0','11','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'],
['0','0','0','0','0','0','0','0','0','0','0','0','3','5','5','4','0','0','0','0','0','0','0','0','0','7','0','0','0','0'],
['0','0','0','0','0','0','0','0','0','0','0','0','0','0','9','0','0','0','7','11','0','0','0','8','3','5','4','0','0','0'],
['0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','3','5','5','5','0','0','0','0','0','0','0','0','0'],
['0','0','0','0','0','0','0','0','7','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'],
['0','0','0','0','0','0','0','3','5','4','0','0','0','3','5','4','0','0','0','0','0','0','0','0','0','0','0','0','0','0'],
['6','6','6','6','6','6','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','6','6','6','6','6','6','6'],
['1','1','1','1','1','1','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','1','1','1','1','1','1','1'],
['2','2','2','2','2','2','11','11','11','11','11','11','11','11','11','11','11','11','11','11','11','11','11','2','2','2','2','2','2','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()