Python 如何找到资源的坐标?
我正在制作一个游戏,我开始制作一些框架,让我在游戏中学习和测试不同的东西。在这个游戏中,我有一个随机生成的tilemap,其中包含了泥土、草、水和煤等资源。在代码中,有一些其他不相关的资源,但我试图做的是找到游戏中特定资源的坐标。我打算做的是假设资源是一面墙,下面有一面墙,在它旁边,中间墙的纹理将变成一个角块。我的问题是我不知道如何找到坐标。有人能帮帮我吗,我真的不知道我在做什么,但我正在努力学习。 这是我的密码:Python 如何找到资源的坐标?,python,pygame,Python,Pygame,我正在制作一个游戏,我开始制作一些框架,让我在游戏中学习和测试不同的东西。在这个游戏中,我有一个随机生成的tilemap,其中包含了泥土、草、水和煤等资源。在代码中,有一些其他不相关的资源,但我试图做的是找到游戏中特定资源的坐标。我打算做的是假设资源是一面墙,下面有一面墙,在它旁边,中间墙的纹理将变成一个角块。我的问题是我不知道如何找到坐标。有人能帮帮我吗,我真的不知道我在做什么,但我正在努力学习。 这是我的密码: import pygame, sys import Sprites import
import pygame, sys
import Sprites
import random
from pygame.locals import *
pygame.init()
fpsClock = pygame.time.Clock()
cloudx = -200
cloudy = 0
infoObject = pygame.display.Info()
DIRT = 0
GRASS = 1
WATER = 2
COAL = 3
CLOUD = 4
WALL = 5
controls = {
DIRT : 49,
GRASS: 50,
WATER: 51,
COAL : 52,
WALL : 53
}
infoObject = pygame.display.Info()
w = infoObject.current_w
h = infoObject.current_h
TILESIZE = 40
MAPWIDTH = 15
MAPHEIGHT = 15
WHITE = (255,255,255)
BLACK = (0,0,0)
resources = [DIRT, GRASS, WATER, COAL]
textures = {
DIRT : pygame.image.load('Sprites/Dirt.png'),
GRASS : pygame.image.load('Sprites/tile130.png'),
WATER : pygame.image.load('Sprites/Water.png'),
COAL : pygame.image.load('Sprites/Coal.png'),
CLOUD : pygame.image.load('Sprites/Cloud.png'),
WALL : pygame.image.load('Sprites/Swall.png')
}
playerPos = [0,0]
inventory = {
DIRT : 0,
GRASS : 0,
WATER : 0,
COAL : 0,
WALL : 10,
}
tilemap = [[DIRT for w in range(MAPWIDTH)] for h in range(MAPHEIGHT)]
DISPLAYSURF = pygame.display.set_mode((MAPWIDTH*TILESIZE,MAPHEIGHT*TILESIZE + 50))
pygame.display.set_caption('M I N E C R A F T -- 2D')
pygame.display.set_icon(pygame.image.load('Sprites/player.png'))
PLAYER = pygame.image.load('Sprites/Player.png').convert_alpha()
for rw in range(MAPHEIGHT):
for cl in range(MAPWIDTH):
randomNumber = random.randint(0,15)
if randomNumber == 0:
tile = COAL
elif randomNumber == 1 or randomNumber == 2:
tile = WATER
elif randomNumber >= 3 and randomNumber <=7:
tile = GRASS
else:
tile = DIRT
tilemap[rw][cl] = tile
INVFONT = pygame.font.Font('freesansbold.ttf', 18)
print(tilemap)
while True:
currentTile = tilemap[playerPos[1]][playerPos[0]]
DISPLAYSURF.fill(BLACK)
for event in pygame.event.get():
# print(event)
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
for key in controls:
if (event.key == controls[key]):
if inventory[key] > 0:
inventory[key] -=1
inventory[currentTile] += 1
tilemap[playerPos[1]][playerPos[0]] = key
if(event.key == K_RIGHT) and playerPos[0] < MAPWIDTH - 1:
playerPos[0]+=1
elif(event.key == K_LEFT) and playerPos[0] > 0:
playerPos[0]-=1
elif(event.key == K_DOWN) and playerPos[1] < MAPHEIGHT - 1:
playerPos[1]+=1
elif(event.key == K_UP) and playerPos[1] > 0:
playerPos[1]-=1
if event.key == K_SPACE:
currentTile = tilemap[playerPos[1]][playerPos[0]]
inventory[currentTile] += 1
tilemap[playerPos[1]][playerPos[0]] = DIRT
for row in range(MAPHEIGHT):
for column in range(MAPWIDTH):
DISPLAYSURF.blit(textures[tilemap[row][column]],(column*TILESIZE, row*TILESIZE, TILESIZE, TILESIZE))
DISPLAYSURF.blit(PLAYER,(playerPos[0]*TILESIZE,playerPos[1]*TILESIZE))
DISPLAYSURF.blit(textures[CLOUD].convert_alpha(),(cloudx,cloudy))
cloudx +=1
if cloudx > MAPWIDTH*TILESIZE:
cloudy = random.randint(0, MAPHEIGHT*TILESIZE)
cloudx = -200
placePosition = 10
for item in resources:
DISPLAYSURF.blit(textures[item],(placePosition, MAPHEIGHT*TILESIZE+10))
placePosition+=50
textObj = INVFONT.render(str(inventory[item]), True, WHITE, BLACK)
DISPLAYSURF.blit(textObj,(placePosition, MAPHEIGHT*TILESIZE+20))
placePosition += 50
pygame.display.update()
fpsClock.tick(24)
for x in range(MAPWIDTH):
for y in range(MAPHEIGHT):
if tilemap[x][y] == WALL:
pos = tilemap[x][y]
if tilemap[pos[1]][pos[0]-1] == WALL:
print('I DID IT')
pygame.display.update()
import pygame,sys
进口雪碧
随机输入
从pygame.locals导入*
pygame.init()
fpscall=pygame.time.Clock()
cloudx=-200
多云=0
infoObject=pygame.display.Info()
污垢=0
草=1
水=2
煤=3
云=4
墙=5
控件={
污垢:49,
草地:50,
水:51,
煤炭:52,
墙:53
}
infoObject=pygame.display.Info()
w=infoObject.current\u w
h=infoObject.current\u h
TILESIZE=40
地图宽度=15
地图高度=15
白色=(255255)
黑色=(0,0,0)
资源=[泥土、草、水、煤]
纹理={
污垢:pygame.image.load('Sprites/DIRT.png'),
GRASS:pygame.image.load('Sprites/tile130.png'),
水:pygame.image.load('Sprites/WATER.png'),
COAL:pygame.image.load('Sprites/COAL.png'),
CLOUD:pygame.image.load('Sprites/CLOUD.png'),
墙:pygame.image.load('Sprites/Swall.png')
}
playerPos=[0,0]
存货={
污垢:0,
草:0,
水:0,
煤:0,,
墙:10,
}
tilemap=[[范围内w的污垢(贴图宽度)]范围内h的污垢(贴图高度)]
DISPLAYSURF=pygame.display.set_模式((MAPWIDTH*TILESIZE,MAPHEIGHT*TILESIZE+50))
pygame.display.set_标题('M I N E C R A F T--2D')
pygame.display.set_图标(pygame.image.load('Sprites/player.png'))
PLAYER=pygame.image.load('Sprites/PLAYER.png')。convert_alpha()
对于范围内的rw(地图高度):
对于范围内的cl(地图宽度):
randomNumber=random.randint(0,15)
如果randomNumber==0:
瓷砖=煤
elif randomNumber==1或randomNumber==2:
瓷砖=水
elif randomNumber>=3和randomNumber 0:
目录[键]-=1
库存[currentTile]+=1
tilemap[playerPos[1]][playerPos[0]]=key
如果(event.key==K_RIGHT)和playerPos[0]0:
playerPos[0]-=1
elif(event.key==K_DOWN)和playerPos[1]0:
玩家角色[1]-=1
如果event.key==K_空间:
currentTile=tilemap[playerPos[1]][playerPos[0]]
库存[currentTile]+=1
tilemap[playerPos[1]][playerPos[0]]=污垢
对于范围内的行(贴图高度):
对于范围内的列(MAPWIDTH):
blit(纹理[tilemap[行][列]],(列*TILESIZE,行*TILESIZE,TILESIZE,TILESIZE))
DISPLAYSURF.blit(PLAYER,(playerPos[0]*TILESIZE,playerPos[1]*TILESIZE))
blit(纹理[CLOUD].convert_alpha(),(cloudx,cloudy))
cloudx+=1
如果cloudx>MAPWIDTH*TILESIZE:
cloudy=random.randint(0,贴图高度*TILESIZE)
cloudx=-200
位置=10
对于资源中的项目:
DISPLAYSURF.blit(纹理[项目],(位置,贴图高度*TILESIZE+10))
位置+=50
textObj=INVFONT.render(str(库存[项目]),真,白,黑)
DISPLAYSURF.blit(textObj,(placePosition,MAPHEIGHT*TILESIZE+20))
位置+=50
pygame.display.update()
时钟。滴答(24)
对于范围内的x(贴图宽度):
对于范围内的y(贴图高度):
如果tilemap[x][y]==墙:
pos=tilemap[x][y]
如果tilemap[pos[1][pos[0]-1]==墙:
打印(‘我做到了’)
pygame.display.update()
编辑:我当前的代码已经更新,添加的部分在最末端如果您想找到特定磁贴的坐标,那么需要做一些工作。也就是说,您的程序必须搜索每个磁贴并进行比较,以查看它是否是
墙
磁贴。
i、 e
然而,这是非常低效的。虽然当你的地图只有15乘15时可能不会有问题,但如果你扩展地图,它会开始消耗你的性能
只检查屏幕上显示的区域可能更明智。毕竟,你只是想弄清楚瓷砖应该如何显示——否则没关系
for x in range(30): # Replace with whatever number of tiles is displayed horizontally on the screen, times two
for y in range(30): # Do the same here
if tilemap[y][x] == WALL:
# Do something here
不过,请注意——如果这只是为了显示,那么更好的解决方案是定义多个墙瓷砖。您可以通过创建像WALL\u UPPER\u RIGHT
这样的常量来实现这一点,但最好是以列表的形式创建
WALL_TILES = [[5, 6, 7],
[8, 9, 10],
[11, 12, 13]]
# WALL_TILES is a 2D list in the format:
# upper left upper middle upper right
# middle left middle middle middle right
# lower left lower middle lower right
然后,您可以使用WALL\u TILES[0][2]
来解决类似于WALL\u右上方的问题。当您有多个墙瓷砖时,只要在瓷砖或其旁边的瓷砖发生更改时更改瓷砖的类型即可
添加:
要检查周围的瓷砖是否也是墙瓷砖,可以检查其x位置和y位置均在中心瓷砖1范围内的瓷砖。例如,您可以选中tilemap[pos[1]][pos[0]-1]
@user123非常感谢。你帮了我大忙,你能给我指引正确的方向吗?如何检查它旁边是否有墙式建筑?我也不知道你上一个列表示例的意思。我是新手
WALL_TILES = [[5, 6, 7],
[8, 9, 10],
[11, 12, 13]]
# WALL_TILES is a 2D list in the format:
# upper left upper middle upper right
# middle left middle middle middle right
# lower left lower middle lower right