ヘキサ日記 Blog

 

        

こんにちはプログラマーのチャラメガネです

 

今日で8月も終わりですね

 

皆様、この夏はいかがお過ごしでしたでしょうか

 

チャラメガネは、先日「秋田竿燈まつり(あきたかんとうまつり)」を見に行ってまいりました。

 

竿燈というのは、沢山の灯籠の付いた長い竿のことで、

「秋田竿燈まつり」は、その掲げ方の技術を競い、魅せるお祭りです

IMG_3078

 

 

竿燈は最大で12mほどの長さになり、

吊るされる灯籠の数は46個にも登ります

IMG_3065

 

 

支えるのは竿の下端一点のみで、

下端を、「手のひら」「額」「肩」「腰」など各々の場所に乗せ、

バランスを取ります

IMG_3081

※肩や額に乗せてバランスを取っている方々

 

 

これだけ大きいと、重く、バランスをとるのも難しそうですが、

灯籠の火がたくさん灯っていれば

上昇気流の恩恵で、少しだけ軽くなるそうです

 

現物を見るのは、今回が初てでしたが、

そのスケールは圧巻でした

昼には「妙技会」なる大会も開かれており、

その技量を競い合っていました

 

様々な形のエンターテインメントとなり

地域の人達に愛されているのですね

 

チャラメガネも、多くの人に愛されるゲームを作っていきたいです


2017年8月30日

ぐっすり寝るために

        

どうも、ドラクエ11をクリアして完全にドラクエロス状態にあるゆっきーです

さて、毎回ブログを書いた後に次に何を書こうかなと考えるのですが、前回書いたときに考えていた内容は

 

ヘキサブログにデザイナーさんたちが書いている内容を参考にプログラマーが本気で絵を書いてみる

 

っていう内容を考えてたんですけど、ごめんなさい時間取れなくて無理でした

(気づいたらもう明日ブログ当番ですみたいな感じになっちゃうんだもん…)

まぁ誰も期待してないだろうからそんなに申し訳なさも感じてないけど

 

 

というわけで全く話は変わって睡眠の話します

いや、ちょっと前に新しい枕を買ったんですよ。

オーダー枕的なやつ。

 

 

枕の高さがしっくりくると本当に気持ちが良いものなんですよ。

今まで使ってた枕が引越しするときに買っためっちゃ安い枕だったんですけど、もう寝てみた感じが段違い

「あぁ…こりゃ良く寝れるわ…」という悟りが開けます。

 

あとずっとスウェットとTシャツとかで寝てたんですけど、パジャマ的なものも買ってみたんですよ。

 

 

こう、肌触りなめらかなやつにしてみたんですけど、汗をかいてもサラサラみたいな。

まぁ自分の場合は元のスウェットとTシャツがゴワゴワしてるのもあったけど、とても気持ちが良いわけなんですよ。

こーれは睡眠の質上がったなーっていうのがわかります。

(気持ちの問題かもしれないけど)

今は枕とパジャマ新調しただけですが、もういっそマットレスとかも良いもの買ってみようかなっていう気になってます。

結構いいお値段するのでまだ悩み中ですが

 

 

夜ぐっすり寝れると次の日すっきりとした気持ちで仕事ができますよ

皆さんも是非寝具にはこだわってみてくださいね

 

でわまた


        

いつか、誰かが私を打ち負かすだろう。
だがそれは今日ではないし、お前にでもないし、ミッツです

 

前回のブログ担当のオサえもんからドラゴン続きということで
今が旬のやつでいきましょう。
絶賛発売中の
『ドラゴンクエストXI 過ぎ去りし時を求めて』

20170829_image01

 

皆さん、ゆうべはお楽しみでしたでしょうか?
私はそれまでプレイしていたゲームがようやく区切りがついて
つい先日にようやく3DS版を購入、旅路に出たばかりのところです

 

思い起こせば小学校2年の頃、当時の私はファミコンというゲーム機の
ことも分からないまま、初めてドラクエというテキストのゲームに踏み込み、
そのまま魅惑のRPGという沼地に沈んだのでしたが、
このドラクエあればこそ、敬愛する妖魔司教ザボエラと出会えたと思えば
その感慨もひとしおといったところです。

 

さても今回の最新作XIをプレイして感じたのも、変わらぬ“ドラクエらしさ”
シリーズはすでにナンバリングタイトルだけでも11作を迎え、
随所は今のトレンドに即して調整されているにも関わらず、
いまだ根元に感じるドラクエらしいという伝統の持ち味には舌を巻きます。
根幹で小学2年の体感を思い起こさせるというのはけっこう凄いことです

 

