
連結された画像をプログラム内で分解して、アニメーション&上下左右に動かせるようにしてみました。
今回は連結された画像(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