Tag Archives

91 Articles
クッキー焼くゲーム

クッキー焼くゲーム

cookieclickerというクッキー焼くゲームを教えてもらったのですが、
焼き始めてから、はまってしまって止め時がわからなくなったので、
ここで紹介して止めたいと思います!

cc1(ネタばれ注意)

cc2

MS4wNDY2fHwxNDE4NDc0MTIwMDUxOzE0MTg0NzQxMjAwNTE7MTQyMDA4OTczMDk3MTtOYXRhZGV8MTExMTExMDExMDB8NTEyOTcxNzE1Nzc0NzI2MzQwOzEzMjQ4NDQyMzg2MzkyNzUzMDA7NDQ4NTs3NDs2MDczNTg0MzUwNzI0MzI7Mjg4MjstMTstMTswOzA7MzswOzA7LTE7MDs3NDsxMDk4NjA0MjY5MTQxMjk2MzA7NDA4OzE0OzEzNTswOzA7Y2hyaXN0bWFzOzA7MDt8MjAwLDI1Miw1NDA5MDAwMTA3NTk0MjAsMDsyMDAsMjIyLDEzMTg3NzMyMjA3NzUyNzI2LDA7MjAwLDIyMSwyNDcyMzE2NzI4OTEsMDsxMDAsMTEwLDQxMDkzMzEwMzM5OCwwOzEwMCwxMTAsMTQ2NzYwMzM5MzE4MCwwOzEwMCwxMTEsMzgxNTc1MzAyODQzNCwwOzEwMCwxMjAsMTQ2NzU4NjE1MTU5MjMsMDsxMDAsMTQwLDI0NDY0OTI0NTc2MTk3MCwwOzEwMCwxMDIsMzEzNDUyOTE5MTAwNTg4NiwwOzEwMCwxMDAsMzA1MTY0ODU3ODQ1ODY2MzYsMDsxMDAsMTAwLDE4MDE2MTMwNjYwODgxODc1MCwwO3w0NTAzNTk5NjI3MzcwNDk1OzQ1MDM1OTk2MjczNzA0OTU7MjgxNDc0OTc2NzEwNjU1OTs0NTAzNTczNzI3MTQ4NTQzOzIyNTM5OTg4MzUzNjc5MzU7NDUwMzQ2MjE4ODQxNzAyNTsyMjUyMjQ2NDkwMjg0MDMxOzIyNTIzMjE2NTIyMTk5MDM7MjI1MTc5OTgxMzY4NTI0OTszMjc2OXw0NTAzNTk3NjE0MTA0NTc1OzIyNjAzNTIyOTUxNzQxNDM7MjMyMjE5NDQ0NTIwNDk0Mzs2MjkxNDU5%21END%21

こういうはまるゲームを私に教えないでくださいね!

最近のプログラミング状況

最近のプログラミング状況

先月はかなり忙しく、これからも忙しくなりそう。(_Σ_)
というか去年の年末より忙しい。
ひどいときは1週間の内に2回お泊りしたし。
本当にどうしてこうなった状態です。。。。゛(ノ><)ノ 

日記の方も書くネタがたまっていっていく一方で、
書く元気とか、やる気が中々でない状況。

そこで休みを利用して、作ったけど、事情で公開出来ないものとか、
公開するまでもないものとか、製作中なものとかの紹介で、消化していきます。
いつも通り全部Javaです。

A

よくあるwavプレーヤー。
とある理由で波形を取得したかったので、
wavファイルの解析から、出力デバイスへの出力まで1から制作。
一応、チャンネル数やサンプリング周波数は、2ch、44100Hz、16ビット以外でも再生できるようになっています。
いや、もしかしたら量子化ビット数は対応させてなかったかな。
もう作ってからひと月以上経つので、忘れ気味。
本当は、mp3とかも対応させたいけど、Javaだったら一度ライブラリ使ってwavに変換するしかないかな。
JavaのLGPLとかはよく分からないので、好きじゃないです。
GUIは、以前作ったsmfプレーヤー を流用。
あと波形から、FFTを利用した解析機能もついています。

B

剛体球の運動のシミュレーション。
簡易型ゲームに使用するような、めり込みを利用した当たり判定ではなくて、
速度ベクトルを持った球同士が、何秒後にぶつかるかを方程式を解いて判定しています。
(この方程式については、「実例で学ぶゲーム3D数学」が役に立ちました。)
そのため、速度をすごい速くしてもめり込んだり、通過することはほぼ絶対ありません。
衝突後に、球をどのように動かすかが、結構大変で3日間近くかかりました。
attochipさんに色々とお世話になりつつ、完成。
片方の球を止まった球だと考えるというのは、当たり判定も、衝突後の動きに関しても、同じですね。
これについては、いつか解説したいです。

