首页 > 解决方案 > 如何制作墙贴图?

问题描述

我正在制作游戏,但我想通过添加墙来使游戏更难。我发现它叫做瓷砖地图。但它有多种颜色,我只想要一种颜色,灰色。我希望它像1,1,1,1, 1,0,0,1, 1,0,0,1, 1,1,1,1

0 = 没有。1 = 灰色矩形。我也需要它像WIDTH = 16 HEIGHT = 9 TILESIZE = dw/WIDTH

但我找不到实现它的方法。

我尝试使用 def 代码,但它落后于我的游戏。我尝试使用这个网站:http ://usingpython.com/pygame-tilemaps/

import pygame
import os
import sys
pygame.mixer.pre_init()
pygame.mixer.init(44100, 16, 2, 262144)
pygame.init()
from pygame.locals import*
import cv2
import time
import random
import pickle
import shutil

grey = (128,128,128)

def pause():

    paused = True

    while paused:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    paused = False
                elif event.key == pygame.K_SPACE:
                    menu(1)
        screen.fill(white)
        mts("Paused", black, -100, 100)
        mts("Press esc to go back to the game or press space to go back to the menu", black, 25, 45)
        pygame.display.update()
        clock.tick(60)

def score(score):
    text = pygame.font.Font('Fonts/Kuiper_Belt.otf', 25).render("Score: "+str(score), True, black)
    screen.blit(text, [0,0])

def highscore(highscore):
    text = pygame.font.Font('Fonts/Kuiper_Belt.otf', 25).render("Highscore: "+str(highscore), True, black)
    screen.blit(text, [1100,0])

#define the apple to spawn in a random place
def randAppleGen():
    randAppleX = random.randrange(0, dw-at, bs)
    randAppleY = random.randrange(0, dh-at, bs)

    return randAppleX,randAppleY

def snake(bs, sl):
    for XnY in sl:
        pygame.draw.rect(screen, Dgreen, [XnY[0],XnY[1],bs,bs])

def text_objects(text,color,fontS):
    font = pygame.font.Font('Fonts/Kuiper_Belt.otf', fontS)
    textSurface = font.render(text, True, color)
    return textSurface, textSurface.get_rect()

def mts(msg,color, y_displace=0, fs=35):
    textSurf, textRect = text_objects(msg,color,fs)
    textRect.center = (dw / 2), (dh / 2)+y_displace
    screen.blit(textSurf, textRect)

