読者です 読者をやめる 読者になる 読者になる

人工知能に関する断創録

人工知能、認知科学、心理学、ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。最近は、機械学習、Deep Learning、Kerasに関する記事が多いです。



Javagame

Javaでゲーム作りますが何か?のGitHubリポジトリをEclipseで読み込む

10年前のプロジェクトなのに、相変わらず本ブログでのアクセス数が最も多いのがこれ。 Javaでゲーム作りますが何か? - 人工知能に関する断創録 以前から、ブログ上ではjarファイルしか配布しておらず、解凍しないとソースコードが見られないのは不便という…

反射方向の調整

ブロックを壊す(2007/7/15)を何度かプレイしてみるとわかりますが毎回同じパターンが再現されます。これはラケットの反射方向が毎回同じだからです。これだとプレイヤーがボールの動きをまったく制御できないのでゲーム性がないです。そんなわけでボールが…

ブロックを壊す

今回はブロック崩しのキモであるブロックを導入します。そしてボールがブロックに当たったときにブロックが消えるようにします。これでようやく遊べるレベルになりますね。breakout04.jar ブロックを並べる ブロック1つ1つはBlockクラスのオブジェクトとなり…

ラケットでボールを打ち返す

ボールとラケットの当たり判定処理を入れてボールがラケットに当たったとき跳ね返るようにします。ブロックがなくてボールをただ打ち返して対戦するゲームは「ぽん」っていいますが、これは1人用の「ぽん」に相当しますね。ブロック崩しではなくぽんを作るの…

跳ね回るボール

ブロックを壊すボールを実装します。ボールは壁に当たったら跳ね返ります。実行するとわかりますがラケットに当てなくてもボールが跳ね返るようになっています。次回はボールとラケットの当たり判定処理を入れてボールがラケットに当たったとき跳ね返るよう…

ラケットを動かす

マウスの動きに合わせてラケットが左右に動くプログラムから作ります。breakout01.jar マウス座標の取得 マウスの動きに反応するプログラムを作るにはMouseMotionListenerを使います。下はMainPanel.javaの抜粋です。 public class MainPanel extends JPanel…

フェードアウト効果

だんだん透明になって見えなくなる画面効果をフェードアウトと言います(逆にだんだん見えてくるのはフェードイン)。フェードアウトは半透明描画で解説したアルファ値をだんだん小さくすることで実現できます。remuoru.jarちなみにレムオルはドラクエ3の姿…

フルスクリーンモード

Javaでもフルスクリーンモードのゲーム作れます。ここでは、フルスクリーンモードの簡単なサンプルを書いてみます。またBufferStrategyという技術も使ってるので合わせて解説します。Javaでフルスクリーンがサポートされたのは1.4からなのでそれ以前のJavaが…

正確なFPS