シミュレーションということで、色々設定を変えたりしなきゃいけないです。
ですが、GUI作るのは面倒なので、HSP風な言語?で右側から指定するという形にしました。
凝ったものではないので、REPEAT文・GOTO文・IF文・変数・計算など使えません。
いわゆる指定された命令のみ使えるというものです。

こだわり機能として、左側の画面を、自由に拡大・縮小・回転・移動が出来ます。
ここは3D処理ではお馴染みのアフィン変換を利用してます。
ところで、Graphics2Dで線の太さを、実数で指定できるのは驚きました。
0.5とかに指定した場合は、色が薄くなり細くなります。

C

重さを持つ粒子同士にバネがついていると考えた場合のシミュレーション。
4次のルンゲクッタ法で多変数の2階微分方程式を解いています。
多変数はできたけど、2階っていうのが難しかったです。
上のは、境界が自由端になっています。
固定端は、両端の重さを無限大として考えればいいのかな。
適当に考えたので、違う可能性大だけど。うん。

GUIは、作品Bを流用。
拡大・縮小・回転・移動のオマケ機能もそのままついています。

D

ゲーム制作ツールと、3Dソフトウェアレンダリング関連。
3D描写に関しては、以前のバージョン(1月1日のブログ)から
・メタセコイアのデータインポート機能追加
・独自3Dモデル形式のインポート・エクスポート機能追加
・複数のデータのパッケージ化追加
・それにともなって、使い易いI/O関連のライブラリを作った。
・ハードグラウンド機能(90度のデコボコ)の追加
・バンプマップからの法線マップ生成の高速化(DirectX9シェーダプログラミングを参考)
・パーティクル描写の最適化(高速化)
・3D上の線と、表示画面とのクリッピングの追加(3各ポリゴンのクリッピングは未対応)
・反射マッピングの追加。(法線を0.5ずらしたものをテクスチャのUVに利用する例の方法。これを参考)
・水の表現の追加。(2つのノイズを一定時間ごとにずらし重ねたものを、UVに利用したり、法線に利用したり)
・なんかGUIに利用できるようなアイコン制作とその配置。
・簡易型のテクスチャの生成言語(以前作った画像処理ツールオレンジビューアを利用)
・パーリンノイズを利用して、2つのテクスチャを自然に合成とかできる。(SSの緑とレンガの中間のテクスチャ)

順調に進んでいる?ように見えますが、3月中旬から進んでません。
マップエディタには魔物が潜んでいます。気をつけてください。ヽ(^o^)丿

それはおいておいて、水の表現なのですが、
最初、次の用な感じで実装しました。
・ 2次元のパーリンノイズを2つ生成しておいて、それをずらし重ねて、波を表現。
※ずらし重ねるときに、小数点の場合も考えて補間法を用意しておく。
・ 上記で生成した波みたいなものを高さマップと考え、各頂点の法線を生成。(頂点の位置は固定)
・ 法線から、反射マッピング用のUV生成。
・ あとは、半透明で描写。

で、この方法。正直640×480じゃ30fpsはきついです。
最近のPCだといけると思いますが、その他のPCじゃかなり危険です。
描写部分のみをマルチスレッドで動かしてもです。
というわけで、結局妥協して、
テクスチャを利用しない(反射マッピングを行わない)、上記のSSのような感じになりました。

でもなんか、動作速度上の都合での妥協っていうのは自分的には悲しい感じがして、
グラフィックがもっと綺麗なのがいいなあって思ってきて、開発停滞中。
この先、オブジェクトの配置・描写とかの表示とかも考えると、いけるかなとか。
立ち絵的なものは、「g.drawImage」を使えばJavaの機能で、高速に描写できるから問題ないと思うけど。
とにかく、こういう事考えたりしていて、なかなか進まなかったりする。

JOGL使っておけばよかったかも。
シェーダ言語とか使ってみたいし。自影が表現できるシャドウマッピングとかやってみたいなあ。
その前に、やる気出したり時間を作ったり、という根本的な課題が。

話が変わりますが、saharanさんの「Jhun」がすごすぎる。

Javaで3Dゲーム開発日記 part6 マルチスレッド対応とマップメーカー

Javaで3Dゲーム開発日記 part6 マルチスレッド対応とマップメーカー

・描写関連のみ完全に別スレッド化!
本当は、頂点の座標変換&頂点ライト計算と、ピクセル描写部分とでもスレッド化できそうだったけど、
メモリの受け渡しが大変そうなので、諦めました。
※座標変換・光の計算を終わったデータのバッファだけで、1更新当たり2MBぐらいになりそう
あと、まだ世間的にはデュアルコアが主流だと思うしうん。・アクティブレンダリング
アクティブレンダリング – Javaでゲーム作りますが何か?」をみながら実装。
いや、実装してから分かるけどぜんぜん違う。
やばい。データの描写中によるpaintComponentのちらつきが全然なくなった。
ティアリング?が残っているから、ちらつきが全くなくなったわけじゃないけど。
今までは

	synchronized public void paintComponent(Graphics g) {
		super.paintComponent(g);
		if(!isShowing()){
			return;
		}
		g.drawImage(solid.getBufferedImage(),0,0,this);
		Toolkit.getDefaultToolkit().sync();
	}

