2

これを読んでくれてありがとう。私は pygame で非常に基本的なタイル ゲーム システムを作成しようとしています。私は pygame が得意ではないので、明らかな何かを見落としている可能性があります。これまでのところ、すべてを1つのファイルにまとめています。私が今持っているものは本当にずさんで、おそらくもっと効率的な方法がありますが、今は特定の種類のタイル (草、水など) に相当する数の 2d 配列を使用しているだけです。そのために私は numpy を使用しています。これは誰かが私に勧めたものだからです。この方法が好きかどうかはわかりませんが、将来、単純なグラフィックではなく、より具体的な属性を持つタイルができたらどうなるでしょうか? たとえば、宝箱やトラップのように?これをどのように構成しますか?

しかし、それでもなお、私の問題は現在、画面が単に黒く、草のタイルが描画されていないことです。

コードは次のとおりです。

import numpy
import pygame
import sys
from pygame.locals import *

pygame.init()

fpsClock = pygame.time.Clock()

windowWi = 800
windowHi = 608

mapWi = 50 # *16 = 800, etc
mapHi = 38

# ----- all of the images ------------------------------

grass1 = pygame.image.load('pictures\(Grass\grass1.png')


#-------------------------------------------------------
screen = pygame.display.set_mode((windowWi, windowHi))
pygame.display.set_caption("Tile Testing!")

gameRunning = True

groundArray = numpy.ones((mapWi,mapHi))

def drawMapArray(maparray):
    for x in range(mapWi,1):
        for y in range(mapHi,1):
            #Determines tile type.
            if maparray[y,x] == 1:
                screen.blit(grass1, (x*16, y*16))
            else:
                print "Nothing is here!"

while gameRunning:
    drawMapArray(groundArray)

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



    #Updates display and then sets FPS to 30 FPS. 
    pygame.display.update()
    fpsClock.tick(30)

私はゲーム デザインに非常に慣れていないため、フィードバックが必要なため、より良い構造の方向性に私を導いてください!

ありがとう、ライアン

編集:これを試してみましたが、これは論理的には理にかなっていますが、インデックスが範囲外のエラーになっています。

def drawMapArray(maparray):
    for x in range(0,mapWi,1):
        for y in range(0,mapHi,1):
            #Determines tile type.
            if maparray[y,x] == 1:
                screen.blit(grass1, (x*16, y*16))
            else:
                print "Nothing is here!"
4

2 に答える 2

1

描画方法が間違っています。

def drawMapArray(maparray):
    for x in range(mapWi,1):
        for y in range(mapHi,1):
            #Determines tile type.
            if maparray[y,x] == 1:
                screen.blit(grass1, (x*16, y*16))

最初のエラーはfor x in range(mapWi,1).

機能をご覧くださいrangemapWi2 つのパラメーターを使用しているため、 from からtoにループしますが1、これは望ましくありません。

0からまでループしたいmapWiので、使用する必要があります

for x in range(mapWi):
    for y in range(mapHi):

(使用xrangeするとさらに良くなりますが、それは非常に小さな改善にすぎません)

そうしないと、画面に何も描画されません。


2 番目のエラーは次の行です。

if maparray[y,x] == 1:

IndexError配列の初期化を混同したため、が得られます。それは実際にはmapWi 高くmapHi 広いです。したがって、次を使用して初期化する必要があります

groundArray = numpy.ones((mapHi,mapWi))

それ以外の

groundArray = numpy.ones((mapWi,mapHi))

それを説明するために、ちょっとしたテストを行います:

>>> numpy.ones((10,5))
array([[ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.]])
>>>

usingによってと(10, 5)の配列が得られることがわかります。height = 10width = 5


補足:

for event in pygame.event.get():
    if event.type == "QUIT":

何もしません。event.typeは文字列ではありません"QUIT"。終了イベントのタイプは12、またはそれ以上です: pygame.QUIT; したがって、次のように読む必要があります。

for event in pygame.event.get():
    if event.type == pygame.QUIT:

メインループを次のように書き換えます。

while gameRunning:
    drawMapArray(groundArray)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            gameRunning = False
            break

    #Updates display and then sets FPS to 30 FPS. 
    pygame.display.update()
    fpsClock.tick(30)

pygame.quit()

を呼び出さないようにしsys.exitます。

ベター: メイン ループを、通常メイン ループで実行する 3 つのステップに分割します。

while gameRunning:
    draw()         # do all the drawing stuff in this function
    handle_input() # handle all input stuff in this function
    update()       # update the game state in this function
于 2012-08-09T08:32:34.673 に答える
1

より多くのタイル タイプを追加するにつれてスケーリングが向上する可能性のある 1 つのソリューションは、辞書を使用して、配列内の数値から画像を取得することです。次に例を示します。

tile_dict = {1 : pygame.image.load('pictures\(Grass\grass1.png'),
             2 : pygame.image.load('pictures\rock.png')
            }

そして、描画関数の辞書から関連するエントリを描画するだけです

def drawMapArray(maparray):
    for x in range(0, mapWi):
        for y in range(0, mapHi):
            #Determines tile type.
            current_tile = tile_dict[maparray[x, y]]
            screen.blit(current_tile, (x*16, y*16))
于 2012-08-09T00:40:45.787 に答える