正確なFPS(Frame Per Second)を計算して画面に表示します。正確なFPSの実現方法は、『Killer Game Programming in Java』を参考にしました。fps.jar ゲームループの構造 ゲームループは下のような構造になっています。詳しくは、アクティブレンダリング(2…

フォントファイルからフォントを読み込む

フォントファイルからフォントを読み込む方法です。ゲームにフォントファイルを含めて一緒に配布したい場合に使います。ちなみにフォントとは文字の形のことです。またテキストにアンチエイリアシングをかける方法もご紹介します。ただフォントファイルはサ…

辞書からランダムに返答

ファイルから会話文を読み込んで、その中からランダムに返答する人工無脳を作ります。ここでは会話文のことを辞書(dictionary)と呼びます。chatbot02.jarChatbotクラスから見ていきます。dicというArrayListオブジェクトを作ってます。ここに会話文を放り…

テキストファイル入出力

テキストファイルからデータを読み込んだり、書き込んだりする基本的な方法です。ファイルに保存してあるイベントデータを読み込んだり、ゲームのスコアをファイルに記録したりする場合に使います。サンプルは読み込みボタンを押すとtest.txtからデータを読…

円運動

ある点を中心に回転するオブジェクトです。円の方程式を用いると実現できます。circular_motion.jar 円運動 上の図を見てください。水色の物体が中心 (cx,cy)、半径rの円上をくるくる回転してると考えます。このとき、中心と物体のなす角度をθ(シータ)、物…

人工無脳まとめ

人工無脳について全体的なことをまとめています。 人工無脳 人工無脳は会話プログラムのことです。チャットのように文章を入力して会話します。人工知能の究極の目的の1つは人間のように会話するプログラムですが、人工知能ほどシリアスなものではないため人…

スポットライト効果

スポットライト効果です。ドラクエ1の洞窟内でたいまつ使ったイメージです。いろいろ使えそうです。 スポットライト マウスをドラッグするとスポットライトが移動します。何かの気配がする・・・ドキドキ。背景画像はぐったりにゃんこのホームページさん(リ…

半透明描画

後ろが透けて見える効果を出す方法です。さあ何を透けさせようか。 半透明描画 transparent.jar赤い丸はべた塗りで青い四角形は透けています。以下、描画部分のコードです。 public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D …

マップエディタ

今作っているRPGに合わせてマップエディタを作ってみます。マップチップの数を増やしたり、イベントも簡単に登録できるように改造していく予定です。マップチップはすべてJ-JSoftさんのサイトからMACKさんの素材をお借りしています。すばらしいマップチップ…

ここまでの整理

きりがよいのでここらで整理します。いくつか変更点をまとめておきます。rpg24.jar パネルサイズ変更 パネルのサイズを少し大きくしました。それに合わせてメッセージウィンドウの表示位置も調整しています。 // パネルサイズ public static final int WIDTH…

デバッグ情報表示

デバッグ情報が表示できるようにします。rpg23.jar デバッグモード デバッグモード(DEBUG_MODE=true)にするとデバッグ情報が画面に描画されるようにします。他に表示しておきたい情報があれば追加できます。MainPanel.javaに以下を追加します。 // デバッ…

シーケンサとシンセサイザー

Java Sound APIを用いてMIDIデータ(MIDIシーケンスと呼びます)を鳴らす手法です。シーケンサとシンセサイザを用います。曲はTAM MUSIC FACTORYさんから。midi_engine.jar シーケンサとシンセサイザの関係図 シーケンサは指揮者、シンセサイザは演奏者と考…

ClipでWAVE再生

Java Sound APIを使ってWAVEファイルを再生する方法です。ここでは、Clipというクラスを使ってみます。ゲームで使う短い効果音なんかはClipで十分です。wave_engine.jar WAVEファイルのロード あらかじめWAVEファイルの内容をすべてClipに読み込んでおく方法…

効果音を鳴らす

宝箱を空けたらガチャ、ドアを開けたらギ〜、階段を下りたらザッザッザッと鳴るようにしてみます。基本的にサウンドエンジン(2005/12/10)のWaveEngineを使うので簡単です。例によって効果音はザ・マッチメイカァズさんからお借りしています。rpg22.jar サ…

基本的な方法

Javaで音を鳴らすための基本的な方法です。音の再生、停止、ループくらいはできます。もっと細かく制御したい場合はJava Sound APIを使う必要があります。 Java Appletで音を鳴らす もっとも古い方法。play()を呼び出すたびにファイルをロードして再生します…

アプリケーションをアプレットに変換

本サイトのアプリケーションをアプレットに変換する方法です。アプレットはWebブラウザ上で実行することができます。ただし、アプレットでは使えない機能もあるので下の手法で全部のアプリケーションが変換できるとは限りません。 アプリケーションをアプレ…

稲妻

リアルな稲妻です。マウスでクリックするとぴっしゃーんと落雷します。下に誰もいないのを確認してから撃ってください。サンダーと比べると雲泥の差がありますね(笑)稲妻は点滅するので何度も繰り返し注視しないでください。ポケモン事件を覚えてる方もい…

横にそろったブロックの消去

一列そろったらブロック消去する処理を実装します。これがないとテトリスにならないですね。tetris07.jarまず呼び出し側を見てみます。MainPanelのゲームループrun()です。 /** * ゲームループ */ public void run() { while (true) { // ブロックを下方向へ…

ブロックの落下

ブロックが自動落下するように修正します。テトリスは落ちゲーなのでブロックが落ちないことには始まりません。tetris05.jarブロックが落下するためにはゲームループを実装します。ゲームループが回るたびにブロックが下に移動するように変更すればいいです…

アクティブレンダリング

Javaでゲームを作るときの基礎技術としてアクティブレンダリングを取り上げます。repaint()を使わずに自前で描画処理(レンダリング)を行う定石です。repaint()はいつ描画するか自分で決められませんがアクティブレンダリングを使うと自分で決められます。a…

BGMを鳴らす

無音の世界で寂しかったのでBGMでも付けてみます。すでに作ってあるサウンドエンジン(2005/12/10)を組み込んで音を鳴らすだけなんで簡単です。マップごとに独自のBGMを用意する。マップ切り替え時にBGMを切り替えるあたりがミソです。ちなみにMIDIファイル…

ブロックの積み上げ

ブロックを積めるようにします。tetris06.jar ブロックの積み上げ まず一番大枠を見てみます。MainPanel.javaのゲームループを見てください。ブロックの落下(2006/5/28)でブロックが落下する処理block.move(Block.DOWN)をゲームループに追加しました。ブロ…

壁との衝突判定

壁や積まれたブロックと重ならないようにします。tetris04.jar衝突判定は移動するときに行います。というわけでBlockクラスのmove()を見てみます。 /** * dirの方向にブロックを移動 * * @param dir 方向 */ public void move(int dir) { switch (dir) { cas…

ブロックの移動と回転

キー操作でブロックが移動、回転するようにします。スペースキーで回転。NキーでI型ブロックへ変更です。tetris03.jar キー操作 まずはキー操作から見てみます。矢印キーでブロックが移動し、スペースキーか上キーで回転するようにします。そのためにはMainP…

ブロックの作成

ブロックを作ってみます。テトリスには7種類のブロックがありますが、ここでは一番簡単な四角ブロックだけ実装します。tetris02.jar ブロックの実装 ブロックはBlockクラスで定義してます。テトリスのブロックはいろいろな形のものがありますがすべて4x4の大…

フィールドの作成

まずは、テトリスの舞台となるフィールドを作成します。まあ盤面を書くだけだから簡単ですね。tetris01.jar フィールドのデータ構造 フィールドってのは下のことです。テトリスの盤面です。このフィールドはFieldクラスで定義しています。テトリスに正式なル…

マップ間移動

複数のマップを移動できるようにします。王様の部屋の階段を下りるとフィールドマップへ移動します。階段を下るとそこはフィールドマップだったって感じです。1ルームとはずいぶんしけた城ですね(笑)rpg20.jar 移動イベント まずはマップを移動するイベン…

ImageIconを使ったイメージのロード

ImageではなくImageIconを使うと自動的にMediaTrackerが使われるため便利です。ImageIconからImageを取り出すにはgetImage()を使います。ImageIconの利用例です。 /** * イメージをロードする */ private void loadImage() { // プレイヤーのイメージを読み…

自己実行型JARファイル

自己実行型JARファイルを作るとダブルクリックでJavaアプリケーションが実行できます。 自己実行型JARファイル Javaアプリケーションは、javaコマンドにクラスファイル(.class)を渡すことで起動できます。 javac HelloWorld.java // プログラムのコンパイ…

ファイアボール

マウスでクリックした方向にファイアボールを飛ばします。fireball.jar 始点と終点から角度を求める 画面中央の点からマウスでクリックした方向にファイボールを飛ばしたいので画面中央の点から見たマウスの位置を求める必要があります。下の図を見てくださ…

とびらを開ける

今回はとびらです。作り方は宝箱とほとんど同じなので簡単に流します。rpg19.jar とびらイベント とびらはイベントファイルの中に書かれています。こんな感じです。 DOOR,7,10このマップの座標(7,10)にとびらをくっつけるという意味です。これだけ。宝箱より…

サウンドエンジン

WAVEの再生(2004/10/03)で紹介したAudioClipを使えばJavaで音を鳴らせます。しかし、 WAVEファイルの同時再生をしたり、連続再生をしたり、ほかのアプリケーションでBGMを鳴らしていたりすると音が鳴らない場合があります。これらの問題を解決するのがJava…

宝箱

今回は宝箱です。イベントを追加するだけなので簡単です。ただアイテムを実装してないので中身はとれません。rpg18.jar 宝箱イベント 宝箱はキャラクター(町の人)と同じくイベントとして実装します。イベントはevent.datにまとめて書いておき、マップをロ…

流れるメッセージ

メッセージウィンドウをもう少し改造してドラクエのようにメッセージが流れて表示されるようにします。TimerTaskを使って1文字ずつ順に表示するようにすれば意外と簡単にできます。rpg17.jar TimerTaskの起動 描画部でメッセージをcurPos文字まで表示すると…

メッセージの表示

ようやくメッセージを表示するとこまできました。メッセージ表示は文字イメージを適切な順番で並べることで実現します。指定された位置に好きなメッセージを描画できるメッセージエンジンを作ったのでそれと合わせて解説します。rpg16.jar 文字イメージ まず…

メッセージウィンドウの表示

今回はメッセージウィンドウを表示させてみます。ドラクエのように黒い背景に白枠のウィンドウです。ウィンドウが表示されている間のキー処理についても解説します。rpg15.jar メッセージウィンドウの表示 メッセージウィンドウはMessageWindowクラスで実装…

キャラクターイベント

簡単イベントを導入します。キャラクターイベントです。今までは王様や兵士などの追加はMainPanelに直接書き込んでいました。今回は、キャラクターを外部のイベントファイルから読み込んで簡単に追加できるようにしてみます。rpg14.jar イベントファイルの形…

画像をまとめる

今回はキャラクターやマップチップごとに別々のファイルになってた画像を1つのファイルにまとめてしまいます。rpg13.jar 画像をまとめる 今までは勇者(hero.gif)、王様(king.gif)、兵士(soldier.gif)といったようにイメージファイルをばらばらに用意し…

マップの読み込み

ファイルからマップを読み込めるようにしてみます。rpg11.jar マップファイルの構造 マップファイル(map.dat)の中身は次のようになってます。 16 16 1111111111111111 1111111111111111 1111111111111111 1111111111111111 1111000000001111 1111022222201…

王様登場

勇者が1人のさびしい世界でしたがついに王様の登場です。ついでに王様のまわりをぶらぶらしてる護衛である兵士も登場させましょう。今回はこの2人を世界に組み込みます。勇者を表すCharaクラスを流用すれば簡単にキャラクターを増やすことが可能です。オブジ…

スクロール処理2

スクロール処理1(2005/10/10)の続きです。前今回はピクセル単位の移動を実装してドラクエっぽいスクロールを実現します。かくかくした移動ではなくて、滑らかな移動になります。イメージがわかない方はプログラムを実行してみてください。rpg10.jar ゲーム…

ゲームループとキー操作の改良

今まではキーイベントハンドラ keyPressed() に直接移動するコードを書いてました。こうしてしまうとキーを押し続けた場合、「ととととと」と勇者が速く移動してしまいます。そこで、今回はキー操作を改良して「とっ、とっ、とっ」と勇者がゆっくり移動でき…