ってやっておいて、タイマでthis.repaint();しまくってたけど、
アクティブレンダリングはぜんぜん違う。アクティブレンダリングばんざい!

・SoftGround(勝手に呼んでる)の対応
←こういうの

実際の実行した画面。(紫が法線)

テクスチャは、U反転・V反転・右に回転(1回~3回)といろいろ対応。
これで、洞窟とか平地とか、滑らかな地形は作れそう。

次は、HardGround(これも自分で勝手によんでる)というのを対応させたい。
←こういうの

こっちは難しそう。
1つのブロックに3つの面があれば実装できそうだけど、
壁に当たる部分は凹んだり凸ったりすることもあるから、
カリングの問題でサーフェイスを、先に単純に張っておくってことも出来ない?
でもHardGroundは、家の中とか、遺跡の中とかそういう整形された地形には欠かせない。
うん。

ゲームでも使えるように速度・メモリ重視っていうのが難しい。
考えてるだけで時間が過ぎていく。
でもアルゴリズムを考えてるときって楽しいよね。

Javaで3Dゲーム開発日記 part5 画像補間

Javaで3Dゲーム開発日記 part5 画像補間

以前の続きでテクスチャのパーリンノイズの補間法の話です。
いい加減補間について調べようといろいろとプログラムして作ってみました。
テクスチャなので、上下と左右が繋がるように補間します。

8x8px → 256x256px と、各補間法で32倍拡大してみます。

最近傍補間(NearestNeighbor)(1×1の格子点を使用)

線形補間(Biliner)(2×2の格子点を使用)

三角関数による補間(Cosine)(2×2の格子点を使用)

5次のエルミート曲線による補間(2×2の格子点を使用)

バイキュービック法(Bicubic)
(4×4の格子点を用いたsinc関数の近似補間関数を用いる)
sinc関数はrect関数をフーリエ変換・逆フーリエ変換したもの。

Lanczos2
(4×4の格子点を用いた近似補間関数を用いない手法)

Lanczos3
(6×6の格子点を用いた近似補間関数を用いない手法)

近似関数を用いたバイキュービック法の方が、近似関数を用いないLanczos2より画質がいいと思う。速度も速いですし。Lanczos3はバイキュービック法とほぼ変わらない。近似関数とほぼ一致。

結論
綺麗に拡大したい。 → バイキュービック補完
早く綺麗に拡大したい → 3次のエルミート曲線による補間
速度重視で拡大したい → 最近傍補間

バイキュービック補間の係数については、koujinz blogさんのブログの「画像の拡大「Bicubic法」」を用いています。

この係数なんですが、Javaの※拡大機能のバイキュービック補間は、速度重視で多分違う係数を用いていると思う。上記の係数を用いた方が綺麗に補完できましたし。それか、固定小数点で計算していて誤差が出るとか?

※g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);の方法

.NET TIPSの「画像を高品質に拡大/縮小するには?」を見ると
.NETのバイキュービック補間でも「Bicubic」と「HighQualityBicubic」の2種類があるから、
きっと同じバイキュービック補間でも、係数が変えて速度変えるとかあるのかな。

というか「HighQualityBilinear」ってまじで線形補完なのか。どうやってるんだろう。

三角関数による補間とエルミート曲線による補間の元ネタは、t-potの管理人さんが執筆した「DirectX 9 シェーダプログラミングブック」のパーリンノイズの章です。一番後ろの方です。

Javaで3Dゲーム開発日記 part4 パーリンノイズ

Javaで3Dゲーム開発日記 part4 パーリンノイズ

3Dと言ったらやっぱりテクスチャ。

パーリンノイズを作ってみた。
ノイズの間は線形補完しています。
本当はバイキュービックとか、しっかりした補完がいいと思うのですが、技術力不足で無理でした。(>_<)

こんなのが出来上がるなんて、ランダムって不思議です!

自動生成を利用すれば、小さなファイルサイズでも、高解像度テクスチャを利用できます。


↑ライトのテクスチャもプログラムで生成してみました。

他にも波の高さに用いたり、地形を作ったりできるそうです。
ただパラメータが面倒だったり、この後の加工が面倒だったりするので、
結局は他のソフトを使用して作ったものを利用しそう。(・ω・` )

%d人のブロガーが「いいね」をつけました。