cocos2d というか pyglet は、2Dスプライトに使うテクスチャの補完パラメーターがデフォルトでは GL_LINEAR
になるらしく、タイル状にスプライトを並べた絵から矩形を切り出して使うと、ちょっとだけ隣のピクセルが滲んでくる。
まあ、スプライトを拡大縮小すると境界はボケないのに中だけぼやけて、いかにもOpenGLくさい感じになってしまうのもアレだしなぁ。8bit感のあるジャギジャギな絵で割りきって作りたい。
これ、テクスチャの GL_TEXTURE_MAG_FILTER
と GL_TEXTURE_MIN_FILTER
に GL_NEAREST
を付ければよさそう。ロードした時点でもう付けておく。
image = pyglet.image.load('hoge.png')
glBindTexture(image.texture.target, image.texture.id)
glTexParameteri(image.texture.target, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexParameteri(image.texture.target, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
sprite = Sprite(image.texture)
これでピクセルがボケない。
sprite1 = Sprite(image.texture.get_region(0, image.height - 32, 32, 32))
sprite2 = Sprite(image.texture.get_region(32, image.height - 32, 32, 32))
actor_layer.add(sprite1)
actor_layer.add(sprite2)
タイルの隣のピクセルも滲み出してこない。
TMXのタイルマップを読み込んだ場合、暗黙的に画像がロードされて個別のテクスチャになってしまうようなので、タイルセットの全タイル定義に適用する。
map_resource = cocos.tiles.load('fuga.tmx')
for res in map_resource.contents.values():
if isinstance(res, cocos.tiles.TileSet): # タイルセットだけ
for tile in res.values():
glBindTexture(tile.image.texture.target, tile.image.texture.id)
glTexParameteri(tile.image.texture.target, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexParameteri(tile.image.texture.target, GL_TEXTURE_MAG_FILTER, GL_NEAREST)