ゲーム制作と創作の
「語らいの一時オンライン」
へようこそ
サウンドノベル制作ツール『SNEC/nextSNEC』、写真素材(約200枚)、シルエット素材、フリーゲーム&商用作品、HSP3.3プログラミング講座などを網羅したクリエイターポータルサイトです。
新着情報 & 更新履歴
製品タイトル
インディーゲーム制作サークル「ANGROWA」および当サイト発の製品版ゲームです。
3D FPS
3D Action
Fighting Action
FPS Escape
Belt Scroll Action
フリーゲーム
手軽に遊べるミニゲームから、長編推理・ホラーサウンドノベルまで無料で遊べる全12タイトル!

DEAD CITY -The place to be-
| 対応機種 | WindowsXP/Vista/7/8 |
|---|---|
| ジャンル | アドベンチャーゲーム |
| バージョン | 1.0 |
| 最終更新日 | 2012/9/13 |
| シリーズ紹介 | 「ヘルズ・スイーパー(地獄の清掃人)」の異名を取る、裏世界の人間・檜山信吾と堀越僚の二人が、巨悪と闘っていくアクション・アドベンチャーです。 通常パートはアドベンチャー形式で進んでいき、時折現れる選択肢を選んで物語を進めていきます。 イベントシーンでは時限式選択肢や射撃モードに切り替わります。 |
| 内容 | トップアイドル・久遠美令に届いた「アジアンポップスサミットの広報大使を辞退しなければ命はない。」と書かれた脅迫状。 腐れ縁の刑事・香川麻紀からの紹介でボディーガードを依頼された檜山信吾は……。 MSX版から17年の時を経て遂に復活!シーズン1がスタート!(1話完結です)。 ※プレイ時間は15分程度です。そのため、セーブ機能はありません。 ※今回は諸事情により信吾の相棒・堀越僚の出番はありません。 |

北信州ペンション殺人事件
| 対応機種 | Windows95/98/SE/Me/2000/XP |
|---|---|
| ジャンル | サウンドノベル |
| バージョン | 1.1 |
| 最終更新日 | 2009/1/9 |
| 内容 | 本作は当サイトの8周年記念企画としてnextSNECで開発したオリジナルサウンドノベルです。 大学生の男女2人組が北信州のペンションを訪れ、巻き込まれる殺人事件を解決するのがゲームの目的です。 プレイ時間は読むのが遅めの方でも30分かからない程度ですので、お気軽にお試し頂けるかと思います。 nextSNECのTIPS機能を体験出来ますし、クリア後にはちょっとしたオマケも用意しておりますので、是非プレイしてみて下さい! |
| バグ情報 | データをロードすると文章表示Y座標がずれる場合あり フルスクリーン時に全角入力ができない |
ゲーマー探偵・葉山俊
| 対応機種 | Windows95/98/SE/Me/2000/XP/Vista/7 |
|---|---|
| ジャンル | コメディノベル |
| バージョン | 1.0 |
| 最終更新日 | 2008/12/29 |
| 内容 | nextSNECで制作のコメディものです。 SNECサンプルゲームからのスピンアウト! あのゲーマーで探偵の葉山俊が活躍する超短編! コメディ・サウンドノベルです。 ※某ドラマを知らないと分からないネタです。 |

黒い都市伝説
| 対応機種 | Windows95/98/SE/Me/2000/XP/Vista/7 |
|---|---|
| ジャンル | ホラーノベル |
| バージョン | 0.80 |
| 最終更新日 | 2007/11/9 |
| 内容 | この作品は拙作のnextSNECを使用した都市伝説ノベルです。 絵と音付きのオムニバス超短編集で、現在第三話まで収録されています。 全話読み終わると解説を読むことができます。 ※陰鬱なので、要注意。18禁にしようかな(笑) ※ゲーム要素は殆どありません。 |

真夜中のエレベーター
| 対応機種 | Windows95/98/SE/Me/2000/XP/Vista/7 |
|---|---|
| ジャンル | ホラーノベル |
| バージョン | 0.80 |
| 最終更新日 | 2005/8/21 |
| 内容 |
nextSNECで制作のホラーものです。 nextSNECのサンプルとして制作した超短編です。 |

君との時間
| 対応機種 | Windows95/98/SE/Me |
|---|---|
| ジャンル | ノベル |
| バージョン | 1.0 |
| 最終更新日 | 2004/11/29 |
| 内容 |
デジタル紙芝居です。 選択肢はなく、物語を読み進めるだけです。 「愛とは決して後悔しないこと!」なのです。 |

たいぴんぐぽーざー
| 対応機種 | Windows95/98/SE/Me/2000/XP/Vista/7 |
|---|---|
| ジャンル | タイピングゲーム |
| バージョン | 1.1 |
| 最終更新日 | 2004/10/26 |
| 内容 | POSERキャラと戦うタイピングゲームです。 タッチタイピングがある程度できる方向けです。 ボイスなどを変更して遊べるオマケ機能付。 入力ワードの元ネタ解説文もついてます。 |
| 雑誌掲載履歴 | DOS/V USER DELUXE6月号 Windowsでゲームざんまい2006 |

冬の贈り物
| 対応機種 | Windows95/98/SE/Me |
|---|---|
| ジャンル | ノベル |
| バージョン | 1.0 |
| 最終更新日 | 2002/12/24 |
| スタッフ | [企画・製作]ANGLE [CG]文月 [広報]将 |
| 内容 |
ひとりぼっちのクリスマスの日に素敵な贈り物が。 あなたにも届くといいですね。 文月さんの暖かいタッチの絵柄が作品を彩ります。 ※クリスマス時期に見て下さい。 |

君がいて、僕がいた。
| 対応機種 | Windows95/98/SE/Me |
|---|---|
| ジャンル | ノベル |
| バージョン | 1.0 |
| 最終更新日 | 2002/11/26 |
| 内容 |
事故に遭った友人を見舞う主人公。 友人は記憶を無くしていた。 ショートショートストーリー。 選択肢はありません。 写真背景と音楽つきの小説といった形です。 生きているのが辛くなる時、ありますよね。 そんな時ふと考えるのです。 |

夢の中の恋人
| 対応機種 | Windows95/98 |
|---|---|
| ジャンル | ファンタジーノベル |
| バージョン | 0.90 |
| 最終更新日 | 2001/11/26 |
| 内容 |
夢の中で出会った美しい女性。 彼女に恋をした主人公は…… ショートショートストーリー。 選択肢も無ければ、音楽も効果音もありません。 ちょっと変わった話です。 純粋にお話を楽しんでいただければと思います。 |
ゲーム制作ツール
直感的なスクリプト記述で本格的なサウンドノベルを制作できるWindows用エンジン群です。
サウンドノベル作成ツール『SNEC』
初心者から上級者まで、直感的な記述で本格サウンドノベルを制作できるWindows用エンジン。
マルチシナリオ & 分岐
選択肢による分岐・マルチエンディング、フラグ管理を簡単かつ強力に実現。
BGM & 効果音
MIDI / WAV / MP3の音楽・効果音再生に対応。フェードイン・アウト制御も可能。
多彩なビジュアル演出
背景・立ち絵の重ね合わせ、画面揺れ、フラッシュ、トランジションなど豊富な演出。
多数のゲーム誌・PC雑誌に掲載されました(掲載実績一覧)
- テック・ウィン(アスキー)2001年7〜2004年6月 毎号連載・コンテスト紹介
- Windows100%(晋遊舎)2001年8・2002年9・2004年3月 掲載
- Yahoo! Internet Guide(ソフトバンク)2002年12月
- iP!(晋遊舎)2002年1月、2003年10月
- PC・GIGA(インフォレスト)2002年11月
- PC-DIY(秋田書店)2002年7月
バグ・既知の挙動について
・グラフィックの重ね合わせ時に透過色が反映されない場合は、透過色を統一してください。
・Windows 7以降での動作時は互換モード(XP SP3)推奨です。
新世代バージョン『nextSNEC』
高解像度化、DirectX対応、アルファブレンド、動画再生など大幅に進化した後継エンジン。
高解像度800x600対応
美しいグラフィックと読みやすいフォント表示を実現。フルスクリーンにも対応。
アルファブレンド(半透明)
レイヤー透明度(0〜256段階)やユニバーサルトランジションで劇的な演出。
動画再生 & 変数・演算
ムービー再生、ランダム変数、四則演算、サブルーチン、TIPS用語解説機能を標準搭載。
nextSNECの主な機能(SNECからのパワーアップ点)
- ウインドウサイズ変更可能
- フォントサイズ変更可能(選択肢も可)
- 自動改行の文字数制限なし
- 文字のスキップ機能強化
- 文字表示速度変更可能
- シーンがラベル対応
- 命令表記がカンマ区切りに変更
- ユニバーサルトランジション対応
- レイヤーに透明度指定可能(0〜256)
- レイヤーの表示位置指定可能
- 作品の商用・有償配布可能
- フラグの値を画面に表示可能
- ランダム変数・四則演算対応
- サブルーチン機能
- スペースキーでの文章送り
- 画面のフェードイン / フェードアウト
- TIPS機能(用語解説機能)
- 「次の選択肢へ」の解除可能
実践!nextSNECテクニック集(ノウハウ&スクリプト解説)
テクニックその1:素材ファイルの整理方法
画像や音楽が多くなると、フォルダがファイルだらけで収集がつかなくなってしまいます。ここではすっきりと整理するノウハウをご紹介します。(※下記は『北信州ペンション殺人事件』のフォルダ構成例です)
画像関係はすべて「GRP」フォルダ、音楽・効果音関係は「SND」フォルダにまとめて収納します。そしてスクリプトから読み込む際に、ファイル名の前に「GRP\」「SND\」のようにフォルダパスを指定します:
; 背景画像読込 (GRPフォルダ内の画像を指定)
GRP,GRP\id25_640.jpg,9
; レイヤーセット (GRPフォルダ内の画像を指定)
LAYSET,GRP\titlewindow.bmp,0,0,0
; 音楽再生 (SNDフォルダ内の音楽を指定)
BGM,SND\free0638.ogg,1
; 効果音再生 (SNDフォルダ内の効果音を指定)
SND,SND\70.wav,0
【具体的手順】
① nextSNEC本体があるフォルダに「GRP」「SND」などのフォルダを作成。
② それぞれのフォルダに画像や音声ファイルを分類収納。
③ スクリプトで読み込む際に、ファイル名の前に「GRP\」のようにフォルダを指定。
テクニックその2:半透明メッセージウインドウ作成方法
背景画像の上に文字を表示すると、画像の色によっては文字が読みにくくなる場合があります。nextSNECの半透明レイヤー機能を応用すると、美しい半透明メッセージウインドウの作成が可能です。
nextSNECのレイヤーは一番左上のドットの色が完全に透過され、それ以外の色が半透明で表示されます。下記スクリプトのように透明度を設定して表示します:
; 0番レイヤーにウインドウ画像をセット (X座標0, Y座標0)
LAYSET,GRP\window.bmp,0,0,0
; レイヤーを表示 (レイヤー0, 透明度100, 演出速度9)
; ※透明度は 0で非表示 〜 256で完全不透明
LAYON,0,100,9
画像を変えるだけで様々なウインドウが作成可能です。色だけでなく、大きさや形も自由に作って使えます。
テクニックその3:エンディングリスト作成方法
ゲームをどれだけ攻略したのかを分かりやすくするシステムとして「エンディングリスト」があります。nextSNECのグローバルフラグと分岐判定を活用して作成できます。
【原理】
① 各エンディングに到達する毎に、そのエンディングのグローバルフラグを立てる。
② リスト表示時にフラグを最初から最後まで判定し、到達済み(ON)ならエンディング名を表示、未到達(OFF)なら「???」と伏せ字で表示します。
; サンプル用にグローバルフラグを設定 (テスト時は ; を外して試してください)
GFLAG,1,=,1
;GFLAG,2,=,1
;GFLAG,3,=,1
【エンディングリスト】
/
#,1
GBRANCH,1,=,1,2,3
#,2
バッドエンド1 〜悪霊の神々〜
GO,4
#,3
???
#,4
GBRANCH,2,=,1,5,6
#,5
バッドエンド2 〜そして伝説へ〜
GO,7
#,6
???
#,7
GBRANCH,3,=,1,8,9
#,8
トゥルーエンド 〜導かれし者たち〜
GO,10
#,9
???
#,10
*
SNEC作品紹介
SNECエンジンを使用して有志クリエイターの皆様によって制作されたサウンドノベル作品集(13作品)です。

