- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在制作一款游戏,我首先制作了一些框架,供我学习和测试游戏中的不同内容。在这个游戏中,我有一个随机生成的图 block map ,其中包含资源泥土、草、水和煤炭。在代码中,还有一些其他不相关的资源,但我想做的是找到游戏中特定资源的坐标。我打算做的是说资源是一堵墙,它下面有一堵墙,旁边的中间墙的纹理将变成一个角 block 。我的问题是我不知道如何找到坐标。有人可以帮助我吗,老实说,我不确定我在做什么,但我正在努力学习。这是我的代码:
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()
编辑:我当前的代码已更新,添加的部分在最后
最佳答案
如果你想找到特定图 block 的坐标,那么这将需要一些工作。也就是说,您的程序必须搜索每个图 block 并进行比较以查看它是否是WALL
图 block 。即
for x in range(MAPWIDTH):
for y in range(MAPHEIGHT):
if tilemap[y][x] == WALL:
# Do something here...
但是,这是极其效率低下的。虽然当你的 map 只有 15 x 15 时这可能不是问题,但如果你扩大 map ,它就会开始消耗你的性能。
仅检查屏幕上显示的区域可能是更明智的做法。毕竟,您只是想弄清楚图 block 应该如何显示 - 否则并不重要。
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
图 block 。您可以通过创建像 WALL_UPPER_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_TILES[0][2]
来解决类似 WALL_UPPER_RIGHT
的问题。当您有多个墙砖时,只要墙砖或其旁边的砖发生变化,您只需更改墙砖的类型即可。
添加:
要检查周围的瓷砖是否也是墙砖,您可以检查 x 位置和 y 位置都在中心瓷砖 1 以内的瓷砖。例如,您可以检查tilemap[pos[1]][pos[0]-1]
。
关于python - 如何找到资源的坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53550275/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!