Как мне найти координаты ресурса? - PullRequest
0 голосов
/ 30 ноября 2018

Я делаю игру, и я начал с создания какой-то основы, чтобы я мог изучать и тестировать разные вещи в ней.В этой игре у меня есть случайно сгенерированная карта тайлов с ресурсами грязи, травы, воды и угля.В коде есть и другие не относящиеся к делу ресурсы, но я пытаюсь найти координаты определенного ресурса в игре.Что я планирую сделать с этим, так это сказать, что ресурс представляет собой стену, а под ней есть стена, а рядом с ней текстура для средней стены превратится в угловой элемент.Моя проблема в том, что я не знаю, как найти координаты.Может кто-нибудь, пожалуйста, помогите мне, я, честно говоря, не уверен, что я делаю, но я пытаюсь учиться.Вот мой код:

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()

Редактировать: мой текущий код был обновлен, добавленная часть находится в самом конце

1 Ответ

0 голосов
/ 30 ноября 2018

Если вы хотите найти координаты конкретной плитки, тогда потребуется некоторая работа.А именно, ваша программа должна будет просмотреть каждую плитку и сравнить ее, чтобы увидеть, является ли она плиткой WALL.то есть

for x in range(MAPWIDTH):
    for y in range(MAPHEIGHT):
        if tilemap[y][x] == WALL:
            # Do something here...

Однако, это крайне неэффективно.Хотя это может быть проблемой, если ваша карта только 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.Вы могли бы сделать это, просто создав константы, такие как 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_UPPER_RIGHT с WALL_TILES[0][2].Если у вас есть несколько настенных плиток, вы можете просто менять тип плитки всякий раз, когда ее или плитка рядом с ней изменяется.

ADDED:

Чтобы проверить, еслиокружающие плитки также являются настенными плитками, вы можете проверить плитки, чьи x-position и y-position находятся в пределах 1 от центральной плитки.Например, вы можете проверить tilemap[pos[1]][pos[0]-1].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...