そこで今回のブログでは、過ぎ去りし時のタイトルに即して、
小学校2年生の私の過ぎ去りし日々を振り返って
特に印象深い『ドラクエで初めて知った日本語』をご紹介したいと思います。 

 


 

 【5位】

20170829_image02

 

ドラゴンクエストIの戦闘時、コマンド入力待ちの間に表示されている言葉。
「かいしん」や「つうこん」とどっちを取るか迷いましたが、
印象深いというか、そもそも当時、何なのかまるで分からなかった単語と
いうことでこっちを選びましたですね。
後にこの「コマンド」というものの意味を知ってからも、この言葉には何か
違和感のようなものを覚え続けていました。
そうした意味で今でもなかなか印象深い言葉です。
後に、II以降の作品からはこのコマンドという表示が消えていることから、
これはRPG黎明期だからこそ出会えた言葉だったのかもしれません。

 


 

【4位】

20170829_image03

 

洞窟でドクロを見かけて調べた時に表示されたのが
すでに有名な「ただのしかばねのようだ」というフレーズでした。
死体らしきものがあって、それを調べたというのに「ただの」という言い草。
当時の自分はまったくそれが理解できず、「しかばね」は死体のことではなく、
もっと道端のゴミみたいなものを指した言葉と思ったものです。

 

後に「しかばね」の意を知ることになり、主人公の死体に対する無頓着さに
ドラクエ世界のバイオレンスな風情を感じて恐怖したものです。

 


 

【3位】

20170829_image04

 

装備品を「つかう」してみた時に発生するフレーズです。
振るという意味は当時の私も分かっていましたが、かざしたとは一体どういう
ことだろう、という具合に初めて知ることになった表現でした。

これは、「いかずちのつえ」で偶然発見することができたテキストでした。
一度、いかずちのつえでこの言葉を見つけて以来、何かにつけ
装備を「つかう」してみるわけですが、ほとんどの装備では何も起きない。
つまり、この「ふりかざした」という言葉は、当時の私にとって、
特別効果を発見時だけ見られる発見おめでとう的レアテキストなわけです。

 


 

【2位】

20170829_image05

 

全滅後に王様から言われる、ドラクエの名言としておなじみのアレですね。
子供の頃は、それはそれは大量に死んでおります。
まさか王様からゴールド半分、ネコババされてると夢にも思いませんでした
それに重ねて「なさけない」という言葉をかけられるも、それがどんな意味かも
分からず、なさけという表現が含まれてるので「かわいそう」くらいの意味かと
とりあえず当時、小学校2年頃の私は解釈していたのです。
もうこれは、本当に当時の私がかわいそうですね。
王様ともあろう偉い人が、そんな手ひどいことを言ってくるなんて全然想像が
できなかったんですね、権力者を甘く見ていました。
真意(とネコババ)が明らかになった時、メロス並に激怒しました。

 


 

【1位】

20170829_image06

 

ドラゴンクエストではじめて知った日本語の中、私が一番好きになったのが、
なんといっても、この「となえた」ですね
なんと素晴らしいフレーズでしょうか
呪文を「言った」でもなく「使った」でもなく、この奇妙で耳障りの良い
口ずさむだけで気持ちがよくなる動詞が使われていたことが、
いっそう呪文というものの持っている不思議な魅力を私に感じさせました

 

もうこれこそが自分的にはベスト・オブ・ドラクエ動詞ですね。
昨今の日常生活のなかでは「となえる」ことなんてそうそうないだけに、
この言葉は今も私の中で燦然とファンタジーの頂点として輝いています。

 


 

以上、日本語で振り返る私の過ぎ去りし時の話でした。
誰かが己を振り返った時、その人の過ぎ去りし時の一部になっている
そんなゲームを今、自分も作っているかもしれない、そんな風に想像し
今日もゲーム開発に邁進しております


        

今年の夏は涼しいですね

 

アイスが売れなくて巷では大変みたいですよ
僕はいつでもガリガリする男の子のアイス(大人味のぶどうのやつ)食べたいです

 

う~ふ~ふ~、ぼ~く、オサえもんです

 

さて、今日はお待ちかねのレトロゲーム探訪です

と、その前に今回の紹介するソフトのヒントを
オサえもん、どはまり中ラテアートから

201701

バーン

何に見える?ねぇ、なにに見える?
正解は、、、炎吹き荒れるドラゴンでした

舌をペロ、じゃないんですよ

もうどこからどう見てもドラゴンでしょう、これは

結構練習したんですよ。

 

 

 

ということで、ヒント、ドラゴン…から繰り出される
今回のレトロゲーム探訪は

チ、チ、チ、チ、はい、ブーーーーー

 

 

 

201702

ファンタジー系のドラゴンだから、あれとか

それとか考えてた皆さん、残念でした。

 

 「ドラゴンボール 神龍の謎」