def gameLoop():
    global at
    global bs
    hs = pickle.load( open( os.getenv('APPDATA')+str('/Snake Universe/h.SNUN'), "rb" ) )
    gameExit = False
    gameOver = False
    gameHack = False
    tilemap = [
  [1,1,1,1],
  [1,0,0,1],
  [1,0,0,1],
  [1,1,1,1]
]

    WIDTH = 4 
    HEIGHT = 4
    TILESIZE = dw/WIDTH



    Speed = 20
    lead_x = dw/2
    lead_y = dh/2

    lead_x_change = 0
    lead_y_change = 0
    pygame.mixer.music.load(os.path.join(os.getcwd(), 'Sounds', 'music1.ogg'))
    pygame.mixer.music.play(-1) 

    slist = []
    sl = 0
    if sl > 2304:
        gameHack = True

    randAppleX,randAppleY = randAppleGen()

    while not gameExit:
        for row in range(HEIGHT):
            for column in range(WIDTH):
                if tilemap[row][column] == 1:
                    pygame.draw.rect(screen, grey, (column*TILESIZE, row*TILESIZE, TILESIZE, TILESIZE))

        while gameOver == True:
            screen.fill(white)
            mts("Game over", red, -50,100)
            mts("Press enter to play again or press space to go back to the menu", black, 50,50)
            pygame.display.update()
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    gameOver = False
                    gameExit = True
                    pygame.quit()
                    sys.exit()
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_KP_ENTER or event.key==pygame.K_RETURN:
                        gameLoop()
                    if event.key == pygame.K_SPACE:
                        gameExit = False
                        gameOver = False
                        menu(1)
        while gameHack == True:
            pygame.mixer.music.stop()
            screen.fill(white)
            mts("Hacked", red, -50,100)
            mts("You hacked or exploit the game, press enter to quit the game", black, 50,50)
            pygame.display.update()
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    gameOver = False
                    gameExit = True
                    pygame.quit()
                    sys.exit()
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_KP_ENTER or event.key==pygame.K_RETURN:
                        pygame.quit()
                        sys.exit()

        lead_x += lead_x_change
        lead_y += lead_y_change
        prev_x, prev_y = lead_x_change, lead_y_change 
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                gameExit = True
                pygame.quit()
                sys.exit()

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT and prev_x != bs:
                    lead_x_change, lead_y_change = -bs, 0
                elif event.key == pygame.K_RIGHT and prev_x != -bs:
                    lead_x_change, lead_y_change = bs, 0
                elif event.key == pygame.K_UP and prev_y != bs:
                    lead_x_change, lead_y_change = 0, -bs
                elif event.key == pygame.K_DOWN and prev_y != -bs:
                    lead_x_change, lead_y_change = 0, bs    
                elif event.key == pygame.K_ESCAPE:
                    pause()
                elif event.key == pygame.K_s and Speed >= 10 and Speed < 60:
                    Speed += 10
                    clock.tick(Speed)
                elif event.key == pygame.K_d and Speed <= 60 and Speed > 10:
                    Speed -= 10
                    clock.tick(Speed)
                elif event.key == pygame.K_a:
                    sl += 1

        if not pygame.Rect(0, 0, dw, dh).contains(lead_x, lead_y, bs, bs):
            gameOver = True

        screen.fill(white)

        #draw the apple
        apple = pygame.draw.rect(screen, red, [randAppleX,randAppleY,at,at])

        sh = []
        sh.append(lead_x)
        sh.append(lead_y)
        slist.append(sh)
        snake(bs, slist)

        if len(slist) > sl:
            del slist[0]

        for eachSegment in slist[:-1]:
            if eachSegment == sh:
                gameOver = True

        score(sl)
        highscore(hs)

        if sl > hs:
            hs += 1
            os.remove( os.getenv('APPDATA')+str('/Snake Universe/h.SNUN') )
            pickle.dump( sl, open( os.getenv('APPDATA')+str('/Snake Universe/h.SNUN'), "wb" ) )
            hs = pickle.load( open( os.getenv('APPDATA')+str('/Snake Universe/h.SNUN'), "rb" ) )


        pygame.display.update()

        #make the apple spawn
        appleRect = pygame.Rect(randAppleX, randAppleY, at, at)
        if appleRect.collidepoint(lead_x, lead_y):
            while True:
                randAppleX, randAppleY = randAppleGen()
                appleRect = pygame.Rect(randAppleX, randAppleY, at, at)
                if not appleRect.collidepoint(lead_x, lead_y) and \
                not any(appleRect.collidepoint(*p) for p in slist):
                    break
            sl += 1
        clock.tick(Speed)
    pygame.quit()
    sys.quit()

我希望它显示单色瓷砖地图,但我不断崩溃。

标签: pythonpygame

解决方案


如果您已经在代码中有问题并且您的链接中有示例,我不明白您为什么会遇到问题。

tilemap = [
  [1,1,1,1],
  [1,0,0,1],
  [1,0,0,1],
  [1,1,1,1]
]

MAPHEIGHT = 4 
MAPWIDTH = 4
TILESIZE = dw/MAPWIDTH
GREY = (128,128,128)


for row in range(MAPHEIGHT):
    for column in range(MAPWIDTH):
        if tilemap[row][column] == 1:
            pygame.draw.rect(screen, GREY, column*TILESIZE, row*TILESIZE, TILESIZE, TILESIZE))                 

编辑:

你有问题,因为你在错误的地方使用它。您必须在screen.fill(清除缓冲区)和pygame.update(将缓冲区发送到视频卡并将其显示在屏幕上)之间进行绘制

   screen.fill(white)

   for row in range(HEIGHT):
       for column in range(WIDTH):
           if tilemap[row][column] == 1:
                pygame.draw.rect(screen, grey, (column*TILESIZE, row*TILESIZE, TILESIZE, TILESIZE))

   # ... draw other things ...       

   pygame.display.update()

