語らいの一時オンライン
Since 2000.11.26 - 2026 Game & Material Portal

ゲーム制作と創作の
「語らいの一時オンライン」
へようこそ

サウンドノベル制作ツール『SNEC/nextSNEC』、写真素材(約200枚)、シルエット素材、フリーゲーム&商用作品、HSP3.3プログラミング講座などを網羅したクリエイターポータルサイトです。

Zombieeee!
HOT RELEASE
Windows 10 / 11用 3Dアクション

『Zombieeee!(ゾンビィィィ)』

武闘家の女子高生・結衣がゾンビや無法者たちを相手に素手やバット、鉄パイプを駆使して立ち向かう3Dアクションゲーム。

INFORMATION

新着情報 & 更新履歴

2026/08/23
ホームページをリニューアルしました!!!
2015/12/28
2015/12/13
2015/12/15~2016/02/02
2015/11/26
おかげさまで15周年を迎えました!!! 15周年記念第一弾として『アドベンチャーゲームつくれーる』を公開しました!
2015/06/13
マルチドメインの対応をしました!!!(www.kataline.comへのアクセスはkataline.comにリダイレクトするようにしました)
2015/06/07
サイトをリニューアルしました!!!(スマホ・タブレット対応)
COMMERCIAL WORKS

製品タイトル

インディーゲーム制作サークル「ANGROWA」および当サイト発の製品版ゲームです。

Subdue the Creatures 3D FPS

Subdue the Creatures

襲い来るクリーチャーたちを各種武器を駆使して討伐する、Windows用ファーストパーソン・シューター。

発売日2022年7月26日
ジャンル3D FPS アクション
プラットフォームWindows PC
制作スタッフROWARD
制作ツールUnity
Zombieeee! 3D Action

Zombieeee!(ゾンビィィィ)

武闘家の女子高生・結衣がゾンビや無法者たちを相手に素手やバット、鉄パイプを駆使して立ち向かう3Dアクションゲーム。

発売日2023年6月30日(アーリーアクセス)
ジャンル3Dアクション
対応OSWindows 10 / 11
制作スタッフANGLE
制作ツールUnity
PPDD Fighting Action

PPDD(ピーピーディーディー)

十字キー操作で敵の攻撃を回避し、カウンターを叩き込む格闘アクション。「ドッヂカウンター」やコンボ技「マーシャルブロー」を搭載。

発売日2019年6月30日
ジャンル格闘アクション
プラットフォームWindows PC / Mac
制作スタッフプログラム: ANGLE / グラフィック: ROWARD
制作ツールGame Maker Studio
Escape From Bondage FPS Escape

Escape From Bondage

Unityで制作された3D脱出FPS。建物内の武器を見つけ出し、侵略者を倒してアパートからの脱出を目指します。

発売日2021年2月28日
ジャンル3D FPS 脱出ゲーム
プラットフォームWindows PC
制作スタッフROWARD
制作ツールUnity
Wired Soul Belt Scroll Action

Wired Soul(ワイアドソウル)

コンボと多彩な技を駆使して進むベルトスクロールアクションゲーム。キャラクターボイスも収録。

発売日2014年11月16日
ジャンルベルトスクロールアクション
対応OSWindows Vista / 7 / 8
動作環境Core2Duo以上 / メモリ 1.5GB以上
制作スタッフプログラム: ANGLE / グラフィック・ボイス: ROWARD
制作ツールHSP
FREE GAMES

フリーゲーム

手軽に遊べるミニゲームから、長編推理・ホラーサウンドノベルまで無料で遊べる全12タイトル!

DEAD CITY -The place to be-
Suspense ADV

DEAD CITY -The place to be-

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

北信州ペンション殺人事件
Mystery ADV

北信州ペンション殺人事件

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

ゲーマー探偵・葉山俊
Gamebook ADV

ゲーマー探偵・葉山俊

対応機種 Windows95/98/SE/Me/2000/XP/Vista/7
ジャンル コメディノベル
バージョン 1.0
最終更新日 2008/12/29
内容 nextSNECで制作のコメディものです。
SNECサンプルゲームからのスピンアウト!
あのゲーマーで探偵の葉山俊が活躍する超短編!
コメディ・サウンドノベルです。
※某ドラマを知らないと分からないネタです。

黒い都市伝説
Horror ADV

黒い都市伝説

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

真夜中のエレベーター
Horror ADV

真夜中のエレベーター

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

君との時間
Sound Novel

君との時間

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

たいぴんぐぽーざー
Typing Game

たいぴんぐぽーざー

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