はい、あの水色のカセットです。

 

数少ないヤムチャが大活躍するゲームです(敵役で)

なにやら堂々とパッケージに写ってますね。

 

ちなみにオサえもんはクリアはおろか宇宙まで行けていません、、、むずいんですもの

 

ご褒美に動かせるだけで何の意味のない神龍とか

妙に美味しそうなお肉と、お肉より回復するけどあまりおいしそうじゃないケーキとか
高難易度・高運ゲー度なんですが、愛すべき点が多いですね!

 

カプセルの中からたまに敵が出てきますけど

あれ、収まってる時ってどういう心境なんですかね。
見つけてもらえなかったら、
ずっと解放されないかもしれないという恐怖

開放されたらされたで、瞬殺されるかもしれない恐怖
オサえもんはきっと耐えられないと思います

 

あ、悟空が棒をもってくるくる回るあれ、「からまん棒」っていう技らしいですよ

そして、オサえもん最大の注目ポイントは
ギャルのパンティを拾って喜びのあまり足がシャカシャカして爆速化する悟空
作品中あんなにピュアにふるまっている彼も、やはり男子ということなんですよ

つまりは、 そういうことなんですよ


2017年8月25日

Mastodon

        

皆さん、こんにちは。店長です

 

皆さん、何かしらのSNS(Twitter、Instagram等)は使っているかと思いますが、

今回は私が注目しているMastodonを紹介しようと思います。

 

Mastodonとは、簡単にいうとコミュニティがあるTwitterみたいなものです。

 

Twitterと違う点は、

コミュニティ毎にアカウントを作る必要がある。

コミュニティ内だけのツイートを見ることができる。

コミュニティは誰でも立てることができる。(事前の知識は必要ですが)

などがあります。

 

私は主に開発者向けコミュニティを覗いていますが、

他にも音楽とか趣味向けのコミュニティなどもあります。

こちらのページでコミュニティ(インスタンス)の一覧が見れますので、

是非皆さんも覗いてみて下さい


2017年8月24日

光のお父さん!

        
こんばんは。
イノウエです。
 
何を書こうかなぁ…と色々考えましたが、
FF14についてでいきます!
 
みなさんは、ドラマの光のお父さん、見ましたか?
 
マイディーさんというプレイヤーが書いていたブログからドラマ化されたのですが、
個人的にとてもグッと来ました
 
元々、FF11を長年やっていて、
でもFF14は我慢せねば…と耐えていたのですが、
11の時のオンラインでのあれこれがよみがえり、
懐かしい気持ちになりつつ、
自分も父親なのでお父さんの気持ちもなんとなくわかり…
泣いちゃいましたね、はい
 
そもそも、オープニングの、
FF3のクリスタルからFF14のクリスタルに変わる演出が、
とてもとてもステキでした
思い出補正もあるかもしれませんが、
FFのクリスタルの中では、3が一番好きなのです
当時自分のお金で買った初のFFであり、
導入部分のクリスタルの語り、輝き、神秘さが、
自分の中のFFクリスタルの定義として深く根付いています。
 
そんな思いもあるところからの、あの演出、そしてドラマの内容です。
さらには、声優が大好きな南條さんです
もう、完全に負けました。
これ、ターゲット層は僕ですよね?
 
はい、FF14買いました。
時間がない中なんとか進めて、ようやく53レベルです。
FF11時代は召喚だったので、その道を歩んでいましたが、学者に転向。
IDシャキリ易くてとても楽しいです
 
広報戦略の術中にまんまとハマりましたが、
非常に楽しませていただいているので、
ドラマ関係者やマイディーさん、
そしてもちろんゲームの制作者や関係するすべての人、
みなさま大変ありがとうございます!!
これからも光の戦士として、光のお父さんとして、頑張ります!

2017年8月23日

溶接とかやってみる

        

こんにちはkayanuma.です。

みなさんは溶接にご興味がおありでしょうか。
たぶん無いと思います。
今日は溶接の話です。

 

・ロマン

金属と金属をくっつける溶接。半田付けなどという穏やかなものではなくバチッと火花を飛ばしてくっつけるあれ。
あれをマスターすればなんでも作れる(気がする)。ロマンですよね。

でもあれは簡単にはできなさそうだし大掛かりでちょっと恐い感じ。

 

 

・スポット溶接
スポット溶接といわれるものをやってみます。
自動車工場でロボットが火花を散らして溶接を行っているのを見たことがあると思います。

こんなの(youtube:新型ノートも製作中…日産自動車九州で見た生産ライン)

こんな大掛かりな組み立てにも使われる技術ですが、
小規模で低電圧なものは比較的安全に作業がおこなえるので
卓上で作業ができちゃったりします。

 