你的代码很乱。你应该有

  • 您更新值、移动对象、箱子/重新生成对象、加载/保存泡菜等的地方,但不要在那里绘制。
  • 您使用的地方screen.fill,绘制所有元素,使用pygame.display.update但不更新对象并且不加载/保存泡菜

编辑:

我的版本(具有更好的变量和函数名称)

import pygame
import os
import sys
import random
import pickle

# --- constants --- (UPPERCASE names)

WHITE = (  0,   0,   0)
RED   = (255,   0,   0)
BLACK = (255, 255, 255)
GREEN = (255,   0,   0)
GREY  = (128, 128, 128)

DISPLAY_WIDTH  = 1200
DISPLAY_HEIGHT = 800

APPDATA = os.getenv('APPDATA', '')
PICKLE_PATH = os.path.join(APPDATA, 'Snake Universe', 'h.SNUN')

WIDTH  = 4
HEIGHT = 4
TILE_SIZE = DISPLAY_WIDTH/WIDTH
BLOCK_SIZE = 20

# --- functions ---

def pause():

    paused = True

    while paused:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    paused = False
                elif event.key == pygame.K_SPACE:
                    menu(1)

        screen.fill(WHITE)
        mts("Paused", BLACK, -100, 100)
        mts("Press esc to go back to the game or press space to go back to the menu", BLACK, 25, 45)
        pygame.display.update()

        clock.tick(60)

def text_object(text, color=BLACK, font_size=25):
    font = pygame.font.SysFont(None, font_size)
    surface = font.render(text, True, color)
    rect = surface.get_rect()
    return surface, rect

def draw_score(screen, score):
    surface, rect = text_object("Score: " + str(score))
    screen.blit(surface, (0, 0))

def draw_highscore(screen, highscore):
    surface, rect = text_object("Highscore: " + str(highscore))
    screen.blit(surface, (1100, 0))

def rand_apple_pos():
    x = random.randrange(0, DISPLAY_WIDTH - BLOCK_SIZE, BLOCK_SIZE)
    y = random.randrange(0, DISPLAY_HEIGHT - BLOCK_SIZE, BLOCK_SIZE)
    return x, y

def draw_snake(screen, snake):
    for x, y in snake:
        pygame.draw.rect(screen, GREEN, (x, y, BLOCK_SIZE, BLOCK_SIZE))

def mts(msg, color, y_displace=0, fs=35):
    surface, rect = text_object(msg, color, fs)
    rect.center = (DISPLAY_WIDTH / 2), (DISPLAY_HEIGHT / 2) + y_displace
    screen.blit(surface, rect)

