pictSQUAREのキャラを表示してみた

連結された画像をプログラム内で分解して、アニメーション&上下左右に動かせるようにしてみました。

今回は連結された画像(4方向×3アニメーション)をloadImageし、12枚の個別の画像を生成することにした。プログラム内で新しい画像を作る場合createGraphicsを用いる。

# 画像を分割してリストで返す
def createChareChips(image):
    chips = list()
    for y in range(4):
        for x in range(3):
            chip = createGraphics(characterSize, characterSize)
            chip.beginDraw()
            chip.copy(image, x*chipSize, y*chipSize, chipSize, chipSize, 0, 0, characterSize, characterSize)
            chip.endDraw()
            chips.append(chip)
    return chips

画像が欲しい場合は、柚華さんのピクスク用シンプルアバターメーカーで作るといいよ!画像サイズがおかしいのでNG

実際のプログラム

ごちゃごちゃ長いね。

from KeyState import KeyState

images = list()

CHAR_DOWN = 0
CHAR_LEFT = 1
CHAR_RIGHT = 2
CHAR_UP = 3

chipSize = 32
chipType = CHAR_DOWN
chipInterval = 3
chipIndex = chipType * chipInterval
character = None
characterNo = 0
characterSize = 64
characterX = 128
characterY = 128
characterDistance = 4
characterDuration = 8

# 画像を分割してリストで返す
def createChareChips(image):
    chips = list()
    for y in range(4):
        for x in range(3):
            chip = createGraphics(characterSize, characterSize)
            chip.beginDraw()
            chip.copy(image, x*chipSize, y*chipSize, chipSize, chipSize, 0, 0, characterSize, characterSize)
            chip.endDraw()
            chips.append(chip)
    return chips

def setup():
    global images, character, characterX, characterY

    size(600, 300)
    noSmooth()
    characterX = width / 2 - characterSize / 2
    characterY = height / 2 - characterSize / 2

    # 画像読み込み
    for fileName in loadStrings("image_list.txt"):
        images.append(loadImage(fileName))

    # キャラをセット
    character = createChareChips(images[characterNo])

def draw():
    global chipType, chipIndex, characterX, characterY, character, characterNo

    # 背景
    background(200)

    # キャラの表示
    image(character[chipIndex], characterX, characterY)

    # アニメーション
    if frameCount % characterDuration == 0:
        chipIndex += 1
        if chipIndex >= chipType * chipInterval + chipInterval:
            chipIndex = chipType * chipInterval

    # 方向キー入力
    preChipType = chipType
    if KeyState.isPress(UP):
        chipType = CHAR_UP
        characterY -= characterDistance
    if KeyState.isPress(DOWN):
        chipType = CHAR_DOWN
        characterY += characterDistance
    if KeyState.isPress(LEFT):
        chipType = CHAR_LEFT
        characterX -= characterDistance
    if KeyState.isPress(RIGHT):
        chipType = CHAR_RIGHT
        characterX += characterDistance

    # キーが変わった場合のみアニメーションをリセット
    if preChipType != chipType:
        chipIndex = chipType * chipInterval

    # その他のキー入力
    if KeyState.isPress(" "):
        character = createChareChips(images[characterNo])
        characterNo += 1
        if characterNo >= len(images):
            characterNo = 0

def keyPressed():
    if key == 65535:
        KeyState.put(keyCode, True)
    else:
        KeyState.put(key, True)

def keyReleased():
    if key == 65535:
        KeyState.put(keyCode, False)
    else:
        KeyState.put(key, False)

以前作ったキー入力管理用クラスを辞書型で作り直した

# coding: utf-8

class KeyState(object):
    TRUE = 1
    FALSE = 2
    LOCK = 3
    state = dict()
    zyogai = [UP, DOWN, LEFT, RIGHT] # 連続入力禁止を除外するキー

    @classmethod
    def put(self, code=0, state=1):
        # 初入力処理
        if code not in KeyState.state:
            if code not in KeyState.zyogai and state == KeyState.TRUE:
                KeyState.state[code] = KeyState.LOCK
            else:
                KeyState.state[code] = state
        # 連続入力禁止を解除処理
        elif KeyState.state[code] == KeyState.LOCK and state == KeyState.FALSE:
            KeyState.state[code] = KeyState.FALSE
        # 通常処理
        elif KeyState.state[code] != KeyState.LOCK:
            KeyState.state[code] = state

    @classmethod
    def isPress(self, code=0):
        # 未入力は弾く
        if code not in KeyState.state:
            return KeyState.FALSE

        # 連続入力を弾く
        if KeyState.state[code] == KeyState.LOCK:
            return False

        # 通常処理
        if code in KeyState.zyogai:
            # 連続入力OKキー
            return KeyState.state[code]
        else:
            # 連続入力禁止キー
            KeyState.state[code] = KeyState.LOCK
            return KeyState.TRUE