ナワヤの逆転裁判H
| ジャンル | 法廷 |
|---|---|
| 作者 | urecco |
| 内容 | SNEC初の法廷ものです。 あの『逆転裁判』を強く意識した法廷アドベンチャーです。 誰もが知っている歴史的事件を扱ったストーリー。 現在は漫画喫茶店長の主人公がその事件を無かったことにしてしまうという、奇想天外なゲーム。 一見コメディのようで、実はそれだけではないと感じる作品。 |
| ダウンロード | |

双重峠
| ジャンル | ホラー |
|---|---|
| 作者 | 佐音友俊 |
| 内容 | 男二人、女一人、三人は親友だった。 主人公が新車を購入したのをきっかけに、久しぶりに三人で会うことになったのだが、ドタキャンされ、一人で遠出することにした主人公。 渋滞を避ける為、峠越えすることにしたのだが、その峠は……。 |
| ダウンロード | |

小心サッカー
| ジャンル | 恋愛? |
|---|---|
| 作者 | 佐音友俊 |
| 内容 | サッカー場で出会った少女は初恋の女性にそっくりだった……。 息子のサッカーの試合会場の警備係をすることになった「私」。 そこで初恋の女性に似た女子高生を見かける。 「私」は……。 |
| ダウンロード | |

RECALL
| ジャンル | 恋愛? |
|---|---|
| 作者 | 佐音友俊 |
| 内容 | 会社をさぼった僕は学校をさぼった中学生の女の子と知り合いになった。 仕事でミスをした主人公は出社拒否になり街をさまよい、公園で犬を飼っている美少女に偶然で会う。 しかし、それは時の神の密かに仕組んだリコールだった。 昔懐かしい少年ドラマ風のSFジュブナイル。 |
| ダウンロード | |

夢の続き
| ジャンル | 恋愛? |
|---|---|
| 作者 | 佐音友俊 |
| 内容 | 「同じ夢を何度も見ても、その夢の続きは見たことがありません。その続きをもし見ることが出来たなら・・・。」 マルチエンドになっています。 夢の中ということで、不思議な世界観が表現されています。 昔学生だった頃の街の表現にはなんだか作品の中にトリップさせてくれる魅力があります。 私もいい歳になったということでもありますが……。 大人向けの作品です。 |
| ダウンロード | |

ポケベル
| ジャンル | 恋愛 |
|---|---|
| 作者 | 佐音友俊 |
| 内容 | 「大人の女性限定の甘く切ないラブストーリーです。」 作者の佐音友俊さんのこの言葉が全てを語っています。 短い作品ですが、与えてくれる物がきっとある作品です。 5分間ノンストップですので、絶対邪魔が入らない時に観て下さい。 |
| ダウンロード | |

鍵
| ジャンル | ホラー |
|---|---|
| 作者 | 佐音友俊 |
| 内容 | 「忘れていた鍵を手に入れました。それは忘れていた過去への扉を開く鍵だったのです。」 ちょっとホラーテイスト風。 短編ですが、こういう作品を作るのにSNECは向いているかもしれません。 作者の佐音友俊さんの方向性というか作風、好きです。 |
| ダウンロード | |

Original Soundnovel Hanged Woman
| ジャンル | SF? |
|---|---|
| 作者 | ALEX |
| 内容 | 150以上の画像と、70以上の効果音、約50曲ものBGM、13種の結末! 私はコンプリートしましたが、本当に良く出来ています。 軽妙な文体、効果的に使われている効果音と音楽は作品を創りたい方の指標にもなると思います。 シナリオ内容も、SF、恋愛、コメディと幅広く分岐していきます。 根幹となるネタはあえて書きませんが、「日常の中の非日常」とだけ書いておきます。 ご自分の目で確かめて頂きたいのです。是非体験して下さい! |
| ダウンロード | |

異変の欠片
| ジャンル | SF? |
|---|---|
| 作者 | ALEX |
| 内容 | 全5篇の連作!その序章と第1篇『罪』が公開中! 大学生の主人公が家で探し物をしていると、中学生の頃に好きだった女の子の写真を見つける。 その写真には奇妙な霧のような物が……。 SNEC作品で最大規模のシナリオを誇り、5種類の結末が待っています。 ハラハラドキドキの展開の連続のシナリオ、シルエットやサウンドなども丁寧に作りこまれており、エンディングまでしっかりできています。 今後の『痕』、『破壊』、『先見』も非常に楽しみです★ ※それぞれ共通設定から派生の独立したお話です。 |
| 異変の欠片 "胎動" ダウンロード | |
| 異変の欠片 "罪" ダウンロード | |

File No,Case of seaside
| ジャンル | ミステリー |
|---|---|
| 作者 | mfamiy |
| 内容 | 連載サスペンスサウンドノベル! 過去に起きた「シーサイド事件」から涌き出るいくつもの真実……。 オリジナル小説のサウンドノベル化。 全10話予定。 オープニングや要所要所での演出が、とても良くできています。 1話毎に意外な展開になってきて、毎回プレイ終了後には次回作が待ち遠しいです。 3章にはザッピングシステムを導入するなど、新たな試みもされています。 5章で過去編が終了し、6章からは新展開です! |
| ダウンロード | |

ハゲあゆメモリアル シリーズ
| ジャンル | コメディ |
|---|---|
| 作者 | トニー果糖、ライシン |
| 内容 | 「殺人鬼との変な恋愛サウンドノベル 」 DLページにはこのように書かれています。 タイトルの「ハゲあゆメモリアル」から想像すると、どうやら「と●メモ」のようなゲームのようだと思うかもしれません。 では、「ハゲあゆ」とは……。 奇想天外な登場人物、そして、予測不可能で多岐に渡るストーリー分岐。 恋愛とは何かを教えてくれる……かどうかはご自分の目で確かめてみて下さい。 この世界観は遊んでみないと分かりません。 2ではボリュームが倍増。 便利なエンディングリスト機能も用意されています。 グローバルフラグでこんなこともできるんですね。 零では「あゆ」の過去が明らかに! ※一部過激な表現が使われていますので、ご注意下さい。 |
| ダウンロード | |

五人組物語 緊急指令! 闇の扉の謎を解け
| ジャンル | 冒険 |
|---|---|
| 作者 | Nagase |
| 内容 | 「友情という絆で恐怖に立ち向かう5人のメンバー」 最後までプレイした私は 「大長編ドラえもん」を思い起こしました。 助け合い強大な敵に立ち向かう姿、そしてヒロイン。 SNECを使用しながらもアドベンチャーのようなシステムであり、ストーリーや雰囲気も何か古き良き時代を思い出させてくれる作品です。 |
| ダウンロード | |