冬の贈り物
Romance Novel

冬の贈り物

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

君がいて、僕がいた。
Visual Novel

君がいて、僕がいた。

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

夢の中の恋人
Romance Novel

夢の中の恋人

対応機種 Windows95/98
ジャンル ファンタジーノベル
バージョン 0.90
最終更新日 2001/11/26
内容 夢の中で出会った美しい女性。
彼女に恋をした主人公は……
ショートショートストーリー。
選択肢も無ければ、音楽も効果音もありません。
ちょっと変わった話です。
純粋にお話を楽しんでいただければと思います。

CREATION ENGINES

ゲーム制作ツール

直感的なスクリプト記述で本格的なサウンドノベルを制作できるWindows用エンジン群です。

サウンドノベル&インディーゲーム制作に役立つ必読書・音源機材

Amazonアソシエイト公認

SAVE THE CATの法則 本当に売れる脚本術

ブレイク・スナイダー 著

世界中のクリエイターが愛読する物語作りのバイブル!プレイヤーを惹き込むシナリオ構成の黄金律を完全解説。

Amazonで詳細を見る

ゲームシナリオの教科書

キャラクター・ストーリー制作

選択肢分岐やマルチエンディング、世界観設定などゲーム特有のインタラクティブシナリオ制作技法を網羅。

Amazonで探す

音楽制作 USB MIDIキーボード

AKAI / KORG / Native Instruments

自作ノベルやゲームのオリジナルBGM・ジングル・効果音を直感的に打ち込める、コンパクトなMIDI鍵盤。

AmazonでMIDI機器を見る
SNEC WORKS

SNEC作品紹介

SNECエンジンを使用して有志クリエイターの皆様によって制作されたサウンドノベル作品集(13作品)です。

ナワヤの逆転裁判H

ナワヤの逆転裁判H


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

双重峠


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

小心サッカー


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

RECALL


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

夢の続き


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

ポケベル


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


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

Original Soundnovel Hanged Woman


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

異変の欠片


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

※それぞれ共通設定から派生の独立したお話です。
異変の欠片 "胎動" ダウンロード
異変の欠片 "罪" ダウンロード
File No,Case of seaside

File No,Case of seaside


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

ハゲあゆメモリアル シリーズ


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

※一部過激な表現が使われていますので、ご注意下さい。
ダウンロード
五人組物語 緊急指令! 闇の扉の謎を解け

五人組物語 緊急指令! 闇の扉の謎を解け


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

ポチのクイズ脱出大作戦~迷いの森~


