IMG_5256
Development

Vanilla JavaScriptを書いてみよう その2(タブUIを実装)

前回はイベントハンドリングとjQueryの様にクラス名でhtml要素を検索出来るquerySelectorを紹介しました。

今回はjQuery等の等のライブラリを一切使わずにタブUIを実装して見るための下準備をご紹介したいと思います。

デザイン

デザインは以下の様なもので、タブのボタンとその内容の文章が3つずつ存在し、選択されていないタブをクリックすると内容と共に選択中の表示に切り替わります。

スクリーンショット 2014-02-24 12.23.24

 

各タブに .tab-nav__item–current というクラスが付いていると選択中の表示になり、内容部分はデフォルトで display: none; に設定されているので .tab-content–current というクラスが付いているもののみ display: block; で可視化するという仕様です。

見た目の制御はcssで行うようにしていますので、JavaScriptからhtml要素のclass属性を操作できる必要があります。

クラスを定義してみる

class属性は element.className というプロパティを使って操作できますので、専用のクラス(ここで言うクラスはインスタンスを生成するためのオブジェクトという意味)を用意しておきましょう。

ところがJavaScriptにはクラスを定義する構文は用意されていません。ではどうやるのかというと、関数オブジェクトに備わっているprototypeという仕組みを利用することでクラス定義をエミュレート出来ます。
具体的には以下のように記述します。