ポチのクイズ脱出大作戦~迷いの森~
| ジャンル | クイズ |
|---|---|
| 作者 | Nagase |
| 内容 | SNECでは珍しいクイズゲームです。 結構一般常識なんだろうなあと思う問題も間違ってしまって、実はクリアするのが大変でした(^^; でも、無限コンティニューなので、誰でもクリアできるようになっていますから安心してプレイできますよ。 |
| ダウンロード | |
フリーウェア & ユーティリティ
自作の便利ユーティリティ、写真ビューア、パズル解法ツールなど様々なWindowsアプリを公開中!

めもめーる
| 対応機種 | Android2.3.3以上 |
|---|---|
| ジャンル | ツール |
| バージョン | 1.0 |
| 最終更新日 | 2015/8/8 |
| 内容 |
素早くメモできて、あらかじめ登録しておいたメールアドレスにメール送信できるアプリです。 多くの機能を求めている方には向きませんが、とにかく素早くメモしたい方、メモをメールで送信したい方には重宝していただけるかもしれません。 アプリの容量は非常に小さく、起動も動作も軽快です。 |
| 掲載履歴 | AndroidView 2015/9/19 |
音の様
| 対応機種 | Android4.2以上 |
|---|---|
| ジャンル | ギャグアプリ |
| バージョン | 2.0 |
| 最終更新日 | 2014/9/2 |
| 内容 | 3D描画された滝が効果音と共に表示されるだけのアプリです。 お手洗いで消音の為に使用するもよし、ただただ滝を眺めるもよし……。 |

ポメラDE読書
| 対応機種 | WindowsXP/Vista/7(ポメラ動作環境) |
|---|---|
| ジャンル | ユーティリティ |
| バージョン | 1.1 |
| 最終更新日 | 2009/11/29 |
| 内容 | KINGJIM社のデジタルメモ『ポメラ』で読書を楽しむ為のユーティリティです(DM10・DM20対応)。 7500字もしくは27500字を超えたセンテンス毎にファイルを分割します。 ファイル名は元のファイル名+連番の形で保存します。 『ポメラ』をテキストビューアとして利用することも簡単になります。 |
| 雑誌掲載履歴 | 2009/3/16 窓の杜 2009/4/7 週間アスキー |

POMERA SYNC(ポメラ シンク)
| 対応機種 | WindowsXP/Vista/7(ポメラ動作環境) |
|---|---|
| ジャンル | ユーティリティ |
| バージョン | 1.01 |
| 最終更新日 | 2009/3/30 |
| 内容 | このソフトはKING
JIM社から発売されているデジタルメモ機『ポメラ』とPC間でテキストファイルを完全に同期する他、ポメラからPCへ、PCからポメラへ一方通行でコピーすることも出来るソフトです。 同期する場合は、特定のファイルが片方にしか無いと、ある方から無い方へコピーします。 ファイルがある場合は新しいファイルが古いファイルに上書きされます。 ※違う中身でもファイル名が同じだと新しいファイルに上書きされますので、注意して下さい。 設定ミス、本ソフトの不具合によるファイルの消失の責任は負いかねますので、ご了承下さい。 ※ファイルがポメラで読み込めないサイズの場合、そのファイルのコピーはスキップします。 |
| 雑誌掲載履歴 | なし |

ポメラ用早見表
| 対応機種 | WindowsXP/Vista/7(ポメラ動作環境) |
|---|---|
| ジャンル | ユーティリティ |
| バージョン | 1.0 |
| 最終更新日 | 2009/2/22 |
| 内容 | KINGJIM社のデジタルメモ『ポメラ』用各種早見表です。 用紙サイズ、特別番号、都道府県の県庁所在地・人口、和暦・年齢・西暦・干支、春の七草、誕生石の早見表です。 |
| 雑誌掲載履歴 | なし |

自動計算出勤簿 of Excel
| 対応機種 | Windows98以降(Excel97以上動作環境) |
|---|---|
| ジャンル | ユーティリティ |
| バージョン | 1.01 |
| 最終更新日 | 2009/7/13 |
| 内容 | Excelでアルバイト・パートの方の勤務時間、休憩時間、給与などを自動計算します。 ただそれだけですが、意外にフリーで良いものが無いので自作してみました。 一度設定してしまえば、始業時間と就業時間を入力するだけです。 |
| 雑誌掲載履歴 | なし |
Rapid Fire
| 対応機種 | Windows98/SE/Me/XP/Vista/7 |
|---|---|
| ジャンル | Webブラウザ |
| バージョン | 0.3 |
| 最終更新日 | 2008/9/9 |
| 内容 | HSP製のWebブラウザです。 容量がとにかく小さく、機能が最低限しかないので、軽快に動きます。 |
| 雑誌掲載履歴 | なし |

MovieDB(仮)
| 対応機種 | Windows95/98/SE/Me/2000/XP/Vista/7 |
|---|---|
| ジャンル | 映画データベース |
| バージョン | 0.1 |
| 最終更新日 | 2006/3/3 |
| 内容 | 映画紹介ソフトです。 本格的なデータベースではありませんが、予告動画等を再生できるので、自分なりの映画予告編集を作ってみたり、友達にお勧めの映画を紹介出来たり、使い方は皆さん次第です。 現在は映画紹介に特化していますが、ゆくゆく汎用性を持たせることもありえます。 |
| 雑誌掲載履歴 | なし |

Color Coder
| 対応機種 | WindowsXP/Vista/7 |
|---|---|
| ジャンル | ユーティリティ |
| バージョン | 1.0 |
| 最終更新日 | 2012/7/4 |
| 内容 | ホームページ作成の際、カラーコードを16進数で指定する必要があります。 その補助となる(だけの)ソフトです。 |
| 雑誌掲載履歴 | なし |
曜日当てプログラム
| 対応機種 | Windows95/98/SE/Me/2000/XP/Vista/7 |
|---|---|
| ジャンル | ユーティリティ |
| バージョン | 0.92 |
| 最終更新日 | 2001/1/31 |
| 内容 | 西暦、月、日にちを入力すると曜日がわかるプログラムです。 ご自分の誕生日が何曜日だったかご存知ですか? Excelで簡単に分かるとか言わないで……。 |
| 雑誌掲載履歴 | WinPC 2001年3月号 ウインドウズ・パワー 2001年3月号 TECH Win 2001年4月号 ウインドウズ・パワー 2001年9月号 ウィンドウズ・パワー増刊号 DOS/V USER DELUXE6月号 |
本日の一言
| 対応機種 | Windows95/98/SE/Me/2000/XP/Vista/7 |
|---|---|
| ジャンル | ジョーク |
| バージョン | 1.0 |
| 最終更新日 | 2004/2/7 |
| 内容 | 昔見た格言ジョークソフトを自分なりに作っただけです。 形容詞、人物、行動がランダムで選択され、格言っぽい文章が表示されます。 |
| 雑誌掲載履歴 | なし |
Wii版『428~封鎖された渋谷で~』コンプリートセーブデータ
| 対応機種 | Wii |
|---|---|
| ジャンル | セーブデータ |
| バージョン | - |
| 最終更新日 | 2009/7/15 |
| 内容 | Wii版『428~封鎖された渋谷で~』のコンプリートセーブデータ(虹の栞)です。 全ての隠し要素がオープンになっています。 ※どうしてもクリア出来ない場合のみ使用して下さい。 ※別途SDカードが必要です。解凍後SDカードにコピーして、Wii本体のSDカードスロットにセットし、そこからWii本体へコピーします。 |
| 雑誌掲載履歴 | なし |
素材ギャラリー(写真・シルエット・ルール画像)
ゲーム制作、動画、Web制作などで商用・非商用問わず自由にご利用いただけるフリー素材です。
ゲーム用シルエット素材について
サウンドノベル『ゾウディアック』『女教師・美喜シリーズ』等でもご利用いただいたシルエット素材集です。
BMP形式で背景透過色(0,0,0)設定済み。商用・同人・フリー問わずご自由に加工・ご利用いただけます。(※二次配布のみご遠慮ください)
ユニバーサルトランジション用ルール画像素材
サウンドノベル作成ツール(nextSNECや各種ゲームエンジン)で使用できるルール画像(画面切り替え用グレースケールパターン)のセットです。
著作権はANGLEにありますが、商用・同人・フリー問わずご自由に加工・ご利用いただけます。(二次配布のみご遠慮ください)
HSP3.3 プログラミング講座
ブロック崩し、インベーダー、本格ペイントソフト、スマホ向けゲームまで全ステップをコード付きで徹底解説!
HSP3.3でブロック崩しを作る!
HSPの基本描画からボールの反射、パドルの移動、ブロックの当たり判定までをステップ・バイ・ステップで学ぶ実践チュートリアル。
<第1回>ラケットボールを作ってみる!
2012/10/2
まずはブロック以外を作ってみる
ゲーム作りの基本中の基本であろうブロック崩しですが、実は私自分で作ったことがありません!
せっかくなので、この機会に作ってみようと思います。
是非初心者の方も入力して動かしながら、そして色々数字を変えてみながら作っていってみて下さい。
それでは、始まります。
ブロック崩しを作るに当たって、必要な要素はなんでしょうか?
1.ボール
2.パドル
3.ブロック
4.壁
主なものはこんなところでしょう。
ひとまず、壁は画面の端で代用することにします。
ブロックも配置やら当たり判定やら面倒そうなので、後回しにします。
今回はパドルをマウスで操作して、ボールを跳ね返すことができ、下に落としてしまったらゲームオーバーというところまでやってみます。
プログラムに注釈を付けているので、分かりにくそうな部分のみ解説します。
まず、冒頭の「#define」というところでは、「定数」を定義しています。
簡単に言うと、以降のプログラムで同じ値を使うものを宣言しています。
ここで決めておくと、後で何かのサイズなどを変えたいと思った時に、この定数の宣言のところだけを変えればプログラム全てに適用できるという大変便利なものです。
小規模なプログラムではあまりメリットを感じないかもしれませんが、後々バージョンアップしていく際にはその意義をご理解いただけると思います。
次に*mainの中の「redraw 0」と「redraw 1」なんですが、これは実際の画面に描画するかどうかを決めています。
まず画面を描画しない設定にしておいて、内部処理で画面をクリア→ボールを描画→パドルを描画→実際の画面に描画というようにすることで、画面のチラツキを防止しています。
続いて「x+=dx」「y+=dy」という部分ですが、これは「x=x+dx」「y=y+dy」と同じ意味で、ボールを移動させています。
プログラムを少し短くでき、見た目にもすっきりするので、慣れたら使ってみてください。
そして、今回一番ややこしそうな箇所、ボールの当たり判定です。
「if x<0 or x+size>winx:dx=-dx」ですが、「x
<0」はウインドウの左端に達した場合、「size」はボールのサイズ、「winx」はウインドウのXサイズなので、「x+size>
winx」はウインドウの右端に達した場合です。
「dx=-dx」とすることで、ボールの動く方向を反対にしています。
「if x>=px-p_size-size & x<=px+p_size+size &
y+size=py:dy=-dy」については、「px-p_size-size」がパドルの左端、「px+p_size+size」がパドルの右端を表しています。
パドルの端に当たった場合を考え、左右はボール一個分当たり判定を広げています。

<p class="program">
*init
#define winx 320//画面のXサイズ
#define winy 480//画面のYサイズ
#define size 12//ボールのサイズ
x=160.0:y=0.0//ボールの初期位置
dx=4.0:dy=4.0//ボールの移動速度
px=300:py=440//パドルの初期位置
p_size=20//パドルのサイズ
screen 0,winx,winy,0//画面作成
pos 90,200:color 0,0,0:mes"Click to start!"//スタート画面
*start
stick st//入力設定
if st=256:goto *main//マウスの左クリックでメイン処理へ
await//ウェイト
goto *start//戻る
*main
redraw 0//画面を描画しない
color 255,255,255:boxf 0,0,winx,winy//白で画面全体を塗り潰す
color 0,0,0:circle x,y,x+size,y+size//黒でボールを描く
x+=dx//ボールのX座標に移動速度を足す
y+=dy//ボールのY座標に移動速度を足す
if x<0 or x+size>winx:dx=-dx//ボールが左右の端に行ったらボール速度を反転(逆方向)
if y<0 or y+size>winy:dy=-dy//ボールが上下の端に行ったらボール速度を反転(逆方向)
if x>=px-p_size & x<=px+p_size & y+size=py:dy=-dy//ボールがパドルに当たったらボール速度を反転(逆方向)
if y=480-size:pos 120,200:color 0,0,0:mes"Game Over":redraw 1:await 1000:goto *init//ゲームオーバー処理
px=mousex:color 255,0,0:boxf px-p_size,py,px+p_size,py+8//パドルを表示
await 2//ウェイト
redraw 1//画面を描画する
goto *main//戻る
</p>
次回はブロックを配置して、ブロックの当たり判定を入れて、ブロック崩しが完成します!
お楽しみに♪
<第2回>ブロックを追加してみる!
2012/10/4
ブロックを追加して当たり判定を付ける
前回はブロック以外の部分を作りました。
今回はいよいよブロックを配置し、当たり判定を付けてブロック崩しとして完成させます。
まず初期設定でボールの初期位置等を変更し、スコアの初期化を追加しています。
続いてブロックの初期設定を行っています。
20個のブロックを作ることとし、ブロックのフラグ、位置、サイズを設定します。
この際、「dim」という命令を使用していますが、これはその変数の最大個数を決めています。
プログラム用語では「配列」と言います。
イメージとしては、値を入れる箱が変数とすると、その箱が横に繋がっているような感じです。
箱の何番目に何が入っているかという風に使用していくものです。
例えばblfの場合は、「blf.i」のように変数の名前の後に「.i」のように表記し、ブロックのi番目に0が入っているか1が入っているかを判断し、ブロックを表示するかどうかを決めています。
ゲームが始まる段階ではblf.0からblf.19まで全て1にし、ブロックが全て存在するという設定をしています。
同様にブロックのXサイズ、Yサイズも設定しています。
ブロックの表示部分では、「blf.i」の値をチェックし、1であれば表示しますが、0の場合は何もしません。つまり表示しません。
ブロックとボールの当たり判定が今回の一番の難所です。
プログラムをパッと見た感じだと何が何やら分からないかもしれませんが、行っていることが分かると読めるようになると思います。
まず、「if blf.i=0:_continue」という部分です。
ここではブロックがない場合に次のブロックの判定を行うように「_continue」命令を使っています。
もしこの文がないとどうなるかというと、ないはずのブロックにボールが跳ね返ってしまいます。一度試してみるのもいいでしょう。
次にボールがブロックの上から当たった場合を考えてみましょう。
「if(y+size=bly.i) & (x>=blx.i-size &
x<=blx.i+blx_size.i+size):blf.i=0:dy=-dy:sc+=100:_break」という文ですが、まず「if(y+size=bly.i)」というのはボールの下のY座標がi番目のブロックのY座標と等しければという意味です。
「x>=blx.i-size &
x<=blx.i+blx_size.i+size」はボールのX座標がi番目のブロックの左端のX座標-ボール一個分以上かつ、i番目のブロックの右端のX座標+ボール一個分以下という意味です。「-size」「+size」でボール一個分左右に当たり判定を広げています。
そして、その条件と合致した時に「blf.i=0:dy=-dy:sc+=100:_break」を実行します。
「blf.i=0」でブロックのフラグをオフにして消去します。
「dy=-dy」でボールの移動方向を反転させます。
「sc+=100」でスコアに100点追加します。
「_break」でループから抜けます。
ボールが他の方向から当たった場合も殆ど同じ処理なので割愛します。
最後にクリア判定の処理を見てみます。
ここではclというフラグを作り、blf.0からblf.19まで全て加算し、その値が0であればクリアという判定をしています。
このやり方以外にもブロックを崩すごとにフラグに加算し、その値を調べるという方法でもいいと思います。
この講座では一応の完成ですが、ブロックの当たり判定が完璧とは言えませんし、1面しかなかったり、1回のミスでゲームオーバーになってしまったり、色々改良の余地もあります。
是非皆さん自身の手で改良を行ってみて下さい。
プログラム上達の近道はとにかく自分で考えて打ってみることに尽きます。

<p class="program">
*init
title"Block"
#define winx 320//画面のXサイズ
#define winy 480//画面のYサイズ
#define size 12//ボールのサイズ
x=160.0:y=140.0//ボールの初期位置
dx=2.0:dy=2.0//ボールの移動速度
px=300:py=440//パドルの初期位置
p_size=25//パドルのサイズ
sc=0//スコア
//ブロックの初期設定<br>
dim blf,20//ブロックのフラグを初期化
dim blx,20//ブロックのX位置を初期化
dim bly,20//ブロックのY位置を初期化
dim blx_size,20//ブロックのXサイズを初期化
dim bly_size,20//ブロックのYサイズを初期化
//ブロックの初期設定
for i,0,20
blf.i=1//ブロックのフラグを立てる
blx_size.i=40//ブロックのXサイズ
bly_size.i=10//ブロックのYサイズ
//ブロックのX位置
if i>=15:blx.i=20+(i-15)*60
if i<15 & i>=10 :blx.i=20+(i-10)*60
if i<10 & i>=5 :blx.i=20+(i-5)*60
if i<5:blx.i=20+i*60
//ブロックのY位置
if i>=15:bly.i=30
if i<15 & i>=10 :bly.i=60
if i<10 & i>=5 :bly.i=90
if i<5:bly.i=120
next
screen 0,winx,winy,0//画面作成
pos 90,200:color 0,0,0:mes"Click to start!"//スタート画面
*start
stick st//入力設定
if st=256:goto *main//マウスの左クリックでメイン処理へ
await//ウェイト
goto *start//戻る
*main
title"Block score:"+sc//タイトルとスコア表示
redraw 0//画面を描画しない
color 255,255,255:boxf 0,0,winx,winy//白で画面全体を塗り潰す
//クリア判定
cl=0//クリア判定用変数
for i,0,20
cl+=blf.i//ブロックのフラグを全て足す
next
if cl=0:pos 100,200:color 0,0,0:mes"Game Clear!!":redraw 1:await 2000:goto *init//クリア処理
//ブロックの表示
for i,0,20
if blf.i=1:color 0,0,255:boxf blx.i,bly.i,blx.i+blx_size.i,bly.i+bly_size.i//ブロックのフラグが立っていれば表示
next
//ブロックとボールの当たり判定
for i,0,20
if blf.i=0:_continue//ブロックがない場合は次のブロックの判定を行う
if(y+size=bly.i) & (x>=blx.i-size & x<=blx.i+blx_size.i+size):blf.i=0:dy=-dy:sc+=100:_break//ボールが上から当たった場合
if(bly.i+bly_size.i=y) & (x>=blx.i-size & x<=blx.i+blx_size.i+size):blf.i=0:dy=-dy:sc+=100:_break//ボールが下から当たった場合
if(y>=bly.i-size & y<=bly.i+bly_size.i+size) & (x+size=blx.i):blf.i=0:dy=-dy:sc+=100:_break//ボールが左から当たった場合
if(y>=bly.i-size & y<=bly.i+bly_size.i+size) & (x=blx.i+blx_size.i):blf.i=0:dy=-dy:sc+=100:_break//ボールが右から当たった場合
next
color 0,0,0:circle x,y,x+size,y+size//黒でボールを描く
x+=dx//ボールのX座標に移動速度を足す
y+=dy//ボールのY座標に移動速度を足す
if x<0 or x+size>winx:dx=-dx//ボールが左右の端に行ったらボール速度を反転(逆方向)
if y<0 or y+size>winy:dy=-dy//ボールが上下の端に行ったらボール速度を反転(逆方向)
if x>=px-p_size-size & x<=px+p_size+size & y+size=py:dy=-dy//ボールがパドルに当たったらボール速度を反転(逆方向)
if y=480-size:pos 120,200:color 0,0,0:mes"Game Over":redraw 1:await 1000:goto *init//ゲームオーバー処理
px=mousex:color 255,0,0:boxf px-p_size,py,px+p_size,py+8//パドルを表示
await 2//ウェイト
redraw 1//画面を描画する
goto *main//戻る
</p>
HSP3.3でインベーダーを作る!
シューティングゲーム「インベーダー」の自機移動、弾発射、敵の集団移動、当たり判定処理を学ぶ講座です。
完成版の実行ファイルはこちら
<第1回>自機を作ってみる!
2012/10/10
まずは自機の表示・移動・弾発射までを作ってみる
ゲーム作りの基本の一つと言えば、インベーダーゲームを挙げる方も多いでしょう。
元祖『スペースインベーダー』は社会現象を巻き起こしたゲームなので、コンピューターゲームをよく知らない方でも名前は聞いたことがあるはずです。
様々な亜流を生むほど大ヒットし、シューティングゲームの祖でもあり、その後の業界にも多大な影響を与えた作品です。
今回はそんなインベーダータイプのゲームを作っていきます。
第1回は自機を表示し、カーソルの左右で移動させることが出来、スペースキーで弾を発射することが出来るところまで作成します。
では、早速始めていきましょう!

今回も各行に注釈を入れていますので、分かりにくそうな部分に絞って解説します。
*main処理では開始時に「redraw 0」を入れ、実際の画面への描画をせず、自機と弾を内部処理で描画、その後「redraw 1」で実際の画面への描画を行っています。
今後大量の敵と敵の弾が表示されることになるので、結構画面の書き換えが多くなります。
直接描画処理を行っていては、画面のちらつきが目立つことになるため、このような処理にしています。
弾を撃つ処理は、スペースキーを押した時、画面上に弾が無ければ発射するようにしています。
「stick」命令を使用することで、スペースキーをジョイスティックのボタンのように扱うことが出来ます(トリガータイプと言います)。
スペースキーで弾を発射した後、押しっぱなしにしていても次の弾は発射されません。
プログラムの書き方を説明すると、「stick」命令の後に入力結果を入れる変数「st」を記述し、次の行で「st」が16なら(スペースキーが押されたら)という判定をしています。
もし、「stick」命令を使ってキーの押しっぱなしを検出したい場合には、「stick 変数,非トリガータイプにしたいキー」というように記述します。
「if s=16 &
bl=0:bl=1:bx=x+3:by=y-16」という行では、スペースキーが押され、弾が出ていなければ、弾を出し、弾のX座標は自機+3、弾のY座標は自機-16という意味です。
左右に移動する処理では「stick」ではなく「getkey」を使用しています。
「getkey」は押しっぱなしのキーを検出するのに使用します。
左キーが押されたかどうかを変数「left」、右キーが押されたかどうかを変数「right」に格納します。
「x=limit(x,0,winx-16)」という部分は自機のX座標「x」の範囲を指定しています。
ここでは0からwinx-16までを範囲としています。
最後に弾を表示する処理ですが、まず、弾のフラグ「bl」が1なら処理します。
「by-=bsp:if
by<-16:bl=0」では、弾のY座標「by」を弾の速度「bsp」ずつ更新し、「by」が-16より小さくなったら(つまり画面の上に消えたら)弾のフラグを0にしています。
<p class="program">
*init
title"Invader"//タイトルの表示
#define winx 320//画面のXサイズ
#define winy 240//画面のYサイズ
//自機の初期設定
x=153.0:y=220.0//自機の初期位置
bsp=4.0//弾の移動速度
screen 0,winx,winy,0//画面作成
cls 4//画面消去
pos 80,100:color 255,255,255:mes"Push space to start!"//スタート画面
*start
stick st//入力設定
if st=16:goto *start2//スペースキーで次へ
await//ウェイト
goto *start//戻る
*start2
cls 4//画面消去
pos 130,100:color 255,255,255:mes"Ready!"
await 1000//ウェイト
*main
redraw 0//画面を描画しない
color 0,0,0:boxf 0,0,winx,winy//黒で画面全体を塗り潰す
//弾を撃つ
stick s//スペースキーが押されているか判定する準備
if s=16 & bl=0:bl=1:bx=x+3:by=y-16//スペースキーが押されていて、画面上に弾がなければ弾が画面上にあるというフラグを1にして、弾の座標を自機の上に設定する
//左右に移動する
getkey left,37:if left=1:x-=2//カーソルキー左が押されていたら自機を左に移動する
getkey right,39:if right=1:x+=2//カーソルキー右が押されていたら自機を右に移動する
x=limit(x,0,winx-16)//自機のX座標の範囲を設定する
//自機表示
color 255,255,255:pos x,y:mes"凸"
//弾のフラグが立っていれば弾を表示する
if bl=1:{
color 255,255,255:pos bx,by:mes"|"//弾を表示する
by-=bsp:if by<-16:bl=0//弾のY座標を更新し、画面から消えたら弾が画面上にあるというフラグを0にする
}
await 2//ウェイト
redraw 1//画面を描画する
goto *main//戻る
</p>
次回は敵を配置して、動かしていきます!
お楽しみに♪
<第2回>敵を作ってみる!
2012/10/13
敵と敵の弾の表示を作ってみる

今回は敵を配置し、敵が弾を撃って来るようにします。
敵の数は50匹、敵の弾は画面上に最大4つまでとします。
今回も各行にコメントを入れてありますので、ポイントを絞って解説します。
敵の初期設定のところでは、配列変数を設定しています。
ポイントとしては、X座標を51個用意しているところが挙げられます。
敵は50匹(0番から49番まで)なのですが、敵の移動ルーチン内で、生き残っている敵の中で一番端にいる敵を割り出す為に比較用の変数を作るため、最大数を50ではなく51にしています。
敵の右への移動ルーチンを見てみると、「ex.50=0:rightmax=50」のようにしているのですが、50番(50番目ではありません。0から始まるので順番的には51番目)の敵のX座標を0として、一番右にいるというフラグrightmaxを立てています。
X座標0は当然最も左側なので、この後のプログラムで「if
ex.rightmax<ex.j」のように比較すると、この50番の敵は真っ先に一番右ではないと判断され、rightmaxフラグは下ろされます。
これは何の為にやっているのかというと、現在は全ての敵が必ずいるので問題ないのですが、次回当たり判定が実装され敵が消滅した時にはどの敵が生き残っているか分からないという状況になるからです。
例えば、0番の敵や49番の敵が消滅している可能性もあるので、比較する初期値を0番や49番にするわけにはいかないわけです。
当然中間の敵であっても同様です。
この問題を解決するには既存の敵ではないものと比較を開始する必要があるというわけです(あくまで今回の組み方に関しては)。
仮想的に設定した50番の敵との比較が終わってからは、現在生き残っている敵をどんどん比べていって、一番右側にいる敵の番号を割り出します。
そして、「if ex.rightmax>=300:for k,i+1,50:ex.k+=esp:next:di=1:for
i,0,50:ey.i+=16:next」という処理で、一番右にいる敵のX座標が300以上になったら、他の敵のX座標も今回の移動分を移動させ、変数diを1にして方向転換、Y座標に16を足してプレイヤーに一段近づけるということをしています。
<p class="program">
*init
title"Invader"//タイトルの表示
#define winx 320//画面のXサイズ
#define winy 240//画面のYサイズ
//自機の初期設定
x=153.0:y=220.0//自機の初期位置
bsp=4.0//弾の移動速度
//敵の初期設定
dim ex,51//敵のX座標。方向転換用に+1しておく。
dim ey,50//敵のY座標
dim ef,50//敵が生きているフラグ
wt=0//ゲームスピード調整用
esp=1//敵の移動速度
di=0//敵の移動方向(0は右に移動する、1は左に移動する)
dim ebx,50//敵の弾X座標
dim eby,50//敵の弾Y座標
dim ebf,50//敵の弾フラグ
for i,0,50
ex.i=(i\10)*24//敵のX座標
if (i>=0 & i<10):ey.i=16//敵のY座標
if (i>=10 & i<20):ey.i=32//敵のY座標
if (i>=20 & i<30):ey.i=48//敵のY座標
if (i>=30 & i<40):ey.i=64//敵のY座標
if (i>=40 & i<50):ey.i=80//敵のY座標
ef.i=1//敵が生きているフラグ
dead.i=0//敵が死んでいて消滅パターンを表示するフラグ
d_co.i=0//敵の消滅パターン表示用カウンタ
next
wtmax=5//ゲームスピード
screen 0,winx,winy,0//画面作成
cls 4//画面消去
pos 80,100:color 255,255,255:mes"Push space to start!"//スタート画面
*start
stick st//入力設定
if st=16:goto *start2//スペースキーで次へ
await//ウェイト
goto *start//戻る
*start2
cls 4//画面消去
pos 130,100:color 255,255,255:mes"Ready!"//ゲーム開始表示
await 1000//ウェイト
*main
redraw 0//画面を描画しない
color 0,0,0:boxf 0,0,winx,winy//黒で画面全体を塗り潰す
//弾を撃つ
stick s//スペースキーが押されているか判定する準備
if s=16 & bl=0:bl=1:bx=x+3:by=y-16//スペースキーが押されていて、画面上に弾がなければ弾が画面上にあるというフラグを1にして、弾の座標を自機の上に設定する
//左右に移動する
getkey left,37:if left=1:x-=2//カーソルキー左が押されていたら自機を左に移動する
getkey right,39:if right=1:x+=2//カーソルキー右が押されていたら自機を右に移動する
x=limit(x,0,winx-16)//自機のX座標の範囲を設定する
//自機表示
color 255,255,255:pos x,y:mes"凸"
//弾のフラグが立っていれば弾を表示する
if bl=1:{
color 255,255,255:pos bx,by:mes"|"//弾を表示する
by-=bsp:if by<-16:bl=0//弾のY座標を更新し、画面から消えたら弾が画面上にあるというフラグを0にする
}
//ゲームスピード
wt+=1:if wt>=wtmax:wt=0
//敵の移動
for i,0,50
//右へ移動する
if di=0 & wt=0:{
ex.50=0:rightmax=50//一番右にいる敵の座標を調べる準備
for j,0,50
if ef.j=0:_continue//敵が消滅していたら次の敵
if ex.rightmax<ex.j:rightmax=j//敵が生きている場合、X座標を比較して、より右にいる敵の番号をrightmaxに代入(X座標が同じ場合は無視)
next
ex.i+=esp//敵を右に移動
if ex.rightmax>=300:for k,i+1,50:ex.k+=esp:next:di=1:for i,0,50:ey.i+=16:next//一番右にいる敵が右端まで行ったら、以降の敵を右に移動し、移動方向を左にして、全ての敵のY座標を更新
}
//左へ移動する
if di=1 & wt=0:{
ex.50=320:leftmax=50//一番左にいる敵の座標を調べる準備
for j,0,50
if ef.j=0:_continue//敵が消滅していたら次の敵
if ex.j<ex.leftmax:leftmax=j//敵が生きている場合、X座標を比較して、より左にいる敵の番号をleftmaxに代入(X座標が同じ場合は無視)
next
ex.i-=esp//敵を左に移動
if ex.leftmax<=0:di=0:for k,i+1,50:ex.k-=esp:next:for i,0,50:ey.i+=16:next//一番左にいる敵が左端まで行ったら、以降の敵を左に移動し、移動方向を右にして、全ての敵のY座標を更新
}
next
//敵表示
p_co++:if p_co>20:pt=1-pt:p_co=0//敵アニメ
for i,0,50
if ef.i=1:{//敵が生きていたら
color 255,0,0:pos ex.i,ey.i
if pt=0:mes"W"//敵表示(パターン0)
if pt=1:mes"V"//敵表示(パターン1)
}
next
//敵の弾
eb_count=0//画面上の敵の弾の数を数える準備
for i,0,50
eb_count+=ebf.i//画面上の敵の弾の数を数える
next
r=rnd(50)
if eb_count<4 & ef.r=1 & ebf.r=0:{//敵の弾が4つより少なく、その敵が生きていて弾を発射していない場合
ebf.r=1//敵の弾のフラグを立てる
ebx.r=ex.r+7//敵の弾のX座標を設定する
eby.r=ey.r+14//敵の弾のY座標を設定する
eb_count++//敵の弾のカウントを一つ増やす
}
for i,0,50
if ebf.i=1:eby.i+=2:if eby.i>320:ebf.i=0//敵の弾のフラグが立っていたらY座標を更新し、画面下に消えたらフラグを下げる
if ebf.i=1:color 255,0,0:pos ebx.i,eby.i:mes"|"//敵の弾のフラグが立っていたら表示する
next
await 2//ウェイト
redraw 1//画面を描画する
goto *main//戻る
</p>
次回は当たり判定を追加し、ゲームスピードや敵の移動スピードに変化を付けゲームとして完成させます!
お楽しみに♪
<第3回>当たり判定とスピード変化処理を作ってみる!
2012/10/14
今回でいよいよインベーダーゲームが完成します。
前回までで自機、自機の弾、敵、敵の弾の表示までが終わりました。
今回は当たり判定の追加、スピード変化処理の追加、スコアの追加などを行い、ゲームとして遊べるものになります。

当たり判定を作ってみる
では、早速当たり判定を付けていきましょう。当たり判定は二種類あります。
自機の弾が敵に当たる場合と敵の弾が自機に当たる場合です。
まず、敵の弾が自機に当たる場合を見ていきましょう。
for i,0,50
if ebf.i=0:_continue
if(abs(x-ebx.i+5)<=7 & abs(y-eby.i)<=14):gosub *gameover_sub:goto *init
next
ループで0から50まで回しているのは、敵の数だけ調べる必要があるからです。
「ebf.i」というのは敵の弾があるというフラグなので、0の場合は「_continue」で次の弾をチェックします。
次の行の「abs」は絶対値を得る命令です。
自機のX座標「x」と敵の弾のX座標「ebx.i」に5を足したもの、自機のY座標「y」と敵の弾のY座標「eby.i」がそれぞれ7ドット、14ドット以内の距離であれば、ゲームオーバーのサブルーチンに飛んでゲームの初期化を行うということをしています。
このサンプルでは1回のミスでゲームオーバーにしていますが、自機のストックを増やす改造をしてみるのもいいと思います。
続いて、自機の弾が敵に当たる場合を見てみます。
for i,0,50
if ef.i=0:_continue
if(abs(ex.i-bx+5)<=7 & abs(ey.i-by)<=14):{
ef.i=0
dead.i=1
bl=0
by=320
sc+=100:if sc>hi:hi=sc
_break
}
next
0から50までループするのは同じですが、少々複雑になっています。
敵は50匹いるので、それぞれに処理をしてやらなければならないためです。
具体的には、敵が生きているというフラグ「ef.i」を0にする、敵の消滅パターンを表示するフラグ「dead.i」を1にする、自機の弾のフラグ「bl」を0にする、自機の弾のY座標「by」を320にして画面外に設定する、スコアに100を足し、ハイスコア以上であれば現在のスコアをハイスコアにするということを行っています。
スピード変化の処理を作ってみる
このサンプルには二種類のスピードが存在しています。一つにはゲーム全体のスピード、もう一つはキャラクターのスピードです。
自機のスピードは一定なので、ゲームスピードと敵のスピードについて見ていきます。
まず、ゲームスピードですが、「wt」という変数を用意し、メインループを通る度にプラス1しています。
そして、その値が「wtmax」に達したら0に戻し、その時に敵キャラクターを移動させています。
「wtmax」は「wtmax=cl/8.0」という計算で算出させているので、敵の残りが少なくなるほど小さくなります。
要するに敵が少なくなればなるほどゲームスピードが上がるようにしているわけです。
次にもう一つの敵自体のスピード変化を見てみます。
敵の移動速度は変数「esp」で設定しています。
ゲームのクリア判定用に「cl」というフラグを用意しており、このフラグが0ならクリアになるので、「cl」はそのまま敵の残りの数を表しています。
「esp」は最初1から始まりますが、「if cl<5:esp=2」とすることで、敵の数が5より少なくなった時に2にし、「if cl=1:esp=4」とすることで敵の数が1になった時に4に設定しています。
本家『スペースインベーダー』にも同じような演出がありますね。
<p class="program">
*init
title"Invader"//タイトルの表示
#define winx 320//画面のXサイズ
#define winy 240//画面のYサイズ
//自機の初期設定
x=153.0:y=220.0//自機の初期位置
bsp=4.0//弾の移動速度
//敵の初期設定
dim ex,51//敵のX座標。方向転換用に+1しておく。
dim ey,50//敵のY座標
dim ef,50//敵が生きているフラグ
dim dead,50//敵が死んでいて消滅パターンを表示するフラグ
dim d_co,50//敵の消滅パターン表示用カウンタ
wt=0//ゲームスピード調整用
esp=1//敵の移動速度
di=0//敵の移動方向(0は右に移動する、1は左に移動する)
dim ebx,50//敵の弾X座標
dim eby,50//敵の弾Y座標
dim ebf,50//敵の弾フラグ
for i,0,50
ex.i=(i\10)*24//敵のX座標
if (i>=0 & i<10):ey.i=16//敵のY座標
if (i>=10 & i<20):ey.i=32//敵のY座標
if (i>=20 & i<30):ey.i=48//敵のY座標
if (i>=30 & i<40):ey.i=64//敵のY座標
if (i>=40 & i<50):ey.i=80//敵のY座標
ef.i=1//敵が生きているフラグ
dead.i=0//敵が死んでいて消滅パターンを表示するフラグ
d_co.i=0//敵の消滅パターン表示用カウンタ
next
//スコア
sc=0
screen 0,winx,winy,0//画面作成
cls 4//画面消去
pos 80,100:color 255,255,255:mes"Push space to start!"//スタート画面
*start
stick st//入力設定
if st=16:goto *start2//スペースキーで次へ
await//ウェイト
goto *start//戻る
*start2
cls 4//画面消去
pos 130,100:color 255,255,255:mes"Ready!"//ゲーム開始表示
await 1000//ウェイト
*main
redraw 0//画面を描画しない
color 0,0,0:boxf 0,0,winx,winy//黒で画面全体を塗り潰す
//弾を撃つ
stick s//スペースキーが押されているか判定する準備
if s=16 & bl=0:bl=1:bx=x+3:by=y-16//スペースキーが押されていて、画面上に弾がなければ弾が画面上にあるというフラグを1にして、弾の座標を自機の上に設定する
//左右に移動する
getkey left,37:if left=1:x-=2//カーソルキー左が押されていたら自機を左に移動する
getkey right,39:if right=1:x+=2//カーソルキー右が押されていたら自機を右に移動する
x=limit(x,0,winx-16)//自機のX座標の範囲を設定する
//自機表示
color 255,255,255:pos x,y:mes"凸"
//弾のフラグが立っていれば弾を表示する
if bl=1:{
color 255,255,255:pos bx,by:mes"|"//弾を表示する
by-=bsp:if by<-16:bl=0//弾のY座標を更新し、画面から消えたら弾が画面上にあるというフラグを0にする
}
//ゲームスピード
wt+=1:if wt>=wtmax:wt=0
//敵の移動
for i,0,50
//右へ移動する
if di=0 & wt=0:{
ex.50=0:rightmax=50//一番右にいる敵の座標を調べる準備
for j,0,50
if ef.j=0:_continue//敵が消滅していたら次の敵
if ex.rightmax<ex.j:rightmax=j//敵が生きている場合、X座標を比較して、より右にいる敵の番号をrightmaxに代入(X座標が同じ場合は無視)
next
ex.i+=esp//敵を右に移動
if ex.rightmax>=300:for k,i+1,50:ex.k+=esp:next:di=1:for i,0,50:ey.i+=16:next//一番右にいる敵が右端まで行ったら、以降の敵を右に移動し、移動方向を左にして、全ての敵のY座標を更新
}
//左へ移動する
if di=1 & wt=0:{
ex.50=320:leftmax=50//一番左にいる敵の座標を調べる準備
for j,0,50
if ef.j=0:_continue//敵が消滅していたら次の敵
if ex.j<ex.leftmax:leftmax=j//敵が生きている場合、X座標を比較して、より左にいる敵の番号をleftmaxに代入(X座標が同じ場合は無視)
next
ex.i-=esp//敵を左に移動
if ex.leftmax<=0:di=0:for k,i+1,50:ex.k-=esp:next:for i,0,50:ey.i+=16:next//一番左にいる敵が左端まで行ったら、以降の敵を左に移動し、移動方向を右にして、全ての敵のY座標を更新
}
next
//敵表示
p_co++:if p_co>20:pt=1-pt:p_co=0//敵アニメ
for i,0,50
if ef.i=1:{//敵が生きていたら
color 255,0,0:pos ex.i,ey.i
if pt=0:mes"W"//敵表示(パターン0)
if pt=1:mes"V"//敵表示(パターン1)
}
if dead.i=1:color 255,0,0:pos ex.i,ey.i:mes"*":d_co.i++:if d_co.i=10:dead.i=0//敵の消滅パターン表示
next
//敵の弾
eb_count=0//画面上の敵の弾の数を数える準備
for i,0,50
eb_count+=ebf.i//画面上の敵の弾の数を数える
next
r=rnd(50)
if eb_count<4 & ef.r=1 & ebf.r=0:{//敵の弾が4つより少なく、その敵が生きていて弾を発射していない場合
ebf.r=1//敵の弾のフラグを立てる
ebx.r=ex.r+7//敵の弾のX座標を設定する
eby.r=ey.r+14//敵の弾のY座標を設定する
eb_count++//敵の弾のカウントを一つ増やす
}
for i,0,50
if ebf.i=1:eby.i+=2:if eby.i>320:ebf.i=0//敵の弾のフラグが立っていたらY座標を更新し、画面下に消えたらフラグを下げる
if ebf.i=1:color 255,0,0:pos ebx.i,eby.i:mes"|"//敵の弾のフラグが立っていたら表示する
next
//スコア表示
color 255,255,255
pos 10,0:mes"SCORE:"+sc
pos 120,0:mes"HI-SCORE:"+hi
//自機の弾の当たり判定
for i,0,50
if ef.i=0:_continue//敵が消滅していたら次の敵
if(abs(ex.i-bx+5)<=7 & abs(ey.i-by)<=14):{//自機の弾が敵に当たったら
ef.i=0 //敵のフラグを0にする
dead.i=1 //消滅パターン表示フラグを1にする
bl=0 //自機の弾のフラグを0にする
by=320 //自機の弾のY座標を画面外に設定
sc+=100:if sc>hi:hi=sc//スコア加算、ハイスコア更新
_break
}
next
//敵の弾の当たり判定
for i,0,50
if ebf.i=0:_continue//敵の弾がなければ次の弾
if(abs(x-ebx.i+5)<=7 & abs(y-eby.i)<=14):gosub *gameover_sub:goto *init//敵の弾が自機に当たったらゲームオーバーサブルーチンに飛び、ゲーム初期化
next
//クリア判定
cl=0//クリア判定フラグを初期化
for i,0,50
cl=cl+ef.i//全ての敵の生きているかどうかのフラグを足す
next
if cl=0:color 0,0,0:boxf 0,0,319,219:pos 130,100:color 255,255,255:mes"Clear!":redraw 1:await 2000:goto *init//敵が全滅していたらクリア表示し、初期設定に戻る
wtmax=cl/8.0//敵の残りが少ないほどゲームスピードをアップする
if cl<5:esp=2//敵の数が5より少なくなったら敵の移動速度を2にする
if cl=1:esp=4//敵の数が1になったら敵の移動速度を4にする
//ゲームオーバー判定
for i,0,50
if ef.i=0:_continue//敵が消滅していたら次の敵
if ey.i>=220:gosub *gameover_sub:goto *init//敵が下に達したらゲームオーバー表示し、初期設定に戻る
next
await 2//ウェイト
redraw 1//画面を描画する
goto *main//戻る
//ゲームオーバーサブ
*gameover_sub
color 0,0,0:boxf x,y,x+15,y+15 //自機を消去
color 255,255,255:pos x,y:mes"*" //自機の爆発パターンを表示
pos 120,100:color 255,255,255:mes"Game Over!" //ゲームオーバー表示
redraw 1 //画面を描画する
await 2000 //ウェイト
return
</p>
一応の完成ではありますが、UFOを追加してみたり、敵の種類を増やしてみたり色々改造してオリジナルゲームに仕上げてみて下さい!
HSP3.3でペイントソフトを作る!
マウス操作による自由描画、線の補間、カラーパレット、消しゴム・スポイト機能、画像の保存・読込までフル機能のペイントツールを作ります。
<第1回>マウスクリックでスクリーンに描画してみる!
2012/7/15
はじめに
皆さん、こんにちは。ANGLEです。
今日から新連載の「HSP3.3でペイントソフトを作る!」が始まります。
そもそもの発端は、「高機能なソフトは使いこなせないなあ」「WindowsXP(何故かサブマシンは7だったりする)付属のペイントはアンドゥが1回しかないし、レイヤーがないからなあ」等などという悩みがあり、ならば自分で作ろう!と思ったことです。
私がどこまで作れるかは現段階では何とも言えませんが、あえて制作段階をリアルタイムに近い形で紹介することでライブ感を出していきたいと考えております。
せっかくなので、HSP超初心者の方向けの「講座」の形式を取っていますが、必ずしも全てがそうではありません。
私がどこまで出来るか怪しいからです(笑)
中級者以上の方も「生暖かい目」で見守って下さいね(間違い等がありましたら連絡下さい)。
それでは、開発を始める前にどのようなソフトを作るかを考えてみます。
| ペン | 太さ5種 |
|---|---|
| ブラシ | 大きさ3種 |
| レイヤー | 10枚 |
| アンドゥ | 10回 |
| 対応形式 | BMP/JPEG/PNG/GIF/TIFF |
ペンとブラシの種類についてはペイントと同数にしています。
レイヤーがたった10枚で、アンドゥもたった10回というのも物足りないと感じる方も多いと思いますが、あくまで当面の目標です。
うまく実装出来るようであればメモリの許す限り対応出来るようにしたいと考えています。
開発開始!
それでは始めに、HSPを導入していない方はこちらからダウンロードしてインストールして下さい。
インストールの詳細はこちらをご覧下さい。
インストールし終わったら、HSPスクリプトエディタを起動します。
さあ、いよいよ本題です。
まずは描画先となるウインドウを作成します。
<p class="program">
screen 0,640,480
</p>
無難に横640ドット×縦480ドットでウインドウを作成しました。
次に
<p class="program">
*main
</p>
と入力します。「*」を先頭に付けた文字は「ラベル」と言って、プログラムの流れをコントロールする為に作ります。
何の為に使うかは後程分かります。
次にマウス入力の下準備をしましょう。
<p class="program">
x=mousex
y=mousey
</p>
変数xにマウスのX座標を代入、変数yにマウスのY座標を代入する処理です。
次にマウスの左ボタンを検出する為の処理を作ります。
<p class="program">
stick key,256
</p>
stickは各種入力を検出する命令で、256というのはマウスの左ボタンに割り当てられた番号です。左ボタンを押したかどうかが変数keyに代入されます。
続いてマウスの左ボタンを押していたらカーソル位置に点を描画する処理を作ってみましょう。
<p class="program">
if (key & 256):color 0,0,0:pset x,y
</p>
ifとは文字通り「もし~なら」という意味です。この場合マウスの左ボタンが押されていたらという処理になります。
「:」は命令と命令を繋ぐ為に使います。ここでは左ボタンが押された時の処理を続けて書いています。
「color」は色を指定する命令です。R(赤要素)、G(緑要素)、B(青要素)の順で指定します。
RGBはそれぞれ0~255で指定します。0,0,0なら黒、255,255,255なら白になります。ここでは黒を指定しているわけです。
その次に書いている「pset」は画面に点を打つ命令です。
先程colorで指定した色でx,yの位置に点を打つというわけです。
なんと、たったこれだけで本日の目標であるスクリーンに描画する処理は完成です!
でも、喜ぶのはちょっと早いです。
ここでF5を押してプログラムを実行してもすぐに終了してしまいます。
何故かというと、プログラムは基本的に上から下に向かって流れるのですが、一番下まで行くと終了してしまうからなのです。
それではどうしたらいいかというと、その答えこそが冒頭出てきた「*main」です。
ここまでのプログラムでは、ウインドウを作って、マウスのXY座標及び左ボタンクリック検出、左ボタンクリックで点を描画ということを書いてきたわけですが、プログラムの実行は一瞬で終わってしまいます。
さらに言うと、このままでは「プログラムを開始した一瞬の間にマウスを動かしたかどうか、左ボタンを押したかどうか」しか判定出来ないことになります。
つまり、この処理を繰り返さなければお絵描きは出来ないことになります。
そこで、プログラムの下まで行ったら「*main」に戻る処理を入れるのです。
<p class="program">
goto *main
</p>
これで理論上はうまく行くはず……なのですが、ここで実行するとプログラムが固まってしまいます!
HSPでのプログラムのお約束として、ループ処理を行う場合には「await」という命令を入れなければならないのです……。
一種のおまじないみたいなものとして、「goto *main」の前の行に次の通り入れておきます。
<p class="program">
await 1
</p>
完成したプログラムはこのようになります。
<p class="program">
screen 0,640,480
*main
x=mousex
y=mousey
stick key,256
if (key & 256):color 0,0,0:pset x,y
await 1
goto *main
</p>
いよいよ実行!

それではF5を押してプログラムを実行してマウスの左ボタンを押しながら動かしてみましょう!!
・
・
・
あれれ?
描いた線であるはずのものは線ではなく点線になってしまっています!!
これはどうしたらいいでしょう???
プログラムは上から順番に処理され、下まで行ったところでまた上に戻るようにしました。
ということは、前回の点から今回の点を線で結べば上手く行くような気がしますね!
それでは今日のところはエディタの「ファイル」→「名前を付けて保存」を選び、「ペイントソフト」と名前を入力して保存しておきましょう。
次回に続く!
HSPの基礎固めには公認入門書がおすすめ!私もHSP2.5の頃に買って勉強しました。
<第2回>綺麗な線を描画できるように改良してみる!
2012/7/16
座標及び線を引く命令について
第1回で作成したプログラムでは繋がった線が描けず、点線になってしまいました。
第2回ではそれを修正してみたいと思います。
基本的な考え方としては、前回のX座標・Y座標と現在のX座標・Y座標を線で結んでいけば解決出来そうです。
前回のX座標・Y座標というのは、それぞれ変数X、Yに代入されているものです。
それでは、現在のX座標・Y座標というのはどうするかというと、リアルタイムの数値ですからそのままずばりmousexとmouseyを使えば大丈夫そうです。

線を引く処理を作る前にウインドウの座標について説明します。
今回作成したウインドウは横640ドット×縦480ドットでしたので、左上の座標が(0,0)、右下の座標が(639,479)になります。
その中で、前回の座標(x,y)と現在の座標(mousex,mousey)を結ぶ線を描くように処理を修正していきます。
線を描くにはline命令を使います。
「line 始点のX座標,始点のY座標,終点のX座標,終点のY座標」と入力します。
今回は
<p class="program">
line x,y,mousex,mousey
</p>
となります。
プログラムを修正
前回の「pset x,y」と入れ替えてみましょう。
<p class="program">
screen 0,640,480
*main
x=mousex
y=mousey
stick key,256
if (key & 256):color 0,0,0:line x,y,mousex,mousey
await 1
goto *main
</p>
おや、全く何も描けなくなってしまいました……。
プログラムを上からよく見てみると、xとyにそれぞれmousex,mouseyを代入して、すぐlineで(x,y)から(mousex,mousey)に線を引いています。
ということは、xとmosuex、yとmouseyは同じ値になってしまっているのでは!?
それでは、「x=mousex」と「y=mousey」をline命令の後に移動してみましょう。
<p class="program">
screen 0,640,480
*main
stick key,256
if (key & 256):color 0,0,0:line x,y,mousex,mousey
x=mousex
y=mousey
await 1
goto *main
</p>
こうすれば、現在のmousexとmouseyの座標を参照した後で、xとyに代入することになるので、うまく行くはず。

おお!描けました!!
これで「一応」お絵描きツールらしくなりましたね♪
……でも、描いた線を消すことが出来ないですし、色も変えられないんですよね……。
次回はその辺りに挑戦してみようと思いますよ!
<おまけ>
HSPのmousexのヘルプを見ると、似たような処理が書いてありました!
ご参考まで転載。
<p class="program">
; マウスポインタの動きに沿って線を描く
repeat
line mousex, mousey
wait 1
loop
</p>
たったこれだけで同じようなこと実現出来てますが……Σ(゚口゚;
HSPの基礎固めには公認入門書がおすすめ!私もHSP2.5の頃に買って勉強しました。
<第3回>色々な色で線を描画できるように改良してみる!
2012/7/19
とりあえずインターフェース周りは既存パーツ
今回は黒以外の色で線を描画できるように改良していきます。
その為には主に下記の処理が必要になります。
- 色を切り替えるための動作を決め、その入力を受け付ける
- 色を選択する画面を用意する
- 選択した色で描画するように変更する
この中で少々やっかいなのが1です。
入力を受け付けること自体は簡単なのですが、難しいのはそのインターフェースです。
例えばいきなりPhotoshopのようなカッコイイものを作ろうとするのは少々無謀です。
アイコンのデザインだけならともかく、ボタンとして機能するものを自作するのは初心者には簡単ではないからです。
そこで、今回はWindows標準のボタンを使用して、「とりあえず」の処理を作ってみます。
インターフェースはHSPに慣れた頃に他の機能を盛り込む流れで作り込むことにしたいと思います。
それでは、「色を切り替えるための動作」はどうしましょうか?
現在の画面は描画ウインドウのみという何もない更地です。
HSPではWindowsアプリケーションの標準的なメニュー表示も実現出来ますが、モジュールやプラグインという外部の仕組みを使用することになります。
少々煩雑ですので、ここでは描画先の他にもう一つウインドウを作成し、そちらに各種機能を追加していこうと思います。
ウインドウを作成するのは「screen」命令でした。
第1回ではあまり詳しく説明しませんでしたが、ウインドウを作成する際には大きさ以外に「ID」も指定していたのです。
IDは単純に複数のウインドウを管理する為の通し番号だと考えて下さい。
<p class="program">
screen 0,640,480
</p>
という処理でしたが、このプログラムで作成したウインドウのIDは「0」という意味です。
新しいウインドウのIDは「1」とします。サイズは当面それ程大きいものは必要ありませんので、とりあえず120×200ドットとして、「screen 0,640,480」の次の行に入力します。
<p class="program">
screen 1,120,200
</p>
これでツール類のボタンを配置するウインドウが出来ました。
続けて色を変更するボタンを作ります。
ボタンなどのオブジェクトを作る際にはサイズを設定しておくといいです。
ここでは100×20ドットにしておきます。
<p class="program">
objsize 100,20
</p>
続けてボタンを配置します。
<p class="program">
pos 10,10:button"色",*color_change
</p>
「pos 10,10」は座標(10,10)にボタンを置くということです。ボタンなどのオブジェクト以外では文字表示位置の指定にも使います。
「button"色",*color_change」がボタンを配置する部分です。
「button」がその命令で、「"色"」という部分ではボタンに表示される文字列を指定しています。
「,*color_change」はボタンを押した際に飛ぶラベルを指定しています。
ラベル「*color_change」はこれから作成します。
「goto *main」の下に入力していきます。
<p class="program">
*color_change
dialog"",33:r=ginfo_r:g=ginfo_g:b=ginfo_b
goto *main
</p>
「dialog」はその名の通り各種ダイアログを表示する命令です。
「33」は色の設定画面を呼び出す際に指定します。
色の設定画面で選択した色はRGBでメモリに保管されます。
R(赤要素)がginfo_r、G(緑要素)がg=ginfo_g、B(青要素)がb=ginfo_bに保管されるので、「r=ginfo_r」というようにそれぞれ代入しておいて、後で使いやすいようにします。
「goto *main」はもう説明不要ですね? メイン処理に戻るだけです。
さて、ここまでで色を選択する処理が完成しました。
ここからは実際に色を反映させる処理を作っていきます。
<p class="program">
if (key & 256):color 0,0,0:line x,y,mousex,mousey
</p>
という処理がありました。
マウスの左クリックで黒い線を引くという処理です。
「color 0,0,0」のところを先ほどのr,g,bに置き換えれば選択した色で線を引けそうですね。
<p class="program">
if (key & 256):color r,g,b:line x,y,mousex,mousey
</p>
これでほぼ全ての処理が出来たのですが、実はもう一つ大事な処理があります。
それは描画先の指定です。
現在ウインドウはメインウインドウとツールウインドウの2つがあります。
このままだと最後に定義したツールウインドウ側に描画されてしまうのです!
そこで、描画先をメインウインドウに設定します。
<p class="program">
gsel 0
</p>
「gsel」は複数のウインドウ、そして今後出てくる仮想画面を管理するには必須の命令です。
ここでは描画先をID0の画面、メインウインドウに設定しています。
最後に、現在の色がどんな色か分かりやすいように、タイトルバーに表示してみましょう。
<p class="program">
title"color ("+r+","+g+","+b+")"
</p>
「title」命令はこのように変数の値をリアルタイムで確認するのにも重宝しますので、プログラムを試す際に活用してみて下さい。
それでは、完成したプログラムを見てみましょう。
<p class="program">
//メインウインドウ
screen 0,640,480
//ツールウインドウ
screen 1,120,200//追加
objsize 100,20//追加
pos 10,10:button"色",*color_change//追加
//メイン処理
*main
gsel 0//追加
stick key,256
if (key & 256):color r,g,b:line x,y,mousex,mousey//変更
title"color ("+r+","+g+","+b+")"//追加
x=mousex
y=mousey
await 1
goto *main
//色の設定画面
*color_change
dialog"",33:r=ginfo_r:g=ginfo_g:b=ginfo_b//追加
goto *main//追加
「//」を入力すると、その後の文章はコメントとして自由に書くことができます。
プログラムが長くなってくるとどこが何の処理だか分からなくなりがちですので、このようにコメントを付ける癖をつけましょう。
いかがでしたでしょうか?
今回はちょっと難易度が上がったかもしれません。
よく分からない部分は数字を変えてプログラムを実行する等して違いを確認してみると理解が深まります。
色々試してみて下さい。
さて、次回の内容ですが、消しゴム機能、スポイト機能を追加します。
お楽しみに!
HSPの基礎固めには公認入門書がおすすめ!私もHSP2.5の頃に買って勉強しました。
<第4回>消しゴム機能、スポイト機能を追加してみる!
2012/8/4
消しゴム機能を追加してみる
前回から少し時間が経ってしまいました……。
先行公開していたファイルはご覧いただけたでしょうか?
予習されていると今回の内容が理解しやすいかもしれません。そうでない方も詳細に説明していくのでご安心下さい。
当初はファイル入出力までの予定でしたが、結構長くなってしまうので、今回は消しゴム機能とスポイト機能の追加をしてみましょう。
それでは始めていきましょう!
消しゴム機能を実現するにはどうしたらいいでしょうか?
現実世界では鉛筆やシャープペンシルで描いた絵を消すというのが一般的です。
白い紙に黒い線で描くということですね。当たり前ですが……。
PC上では色は自由ではありますが、現段階ではこの色の設定を使うことにします。
背景色は白を前提とし、線は……既にカラー対応しているのでそのままとしましょう。
消しゴムを動かしたら白で小さく塗りつぶす感じにすれば、とりあえずはそれらしい動きになりそうです。
今後背景色を塗りつぶしたり変更したり出来るようになった際に、また変更することにしましょう。
まず、機能の切替が必要になりますので、前回の「色」ボタン同様に「ペン」ボタン、「消しゴム」ボタンを追加します。
<p class="program">
pos 10,40:button"ペン",*pen_on
pos 10,70:button"消しゴム",*eraser_on
</p>
もう大丈夫ですね。
X座標、Y座標を指定して、ボタンを表示、ボタンを押したらそれぞれのラベルに飛ぶという内容です。
続いて、ラベル「*pen_on」「*eraser_on」を作ります。
<p class="program">
*pen_on
pen=1
era=0
spo=0
goto *main
<br>
*eraser_on
pen=0
era=1
spo=0
goto *main
</p>
ペンは「pen」、消しゴムは「era」、スポイトは「spo」という変数を用意して、それぞれオンの時に値を「1」、オフの時に「0」をセットするようにします。
そして、どの機能がオンになっているかによって処理が変わってくるわけです。
「*pen_on」の場合、ペンはオン、消しゴムはオフ、スポイトはオフという設定です。
設定が終わったら、メイン処理に戻ります。
次に消しゴムの動作を作っていきます。
少々ややこしいかもしれませんが、まず元のプログラムと今回のプログラムを並べてみます。
<前回>
<p class="program">
if (key & 256):color r,g,b:line x,y,mousex,mousey
</p>
<今回>
<p class="program">
if (key & 256):{
if pen=1:color r,g,b:line x,y,mousex,mousey//変更
if era=1:color 255,255,255:boxf mousex-4,mousey-4,mousex+4,mousey+4//追加
if spo=1:pget mousex,mousey:r=ginfo_r:g=ginfo_g:b=ginfo_b:spo=0:pen=1//追加
}
</p>
今回、消しゴムとスポイトを追加する為、マウス左クリックした時の処理を分けているんです。
まずは消しゴムの処理から解説していきます。
<p class="program">
if era=1:color 255,255,255:boxf mousex-4,mousey-4,mousex+4,mousey+4//追加
</p>
変数「era」が「1」の時、color命令で白(RGB全て「255」)にしています。
続いて「boxf」命令で小さく塗りつぶしていきます。
「boxf」の後は左上のx,y座標、右下のx,y座標を設定しています。
マウスのカーソル位置を中心として、9×9ドットの白い四角で塗りつぶしているということです。
スポイト機能を追加してみる
まずはスポイト機能をオンにするボタンから作成します。
<p class="program">
pos 10,100:button"スポイト",*spoit_on
</p>
続いて、ラベル「*spoit_on」を作成します。
<p class="program">
*spoit_on
pen=0
era=0
spo=1
goto *main
</p>
先程追加した左クリック時の処理は、
<p class="program">
if spo=1:pget mousex,mousey:r=ginfo_r:g=ginfo_g:b=ginfo_b:spo=0:pen=1
</p>
というものでした。
変数「spo」が「1」の時に「pget」命令を実行します。
pget命令はその後に続く、X座標、Y座標の色を取得し、RGBの値をそれぞれ「ginfo_r」「ginfo_g」「ginfo_b」に代入します。
例によって、使いやすいようにそれぞれ変数「r」「g」「b」に代入しておきます。
色を取得した後はスポイト機能をオフにし、ペン機能をオンにしています。
こうするとちょっとしたペイントソフトのようですよね。
仕上げに
一般的なペイントソフトは初期設定でペンが選択されています。
それにならって、「button」命令の次あたりに
<p class="program">
pen=1
</p>
と設定しておきます。
というのも、この設定がないと、何の機能も選択されていない状態となり、ボタンを何か押さない限り何も出来ないのです。
次に、選択している機能が何なのか表示して分かるようにしてみましょう。
<p class="program">
if pen=1:title"ペン 色:("+r+","+g+","+b+")"//変更
if era=1:title"消しゴム"//追加
if spo=1:pget mousex,mousey:title"スポイト 色:("+ginfo_r+","+ginfo_g+","+ginfo_b+")"//追加
</p>
前回まではペンの色表示だけでしたが、今回は現在の機能に応じて書き換えてみました。
ペンの場合はRGBで何色を選択しているかを表示します。
消しゴムの場合は単純に「消しゴム」とだけ表示します。
スポイトの場合はリアルタイムでマウスカーソル位置の色を取得して表示します。命令は今まで出てきたものだけなので割愛しますが、こうすると、目的の色が取得しやすいですよね。
では、最後に完成したプログラムを見てみましょう!
<p class="program">
//メインウインドウ
screen 0,640,480
//ツールウインドウ
screen 1,120,200
objsize 100,20
pos 10,10:button"色",*color_change
//追加
pos 10,40:button"ペン",*pen_on
pos 10,70:button"消しゴム",*eraser_on
pos 10,100:button"スポイト",*spoit_on
pen=1
//メイン処理
*main
gsel 0
stick key,256
if (key & 256):{
if pen=1:color r,g,b:line x,y,mousex,mousey//変更
if era=1:color 255,255,255:boxf mousex-4,mousey-4,mousex+4,mousey+4//追加
if spo=1:pget mousex,mousey:r=ginfo_r:g=ginfo_g:b=ginfo_b:spo=0:pen=1//追加
}
if pen=1:title"ペン 色:("+r+","+g+","+b+")"//変更
if era=1:title"消しゴム"//追加
if spo=1:pget mousex,mousey:title"スポイト 色:("+ginfo_r+","+ginfo_g+","+ginfo_b+")"//追加
x=mousex
y=mousey
await 1
goto *main
//色の設定画面
*color_change
dialog"",33:r=ginfo_r:g=ginfo_g:b=ginfo_b
goto *main
//追加
*pen_on
pen=1
era=0
spo=0
goto *main
*eraser_on
pen=0
era=1
spo=0
goto *main
*spoit_on
pen=0
era=0
spo=1
goto *main
</p>
ちょっと長くなってきましたが、一つ一つしっかり見ていけば難しいことはありません。
もし全体を見て分からない部分があったら、解説に戻って確認してみて下さいね。
さて、だいぶそれらしくなってきたペイントソフトですが、次回はいよいよファイル入出力機能を付けていきます!
お楽しみに♪
HSPの基礎固めには公認入門書がおすすめ!私もHSP2.5の頃に買って勉強しました。
<第5回>ファイル入出力機能を追加してみる!
2012/8/12
モジュールの利用
「ファイル入出力機能」と言うと何だか小難しく聞こえるかもしれませんが、簡単に言えば「描いた絵の保存・読込ができる」ということです。
これまでのプログラムでは、せっかく描いた絵を保存することができませんでしたので、その場の落書きにしか利用できませんでしたが、今回保存・読込ができるようになりますので、ようやく実用ソフトへの第一歩を踏み出せると言えるかもしれません。
対応するファイル形式は下記の通りです。
入力(読込)
- BMP
- GIF
- JPEG
- PNG
- TIFF
出力(保存)
- BMP
実はHSP3.3の通常の機能ではPNGとTIFFは扱えないのですが、今回「モジュール」を利用することでこの問題をクリアしたいと思います。
HSP公式サイトによると「モジュール機能は、複数のスクリプトをラベル名や変数名の衝突を気にせず結合するための仕組みです。」とのこと。
要はプログラムをいくつかに分けて作るやり方に用いられるものです。
しかし、今回モジュールを利用するのは「モジュール機能を使わない人であっても、他の人がモジュール機能を使って追加した新しい命令を使うことが可能」(同)という部分です。
HSP3.3には「mod_img.as」というモジュールが同梱されています。
このモジュールを読み込み、このモジュールで定義された命令を使用することで、PNGもTIFFも読み込むことが可能になるのです。
こうしたモジュールはHSP本体に同梱されているもののみならず数多く存在しています。
もし、自分では実現できない処理があった場合にモジュールを探してみるのもいいかもしれません。
それでは、「mod_img.as」を使ってプログラムを作っていきましょう!
まずモジュールを読み込む必要があります。
プログラムの一番上に下記のように記述します。
<p class="program">
#include "mod_img.as"
</p>
「include」は英語で「含める」という意味です。
モジュール「mod_img.as」をこのプログラムに含めるということですね。
他のモジュールを利用する際も、「#include"ファイル名"」と記述しますので、覚えておいて下さい。
保存処理・読込処理
続いて、「保存」ボタンと「読込」ボタンを作りましょう。
前回作成した「スポイト」ボタンの下に
<p class="program">
pos 10,130:button"保存",*save
pos 10,160:button"読込",*load
</p>
と追加します。
次にプログラムの一番下にラベル「*save」を作ります。
<p class="program">
*save
dialog"bmp",17
if stat=0:goto *main
bmpsave refstr+".bmp"
mouse x,y
goto *main
</p>
「dialog」命令に「17」を指定するとファイルSAVE(保存)ダイアログを開くことができます。
「""」の中は保存するビットマップの拡張子「bmp」を指定します(ダイアログが開くとフォルダ内にあるbmp形式のファイルが表示されます)。
次のif文では「stat」が「0」の時にメイン処理に戻るようにしています。
この「stat」は「dialog」命令実行時に保存を実行したのかキャンセルしたのかを保存するものです。
「0」はキャンセルを表し、保存が正常に終了した場合には「1」になります。
何故この処理を入れるのかと言えば、キャンセルした際に誤った処理をしてしまうからです。
「bmpsave refstr+".bmp"」は画像を「bmp」形式で保存する処理です。
「refstr」には「dialog」命令で選択されたファイル名が入っています。
ところがキャンセルした場合はファイルを選択していないわけですからファイル名が空白になってしまう上、保存処理を通るのでキャンセルしたにもかかわらず保存されてしまうのです。
その次の「mouse x,y」はマウス位置をx,yに移動させています。
というのも、保存処理が終わった直後にペン機能等で描画処理が行われてしまうためです。
もう少し良い方法があればいずれ直そうと思います。
続いて読込処理です。
ラベル「*load」を「*save」の下に作ります。
<p class="program">
*load
dialog"bmp;*.gif;*.jpg;*.png;*tif",16
if stat=0:goto *main
imgload refstr
mouse x,y
goto *main
</p>
「dialog」命令に今度は「16」を指定しています。
ファイルOPEN(開く)ダイアログを開きます。
「""」の中身ですが、拡張子を複数並べて書く場合は「;」で区切り、2個目以降は「*.」を拡張子の前に付けて記述します。
if文は*saveの時と同じです。
その次の「imgload」命令がモジュール「mod_img.as」の独自命令で、画像を読み込みます(ちなみに、HSP標準命令の画像読込命令は「picload」です)。
以降は*saveと同じなので割愛します。
完成したプログラムはこのようになります。
<p class="program">
//モジュール
#include "mod_img.as"
//メインウインドウ
screen 0,640,480
//ツールウインドウ
screen 1,120,200
objsize 100,20
pos 10,10:button"色",*color_change
pos 10,40:button"ペン",*pen_on
pos 10,70:button"消しゴム",*eraser_on
pos 10,100:button"スポイト",*spoit_on
pos 10,130:button"保存",*save//追加
pos 10,160:button"読込",*load//追加
pen=1
//メイン処理
*main
gsel 0
stick key,256
if (key & 256):{
if pen=1:color r,g,b:line x,y,mousex,mousey
if era=1:color 255,255,255:boxf mousex-4,mousey-4,mousex+4,mousey+4
if spo=1:pget mousex,mousey:r=ginfo_r:g=ginfo_g:b=ginfo_b:spo=0:pen=1
}
if pen=1:title"ペン 色:("+r+","+g+","+b+")"
if era=1:title"消しゴム"
if spo=1:pget mousex,mousey:title"スポイト 色:("+ginfo_r+","+ginfo_g+","+ginfo_b+")"
x=mousex
y=mousey
await 1
goto *main
//色の設定画面
*color_change
dialog"",33:r=ginfo_r:g=ginfo_g:b=ginfo_b
goto *main
*pen_on
pen=1
era=0
spo=0
goto *main
*eraser_on
pen=0
era=1
spo=0
goto *main
*spoit_on
pen=0
era=0
spo=1
goto *main
//追加
*save
dialog"bmp",17
if stat=0:goto *main
bmpsave refstr+".bmp"
mouse x,y
goto *main
//追加
*load
dialog"bmp;*.gif;*.jpg;*.png;*tif",16
if stat=0:goto *main
imgload refstr
mouse x,y
goto *main
</p>
さあ、いかがでしたか?
画像を保存できるようになったので、このソフトでどこまで描けるか挑戦してみるのも一興ですね。
力作ができたら見せて下さい!
それでは、次回をお楽しみに♪
HSP3.3でTouch the Numbersを作る!
スマホ向けミニゲーム「Touch the Numbers」をHSPで再現!タッチ/クリックによる直感的なゲーム制作のノウハウを解説します。
2013/4/13
HSPで作るスマホゲーム
HSPでスマホゲームが作れるようになるとは本当に良い時代です。
ある程度HSPをいじったことがある方であれば、最小限の労力でスマホゲームは作れます。
スマホゲームの利点は何と言っても、「皆いつも持ち歩いているゲーム機」でもあるということです。
自分でスマホアプリを作れるならば、その場で友達に配ることも可能です。
(サーバーにアップして、フリーウェアなどでQRコードを作成し、読み取ってもらうなど)
これってワクワクしませんか?
実際、私はその場で作ってその場で配るということをやったりしましたが、今までにない体験でした!
この素晴らしい体験を是非皆さんにも味わっていただきたいと思います。
では、早速始めていきましょう!

今回作るのは大ヒットした『Touch the Numbers』もどきです。
画像の作成も含めて6時間程度で完成させました(半分はバグ取り)。
タイムの算出は少々いい加減な処理をしているのは目を瞑っていただけると幸いです。
作成には「HSP3Dish」を使用します。
基本は通常のHSP3と同じですが、いくつかの仕様が若干異なります。
詳しくはこちらのページを参照して下さい。
それでは、プログラムの中身の解説です。
今回もプログラム中に注釈を入れていますので、ポイントのみ解説していきます。
「*block_ini」ではブロック(パネル)をランダムに配置しています。
まずは1から25まで順番に並べた上で、ランダムに選んだ2つのブロックを30回入れ替えることでバラバラに配置しています。
全てのブロックの場所をランダム値で置いていくということをしていないのがポイントです。
何故かというと、全てランダムに置いていくと、まだ置いていない場所に残りのブロックを置くのが困難になるからです。
こういう場合、フラグを立てて置いたか置いていないか判断することになります。
例えば、1から25まで順番にX座標とY座標をランダムで決めていくとして、最後の25番になると当然置ける場所は1か所なわけですが、なかなかランダム値がその場所にならないということが起こりえます。
ランダム値の範囲から置かれた場所を除外するという手もあるでしょうが、少々複雑な処理になってしまいます。
そのようなことをするくらいであれば、普通に並べた後で一定回数入れ替えてやった方が処理が単純で常に一定の速度で完了するというメリットがあります。
<p class="program">
#include "hsp3dish.as"
celload "number.png",1
celdiv 1,60,60,30,30
mmload"PulseMeter.wav",0,0
//セーブデータ
exist"ranking.dat"
if strsize=-1{
besttime=double(20.0)
}else{
notesel dat
noteload"ranking.dat"
noteget besttime,0
besttime=double(besttime)
}
dim bx,25//ブロックのX座標
dim by,25//ブロックのY座標
dim bf,5,5//ブロックがあるフラグ
ddim r,25//ブロックの回転角度増減用
ddim kaiten,25//ブロックの回転角度
ddim zx,25//ブロックの大きさ(X)
ddim zy,25//ブロックの大きさ(Y)
dim anime,25//ブロックアニメのフラグ
*tit
cls
redraw 0
color 0,0,0:boxf
color 255,255,255:pos 10,160:mes"Touch the 25 panels"
pos 20,200:mes"BEST TIME:"+besttime
objsize 250,40
pos 35,240:button"PLAY(SOUND ON)",*s_on
pos 35,320:button"PLAY(SOUND OFF)",*s_off
redraw 1
stop
*s_on
sound=1
goto *block_ini
*s_off
sound=0
goto *block_ini
*block_ini
for i,0,25
r.i=0.0//ブロックの回転角度
zx.i=1.0//ブロックの大きさ(X)
zy.i=1.0//ブロックの大きさ(Y)
kaiten.i=0.0
anime.i=0
next
cls
for i,0,5:bx.i=i:by.i=0:next//1段目
for i,5,10:bx.i=i-5:by.i=1:next//2段目
for i,10,15:bx.i=i-10:by.i=2:next//3段目
for i,15,20:bx.i=i-15:by.i=3:next//4段目
for i,20,25:bx.i=i-20:by.i=4:next//5段目
randomize
for i,0,30
o=rnd(25)//入れ替え1つ目のX座標保管用
p=rnd(25)//入れ替え1つ目のY座標保管用
x1=bx.o:y1=by.o//入れ替え1つ目
x2=bx.p:y2=by.p//入れ替え2つ目
bx.o=x2//入れ替え1つ目
by.o=y2
bx.p=x1//入れ替え2つ目
by.p=y1
next
*put
for i,3,0,-1
redraw 0 ; 描画開始
color 0,0,0:boxf ; 画面クリア
color 255,255,255:pos 140,200:mes i
redraw 1 ; 描画終了
await 1000 ; 待ち時間(1/60秒)
next
redraw 0
color 0,0,0:boxf
for i,0,25
pos bx.i*60+40,by.i*60+30:celput 1,i
next
objsize 120,30
pos 100,350:button"Retry",*block_ini
pos 100,410:button"Title",*tit
redraw 1
*main
stick st
mx=mousex:my=mousey
xx=bx.now*60+40:yy=by.now*60+30
if st=256{
if (abs(mx-xx)<30 & abs(my-yy)<30){
if sound:mmplay 0
anime.now=1
now++
}
if now=25:goto *hantei
}
tm+=1
redraw 0
color 0,0,0:boxf
for i,0,25
if i>=now:pos bx.i*60+40,by.i*60+30:celput 1,i//通常のパネル表示
//アニメ処理
if anime.i{
pos bx.i*60+40,by.i*60+30:celput 1,i,zx.i,zy.i,kaiten.i
r.i+=0.002:kaiten.i=r.i*180/3.14
zx.i=1.0-r.i*5
zy.i=1.0-r.i*5
if zx.i<=0:zx.i=1.0:zy.i=1.0:r.i=0.0:kaiten.i=0.0:anime.i=0
}
next
rec=double(tm*100/60)/100
color 255,255,255:pos 10,320:mes"TIME:"+rec
title"x:"+abs(mx-(bx.now*60+40))+"y:"+abs(my-(by.now*60+30))
redraw 1
await 1000/60
goto *main
*hantei
redraw 0
cls
color 0,0,0:boxf
color 255,255,255:pos 20,160:mes"YOUR TIME:"+rec
if rec<besttime{
besttime=rec
pos 20,200:mes"BEST TIME!!"
}
dat=str(besttime)+"\n"
notesel dat
notesave"ranking.dat"
objsize 120,30
pos 100,300:button"Retry",*block_ini
pos 100,360:button"Title",*tit
redraw 1
for j,0,5:for i,0,5:bf(i,j)=0:next:next
n=0
tm=0
rec=0
now=0
for i,0,25:anime.i=0:next
stop
</p>
一応それなりに本家に近いものが出来ましたが、このままではただの物真似に過ぎません。
是非皆さん独自のアイディアをプラスしてオリジナルゲームに仕上げてみて下さい。
この本には開発環境の構築や配布方法等が詳しく書かれているので、是非参考にしてみて下さい。
Unity研究室
Unityによる3Dアクション・レースゲーム制作の実験とチュートリアル記録です。
ひよこ本 チャプター6 実践
カーソルキーもしくはWASDキーで移動し、できるだけ速くゴールに辿り着くというゲームです。
ひよこ本 チャプター4 実践
カーソルキー/WASDで移動、スペースでジャンプ、シフトでダッシュ。3Dキャラクターアクションの基礎を構築。
アクションゲームデモ
人物と背景のテクスチャ素材、各種移動スクリプトを組み合わせたアクションゲームデモです。
レースゲーム風デモ
車モデルとSmooth Follow / Third Person Cameraを組み合わせた3Dレースゲーム風デモです。
Webツール & ミニゲーム
ブラウザ上で今すぐ体験できる連射力測定、JSONフォーマッター、レトロシューティングゲームです。
連射力測定器 Web Edition
10秒測定10秒間に何回クリック/タップできるかを測定します!
JSON整形ツール
リアルタイム整形HTML5 Canvas レトロシューティング
Playable Web Game管理人プロフィール & PC遍歴
ANGLE(アングル)
ゲーム制作者 / サウンドノベルツール開発者 / インディーサークル ANGROWA 代表
当サイト「語らいの一時オンライン」は 2000年11月26日
の開設以来、サウンドノベル制作ツールの『SNEC』『nextSNEC』、写真素材、シルエット素材、ユニバーサルトランジション用ルール画像素材をメインに公開しています。
盟友ROWARD氏とインディーズゲームサークル「ANGROWA(アングロワ)」を立ち上げ、2014年にはベルトアクション『Wired Soul』をリリースしました。
MSXで創作活動をしていた頃の独り言コーナー「語らいの一時」をオンラインでやろうということで、このサイト名になりました。
PC遍歴
MSX turboR から始まり、PC-9801DX、PC-98NX、その後、Pentium4自作機、Core2Duo自作機、Core i7自作機、Core Ultra5自作機 など。
所有ゲームハード
Atari 2600から始まり(壊れて処分済み)、ファミリーコンピュータ、ディスクシステム、ゲームボーイ、ゲームボーイアドバンス(売却済み)、メガドライブ、PCエンジンDuo-R、スーパーファミコン、ニンテンドー64、セガサターン、ドリームキャスト、PS2、ゲームキューブ、ワンダースワン、PSP、ニンテンドーDSi、PS3、Wii、ニンテンドー3DS、PSVITA、PS4、Switch、Switch2 などを所有。
保有資格
- 基本情報技術者試験
- Webクリエイター能力認定試験 上級
- .ComMASTER★
- MOUS Excel2002 一般
- 英検2級 / TOEIC 570点
- 第一種衛生管理者
- 日商簿記3級 / 漢検3級 / 損保募集人資格 / 普免
プログラミング・開発スキル
主な活動履歴
- HP『語らいの一時オンライン』運営(2000年〜)
- ウェブリング「みんなでサウンドノベル」主宰
- サウンドノベル作成ツール『SNEC』『nextSNEC』開発(雑誌掲載多数)
- ANGROWA『Wired Soul』プログラム(HSPプログラムコンテスト2011 Windows100%賞)
- シリカプロジェクト『シリカプロジェクト・ファーストインプレッション』プログラム
- 某企業のバイオトイレのHP制作