def game_loop(screen):
    highscore = 0

    #highscore = pickle.load(open(PICKLE_PATH, "rb" ))

    game_exit = False
    game_over = False
    game_hack = False

    speed = 10
    lead_x = DISPLAY_WIDTH/2
    lead_y = DISPLAY_HEIGHT/2

    lead_x_change = 0
    lead_y_change = 0
    #pygame.mixer.music.load(os.pBLOCK_SIZEh.join(os.getcwd(), 'Sounds', 'music1.ogg'))
    #pygame.mixer.music.play(-1)

    snake = [(100, 100)]
    score = 0

    apple_x, apple_y = rand_apple_pos()
    apple_rect = pygame.Rect(apple_x, apple_y, BLOCK_SIZE, BLOCK_SIZE)

    clock = pygame.time.Clock()

    while not game_exit:

        while game_over == True:
            screen.fill(WHITE)
            mts("Game over", RED, -50,100)
            mts("Press enter to play again or press space to go back to the menu", BLACK, 50,50)
            pygame.display.update()

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    game_over = False
                    game_exit = True
                    pygame.quit()
                    sys.exit()
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_KP_ENTER or event.key==pygame.K_RETURN:
                        #gameLoop()
                        game_over = False
                    if event.key == pygame.K_SPACE:
                        game_exit = False
                        game_over = False
                        menu(1)

        while game_hack == True:
            pygame.mixer.music.stop()
            screen.fill(WHITE)
            mts("Hacked", RED, -50, 100)
            mts("You hacked or exploit the game, press enter to quit the game", BLACK, 50,50)
            pygame.display.update()
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    game_over = False
                    game_exit = True
                    pygame.quit()
                    sys.exit()
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_KP_ENTER or event.key==pygame.K_RETURN:
                        pygame.quit()
                        sys.exit()

        lead_x += lead_x_change
        lead_y += lead_y_change
        prev_x, prev_y = lead_x_change, lead_y_change

        # --- events ---

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_exit = True
                pygame.quit()
                sys.exit()

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT and prev_x != BLOCK_SIZE:
                    lead_x_change, lead_y_change = -BLOCK_SIZE, 0

                elif event.key == pygame.K_RIGHT and prev_x != -BLOCK_SIZE:
                    lead_x_change, lead_y_change = BLOCK_SIZE, 0

                elif event.key == pygame.K_UP and prev_y != BLOCK_SIZE:
                    lead_x_change, lead_y_change = 0, -BLOCK_SIZE

                elif event.key == pygame.K_DOWN and prev_y != -BLOCK_SIZE:
                    lead_x_change, lead_y_change = 0, BLOCK_SIZE

                elif event.key == pygame.K_ESCAPE:
                    pause()

                elif event.key == pygame.K_s and speed >= 10 and speed < 60:
                    speed += 10
                    clock.tick(speed)

                elif event.key == pygame.K_d and speed <= 60 and speed > 10:
                    speed -= 10
                    clock.tick(speed)

                elif event.key == pygame.K_a:
                    score += 1

        # --- moves ---


        if not pygame.Rect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT).contains(lead_x, lead_y, BLOCK_SIZE, BLOCK_SIZE):
            game_over = True

        if apple_rect.collidepoint(lead_x, lead_y):
            while True:
                apple_x, apple_y = rand_apple_pos()

                # update existing Rect without creating new Rect
                apple_rect.x = apple_x
                apple_rect.y = apple_x

                if not apple_rect.collidepoint(lead_x, lead_y) and \
                not any(apple_rect.collidepoint(*pos) for pos in snake):
                    break

            score += 1

        # update snake
        snake.append( (lead_x, lead_y) )
        if len(snake) > score:
            del snake[0]

        for segment in snake[:-1]:
            if segment == snake[-1]:
                game_over = True

        if score > highscore:
            #pickle.dump(score, open(PICKLE_PATH, "wb"))
            highscore = score

        if score > 2304:
            game_hack = True

        # --- draw ---

        screen.fill(WHITE)

        #draw_wall(screen)
        for row in range(HEIGHT):
            for column in range(WIDTH):
                if tilemap[row][column] == 1:
                    pygame.draw.rect(screen, GREY, (column*TILE_SIZE, row*TILE_SIZE, TILE_SIZE, TILE_SIZE))

        draw_snake(screen, snake)

        #draw the apple
        #draw_apple(screen, apple)
        pygame.draw.rect(screen, RED, apple_rect)

        draw_score(screen, score)
        draw_highscore(screen, highscore)

        pygame.display.update()

        clock.tick(speed)

    # --- end ---

    pygame.quit()
    sys.quit()


# --- variables ---

tilemap = [
  [1,1,1,1,1,1,1,1,1,1,1,1],
  [1,0,0,1,1,0,0,1,1,0,0,1],
  [1,0,0,1,1,0,0,1,1,0,0,1],
  [1,0,0,1,1,0,0,1,1,0,0,1],
  [1,0,0,1,1,0,0,1,1,0,0,1],
  [1,0,0,1,1,0,0,1,1,0,0,1],
  [1,0,0,1,1,0,0,1,1,0,0,1],
  [1,1,1,1,1,1,1,1,1,1,1,1],
]

HEIGHT = len(tilemap)
WIDTH = len(tilemap[0])

# --- main ---

pygame.mixer.pre_init()
pygame.mixer.init(44100, 16, 2, 262144)
pygame.init()
screen = pygame.display.set_mode((DISPLAY_WIDTH, DISPLAY_WIDTH))
game_loop(screen)

推荐阅读