・今回はこんな感じ

blog20170821_03

いにしえのバッテリーバックアップつきのファミコンカセットを分解したことがあるでしょうか?

写真のように金属板がついている電池が組み込まれていたりします。

がっちり付いていて取り替えたりはできません。

これもスポット溶接です。

半田付けでよいのでは?と思ってしまいますが、
半田付けだと熱で電池が痛むので、瞬間的に作業ができる溶接でくっつけてしまうのです。
★昔からこれがやりたかった。★

 

・作ってみた

blog20170821_01
作ってみたスポット溶接マシン。
”スポット溶接 DIY”でググると先人の知恵がいっぱい出て来ます。
電子レンジから取り出したトランスを改造したり、自動車のバッテリーを何個もつないだりする本気な人の方法が出てきますが、
恐ろしすぎるので比較的安全な”コンデンサ充電方式”でやってみました。

馬鹿でかいコンデンサがついていますが、こいつにエネルギーを蓄えてから一気に放出させる仕組みです。
金属を溶かしてくっつけるにはそれなりの大きな電流が必要ですが、充電させるACアダプタはそこらへんにある汎用の小さなものでOKです。

電圧も30V以下でおこなえるので感電の危険性も低いのです。
コンデンサは瞬間的に放電させる性能が高いのでこのような用途に適しています。

blog20170821_08

このような経路で電極棒から対象の金属板に電気が流れ、抵抗の大きい部分で発熱し、溶けてくっ付くという理屈です。
金属といえど接触部分でわずかな抵抗ができるのです。

★なぜ溶接棒と素材が溶接されないかというと
溶接棒は銅など放熱性の高い金属で作られているため溶けるほど温度が上がらない・・ということらしいです。
裏を返せばそのような金属への溶接は難しいということですね。

 

・やってみる

blog20170821_02

自作の電極。これは東急ハンズで売っていた銅でできた釘を流用しました。
銅釘といっても純度何%なのか良くわからないですけど・・使えているのでいいかな。

 

blog20170821_05
二つのニッケル版を溶接してみます。
ショートさせないようビニールテープを巻いています。

blog20170821_04ついたかな?

blog20170821_06ひっぱってみる。
確かにくっついた! 
でもすこし弱いかな。 電極をもっとちゃんとしたものにしたり、エネルギーを大きくするとか改良の余地がありそうです。


2017年8月22日

32とか16とかその7

        

こんにちは。

 

シュンスケです

 

前回でGAの処理が確認出来たので、いよいよ減色に取り入れて、

誤差拡散を超えてみようと思います

 

まずは、前回も記載した方針の通り、修正を行っていきます。

.使用する色を1チャンネル16色に制限する

.現在開始画像が完全にランダムな絵だったのを、誤差拡散等で

 既にキレイな状態を出発点にする

.評価式にPSNRを使用しているのを、SSIMに変更する

.今までの突然変異だと変化が大きすぎて細やかな改善に向かないので、

 ごく一部の変異に修正

.改善画像出力機能の作成

 

評価式SSIMは、PSNRよりも人間の認識に近い画像評価方法として出てきたもので、

画像の性質次第では事前にガウシアンフィルタによるノイズ除去を行うようです

が、減色の性質や今回のテスト画像の性質から無しで行ってみようと思います。

また、今回はチャンネル単位でSSIMを算出してその平均を画像の評価としています

が、横1ライン毎の各チャンネルで算出したものの平均にするなど、細かく分ける

のも有効そうです

 

では、実行結果。

まずはツールの様子

20170823_ga_window

 

そして、作成された画像

20170823_ga_org

20170823_ga_new

上が誤差拡散、下がそれを元に改善した画像

 

変わっ……った

 

確かに数値は上がっているのですが、元が良いのもあり正直わかりません

 

わかりやすいように、差分画像を作成しました。

(差分0を0xffとしてわかりやすくしています)

 

20170823_ga_diff

 

こう見ると、まばらにでも思ったより多くの箇所が改善されている結果、

評価値の向上に繋がっているようです

後は、どういった画像に使用するのか、使える時間はどのくらいかで

調整をしていけば、少なくとも SSIM基準による画質向上は見込めそうですが、

なかなか実感できる程を目指すのは難しいようです。

誤差拡散のお手軽さを考えると、この一線を超えるかは、 どこまでこだわるか

との相談になりそうですね

 

というわけで長きに渡って減色について続けてきたシリーズですが、

ここで一旦の区切りとします。

 

最後に今回のソースコードを貼っておきます。

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;

