Nyaatrap

アダルト百合ゲー開発ブログ。一部記事は18歳未満閲覧禁止です。

Home どれぱら デーモンマスタークリス 商用ゲーム フリーゲーム

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Ren'py で Tilemap を使う

見下ろし型のシミュレーションやRPGなどでよく使われる、タイルマップを表示するシンプルなコードです。タイルマップは多くの2Dゲームエンジンに標準で搭載されていますが、ren'py にはなかったので加えました。

Tilemap を使うには、まず次のコードを適当なところにコピーします。
## Tilemap displayable

init -2 python:

class Tilemap(renpy.Displayable):

"""

This creates a displayable by tiling other displayables. It has the following field values.

map - A 2-dimensional list of integers that represent index of a tileset.
tileset - A list of displayables that is used as a tile of tilemap.
tile_width - width of each tile.
tile_height - height of each tile.
area - Rectangle area of the displayable that will be rendered. If it's None, default, it renders all tiles.

"""

def __init__(self, map, tileset, tile_width, tile_height, **properties):

super(Tilemap, self).__init__(**properties)
self.map = map
self.tileset = tileset
self.tile_width = tile_width
self.tile_height = tile_height
self.area = None


def render(self, width, height, st, at):

render = renpy.Render(width, height)

# Blit all tiles into the render.
for y in xrange(len(self.map)):
for x in xrange(len(self.map[y])):
render.blit(renpy.render(self.tileset[self.map[y][x]], self.tile_width, self.tile_height, st, at), (x*self.tile_width, y*self.tile_height))

# Crop the render.
if self.area == None:
render = render.subsurface((0, 0, len(self.map[y])*self.tile_width, len(self.map)*self.tile_height))
else:
render = render.subsurface(self.area)

return render


def per_interact(self):

# Redraw per interact.
renpy.redraw(self, 0)


def visit(self):

# If the displayable has child displayables, this method should be overridden to return a list of those displayables.
return self.tileset

これで他の Displayable と同じように、 image hogehoge = Tilemap(map, tileset, tile_width, tile_height) などの方法で使えます。使用例はこんな感じ。
init python:

# displayables のリストを定義。
tileset =[Image("water.png"), Image("sand.png"), Image("forest.png"), Image("rock.png")]

# 整数の二次元配列を定義。値はtilesetのインデックス。
# 例えば、0 は tileset[0] を表す。
map = [
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0],
[0,0,1,1,1,3,3,1,1,1,1,1,1,0,0,0,0],
[0,1,1,1,1,3,3,3,1,1,1,1,1,1,1,0,0],
[0,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,2,2,1,1,1,1,1,1],
[1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1],
[1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1],
[1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1],
[1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1],
[1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
]

# Tilemap クラスのインスタンスを、以下の引数で作成。
# (map, tileset, tile_width, tile_height).
tilemap = Tilemap(map, tileset, 64,64)

# イメージタグに関連付けても良い
image overworld = tilemap


# ゲームはここから
label start:

$ tilemap.area = None
show overworld at truecenter
"マップ全てを表示"

$ tilemap.area = (64,64,256,256)
"マップの一分を表示"

return

コメント

コメントの投稿


管理者にだけ表示を許可する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。