hokug使ってみる_スプライトシートでフレームアニメーション
公開 2025/08/06 22:18
最終更新 2025/08/07 13:42
hokugで用意されているBlockクラスを使ってフレームアニメーションしようとすると、1コマにつき1画像ファイル使うので凝った動作をつくるとき読み込みや管理が面倒になってきます。

なのでスプライトシートに画像をまとめてアニメーションに使えるようにしてみました。

※スプライトシートはこういうやつです


このロボのキャラを前回作った背景に表示させてみます。
コードは前回のファイルに追加していく感じです。
(前回「ツクセカのマップを利用する」https://simblo.net/u/Nz7RmE/post/476286

背景と世界観が合いませんが、たまたま手元にあったやつなので仕方ありません。

imgフォルダにスプライトシート画像を保存し
hokug.config.jspreLoad部分に画像ファイル名を追加します。

アニメーション用Spriteクラスを作ってみる #


Blockクラスをコピー #

とりあえずhokug.jsからBlockクラスをgame.jsにコピーして書き換えていきます。

// ブロッククラス
hokug.Class.Block = function() {
	this.x = 0; // X座標
	this.y = 0; // Y座標
	this.width = 0; // 幅
	this.height = 0; // 高さ
	this.topImgs = []; // 上向きの時の画像
	this.rightImgs = []; // 右向きの時の画像
	this.bottomImgs = []; // 下向きの時の画像
	this.leftImgs = []; // 左向きの時の画像
	this.startTime = 0; // アニメーション開始時刻
	this.vector = hokug.Vector.Top; // 今向いている方向
//メソッド部分は省略
};

スプライトシートアニメーション用に書き換え #

名前をAnimSprite等にして、書き方も新しいバージョンで書きます
class AnimSprite {
	//初期化
	constructor(option) {
		this.x = option.x || 0; // X座標
		this.y = option.y || 0; // Y座標
		this.width = option.width || 32; // 幅
		this.height = option.height || 32; // 高さ
		this.img = option.img; //spriteの画像
		this.originX = option.originX || 0; //スプライトのx座標原点
		this.originY = option.originY || 0; //スプライトのy座標原点
		this.topImgs = option.topImgs || []; // 上向きの時フレーム番号[idx1,idx2,idx3...]
		this.rightImgs = option.rightImgs || []; // 右向きの時フレーム番号
		this.bottomImgs = option.bottomImgs || []; // 下向きの時フレーム番号
		this.leftImgs = option.leftImgs || []; // 左向きの時フレーム番号
		this.startTime = 0; // アニメーション開始時刻
		this.vector = hokug.Vector.Bottom; // 今向いている方向
	}
}
増えたパラメータは img,originX,Yです。originX,Yは前回やったやつと同じ。
imghokug.res["configで指定したファイル名"]の形式です。

topImgsのあたりはパラメータ名はBlockクラスと同じですが、Blockクラスではファイル名の配列だったのに対し、フレーム番号になります(["ファイル0","ファイル1","ファイル2"] → [0,1,2])

メソッド部分は今回は使わないので外しました。

アニメーションの描画機能を作る #

hokug.drawBlock()を直してフレーム番号での描画に対応した関数を作ります。

drawBlockメソッドをコピー #

Blockクラスと同じようにgame.jsにコピーします。
// Blockを描画する
hokug.drawBlock = function(block) {
	var targetImages = [];
	switch (block.vector) {
		case hokug.Vector.Top:
			targetImages = block.topImgs;
			break;
		case hokug.Vector.Right:
			targetImages = block.rightImgs;
			break;
		case hokug.Vector.Bottom:
			targetImages = block.bottomImgs;
			break;
		case hokug.Vector.Left:
			targetImages = block.leftImgs;
			break;
	}
	if (targetImages.length === 0) {
		return;
	}

	var ago = ((new Date()).getTime() - block.startTime) / 200;
	ago = parseInt(ago % targetImages.length, 10);
	var x = block.x - (block.width / 2);
	var y = block.y - (block.height / 2);
	hokug.ctx.drawImage(targetImages[ago], x, y, block.width, block.height);
};

drawAnimSpriteに書き換え #

コピーしたhokug.drawBlockメソッドをdrawAnimSprite()関数として書き換えます。
/**
 * AnimSpriteの描画
 */
function drawAnimSprite(block) {
	let targetImages = [];
	switch (block.vector) {
		case hokug.Vector.Top:
			targetImages = block.topImgs;
			break;
		case hokug.Vector.Right:
			targetImages = block.rightImgs;
			break;
		case hokug.Vector.Bottom:
			targetImages = block.bottomImgs;
			break;
		case hokug.Vector.Left:
			targetImages = block.leftImgs;
			break;
	}
	if (targetImages.length === 0) {
		return;
	}

	let ago = ((new Date()).getTime() - block.startTime) / 200;
	ago = parseInt(ago % targetImages.length, 10);
	drawBg(block, targetImages[ago]);
}
メソッドから関数に直しただけで中はほとんど同じです。
描画原点をスプライトの中心に移す処理はdrawBg()関数の中にあるので削除します。

前回作ったdrawBg()関数を改造 #

表示するのがBgだけじゃなくなったので名前をdrawSpriteとかに変えてもいいかもしれません
/**
 * Spriteの描画
 */
function drawSprite(bg, frameIdx) {//引数にfremeIdxを追加
	//フレーム番号が-1のとき描画しない
	if (bg.idx == -1) return
	const w = bg.width;
	const h = bg.height;
	//表示位置の調整
	const x = bg.x - (w * bg.originX);
	const y = bg.y - (h * bg.originY);

	let idx = frameIdx || bg.idx; //フレーム番号
	
	const col = Math.floor(bg.img.width / w); //スプライトシートの横コマ数
	const row = Math.floor(bg.img.height / h); //スプライトシートの縦コマ数

	//フレーム番号がコマ数以上のときループ
	const maxIdx = row * col;
	idx = idx % maxIdx;
	//スプライトシートの切り取り開始位置
	const sx = (idx % col) * w;
	const sy = Math.floor(idx / col) * h;
	//hokugのcanvasに描画
	hokug.ctx.drawImage(bg.img, sx, sy, w, h, x, y, w, h);
}
引数にframeIdxを追加して、未指定時はスプライトのidxを使用するようにします

初期化処理の中にキャラ表示を追加 #

変数playerを設定 #

game.jsの頭にAnimSpriteを入れておく変数を設定します。
let player ;

init()内に追加 #

player = new AnimSprite({
		img: hokug.res["robo.png"],
		topImgs: [9, 10, 11, 10],
		rightImgs: [3, 4, 5, 4],
		leftImgs: [6, 7, 8, 7],
		bottomImgs: [0, 1, 2, 1]
});
引数内のパラメータはオブジェクト形式になっているので並び順を覚えなくても指定できます。

timar()内に描画処理を追加 #

canvasを塗りつぶす処理の後に追加します。
hokug.drawFillColor(bgColor);
	field.draw();//追加
	drawAnimSprite(player);//追加

画面左上にアニメーションするキャラが表示されたでしょうか。

touchDown()やkeyDown()にplayerの位置やvectorを変更する処理を入れれば動かせます
スゲーでっかいカエル
プロフィールページ
スゲーでっかいカエルです。javascriptでゲームを作ったりします。
最近の記事
モニスクレシピ_ストーリーの進行管理
ストーリーの進行管理 ストーリー進行用の変数を用意しておく # 単発のイベント(アイテムを持ってると道が通れるとか)…
2025/09/25 21:24
モニスクレシピ_定期的に復活する設置アイテム
一定時間で再取得可能になるアイテムのスクリプト 前記事の↓複数個取れるアイテムのスクリプトを流用します https://simb…
2025/09/24 08:40
モニスクレシピ_所持アイテムの消費表現
画像のように特定のアイテムを情報ボックスから消す方法 単純に[var:app_message_info アイテム名]とやってしまうと、どの…
2025/09/23 11:15
ツクセカ用モニスクレシピ
自分のマップで使ったモニスクのメモ。 もっと効率が良い方法もあると思いますので参考程度に。 間違いあったら教えてくだ…
2025/09/22 08:45
約5秒後に特定のマスのタイルを消すスクリプト(モニスク)
判定から5秒後に(0,0)(0,1)(0,2)(0,3)(0,4)のタイルを消す # 前面レイヤーを消すスクリプトになってるので任意で変更してくだ…
2025/09/10 12:39
hokug使ってみる_スプライトシートでフレームアニメーション
hokugで用意されているBlockクラスを使ってフレームアニメーションしようとすると、1コマにつき1画像ファイル使うので凝った動…
2025/08/06 22:18
hokug使ってみる_ツクセカのマップを利用する
ツクセカは2Dマップを作成して公開したりみんなで遊べたりするサービスです。 https://tsukuseka.com/ これで作ったマップ…
2025/08/04 22:26
hokug使ってみる_メモ3(Blockクラス)
hokugのBlockクラスについてメモ プロパティ # プロパティ:初期値 x:0 //x座標 y:0 //y座標 width:0 //幅 height:0 //…
2025/07/31 20:40
hokug使ってみる_メモ2(メソッド)
hokugのメソッドをメモ メソッドはオブジェクトが持ってる関数です。 今まで使ってたhokug.drawText() とかそういうやつ …
2025/07/29 23:25
hokug使ってみる_メモ(game.js)
前回までの記事まとめ 1)https://simblo.net/u/Nz7RmE/post/453297 2)https://simblo.net/u/Nz7RmE/post/457242 3)https://s…
2025/07/28 21:25
hokug(ホクジー)使ってみる_5
前回記事 https://simblo.net/u/Nz7RmE/post/463575 今回は画像を使ってみます。 ゲーム画面で画像を表示する # 画像の…
2025/07/27 18:05
hokug(ホクジー)使ってみる_4
前回記事 https://simblo.net/u/Nz7RmE/post/460515 今回はゲームっぽい要素を入れていきます。 今まで文字を動かしてい…
2025/07/26 13:25
hokug(ホクジー)使ってみる_3
前回記事 https://simblo.net/u/Nz7RmE/post/457242 前回の作ったファイルに続けて書き込んでいく感じになります。 今回は…
2025/07/24 14:51
hokug(ホクジー)使ってみる_2
前回記事 https://simblo.net/u/Nz7RmE/post/453297 前回の終わりで「次は条件分岐やループだ」と言ったがあれは嘘だ。 …
2025/07/22 18:31
hokug(ホクジー)使ってみる_1
hokug? # タイッツー開発でお馴染み「ほく」さんが開発したゲームエンジンです。 クソゲーが簡単に作れるらしいです。JavaScr…
2025/07/22 06:48
カエルマップエディタおまけの使いかた
↓基本的な使いかた https://simblo.net/u/Nz7RmE/post/363809 ↓少し高度な使いかた https://simblo.net/u/Nz7RmE/post/36904…
2025/05/22 14:39
カエルマップエディタのちょっと高度な使い方
基本的な使い方はこちら↓ https://simblo.net/u/Nz7RmE/post/363809 おまけのつかいかた↓ https://simblo.net/u/Nz7RmE/po…
2025/05/22 12:36
カエルマップエディタの簡単な使い方
なにそれ # https://sdkaeru.com/tilemap/ これです。タイルマップエディタってやつです。 ↓ちょっと高度な使いかた http…
2025/05/20 00:11
もっと見る
タグ
hokug(10)
javascript(10)
ゲーム制作(10)
MorningScript(4)
ツクセカ(4)
モニスク(4)
もっと見る