namespace Pic32bitTo16bitGA
{
	class Program : Form
	{
		struct Gene
		{
			// 2点交叉
			public static void cross(ref Gene a, ref Gene b)
			{
				if( a.buf == null || b.buf == null ) return;

				var len = a.buf.Length;
				var r = new Random();
				var index1 = r.Next(0, len);
				var index2 = index1;
				if( index1 > len / 2 ) {
					index1 = r.Next(0, index2);
				}
				else {
					index2 = r.Next(index1 + 1, len);
				}
				for( int i = index1; i <= index2; ++i ) {
					var tmp = a.buf[i];
					a.buf[i] = b.buf[i];
					b.buf[i] = tmp;
				}
			}

			// SSIM算出
			private static double calcSSIM(byte[] x, byte[] y, int start, int end, int offset)
			{
				if( x == null || y == null || x.Length != y.Length || x.Length == 0 ) return 0;

				// 事前計算
				double c1 = (0.01 * 255) * (0.01 * 255);
				double c2 = (0.03 * 255) * (0.03 * 255);
				double avgX = 0, avgY = 0;	//!< 平均
				double sdX = 0, sdY = 0;	//!< 標準偏差
				double cov = 0;				//!< 共分散
				double len = 0;
				for( int i = start; i < end; i += offset, ++len ) {
					avgX += x[i];
					avgY += y[i];
				}
				avgX /= len;
				avgY /= len;
				len = 0;
				for( int i = start; i < end; i += offset, ++len ) {
					double dX = x[i] - avgX;
					double dY = y[i] - avgY;
					sdX += dX * dX;
					sdY += dY * dY;
					cov += dX * dY;
				}
				sdX = Math.Sqrt(sdX / len);
				sdY = Math.Sqrt(sdY / len);
				cov /= len;

				// SSIM算出
				return ((2 * avgX * avgY + c1) * (2 * cov + c2)) / ((avgX * avgX + avgY * avgY + c1) * (sdX * sdX + sdY * sdY + c2));
			}

			// コンストラクタ
			public Gene(int w, int h)
			{
				buf = new byte[w * h * PIXEL_BYTES];
				ssim = 0;
			}

			// 白で埋める
			public void fillWhite()
			{
				if( buf == null ) return;

				// 白色を埋める
				for( int i = 0; i < buf.Length; ++i ) {
					buf[i] = 0xff;
				}
			}

			// SSIM算出
			public void calcSSIM(byte[] org)
			{
				ssim = 0;
				if( org == null || buf == null || org.Length != buf.Length || org.Length == 0 ) return;

				var ssimR = calcSSIM(org, buf, 0, org.Length, 4);
				var ssimG = calcSSIM(org, buf, 1, org.Length, 4);
				var ssimB = calcSSIM(org, buf, 2, org.Length, 4);
				var ssimA = calcSSIM(org, buf, 3, org.Length, 4);

				// SSIM算出
				ssim = (ssimR + ssimG + ssimB + ssimA) / 4.0;
			}

			// 突然変異
			public void mutation()
			{
				if( buf == null ) return;

				var r = new Random();
				var index = r.Next(0, buf.Length);
				var c = r.Next(0, RGBA4444_COLORS.Length);
				buf[index] = RGBA4444_COLORS[c];
			}

			// 値を設定
			public void set(Gene g)
			{
				set(g.buf);
				ssim = g.ssim;
			}

			// バッファを元に値を設定
			public void set(byte[] src)
			{
				if( src == null ) return;

				if( buf == null || buf.Length != src.Length ) {
					buf = new byte[src.Length];
				}

				Array.Copy(src, buf, buf.Length);
			}

			public byte[]	buf;
			public double	ssim;
		}

		// 16bitカラーテーブル
		private static readonly byte[] RGBA4444_COLORS = new byte[] {
			0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
		};
		private const int PIXEL_BYTES				= 4;								//!< 1ピクセルあたりのバイト数

		// エントリポイント
		static void Main(string[] args)
		{
			// 元画像パス入力受付
			Console.WriteLine("please input org picture path...");
			var orgPath = Console.ReadLine();

			// ファイル存在確認
			if( !File.Exists(orgPath) ) {
				Console.WriteLine("file not exists.");
				return;
			}

			// 画像読み込み
			byte[] orgBuf;
			int orgW;
			int orgH;
			if( readImg(out orgBuf, out orgW, out orgH, orgPath) ) {
				Console.WriteLine("org picture load failed.");
				return;
			}

			// 開始画像パス入力受付
			Console.WriteLine("please input start picture path...");
			var startPath = Console.ReadLine();

			// ファイル存在確認
			if( !File.Exists(startPath) ) {
				Console.WriteLine("file not exists.");
				return;
			}

			// 画像読み込み
			byte[] startBuf;
			int startW;
			int startH;
			if( readImg(out startBuf, out startW, out startH, startPath) ) {
				Console.WriteLine("start picture load failed.");
				return;
			}

			// サイズ確認
			if( orgW != startW ||
				orgH != startH ||
				orgBuf.Length != startBuf.Length ) {
				Console.WriteLine("org picture size and start picture size are different.");
				return;
			}

			// 出力先パスを作成
			var dstPath = orgPath.Substring(0, orgPath.Length - Path.GetFileName(orgPath).Length) + Path.GetFileNameWithoutExtension(orgPath) + "_new" + Path.GetExtension(orgPath);

			// フォーム開始
			Application.Run(new Program(orgBuf, startBuf, orgW, orgH, dstPath));
		}