ジャンル クイズ
作者 Nagase
内容 SNECでは珍しいクイズゲームです。
結構一般常識なんだろうなあと思う問題も間違ってしまって、実はクリアするのが大変でした(^^;
でも、無限コンティニューなので、誰でもクリアできるようになっていますから安心してプレイできますよ。
ダウンロード
FREE APPS & UTILITIES

フリーウェア & ユーティリティ

自作の便利ユーティリティ、写真ビューア、パズル解法ツールなど様々なWindowsアプリを公開中!

めもめーる
Freeware

めもめーる

対応機種 Android2.3.3以上
ジャンル ツール
バージョン 1.0
最終更新日 2015/8/8
内容 素早くメモできて、あらかじめ登録しておいたメールアドレスにメール送信できるアプリです。
多くの機能を求めている方には向きませんが、とにかく素早くメモしたい方、メモをメールで送信したい方には重宝していただけるかもしれません。
アプリの容量は非常に小さく、起動も動作も軽快です。
掲載履歴 AndroidView 2015/9/19

音の様
Freeware

音の様

対応機種 Android4.2以上
ジャンル ギャグアプリ
バージョン 2.0
最終更新日 2014/9/2
内容 3D描画された滝が効果音と共に表示されるだけのアプリです。
お手洗いで消音の為に使用するもよし、ただただ滝を眺めるもよし……。

ポメラDE読書
Freeware

ポメラDE読書

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

POMERA SYNC(ポメラ シンク)
Freeware

POMERA SYNC(ポメラ シンク)

対応機種 WindowsXP/Vista/7(ポメラ動作環境)
ジャンル ユーティリティ
バージョン 1.01
最終更新日 2009/3/30
内容 このソフトはKING JIM社から発売されているデジタルメモ機『ポメラ』とPC間でテキストファイルを完全に同期する他、ポメラからPCへ、PCからポメラへ一方通行でコピーすることも出来るソフトです。
同期する場合は、特定のファイルが片方にしか無いと、ある方から無い方へコピーします。
ファイルがある場合は新しいファイルが古いファイルに上書きされます。

※違う中身でもファイル名が同じだと新しいファイルに上書きされますので、注意して下さい。
設定ミス、本ソフトの不具合によるファイルの消失の責任は負いかねますので、ご了承下さい。

※ファイルがポメラで読み込めないサイズの場合、そのファイルのコピーはスキップします。
雑誌掲載履歴 なし

ポメラ用早見表
Reference

ポメラ用早見表

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

自動計算出勤簿 of Excel
Freeware

自動計算出勤簿 of Excel

対応機種 Windows98以降(Excel97以上動作環境)
ジャンル ユーティリティ
バージョン 1.01
最終更新日 2009/7/13
内容 Excelでアルバイト・パートの方の勤務時間、休憩時間、給与などを自動計算します。
ただそれだけですが、意外にフリーで良いものが無いので自作してみました。
一度設定してしまえば、始業時間と就業時間を入力するだけです。
雑誌掲載履歴 なし

Rapid Fire
Windows Tool

Rapid Fire

対応機種 Windows98/SE/Me/XP/Vista/7
ジャンル Webブラウザ
バージョン 0.3
最終更新日 2008/9/9
内容 HSP製のWebブラウザです。
容量がとにかく小さく、機能が最低限しかないので、軽快に動きます。
雑誌掲載履歴 なし

MovieDB(仮)
Freeware

MovieDB(仮)

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

Color Coder
Color Utility

Color Coder

対応機種 WindowsXP/Vista/7
ジャンル ユーティリティ
バージョン 1.0
最終更新日 2012/7/4
内容 ホームページ作成の際、カラーコードを16進数で指定する必要があります。
その補助となる(だけの)ソフトです。
雑誌掲載履歴 なし

曜日当てプログラム
Program

曜日当てプログラム

対応機種 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月号

本日の一言
Daily Tool

本日の一言

対応機種 Windows95/98/SE/Me/2000/XP/Vista/7
ジャンル ジョーク
バージョン 1.0
最終更新日 2004/2/7
内容 昔見た格言ジョークソフトを自分なりに作っただけです。
形容詞、人物、行動がランダムで選択され、格言っぽい文章が表示されます。
雑誌掲載履歴 なし

Freeware

Wii版『428~封鎖された渋谷で~』コンプリートセーブデータ

対応機種 Wii
ジャンル セーブデータ
バージョン -
最終更新日 2009/7/15
内容 Wii版『428~封鎖された渋谷で~』のコンプリートセーブデータ(虹の栞)です。
全ての隠し要素がオープンになっています。
※どうしてもクリア出来ない場合のみ使用して下さい。
※別途SDカードが必要です。解凍後SDカードにコピーして、Wii本体のSDカードスロットにセットし、そこからWii本体へコピーします。
雑誌掲載履歴 なし

FREE MATERIALS GALLERY

素材ギャラリー(写真・シルエット・ルール画像)

ゲーム制作、動画、Web制作などで商用・非商用問わず自由にご利用いただけるフリー素材です。

ゲーム用シルエット素材について

サウンドノベル『ゾウディアック』『女教師・美喜シリーズ』等でもご利用いただいたシルエット素材集です。
BMP形式で背景透過色(0,0,0)設定済み。商用・同人・フリー問わずご自由に加工・ご利用いただけます。(※二次配布のみご遠慮ください)

馬


※ファイルはZIP形式で圧縮されています。解凍してご利用下さい。


猫


※ファイルはZIP形式で圧縮されています。解凍してご利用下さい。


犬


※ファイルはZIP形式で圧縮されています。解凍してご利用下さい。


男の子

男の子


※ファイルはLZH形式で圧縮されています。解凍してご利用下さい。


女の子

女の子


※ファイルはLZH形式で圧縮されています。解凍してご利用下さい。


男性

男性


※ファイルはLZH形式で圧縮されています。解凍してご利用下さい。


男性2

男性2


※ファイルはLZH形式で圧縮されています。解凍してご利用下さい。


女性

女性


※ファイルはLZH形式で圧縮されています。解凍してご利用下さい。


女性2

女性2


※ファイルはZIP形式で圧縮されています。解凍してご利用下さい。


少女

少女


※ファイルはLZH形式で圧縮されています。解凍してご利用下さい。


ショートカットの女性

ショートカットの女性


※ファイルはLZH形式で圧縮されています。解凍してご利用下さい。


男性3

男性3


※ファイルはLZH形式で圧縮されています。解凍してご利用下さい。


ショートカットの女性2

ショートカットの女性2


※ファイルはZIP形式で圧縮されています。解凍してご利用下さい。

HDシルエット素材パック

高解像度ゲーム制作用のシルエット素材一括パックです。
トランジションルール画像

ユニバーサルトランジション用ルール画像素材

サウンドノベル作成ツール(nextSNECや各種ゲームエンジン)で使用できるルール画像(画面切り替え用グレースケールパターン)のセットです。

著作権はANGLEにありますが、商用・同人・フリー問わずご自由に加工・ご利用いただけます。(二次配布のみご遠慮ください)

素材活用・ゲーム制作が快適になる!おすすめクリエイター機材&技法書

Amazonアソシエイト公認

液晶ペンタブレット / 板タブ

Wacom / XP-Pen / HUION

イラスト・立ち絵・背景素材の描画や写真レタッチが劇的に捗る、初心者からプロまで大人気の高精度ペンタブレット。

Amazonでペンタブを探す

キャラクターイラスト&デザイン技法書

イラスト制作・配色入門

ゲーム用キャラクターやシルエット素材の構図・ポーズ・配色テクニックを基礎から体系的に学べる定番参考書。

Amazonで関連本を見る

外付け高速ポータブルSSD(1TB〜2TB)

SanDisk / Crucial / Samsung

大量の高解像度写真素材、音源、ゲーム制作プロジェクトを高速転送し、万一のクラッシュから守る必須バックアップ。

AmazonでSSDを探す
HSP3.3 PROGRAMMING LESSONS

HSP3.3 プログラミング講座

ブロック崩し、インベーダー、本格ペイントソフト、スマホ向けゲームまで全ステップをコード付きで徹底解説!

HSP3.3でブロック崩しを作る!

HSPの基本描画からボールの反射、パドルの移動、ブロックの当たり判定までをステップ・バイ・ステップで学ぶ実践チュートリアル。

<第1回>ラケットボールを作ってみる!

<第2回>ブロックを追加してみる!

<第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」がパドルの右端を表しています。
パドルの端に当たった場合を考え、左右はボール一個分当たり判定を広げています。

HSP 3.3 Source
<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回のミスでゲームオーバーになってしまったり、色々改良の余地もあります。
是非皆さん自身の手で改良を行ってみて下さい。
プログラム上達の近道はとにかく自分で考えて打ってみることに尽きます。

HSP 3.3 Source
<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回>自機を作ってみる!

<第2回>敵を作ってみる!

<第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にしています。

HSP 3.3 Source
<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を足してプレイヤーに一段近づけるということをしています。

HSP 3.3 Source
<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


今回でいよいよインベーダーゲームが完成します。
前回までで自機、自機の弾、敵、敵の弾の表示までが終わりました。
今回は当たり判定の追加、スピード変化処理の追加、スコアの追加などを行い、ゲームとして遊べるものになります。

当たり判定を作ってみる

では、早速当たり判定を付けていきましょう。
当たり判定は二種類あります。
自機の弾が敵に当たる場合と敵の弾が自機に当たる場合です。
まず、敵の弾が自機に当たる場合を見ていきましょう。

HSP 3.3 Source
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回のミスでゲームオーバーにしていますが、自機のストックを増やす改造をしてみるのもいいと思います。
続いて、自機の弾が敵に当たる場合を見てみます。

HSP 3.3 Source
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に設定しています。
本家『スペースインベーダー』にも同じような演出がありますね。
HSP 3.3 Source
<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回>マウスクリックでスクリーンに描画してみる!

<第2回>綺麗な線を描画できるように改良してみる!

<第3回>色々な色で線を描画できるように改良してみる!

<第4回>消しゴム機能、スポイト機能を追加してみる!

<第5回>ファイル入出力機能を追加してみる!

<第1回>マウスクリックでスクリーンに描画してみる!

2012/7/15

はじめに

皆さん、こんにちは。ANGLEです。

今日から新連載の「HSP3.3でペイントソフトを作る!」が始まります。

そもそもの発端は、「高機能なソフトは使いこなせないなあ」「WindowsXP(何故かサブマシンは7だったりする)付属のペイントはアンドゥが1回しかないし、レイヤーがないからなあ」等などという悩みがあり、ならば自分で作ろう!と思ったことです。

私がどこまで作れるかは現段階では何とも言えませんが、あえて制作段階をリアルタイムに近い形で紹介することでライブ感を出していきたいと考えております。

せっかくなので、HSP超初心者の方向けの「講座」の形式を取っていますが、必ずしも全てがそうではありません。

私がどこまで出来るか怪しいからです(笑)

中級者以上の方も「生暖かい目」で見守って下さいね(間違い等がありましたら連絡下さい)。

それでは、開発を始める前にどのようなソフトを作るかを考えてみます。

ペイントソフトの主な仕様
ペン 太さ5種
ブラシ 大きさ3種
レイヤー 10枚
アンドゥ 10回
対応形式 BMP/JPEG/PNG/GIF/TIFF

ペンとブラシの種類についてはペイントと同数にしています。

レイヤーがたった10枚で、アンドゥもたった10回というのも物足りないと感じる方も多いと思いますが、あくまで当面の目標です。

うまく実装出来るようであればメモリの許す限り対応出来るようにしたいと考えています。

開発開始!

それでは始めに、HSPを導入していない方はこちらからダウンロードしてインストールして下さい。

インストールの詳細はこちらをご覧下さい。

インストールし終わったら、HSPスクリプトエディタを起動します。

さあ、いよいよ本題です。

まずは描画先となるウインドウを作成します。

HSP 3.3 Source
<p class="program">
screen 0,640,480
			</p>

無難に横640ドット×縦480ドットでウインドウを作成しました。

次に

HSP 3.3 Source
<p class="program">
*main
			</p>

と入力します。「*」を先頭に付けた文字は「ラベル」と言って、プログラムの流れをコントロールする為に作ります。

何の為に使うかは後程分かります。

次にマウス入力の下準備をしましょう。

HSP 3.3 Source
<p class="program">
x=mousex
y=mousey
			</p>

変数xにマウスのX座標を代入、変数yにマウスのY座標を代入する処理です。

次にマウスの左ボタンを検出する為の処理を作ります。

HSP 3.3 Source
<p class="program">
stick key,256
			</p>

stickは各種入力を検出する命令で、256というのはマウスの左ボタンに割り当てられた番号です。左ボタンを押したかどうかが変数keyに代入されます。

続いてマウスの左ボタンを押していたらカーソル位置に点を描画する処理を作ってみましょう。

HSP 3.3 Source
<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」に戻る処理を入れるのです。

HSP 3.3 Source
<p class="program">
goto *main
			</p>

これで理論上はうまく行くはず……なのですが、ここで実行するとプログラムが固まってしまいます!

HSPでのプログラムのお約束として、ループ処理を行う場合には「await」という命令を入れなければならないのです……。

一種のおまじないみたいなものとして、「goto *main」の前の行に次の通り入れておきます。

HSP 3.3 Source
<p class="program">
await 1
			</p>

完成したプログラムはこのようになります。

HSP 3.3 Source
<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座標」と入力します。



今回は

HSP 3.3 Source
<p class="program">
line x,y,mousex,mousey
			</p>

となります。

プログラムを修正

前回の「pset x,y」と入れ替えてみましょう。

HSP 3.3 Source
<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命令の後に移動してみましょう。

HSP 3.3 Source
<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のヘルプを見ると、似たような処理が書いてありました!

ご参考まで転載。

HSP 3.3 Source
<p class="program">	
; マウスポインタの動きに沿って線を描く
repeat
	line mousex, mousey
	wait 1
loop
			</p>

たったこれだけで同じようなこと実現出来てますが……Σ(゚口゚;


HSPの基礎固めには公認入門書がおすすめ!私もHSP2.5の頃に買って勉強しました。


<第3回>色々な色で線を描画できるように改良してみる!

2012/7/19

とりあえずインターフェース周りは既存パーツ

今回は黒以外の色で線を描画できるように改良していきます。

その為には主に下記の処理が必要になります。

  1. 色を切り替えるための動作を決め、その入力を受け付ける
  2. 色を選択する画面を用意する
  3. 選択した色で描画するように変更する

この中で少々やっかいなのが1です。

入力を受け付けること自体は簡単なのですが、難しいのはそのインターフェースです。

例えばいきなりPhotoshopのようなカッコイイものを作ろうとするのは少々無謀です。

アイコンのデザインだけならともかく、ボタンとして機能するものを自作するのは初心者には簡単ではないからです。

そこで、今回はWindows標準のボタンを使用して、「とりあえず」の処理を作ってみます。

インターフェースはHSPに慣れた頃に他の機能を盛り込む流れで作り込むことにしたいと思います。

それでは、「色を切り替えるための動作」はどうしましょうか?

現在の画面は描画ウインドウのみという何もない更地です。

HSPではWindowsアプリケーションの標準的なメニュー表示も実現出来ますが、モジュールやプラグインという外部の仕組みを使用することになります。

少々煩雑ですので、ここでは描画先の他にもう一つウインドウを作成し、そちらに各種機能を追加していこうと思います。

ウインドウを作成するのは「screen」命令でした。

第1回ではあまり詳しく説明しませんでしたが、ウインドウを作成する際には大きさ以外に「ID」も指定していたのです。

IDは単純に複数のウインドウを管理する為の通し番号だと考えて下さい。

HSP 3.3 Source
<p class="program">
screen 0,640,480
			</p>

という処理でしたが、このプログラムで作成したウインドウのIDは「0」という意味です。

新しいウインドウのIDは「1」とします。サイズは当面それ程大きいものは必要ありませんので、とりあえず120×200ドットとして、「screen 0,640,480」の次の行に入力します。

HSP 3.3 Source
<p class="program">
screen 1,120,200
			</p>

これでツール類のボタンを配置するウインドウが出来ました。

続けて色を変更するボタンを作ります。

ボタンなどのオブジェクトを作る際にはサイズを設定しておくといいです。

ここでは100×20ドットにしておきます。

HSP 3.3 Source
<p class="program">
objsize 100,20
			</p>

続けてボタンを配置します。

HSP 3.3 Source
<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」の下に入力していきます。

HSP 3.3 Source
<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」はもう説明不要ですね? メイン処理に戻るだけです。

さて、ここまでで色を選択する処理が完成しました。

ここからは実際に色を反映させる処理を作っていきます。

HSP 3.3 Source
<p class="program">
if (key & 256):color 0,0,0:line x,y,mousex,mousey
			</p>

という処理がありました。

マウスの左クリックで黒い線を引くという処理です。

「color 0,0,0」のところを先ほどのr,g,bに置き換えれば選択した色で線を引けそうですね。

HSP 3.3 Source
<p class="program">
if (key & 256):color r,g,b:line x,y,mousex,mousey
			</p>

これでほぼ全ての処理が出来たのですが、実はもう一つ大事な処理があります。

それは描画先の指定です。

現在ウインドウはメインウインドウとツールウインドウの2つがあります。

このままだと最後に定義したツールウインドウ側に描画されてしまうのです!

そこで、描画先をメインウインドウに設定します。

HSP 3.3 Source
<p class="program">
gsel 0
			</p>

「gsel」は複数のウインドウ、そして今後出てくる仮想画面を管理するには必須の命令です。

ここでは描画先をID0の画面、メインウインドウに設定しています。

最後に、現在の色がどんな色か分かりやすいように、タイトルバーに表示してみましょう。

HSP 3.3 Source
<p class="program">
title"color ("+r+","+g+","+b+")"
			</p>

「title」命令はこのように変数の値をリアルタイムで確認するのにも重宝しますので、プログラムを試す際に活用してみて下さい。

それでは、完成したプログラムを見てみましょう。

HSP 3.3 Source
<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上では色は自由ではありますが、現段階ではこの色の設定を使うことにします。

背景色は白を前提とし、線は……既にカラー対応しているのでそのままとしましょう。

消しゴムを動かしたら白で小さく塗りつぶす感じにすれば、とりあえずはそれらしい動きになりそうです。

今後背景色を塗りつぶしたり変更したり出来るようになった際に、また変更することにしましょう。

まず、機能の切替が必要になりますので、前回の「色」ボタン同様に「ペン」ボタン、「消しゴム」ボタンを追加します。

HSP 3.3 Source
<p class="program">
pos 10,40:button"ペン",*pen_on
pos 10,70:button"消しゴム",*eraser_on
			</p>

もう大丈夫ですね。

X座標、Y座標を指定して、ボタンを表示、ボタンを押したらそれぞれのラベルに飛ぶという内容です。

続いて、ラベル「*pen_on」「*eraser_on」を作ります。

HSP 3.3 Source
<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」の場合、ペンはオン、消しゴムはオフ、スポイトはオフという設定です。

設定が終わったら、メイン処理に戻ります。


次に消しゴムの動作を作っていきます。

少々ややこしいかもしれませんが、まず元のプログラムと今回のプログラムを並べてみます。


<前回>
HSP 3.3 Source
<p class="program">
if (key & 256):color r,g,b:line x,y,mousex,mousey
			</p>

<今回>
HSP 3.3 Source
<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>

今回、消しゴムとスポイトを追加する為、マウス左クリックした時の処理を分けているんです。

まずは消しゴムの処理から解説していきます。

HSP 3.3 Source
<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ドットの白い四角で塗りつぶしているということです。

スポイト機能を追加してみる

まずはスポイト機能をオンにするボタンから作成します。

HSP 3.3 Source
<p class="program">
pos 10,100:button"スポイト",*spoit_on
				</p>

続いて、ラベル「*spoit_on」を作成します。

HSP 3.3 Source
<p class="program">
*spoit_on
	pen=0
	era=0
	spo=1
	goto *main
				</p>

先程追加した左クリック時の処理は、

HSP 3.3 Source
<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」命令の次あたりに

HSP 3.3 Source
<p class="program">
pen=1
				</p>

と設定しておきます。

というのも、この設定がないと、何の機能も選択されていない状態となり、ボタンを何か押さない限り何も出来ないのです。

次に、選択している機能が何なのか表示して分かるようにしてみましょう。

HSP 3.3 Source
<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で何色を選択しているかを表示します。

消しゴムの場合は単純に「消しゴム」とだけ表示します。

スポイトの場合はリアルタイムでマウスカーソル位置の色を取得して表示します。命令は今まで出てきたものだけなので割愛しますが、こうすると、目的の色が取得しやすいですよね。


では、最後に完成したプログラムを見てみましょう!

HSP 3.3 Source
<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」を使ってプログラムを作っていきましょう!


まずモジュールを読み込む必要があります。

プログラムの一番上に下記のように記述します。

HSP 3.3 Source
<p class="program">
#include "mod_img.as"
			</p>

「include」は英語で「含める」という意味です。

モジュール「mod_img.as」をこのプログラムに含めるということですね。

他のモジュールを利用する際も、「#include"ファイル名"」と記述しますので、覚えておいて下さい。

保存処理・読込処理

続いて、「保存」ボタンと「読込」ボタンを作りましょう。

前回作成した「スポイト」ボタンの下に

HSP 3.3 Source
<p class="program">
pos 10,130:button"保存",*save
pos 10,160:button"読込",*load
			</p>

と追加します。

次にプログラムの一番下にラベル「*save」を作ります。

HSP 3.3 Source
<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」の下に作ります。

HSP 3.3 Source
<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と同じなので割愛します。

完成したプログラムはこのようになります。

HSP 3.3 Source
<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か所なわけですが、なかなかランダム値がその場所にならないということが起こりえます。
ランダム値の範囲から置かれた場所を除外するという手もあるでしょうが、少々複雑な処理になってしまいます。
そのようなことをするくらいであれば、普通に並べた後で一定回数入れ替えてやった方が処理が単純で常に一定の速度で完了するというメリットがあります。

HSP 3.3 Source
<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>

一応それなりに本家に近いものが出来ましたが、このままではただの物真似に過ぎません。
是非皆さん独自のアイディアをプラスしてオリジナルゲームに仕上げてみて下さい。



この本には開発環境の構築や配布方法等が詳しく書かれているので、是非参考にしてみて下さい。

HSP3 プログラミングおすすめ参考書セレクション

Amazonアソシエイト公認

HSP3 オフィシャルガイド

おにたま / 秀和システム

HSP3の基本構文から画面制御、サウンド、ゲームロジックまで公式開発陣が網羅解説した決定版バイブル。

Amazonで詳細を見る

おにたまのHSP3 入門

おにたま 著

初心者でも挫折せずに簡単な2Dゲームやツール作成をステップアップで習得できる人気入門書。

Amazonで探す

HSP 関連書籍・関連本一覧

Amazon Books

ゲーム開発技法、プラグイン活用、サウンドノベル制作に役立つHSP関連書籍の総合カタログ。

Amazon書籍一覧
UNITY RESEARCH LAB

Unity研究室

Unityによる3Dアクション・レースゲーム制作の実験とチュートリアル記録です。

Unity チュートリアル

ひよこ本 チャプター6 実践

カーソルキーもしくはWASDキーで移動し、できるだけ速くゴールに辿り着くというゲームです。

Chapter 6 Game
Unity チュートリアル

ひよこ本 チャプター4 実践

カーソルキー/WASDで移動、スペースでジャンプ、シフトでダッシュ。3Dキャラクターアクションの基礎を構築。

Chapter 4 Game
制作動画

アクションゲームデモ

人物と背景のテクスチャ素材、各種移動スクリプトを組み合わせたアクションゲームデモです。

制作動画

レースゲーム風デモ

車モデルとSmooth Follow / Third Person Cameraを組み合わせた3Dレースゲーム風デモです。

Unity 3Dゲーム制作 おすすめ参考書セレクション

Amazonアソシエイト公認

Unityの教科書(ひよこ本)

北村 愛実 著 / SBクリエイティブ

当研究室でも実践している大人気「ひよこ本」!2D・3Dゲーム制作の基礎から丁寧に学べる一番わかりやすい入門書。

Amazonで詳細を見る

Unity 3Dゲーム開発 徹底攻略

ゲーム開発実践ガイド

キャラクター制御、物理演算、カメラワーク、ライティングなど3Dアクションゲームの実装テクニックを網羅。

Amazonで探す

Unity C# スクリプティング実践

プログラミング専門書

UnityでのC#スクリプト記述、オブジェクト指向設計、UIシステム、最適化まで徹底解説。

Amazon書籍一覧
INTERACTIVE TOOLS & MINI GAMES

Webツール & ミニゲーム

ブラウザ上で今すぐ体験できる連射力測定、JSONフォーマッター、レトロシューティングゲームです。

連射力測定器 Web Edition

10秒測定

10秒間に何回クリック/タップできるかを測定します!

残り時間 10.0
打数 0
秒間打数 0.0

さらなるハイスコアを目指す!連打特化ゲーミングデバイス

Amazon

高耐久 ゲーミングマウス

Logicool G / Razer

超高速クリックレスポンスと数千万回の連打耐久性を誇る定番マウス。

マウスを見る

連射機能付き ゲームパッド

HORI / 8BitDo

秒間最大20回の連射ホールド機能を搭載したWindows PC対応コントローラー。

連射パッドを見る

メカニカルキーボード(銀軸)

高速入力スイッチ

浅いアクチュエーションポイントで超高速打鍵・連打が可能なゲーミングキーボード。

キーボードを見る

JSON整形ツール

リアルタイム整形

HTML5 Canvas レトロシューティング

Playable Web Game

RETRO SHOOTING

操作方法: [←][→][↑][↓] または [A][W][S][D] で移動
[スペース] または [Z] で弾発射(画面タッチ / ドラッグ操作にも対応)

PROFILE & HISTORY

管理人プロフィール & PC遍歴

ANGLE(アングル)

ゲーム制作者 / サウンドノベルツール開発者 / インディーサークル ANGROWA 代表

当サイト「語らいの一時オンライン」は 2000年11月26日 の開設以来、サウンドノベル制作ツールの『SNEC』『nextSNEC』、写真素材、シルエット素材、ユニバーサルトランジション用ルール画像素材をメインに公開しています。
盟友ROWARD氏とインディーズゲームサークル「ANGROWA(アングロワ)」を立ち上げ、2014年にはベルトアクション『Wired Soul』をリリースしました。
MSXで創作活動をしていた頃の独り言コーナー「語らいの一時」をオンラインでやろうということで、このサイト名になりました。

PC遍歴

MSX turboR から始まり、PC-9801DXPC-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級 / 損保募集人資格 / 普免

プログラミング・開発スキル

MSX-BASIC(昔) HSP(昔) C#(Unity修行中) PHP(修行中) Java(修行中) JavaScript(修行中) FORTRAN(大学講義) HTML5 / CSS3 MySQL / PostgreSQL

主な活動履歴

  • HP『語らいの一時オンライン』運営(2000年〜)
  • ウェブリング「みんなでサウンドノベル」主宰
  • サウンドノベル作成ツール『SNEC』『nextSNEC』開発(雑誌掲載多数)
  • ANGROWA『Wired Soul』プログラム(HSPプログラムコンテスト2011 Windows100%賞)
  • シリカプロジェクト『シリカプロジェクト・ファーストインプレッション』プログラム
  • 某企業のバイオトイレのHP制作

ゲーム開発・プレイが快適になる!おすすめPC・パーツ&レトロゲーム機

Amazonアソシエイト公認

最新 ゲーミングデスクトップPC

Core i7 / Ryzen 7 / RTX 40シリーズ

Unity・Unreal Engineの3Dゲーム開発、動画編集、最新PCゲームが超快適に動作するハイスペックPC。

AmazonでゲーミングPCを見る

超高速 M.2 NVMe SSD(1TB〜2TB)

PCIe 4.0 / 読込7000MB/s超

OSの高速起動、ゲームのロード時間短縮、大容量開発プロジェクトの読み込みを一瞬にする高速SSD。

AmazonでSSDを探す

HDMI対応 レトロゲーム互換機

FC / SFC / MD カートリッジ対応

昔遊んだ懐かしの名作ゲームカセットを、最新液晶テレビやPCモニターにHDMI高画質出力で楽しめる互換機。

Amazonで互換機を見る