1

以下のコードは、黒い背景、白いボックス、およびテキストを描画します。ただし、描画順序が決定されていないようで、テキストまたは四角形が背景の四角形で覆われていることがあります。これを管理する適切な方法を理解しようとしていますか?

import sdl2.ext
import sdl2.sdlttf
from sdl2 import SDL_Color, SDL_Init

WHITE = SDL_Color(255, 255, 255)

class Entity(sdl2.ext.Entity):
    def __init__(self, world, sprite, posx=0, posy=0):
        self.sprite = sprite
        self.sprite.position = posx, posy

sdl2.ext.init()

window = sdl2.ext.Window("PySDL2", size=(320, 240))
window.show()
world = sdl2.ext.World()

texture_renderer = sdl2.ext.Renderer(window)
spriterenderer = sdl2.ext.TextureSpriteRenderSystem(texture_renderer)
factory = sdl2.ext.SpriteFactory(sdl2.ext.TEXTURE, renderer=texture_renderer)

world.add_system(spriterenderer)

sdl2.sdlttf.TTF_Init()
font = sdl2.sdlttf.TTF_OpenFont('resources/Helvetica.dfont',32)
text_surface = sdl2.sdlttf.TTF_RenderText_Blended(font, 'test', WHITE).contents
sdl2.sdlttf.TTF_CloseFont(font)

bg = factory.from_color(sdl2.ext.Color(0, 0, 0), size = (320,240))
Entity(world, bg, 0, 0)

c = factory.from_color(sdl2.ext.Color(255, 255, 255), size = (50,50))
Entity(world, c, 100, 100)

text_sprite = factory.from_surface(text_surface)
text_entity = Entity(world, text_sprite, 50, 50)

def run():
    running = True
    while running:
        events = sdl2.ext.get_events()
        for event in events:
            if event.type == sdl2.SDL_QUIT:
                running = False
                break
        world.process()
run()
sdl2.ext.quit()
4

1 に答える 1

0

のデフォルトの実装では、オブジェクトの属性をTextureSpriteRenderSystem使用して描画順序を決定します。すべてのスプライトの深度が同じである場合、それらの描画順序が不定になり、望ましくない動作が発生します。depthSprite

深さの値が 0の Aは、より高い深さの値 (たとえば 10 Sprite) の下 (または前) に描画されます。作成Spriteされるそれぞれのデフォルトの深Spriteさは 0 です。背景と長方形depthを負の値に設定して、描画順序を強制する:

bg = factory.from_color(sdl2.ext.Color(0, 0, 0), size = (320,240))
bg.depth = -99 # always below everything
Entity(world, bg, 0, 0)

c = factory.from_color(sdl2.ext.Color(255, 255, 255), size = (50,50))
c.depth = -1
Entity(world, c, 100, 100)

詳細については、PySDL2 スプライトのドキュメントを参照してください。

于 2015-02-23T11:46:48.847 に答える