		// 画像読み込み
		static bool readImg(out byte[] dst, out int width, out int height, string srcPath)
		{
			dst = null;
			width = 0;
			height = 0;
			using( var img = Image.FromFile(srcPath, true) as Bitmap ) {
				if( img == null ) {
					Console.WriteLine("file type is not support.");
					return true;
				}
				// メモリに保持
				var dat = img.LockBits(new Rectangle(Point.Empty, img.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
				width = img.Width;
				height = img.Height;
				dst = new byte[width * height * PIXEL_BYTES];
				Marshal.Copy(dat.Scan0, dst, 0, dst.Length);

				// 解放
				img.UnlockBits(dat);
			}
			return false;
		}

		// コンストラクタ
		public Program(byte[] org, byte[] start, int w, int h, string dstPath)
		{
			if( org == null || start == null || dstPath == null ) return;

			_org = org;
			_start = start;
			_img = new Bitmap(w, h);
			_dstPath = dstPath;

			// 第1世代生成
			_startGen.set(_start);
			_startGen.calcSSIM(_org);
			for( int i = 0; i < _curGen.Length; ++i ) {
				_curGen[i] = new Gene(w, h);
				_curGen[i].set(_startGen);
			}

			// フォームのサイズ設定
			ClientSize = new Size(w, h * 2);

			// フォント作成
			_font = new Font(Font.Name, 10);
			_fontBrush = new SolidBrush(ForeColor);

			// 出力ボタン作成、登録
			_outBtn = new Button();
			_outBtn.Location = new Point(300, 0);
			_outBtn.Size = new Size(50, 20);
			_outBtn.Text = "出力";
			_outBtn.Click += new EventHandler(onClickOutBtn);
			Controls.Add(_outBtn);

			// 描画更新開始
			_sec = 0;
			_refreshTimer.Interval = 1000;
			_refreshTimer.Tick += new EventHandler(refresh);
			_refreshTimer.Start();

			// 処理更新開始
			_updateTimer.Interval = 1;
			_updateTimer.Tick += new EventHandler(update);
			_updateTimer.Start();
		}

		// 描画時処理
		protected override void OnPaint(PaintEventArgs e)
		{
			base.OnPaint(e);
			if( _img == null ) return;

			// 元画像描画
			if( _org != null ) {
				var newDat = _img.LockBits(new Rectangle(Point.Empty, _img.Size), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
				Marshal.Copy(_org, 0, newDat.Scan0, _org.Length);
				_img.UnlockBits(newDat);
				e.Graphics.DrawImage(_img, 0, 0);
			}

			// 生成画像描画
			if( _topGen.buf != null ) {
				var newDat = _img.LockBits(new Rectangle(Point.Empty, _img.Size), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
				Marshal.Copy(_topGen.buf, 0, newDat.Scan0, _topGen.buf.Length);
				_img.UnlockBits(newDat);
				e.Graphics.DrawImage(_img, 0, _img.Size.Height);
			}

			// フレーム数表示
			e.Graphics.DrawString("sec : " + _sec, _font, _fontBrush, 0, 0);

			// 世代数表示
			e.Graphics.DrawString("gen : " + _genCnt, _font, _fontBrush, 0, 10);

			// SSIM表示
			e.Graphics.DrawString("start ssim : " + _startGen.ssim, _font, _fontBrush, 100, 0);
			e.Graphics.DrawString("top   ssim : " + _topGen.ssim, _font, _fontBrush, 100, 10);
		}

		// 描画更新
		private void refresh(object sender, EventArgs e)
		{
			// 画面をリフレッシュ
			++_sec;
			Invalidate();
		}

		// 出力ボタン押下時処理
		private void onClickOutBtn(object sender, EventArgs e)
		{
			if( _img == null || _dstPath == null ) return;

			// トップの画像を書き出し
			// 出力画像作成
			var newImg = new Bitmap(_img.Width, _img.Height);
			var newDat = newImg.LockBits(new Rectangle(Point.Empty, newImg.Size), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
			Marshal.Copy(_topGen.buf, 0, newDat.Scan0, _topGen.buf.Length);
			newImg.UnlockBits(newDat);
			newDat = null;

			// 保存
			newImg.Save(_dstPath);
			newImg.Dispose();
			newImg = null;
		}

		// 処理更新
		private void update(object sender, EventArgs e)
		{
			// 次世代初期化
			for( int i = 0; i < _nextGen.Length; ++i ) {
				_nextGen[i].fillWhite();
			}

			// 評価値算出
			for( int i = 0; i < _curGen.Length; ++i ) {
				_curGen[i].calcSSIM(_org);
			}

			// 評価値でソート
			Array.Sort(_curGen, (a, b) => {
				if( a.ssim == b.ssim ) return 0;

				return (b.ssim > a.ssim) ? 1 : -1;
			});

			// 1位を保持
			_topGen.set(_curGen[0]);

			// 上位いくつかはそのまま残す
			var newIndex = 0;
			for( int i = 0; i < 2 && i < _nextGen.Length; ++newIndex, ++i ) {
				_nextGen[newIndex].set(_curGen[i]);
			}

			while( newIndex < _nextGen.Length ) {
				// 交叉対象1を選出(上位が選ばれやすいように)
				_cross1Buf.set(_curGen[0]);
				for( int i = 1; i < _curGen.Length; ++i ) {
					var rate = _selectRnd.Next(0, 100);
					if( rate < 10 ) {
						_cross1Buf.set(_curGen[i]);
						break;
					}
				}

				// 交叉対象2を選出(上位が選ばれやすいように)
				_cross2Buf.set(_curGen[1]);
				for( int i = 2; i < _curGen.Length; ++i ) {
					var rate = _selectRnd.Next(0, 100);
					if( rate < 10 ) {
						_cross2Buf.set(_curGen[i]);
						break;
					}
				}

				// 交叉
				Gene.cross(ref _cross1Buf, ref _cross2Buf);
				_nextGen[newIndex].set(_cross1Buf);
				++newIndex;
				if( _nextGen.Length <= newIndex ) break;

				_nextGen[newIndex].set(_cross2Buf);
				++newIndex;
				if( _nextGen.Length <= newIndex ) break;

				// 突然変異対象を選出
				var mutIndex = _selectRnd.Next(0, _curGen.Length);
				_nextGen[newIndex].set(_curGen[mutIndex]);
				_nextGen[newIndex].mutation();
				++newIndex;
				if( _nextGen.Length <= newIndex ) break;

				// そのままコピー
				var copyIndex = _selectRnd.Next(0, _curGen.Length);
				_nextGen[newIndex].set(_curGen[copyIndex]);
				++newIndex;
				if( _nextGen.Length <= newIndex ) break;
			}

			// 次世代を現世代に移す
			for( int i = 0; i < _nextGen.Length; ++i ) {
				_curGen[i].set(_nextGen[i]);
			}
			++_genCnt;
		}

		private Bitmap	_img			= null;
		private byte[]	_org			= null;
		private byte[]	_start			= null;
		private string	_dstPath		= null;

		private Timer	_refreshTimer	= new Timer();
		private Timer	_updateTimer	= new Timer();
		private Button	_outBtn			= null;
		private Font	_font			= null;
		private Brush	_fontBrush		= null;
		private int		_sec			= 0;
		private int		_genCnt			= 0;

		private Gene[]	_curGen			= new Gene[128];
		private Gene[]	_nextGen		= new Gene[128];
		private Random	_selectRnd		= new Random();
		private Gene	_cross1Buf		= new Gene();
		private Gene	_cross2Buf		= new Gene();
		private Gene	_topGen			= new Gene();
		private Gene	_startGen		= new Gene();
	}
}

 

では


        

オッス!オラ「オクダ」

まだまだ暑い日が続きますね~

そして各地で大雨も多いです

自然災害とともに体調にも気をつけたいですね

 

夏休みどうでした?

(学生さんはまだ続いてますね、、、うらやましい、、、)

私は例によってキャンプと帰省で充実した日々をすごしていました

20170821_1

キャンプいいですね~

20170821_2

BBQしたり、燻製したり

20170821_3

夜は焚火!癒されます

 

 帰省は片道約600kmのロングドライブ

その甲斐あって日本海の美しい海を毎日堪能できました

20170821_4

おかげでコンガリ焼けました

 

さて、私の話はコレくらいで、、、

ヘキサドライブでは大きな発表も目白押しでした

先月末、中国で行われたゲームイベント「ChinaJoy2017」で

『西遊記之大聖帰来(MONKEYKING HERO IS BACK THE GAME)』(仮称)が発表されました!

20170818_1

このタイトルの制作をヘキサドライブが担当しています!

(トレーラー映像にもヘキサドライブのロゴが出てます)

会場にはVR映像を体験できるブースを出展していたのですが、大盛況でした!

リリースはまだ先ですが、ご期待ください!

そして、スタッフ募集もしています!!(切実w)

 

更に、新作ゲームもリリースしました!

魔法パスワード1111

Ficustone project第二弾!『魔法パスワード1111』です!

若手ががんばって作ったタイトルです。

是非プレイしてください!

わかってますよね!是非プレイしてください!!

 

そしてこの季節がやってきます、、、

CEDEC2017

もちろん皆さんも参加しますよね?

今年から『タイムシフト配信』もスタートします

都合がつかない人や遠方の方もコレで参加しやすくなりますね

そして今回、講演をさせていただくことになりました!

「若手小規模プロジェクト」のススメ

~昨今の業界における若手育成の問題点とその解決方法の提案~

 

ハイエンドや運営向けのセッションが多いCEDECですが、今回は「若者」「教育」にスポットを当てた内容を話します。

面白い話になるようにがんばりますので是非聴きにきてください

(タイムシフト配信もされます)

 

おっと、まだスライドが途中だった、、、、、、

 


2017年8月18日

節目

        

こんにちは。さいやん、こと齊藤です。
先日ついに40歳になりました。40歳は今までの節目とは違うなーと感じます。
39歳も40歳も年齢としては1つしか違わないのですが、会話のなかで「いやまだ30代ですから」
というようなまだ若者のはしくれであることを装うことも、もうできません。
またユーザー登録やアンケート等で40代と回答することになり、
もう30代とは違うのだということをはっきりと突きつけられたりします。
正真正銘おっさんの仲間入りです。(世の40代以上の方スミマセン)

 

 

そんな節目の歳を迎えたわけですが、今年は色々とイベントが盛りだくさんです。
CEDEC2017も間もなく今月末に開催されます。
運営委員に名を連ねるようになってから6年目、今年は副委員長を拝命し、
スポンサー様のセッションを除くセッション全体のとりまとめを担当させて頂きました。
現時点では全てのセッションの情報公開が完了し、本番に向けて最終調整を残すのみとなり、
少しホッとしています。(あとは本番頑張ります!)
ゲーム開発者の皆様のたくさんのご来場と、お会いできることを楽しみにしています。

 

個人的には今年のCEDECは任天堂さんの『ゼルダの伝説 ブレス オブ ザ ワイルド』の開発事例が
各分野(なんと8セッション!)で聞けるということが楽しみでなりません。
私もプレイヤーとして200時間近くハイラルを冒険し、その世界の完成度がとても高いことに感心しきりでした。
ずっとこの世界に居たいと思わせるワクワク感は他に形容しがたいものがあります。
なかなか入手できないとの声も多いNintendo Switchですが、入手できた方は是非遊んでみてほしいと思います。
作る側としてはあの世界がどう作られたのかを聞くことができるこのチャンス、見逃せません。

 

 

また、先月のChinaJoy2017では弊社で制作が進行中の
『MONKEYKING HERO IS BACK THE GAME(仮称)』
発表となりました。
20170818_1
これは西遊記をモチーフとした中国の国民的アニメ「西遊記之大聖帰来」をゲーム化するもので、
中国メディアで公開されたトレーラーが2日間で200万PVを記録するというほどの反響を頂きました。
日本語字幕のトレーラーもこちらから見ることができます。
https://www.youtube.com/watch?v=ZClhJCmAb40&feature=youtu.be
大型プロジェクトということもあり、スタッフ(正社員)募集の専用サイトもオープンしていますので、
ご興味のある方は是非こちらもご覧ください。
http://hexadrive.jp/recruit/career_n/

 

 

そして今週の月曜日にはblogでも紹介させて頂きましたが、
弊社の若手チームが手掛ける『魔法パスワード1111』
iOS/Androidの各ストアにてリリースされました。
20170818_2
基本無料でエンディングまで遊べるゆるっと切ない魔法と旅するRPGを是非お手に取ってもらえると嬉しいです。
詳細はこちらをご覧ください。
http://ficustone.com/mahoupassword1111/

 

 

今年はヘキサドライブも10周年を迎え、私も40歳の節目を迎えましたが、
まだまだチャレンジを続ける中で成長していきたいと思いますので、
今後ともご指導ご鞭撻のほどよろしくお願い致します。

 

 

また、一緒にチャレンジして頂ける方も募集していますので、
仲間になりたそうに こちらを見ている!
という方は是非ともご連絡下さい!


ヘキサブログ ピックアップ



過去の日記はこちら

2017年8月
« 7月   9月 »
 123456
78910111213
14151617181920
21222324252627
28293031