var Person = (function() {
  function Person(name) {
    this.name = name;
  }

  Person.prototype.greet = function() {
    alert('Hello ! My name is ' + this.name);
  }

  return Person;
)();

Personクラスは初期化時に name という変数を受け取り自身の name プロパティに格納します。そして greet というメソッドを持っていて、nameプロパティを連結した挨拶文をアラートする動作をします。

このPersonクラスからインスタンスをインスタンスを生成するには new Person(‘name’) という形で初期化関数を実行します。

var yamagata = new Person('yamagata');

greetメソッドの実行はこうです

yamagata.greet();

Elementクラス

そして今回のために実装したElementクラスはこちらです。

var Element = (function() {
  function Element(el) {
    this.el = el;
    this.id = this.el.id;
  }

  Element.prototype.classes = function() {
    return this.el.className.split(/\s+/);
  };

  Element.prototype.removeClass = function(targetClass) {
    var classes = this.classes();
    for (var i in classes) {
      if (classes[i] === targetClass) {
        classes.splice(i, 1);
      }
    }
    this.el.className = classes.join(' ');
  };

  Element.prototype.addClass = function(targetClass) {
    var classes = this.classes();
    for (var i in classes) {
      if (classes[i] === targetClass) {
        return
      }
    }
    classes.push(targetClass);
    this.el.className = classes.join(' ');
  };

  Element.prototype.hasClass = function(targetClass) {
    var classes = this.classes();
    var exist = false;
    for (var i in classes) {
      if (classes[i] === targetClass) {
        exist = true;
      }
      if (exist) break;
    }
    return exist;
  };

  Element.prototype.isEqual = function(targetElement) {
    return this.el === targetElement;
  };

  return Element;
})();

class属性を操作する場合、複数のclassを扱うことを考慮しなければいけないので、スペースで分割した配列を返す classes メソッドを実装しました。
addClass と removeClass はその配列に対して操作を行う仕組みです。

配列に要素を追加する場合は、末尾に追加する push というメソッドがメソッドが便利です。
また、配列から要素を削除する場合は、spliceというメソッドが便利です。これは削除したい要素のインデックスとそのインデックスの位置から何個の要素を削除するかという個数を指定します。今回は常に1つの要素を消すように 2番目の引数には 1 を渡しています。

var fruits = ['apple', 'banana', 'melon'];
fruits.splice(1, 1); // => bananaが削除される

また特定のclass属性を持っているかチェックをする hasClass と html要素自体が一致しているかをチェックする isEqual も実装しておきました。

このElementクラスを使用するためにはhtml要素を渡して new しなければいけませんので、以下のようにしてタブのボタンをElement化します。

var tabNavItems = [];
var tabNavItemElements = document.querySelectorAll('.tab-nav__item');
for (var i in tabNavItemElements) {
  if (typeof tabNavItemELements[i] === 'object') {
    tabNavItems.push(new Element(tabNavItemElements[i]));
  }
}

.tab-nav__item が付いているhtml要素を全て取得し、1つずつnew Elementしているのですが、typeofで取り出した要素が確実にhtml要素であることを確認しています。
これはfor文では配列のプロパティである length (中身は整数)も取り出してしまうためです。

まとめ

class属性を操作する準備は整いました、普段jQueryで行っている処理もわりと簡単に作れてロジックを書く勉強にもなるのでおすすめです。一度くらい車輪の再発明をしてみるのもいいと思います。
次回はクリックイベントを監視してどのようにタブの切替を行うのかをご紹介します。

標準
blog-0221b
Design

ブログをプチリニューアルしました

こんにちは!新人森田です。
今日はアプリ博2014を見学してまいりました。
ユーザーでいるだけでは気付かないようなアプリの裏側を垣間見ることが出来たり、
名刺交換させていただいたりととても良い刺激になりました。

マーケットに山ほどあるアプリの中から選んでもらえるものを作れるように
デザインももちろんですが技術の理解も深めていきたいと思いました。

ブログプチリニューアル

さて、ハレノヒブログのリニューアルから早くも約1ヶ月が経ちました。
実装された時は嬉しいだけだったんですが、自分たちで実際に使ってみると改善点がちらほら。
修正箇所を挙げてどう進めていこうか相談していたところ、ちまちま直していくよりは思い切って作り直そうという結論になりました。

早速デザインの見直しをして、昨日プチリニューアルしました!

今回は、様々な制作会社のブログを観察しながら制作を進めました。
その作業の中で気付いた点をいくつかまとめたいと思います。

他ブログとの比較をして気付いたこと

デザインルールを意識する

リニューアルするにあたって、「デザインルール」をもう少し意識してみました。

ハレノヒブログの場合はヘッダーを水色・背景をうすいグレー・コンテンツは白地に黒文字としています。
そのルールに従って、各サブカテゴリのタイトル部を水色の帯にしたらメリハリがつきました。

また、今まで白だったフッターを濃いめのグレーにしてフッターとしての存在感を出してみました。
さらにそれに従って、記事の下のページングを同色にして同類っぽさを出してます。
濃いめのグレーに黒文字だと印象が重すぎる気がして、文字をグレーにしたところもちょっとしたポイントです。

ゆったりとしたマージン

ブログといえば情報量が多いし、いかにコンパクトに詰め込むかと考えていたのがそもそも間違いでした。
情報量が多いからこそ1つ1つの要素に広めの幅を取ることで、どこを見るべきかが分かりやすくなるんだと思います。
今までほとんど5pxだったmarginやpaddingを部分的に15px〜30pxくらいにしてみたら、窮屈感がなくなって広々と見やすくなりました。

フッターエリアが広い

フッターといえば会社のロゴやリンクやコピーライトを表示するだけの簡潔であまり幅を取らないエリア、というのが今までの認識でした。
でも改めてフッターに注目してみると、工夫する余地は十分あるんだと気付かされました。

今回フッターエリアを縦に3分割して使ってみることに。
会社情報がちょっと豊かになって、名前の文字列だけじゃないものも伝わるような気がします。

ソーシャルボタンの設置位置

これは一覧ではなく記事のページについてです。
前はツイートボタンなどは記事の頭の部分に設置していたんですが、これも良くありませんでした。他のブログでなぜソーシャルボタンを記事の上下に2カ所設置しているのかを改めて考えると、

上部:その記事の人気指数を表して、読みたくさせる
下部:記事を読み終えた後にボタンを押す、という流れをつくる

ということなんじゃないかと思います。

なのでソーシャルボタンを記事の上下に設置してみました。(押していただけるとやる気倍増します)

まとめ

結論からいえばブログはあくまでブログなので、パーツの寄せ集めなんですよね。
個性を出す部分はある程度決まっていたり。

でも色々見ながら作り直してみることで、思い込みで作っていたことに気付かされたりもしました。

まだまだ改良点はありますが、プチリニューアルしたハレノヒブログをよろしくお願いします!

標準
IMG_5256
Development

Vanilla JavaScriptを書いてみよう その1

ブラウザ内でアニメーションをさせたり、ユーザーの操作に反応して何かを行う場合必要になるのがJavaScriptです。

最近でこそJavaScriptは便利なライブラリやプリプロセッサが充実してるので、JavaScriptを使ったプログラミングは簡単に始められて楽しいものですが、一昔前まではブラウザ間の差異に悩まされめんどくさいという印象が強かったのでは無いかと思います。

そこで登場したのがjQueryでした。便利なセレクターやメソッドチェーンで簡潔にわかりやすく、そしてクロスブラウザで動作するスクリプトを書けるとあって、これ以外に選択肢を考えることすら無くなったのではないかと思います。

ところで昔からweb制作ではIE対応に悩まされてきた方が多いと思いますが、時代は流れ悪名高いIE6や7の対応はほぼ無くなって2014年現在ではIE8以上としている場合が殆どではないでしょうか。IE8ですら最近は切り捨てられることも増えてきているようです。

さらに最近のブラウザのJavaScriptは進化していて、今までjQueryの領域だと認識されていた部分にも素のJavaScriptが追い付いてきているようです。タイトルにも書きましたが、Vanilla JavaScriptというのは新しいライブラリやフレームワーク等ではなく、素で真っ白な状態のJavaScriptという意味です。

Vanilla JavaScriptだと何がいいのか?jQuery等の読み込みが無くなるのでhttpリクエストをひとつ減らせます。ただ最近ではサイトの公開時にJavaScriptをファイル1つにまとめてを圧縮しておくことも多くなったのでそこまで大きなメリットのようには思えません。ただスマートフォンやタブレットが普及しサイトの半数近くがそれらのモバイルデバイスであり、PCにおいてもモダンブラウザが多数を占めているなら簡単なものはVanilla JavaScriptで書くことで読み込みや実行速度を高めることに一役買うでしょう。

またjQueryの内部ではなにが行われているのか?全ての処理がjQueryの独自実装で動いているのか?そんなことはありません。実はブラウザに同様の機能がある場合はそちらを使うように設計されています。ですのでアニメーションなどは行わずにシンプルなDOM操作のみの場合はjQueryの旨味を十分に発揮させていないことがあるのです。

今回はそんなVanilla JavaScriptではコードをどのように記述していくのかを紹介したいと思います。

イベントの登録を行ってみよう

まずはなにはなくともブラウザ上で動くJavaScriptといえばイベントハンドリングが出来ないと話になりません。なぜならhtmlが読み込まれDOMが構築された後でないと満足にページ内の操作が行えないからです。

body要素にonload属性を追加して関数を実行したり、windowオブジェクトのonloadプロパティに関数を代入する方法でも確実にDOM構築後にスクリプトを実行することが可能ですが、せっかくならjQueryで普通にやっていることを置き換える形で試してみたいと思います。

<script type="text/javascript">
   function start() {
     ...
   }
 </script>
 <body onload="start()">
   ...
 </body>

これでも動くし

<script type="text/javascript">
   window.onload = function() {
     ...
   }
 </script>

これでも動くけど…

<script type="text/javascript">
   jQuery(function($) {
     ...
   });
 </script>

せっかくならこれに置き換わる形で書こう!

JavaScriptでイベント登録を行う関数といえばaddEventListenerがありますが、残念ながらこれはIE8では動作しません。ではどうするか?IE8以前にはattachEventという関数があります。これをif文で使い分けるようにするaddEvent関数を作って対応しましょう。

function addEvent(obj, event_name, handler) {
   if (obj.addEventListener) {
     // addEventListenerが使える場合
     obj.addEventListener(event_name, handler, false);
   } else if (obj.attachEvent) {
     // attachEventが使える場合
     obj.attachEvent('on' + event_name, handler);
   }
 }

次にこれを使ってDOM構築が完了したイベントにハンドラを登録するには以下のようにします。

addEvent(window, 'load', function() {
   alert('Hello');
 });

上記のように書けばwindowのloadイベントに対して何度イベントハンドラを登録したとしても先の処理を上書きすること無く全てが実行されます。

addEvent(window, 'load', function() {
   alert('Hello');
 });
 addEvent(window, 'load', function() {
  alert('World');
 });

HelloにつづいてWorldもアラートされるはずです。

jQueryのようにHTML要素を取得できるquerySelector、querySelectorAllを使ってみよう

イベントハンドリングの壁は超えられたので次にhtml要素を取得してみましょう。

jQueryの大きな特徴としてcssのように使える便利なセレクターがあります。これはページ内にあるDOMノードをJavaScriptから見つけるために欠かせない手順ですが、従来のJavaScriptではあまり開発者にやさしくないものでした。

しかしモダンなブラウザはもちろんIE8以降で使える関数でquerySelectorとquerySelectorAllという2つがあります。前者はセレクタに該当する最初の要素を取得し、後者はセレクタに該当する全ての要素を取得して配列で返してくれます。

<h1>Hello</h1>

このような要素があったとして

addEvent(window, 'load', function() {
  var h1 = document.querySelector('h1');
  alert(h1.innerText);
 });

というスクリプトを書くとh1要素の中身のテキストがアラートされます。 ちなみにquerySelectorを使った場合はh1要素が複数あった場合最初の要素のみ取得されるので

<h1>Hello</h1>
<h1>World</h1>

この場合もHelloのみがアラートされます。

querySelectorAllを使った場合は要素は配列に格納されて返されますので

addEvent(window, 'load', function() {
  var h1s = document.querySelectorAll('h1');
  for (var i in h1s) {
    alert(h1s[i].innerText);
  }
});

と書くとHelloにつづいてWorldもアラートされます。

さらにこれらの関数の便利な点はDOMツリーのスコープが適用されるというところです。上記の例ではdocumentオブジェクトというwindowオブジェクトに続く2番めに大きいオブジェクトですので要素の検索はページ全体に渡ります。しかし2つ目のdiv要素の中にあるh2のテキストのみをアラートしたい場合はどうすればよいでしょうか。しかもh2にはclassもidも降ってないとしたら検索は更に困難になります。

そのような場合にquerySelectorのスコープを活用すると便利です。

<h2>zero</h2>
<div>
  <h2>first</h2>
</div>
<div>
  <h2>second</h2>
</div>

このような要素があるとして

addEvent(window, 'load', function() {
  var h2 = document.querySelectorAll('div')[1].querySelector('h2');
  alert(h2.innerText);
});

このようにすればsecondとアラートされます。
まず最初にdocumentの持っているスコープから2番目のdiv要素を見つけ、そのdiv要素の中にあるh2を見つけたという流れです。querySelectorAllで見つかった要素は配列に格納されているので2番目の要素は[1]で取り出せるというわけですね。

まとめ

いかがでしたでしょうか?このエントリーで書いたJavaScriptはIE8でも問題なく動きます。ちょっとした処理ならjQuery無しで書いてみようかな?という気が少しでも持てれば幸いです。
若干jQuery使用時に比べると簡潔ではありませんが、それでも工夫次第(例えばメソッドチェーンを多用しすぎないとか、別の処理は行を分ける等)で綺麗に書くことも可能だと思います。なによりライブラリに頼らないことでよりJavaScriptに対する理解が深まるのはいいことですよね。

次回では取得した要素に対して変更を行い、実践的な内容に挑戦してみたいと思います。

標準
iphone
Development

iPhoneでメモリを開放する方法

iPhoneアプリを開発しているときはもちろん普段使いの場合でもiPhoneの動作が重たくなったりしていませんか?

まずはマルチタスクで起動しているアプリを全部終了させる事が大事です。
ホームボタンを2回押して並んでいるアプリの画面を上に向かってスワイプすれば終了できますよね。

IMG_2034-6

でもこれだけだとメモリ上にデータが残っている場合があるんです。

ではどうやってメモリを確実に開放するのか、それは

  1. 適当なアプリを起動する
  2. 起動したらスリープボタンを長押し
  3. 電源を切る表示がでたらスリープボタンを離す
  4. ホームボタンをアプリが勝手に終了しホーム画面に戻るまで長押しする

これで出来ちゃいます。

なんか動作が重いなぁとか、メモリに余裕がある状態でデバッグしたい時とかにお試しください!

標準
mbd-cover
Releases

iPhoneアプリ「真ん中バースデー」をリリースしました(Titanium mobile&Alloy製)

本日真ん中バースデーというiPhoneアプリをリリースしました!

AppStoreで “真ん中バースデー” と検索していただくか上記のウィジェットのボタンを押すとダウンロードできます。

デザインはもちろん弊社の新人デザイナー森田が担当しています。
プログラムはTitanium mobileとAlloyを使って書きました。

こんなアプリです

自分の誕生日と、恋人や友だちの誕生日のちょうど中間の日、それが真ん中バースデーです。

なんでもない日だけど記念日にしちゃおう!例えば入籍する日を迷っていたり、デートに誘うきっかけになればと思って作りました。

mbd

遊び方

まずFacebookアカウントが必要です。なぜならFacebookのプロフィールと友達リストを利用するからです。

Facebookアカウントと同期が完了すると友達リストが表示されるので、真ん中バースデーを知りたい友だちを選んで調べるボタンを押すだけです。

iPhoneユーザーの皆さんダウンロードお願いします

標準
enchant_js_wht_1
Development

一日でゲームをプログラムする

先日のバレンタインデー(2014年2月14日)弊社ホームページに特別企画として、”イケメンにチョコを渡しに行く女の子を阻止する”という内容のゲームを公開しました。

『イケメンばかりにチョコは渡さない』
スクリーンショット 2014-02-17 10.44.59

バレンタインデーの2日前に何か面白い企画は出来ないかな?と話し合って、シンプルなゲームなら面白そうだしやってみようという勢いだけで始めました。

僕の中ではゲームを作ると決めた時、真っ先に浮かんだのはenchant.js。数年前からブラウザゲームのフレームワークとして有名でしたのでこれ以外に選択肢は思いつきませんでした。

ドットインストールでenchant.jsの使い方を知る

enchant.jsはなんとなく「Spriteとか使うんでしょ」「フレームレートとか設定するのかな」ぐらいのぼんやりした認識しか無かったので、まずは基本を知るためにドットインストールの入門レッスンを全部見ました。

ドットインストールの解説わかりやすいですね。レッスン12回を見ただけですぐに開発を始められました。

しかしenchant.jsが最初に話題になったころはdiv要素の背景に画像を入れてcss制御で動かしていたような…という気がしていたんですがやはりv0.6あたりから全面的にcanvasに切り替わっていたんですね。

Sprite、Labelという基本クラス

簡単なものならこの2つのクラスを使うだけで乗り切れそうですね。

Spriteはキャラクターなどのバリエーションのある画像素材を1つにまとめたものを簡単に扱えるクラスです。

chara1

 

上のクマはenchant.jsのサンプルに用意されているものですが、歩く動作のコマが全て同じpng画像にまとめられていて、Spriteクラスの機能でコマの切り替えなどが簡単に出来ます。

Labelは文字列を扱うクラスで、点数表示や時間など変化する部分に向いています。

実際今回のゲームは殆ど全てがSpriteとLabelを配置しただけで出来ていて、後はそれぞれのオブジェクトのクリックイベントやフレーム毎に歩く方向を指示しているだけです。

オブジェクトは継承して作った

enchant.jsのクラスを使う方法はざっくりと2つあって、Spriteクラス等をnewするか、Spriteクラス等を継承したクラスを作りnewして使うかです。

今回は殆どのオブジェクトの為に継承クラスを作りました。一見継承をしてからインスタンスの生成をするので手間がかかるように思いますが、実際は手間がかかる印象はあまり無く、むしろコードの見通しが良くなって開発が捗ったと思います。

例えば背景を表示するためのSpriteですが

var bg = new Sprite(STAGE_WIDTH, STAGE_HEIGHT);
bg.image = core.assets['/assets/bg.jpg'];
bg.x = 0;
bg.y = 0;
core.rootScene.addChild(bg);

と書くところを

var Bg = Class.create(Sprite, {
  initialize: function() {
    Sprite.call(this, STAGE_WIDTH, STAGE_HEIGHT);
    this.image = core.assets.['/assets/bg.jpg'];
    this.x = 0;
    this.y = 0;
    core.rootScene.addChild(this);
  }
});

new Bg;

と書いたわけですが、若干コード量が増加しています。しかし、こうすることで背景画像はこうゆうものだと言う意図が明確になると感じていて、さらに定義と生成が分離できるので扱いやすいと思います。
もっと言うと上記の例では登場しませんが、継承パターンの場合だとプロパティを設定する際に一時的な変数を作ってもスコープがあるというのもメリットかと思います。

もちろん今回のゲームのように同じキャラクターを沢山生成する場合には継承クラスを作成することになると思いますけどね。

ロジックは単純、ゲームはデザインが大事

オブジェクトの生成とイベントハンドリングのやり方が分かれば後はキャラクターの動作や時間に応じた難易度の調整しかやることは残されていませんでした。

ゲームの内容が単純ですから一定間隔にキャラを生成し、10秒毎にその間隔を短くしていくという処理だけです。ゲームの基本部分を実装するのに2時間ほどかかりました。残りの時間はデザインされた画像の設定などです。

デザインが施されていくにしたがってただのオブジェクトだったものがキャラクターに進化し、背景が入れば世界が広がっていく感覚はとても楽しいものでした。ゲームの魅力はデザインなのだなぁと改めて感じました。
今までwebの仕事はデザインとプログラミングが高度に融合していなければいけないと感じていましたが、その点ではゲームに勝るものはありませんね。これこそ総合芸術という感じがします。

まとめ

プログラムサイドからは以上です。作ってみて感じたのはenchant.jsは凄いし、ゲームはシナリオやデザインが命だということです。これからも機会があればenchan.jsでブラウザゲームを作ってみたいですね。

あと、canvasの動作はとても軽快でゲームのド素人が適当に書いただけでこんなに安定したものが作れるとは思っていなかったのでかなり驚きでした。canvasを使ってflash的なコンテンツもチャレンジしてみたくなってきました!

標準
title-2b
Design

一日でゲームデザインをする

こんにちは!新人森田です。

皆様『イケメンばかりにチョコは渡さない』は楽しんでいただけていますか?
今回はゲーム制作の裏話をデザイナーサイドから書いてみたいと思います。
デザイナーサイドとかニヤニヤしちゃう響きです。

ゲームの素材を作る

まずはどんなゲームを作るか、企画会議です。

バレンタイン前々日に山形師匠の発案によりゲーム制作が決まり、色々とアイデアを混ぜ込んでゲームの仕組みを考えました。
…てことは制作期限1日ですか!
使用ツールはPhotoshopでどこまでいけるかやってみます!

世界観づくり

ゲームの企画が固まったら、どんなビジュアルにするかイメージを膨らませます。
登場人物はイケメンと女の子。場所は多分日本。時代はなう。

0214-4

手書きで色々とスケッチしてみました。お色気オネーサマはボツです。

0214-3

スケッチを元にPhotoshopで清書ってほどでもないラフを書きました。

でも今回のゲームはドット絵を使いたいので、本番はこれからです。

ドット絵を作る 1

ドット絵と言われても、にわか知識しかないしちゃんと作るのはこれが初めてです。
期限内に出来上がるのかも怪しいところ。

でもとにかくやらなきゃ始まらない、ということでここからは面白法人カヤックさんのデザイナーブログを参考にしました。

0214-5

まずさきほどのラフを縮小して荒くします。

その上にレイヤーを作って1ピクセルの鉛筆ツールで清書します。
普通に絵を描く感覚でなぞってから、いらないドットを消すという感じで作業しました。
0214-6

ブログ通りにやっただけでもうそれっぽくなってきました。

輪郭線のレイヤーの下に色塗り用のレイヤーを作って色を塗っていきます。
以前どこかで「ドット絵はビビットな色の方がいい」的な情報を見かけたような気がするので、一度色を置いてから彩度を上げました。あと、子供向け戦隊モノみたいに一定の色相を使った方がキャラのイメージが湧くかなと思って、ある程度系統を決めて塗ってみました。

0214-7

青系コーデにピンクのシャツで女子力アッピルです。
ビビットな塗り分けの為、陰は焼き込みカラー、ハイライトはオーバーレイに設定してあります。

見よう見まねでしたが、なんとか出来ちゃいました。
人間やろうと思えば出来るんですね。

ドット絵を作る 2

この子が歩いてくれなければゲームになりません。
先ほどのドット絵とにわか知識を元に動きをつけてみます。

0214-8

こうして大きくすると粗さが目立ちますすみません。

歩くのは足の動きが一番大事ですが、頭の高さや肩の高さ(=チョコの高さ)、髪の揺れを表現すると歩いてる感が出るかなとやってみました。微妙に頬のテカリなども変えてあります。
この辺は昔からのゲーマー気質が功を奏しました。
この調子で他のキャラも1〜2ピクセルずつパーツをずらして動きを作りました。

けど、ゲーム内では動きが速すぎてあんまり分からないというかなしみ。

背景を描く

キャラが出来たら背景を作ります。
背景は師匠の一言で「吊り橋」と決まっていたので吊り橋を描きます。
背景に取りかかった段階でもうあまり時間がなく、というかキャラはまだしも背景なんて全然描いたことがなくて、それでもなんとか間に合わせられないものかと頭をフル回転させました。

背景を描く上で大事なのは、「それっぽさ」を出すことかなと思いました。
そんなにしっかり書き込まなくてもそれっぽさがあれば人が勝手に脳内補完してくれる。はず。

0214-10

まずペン先を平たくした適当な太さのラインを引きます。

0214-9

あとは矢印の通りにざっくざっく描いていったら出来上がり。
木の質感はペン先を平筆にして木目っぽくしています。
ほとんどひたすら縦線を描くだけという突貫工事でごり押しました。

0214-11

一番しっかりしてる背景の雲はフリーのブラシ素材です。
「リアルな雲 ブラシ」あたりのワードで検索すると色んなブラシが出てくると思います。
使うか分からないけど一応DLしておいたのが役に立ちました。

各パーツを作る

その他に作ったものは以下の通りです。

  • タイトル兼スタートボタン
  • 得点の背景パーツ
  • 制限時間の背景パーツ
  • 結果表示の背景パーツ

このあたりはほとんど一発描き…
プログラミングと同時進行で足りないパーツを教えてもらって作る、という連携プレイでなんとか1日で仕上がりました。

ドット絵公開

最後に、作ったドット絵を大公開しちゃいます。
地味に表情とかこだわってたりします。
意外と悲しい顔と嬉しい顔って使い回せることも判明。

girl-blueboy

girl-pink

それぞれ「通常・チョコ渡せた・チョコ渡せなかった」バージョンです。

今回も本当に良い勉強になりました。
これで簡単なゲーム作りはばっちこい!と思いたいです!

『イケメンばかりにチョコは渡さない』

http://www.halenohi.jp/

標準
title-2b
Releases

バレンタイン特別企画:イケメンばかりにチョコは渡さない

こんにちは!新人森田です。
しんしんと雪が降り積もるホワイトバレンタイン、皆様いかがお過ごしでしょうか。

寒いし家から出たくない!

でもチョコが欲しい!

そんなあなたに朗報です!
ハレノヒバレンタイン特別企画ゲームを本日リリースいたしました!
その名も、

『イケメンばかりにチョコは渡さない』

http://www.halenohi.jp/

タイトルがタイトルなのと、昨日の予告画像を見た限りではどんなゲームか予想がつかないと思うので、こちらでゲームの内容をご紹介します。興味が湧いたら是非プレイしてみてください。

ゲームスタート

0214-0

ゲームの読み込みが終了したらスタート画面が表示されます。
タイトルをクリックするとゲームスタートです。

プレイ画面

0214-1b

ルールは簡単!

  1. ゲームがスタートしたら、画面左からチョコを持った女の子がイケメンに向かって歩いてきます。
  2. 女の子をクリックすることでイケメンに渡されるはずだったチョコを奪い取れます。
  3. 制限時間50秒の間にどれだけチョコを奪い取れるか?!

内気そうな女の子がチョコを奪われて泣いて帰ったり、チョコを渡せて顔を赤らめているのを見るとちょっと心が痛む場面もあるかもしれません。女の子をいじり倒してチョコを奪いまくるもよし、キラキラのイケメンスマイルを眺め続けるもよし、自由にゲームを楽しんでいただけたらと思います。

—ラスト20秒から、あなたは衝撃の展開を目の当たりにするでしょう

リザルト画面

0214-2

結果画面はこのように表示されます。
「もう一度遊ぶ」ボタンでリトライ出来るので、満足いくまで遊んじゃってください。

(面白いと思ってもらえたらシェアしていただけるととても嬉しいです!)

ちなみにハレノヒメンバーはまだ誰もコンプリート(イケメンにチョコを1つも渡さない)出来ていません。コンプリート出来たら、どんな風に達成出来たかご指南ください。

ハッピーバレンタイン!

それでは男子も女子もイケメンのかたもそうでないかたも、
「イケメンばかりにチョコは渡さない」をプレイしてハッピーなバレンタインをお過ごしください!

『イケメンばかりにチョコは渡さない』

http://www.halenohi.jp/

標準
title-2b
Releases

バレンタイン特別企画予告

こんにちは!
オフィスの近くにワインショップを発見し、いつか行こうと計画中な新人森田です。

本日はハレノヒバレンタイン企画のお知らせです。
とってもすごく楽しいバレンタインゲームを作りました!

タイトルのイメージ画像だけこっそり貼っておきますね。

title

こ、このリア充に牙をむくようなタイトルと謎の吊り橋は一体…?!

明日のリリースをどうぞお楽しみに!

標準
bem
Development

CSSの命名規則をちゃんとやるためにBEMはいい選択だと思う

ちゃんとしたCSSを書くのは難しい

CSSはHTML要素の要素名、id名、class名をセレクターとし、プロパティを定義していくだけの単純なものですが、メンテナブルなものを書こうとするとかなり難しい。勢いで書いてしまって後から後悔することばかりです。

でも最近はSASS等のプリプロセッサがあるから記述が冗長になるのは大分軽減されましたね。importとかmixinがない環境でCSSを書くなんてもう絶対に嫌。勘弁して下さい。

ScoutがあるからデザイナーさんにもSCSSで書いてもらえるし、本当に助かってます。

ボキャブラリーが貧しいのもきつい

しかしCSSが酷い場合ってただ冗長なだけじゃなくてセレクターにセンスがなさすぎるって事も乗っかってくる場合が多い。

.text1 とか .img01 なんてクラス名が付いていると、何のためにHTMLとCSSファイルが別になっているのか…と悲しい気持ちになる。連番降るぐらいならHTMLにstyle属性でインラインで書いてくれたほうがまだマシ。

あと、.honbun とか .gazou とかもやめてほしい。ローマ字表現は曖昧なので表記を統一することはできない。例えば僕の名前は孝造(コウゾウ)だけど自分では kouzou とは書かない。絶対に kozo が正しい。だけど同じ “オウ” の発音が入る 画像 の場合は gazo でいいの? gazou と書く人のほうが多いんじゃないでしょうか。
だから日本語じゃなく、意味のある英語で書こうよと思う。

Bootstrapでちょっと助かった

bootstrapが流行って、ボタンなら .btn で、青く目立たせたいなら .btn-primary も一緒につけるんだよっていうのは、書くのも読むのも明快。簡単に綺麗なUIが欲しいという要求を満たす過程で命名手法まで学べちゃうんだから素晴らしい。

あとUIの名前を標準化してくれたんじゃないかなとも思ってます。.navbar なんていい例でそもそも英語でどこまで略していいのかネイティブじゃないと判断つかいないですよね。

構造が伝わらない欠点

ただbootstrap的な表現でも行き詰まることよくあって、曖昧な感じで今までスルーしてきた。
.btn の目立たせたい奴は .btn-primary でいいんだけど、 .btnの中に下向きの矢印入れてドロップダウンを実装したい時とか、矢印は .btn-caret でいいの? さっきのは状態を表してて今度は細部のパーツなのかよと。

文章とか画像の内容に引っ張られる命名から、UIパターンの命名にやっと進化できたのに今度は状態と細部パーツが同じ表現で混乱。実際これでわけがわからなくなったプロジェクトが最近ありました。

BEMは良い

BEMが醜いとか、構造化という縛りに振り回されて辛いみたいな意見もあるみたいだけど、僕はもうこれでいいと思います。

Block Element Modifier の頭文字をとってBEM。UIパーツをモジュール化したものに名前をつけたのが Block。そのBlockの細部のパーツの名前は Element。BlockとElementがそれぞれ変化した状態を Modifer という分類で表現する。

それぞれは以下のように連結して表現すれば名前のどの部分が何を表しているかが明快になります。

.block__element--modifier

先のボタンの例に当てはめればこんな感じに

.btn
.btn--primary
.btn__caret

Elementはアンダースコア2つで連結し、Modifierはハイフン2つで連結するので見事にprimaryとcaretが分類されて用途の違いが表現されています。

さらにこれが凄いのは各名前がワンワードじゃなくても全然問題ないってこと。
非BEMならこんななっていたものが

<ul class="category-list category-list-design">
  <li>
    <h3 class="category-list-title">...</h3>
    <p class="category-list-description">..</p>
  </li>
</ul>

こうなるから

<ul class="category-list category-list--design">
  <li>
    <h3 class="category-list__title">...</h3>
    <p class="category-list__description">..</p>
  </li>
</ul>

どうしていままでハイフン2つつなぎとか思いつかなかったんだろう…。

標準