2015年12月27日

キルベジ



スマホゲームもう一個。
スマホで今年一番面白いと思ったゲームかもしれません。
へたくそな説明を書くよりも宣伝用動画をみたよーくわかると思います。
迫ってくる敵を狙って撃って爆発させて連鎖させる、そして勝つ。
それだけ。
 
最近の日本でスマホゲーというとカードゲーム的に手駒を集めて、ポチポチ押して、アクション性があってもキャラクターが自動で動いてプレイヤーはそれをみてるだけ〜ってものが多いのですが、そういうのばかりがDLされてばかりってのは寂しいと思いませんか。
まったくもって多様性のないつまらない世界です。
(言っておきますが決してカードゲーム形式がダメだと思ってません。面白いものは面白いです)
 
このゲームみたいに、ゲームの中のキャラクターが強化されるだけでなく、プレイヤー自身の腕前や判断力が上がっていくゲームがもっと注目されていいと思います。
ただポチポチするだけの積み重ねていく形式のゲームばかりだと飽きられた瞬間、恐竜が絶滅したようにスマホの文化が一気に冷めてしまうように思います。
なんにしたって楽しみ方に多様性はあるべきです。
お堅い話になったかもですが、やられて腹が立って、やり返すために努力して勝つ。
プログラム内の乱数に左右されるだけじゃない、自分の手もまた勝因となるゲーム、そういうほうが僕には好ましいです。

posted by B.cos at 21:42| Comment(0) | TrackBack(0) | ゲームレビュー | このブログの読者になる | 更新情報をチェックする

KickBoxing Road To Champion

device-2015-12-27-182654.pngdevice-2015-12-27-182825.pngdevice-2015-12-27-182813.png

GooglePlay:https://play.google.com/store/apps/details?id=com.ImperiumMultimediaGames.KickboxingRoadToChampion
フリー版は自由に対戦相手を決めて戦うクイックファイトだけとなっています。
 
[基本操作]
ジャブ・ストレート:画面右側上の方をタップ
フック:画面右側上の方を右スワイプ
アッパー:画面右側で上の方へスワイプ
ボディジャブ・ストレート:画面右側下の方をタップ
ボディフック:画面右側下の方を右スワイプ
ボディアッパー:画面右側で下の方へスワイプ
ローキック、ミドルキック、ハイキック:左下に赤いボタンが出たらそれをタップ
その他特殊技:右下に青いボタンが出たときにそれをタップ(前蹴り、テンカオ、ジャンプ蹴り、後ろ廻し蹴り、バックハンドブロー)
 
左へ回り込む:画面左側で上へスワイプ
右へ回り込む:画面左側で下へスワイプ
ブロック:画面の右側と左側を同時にタップ
 
スマートフォン用に考慮された操作方法になっている対戦アクションとなっています。
K-1好きだったらモデルが誰なのかわかるくらいしっかりしたグラフィックでモーションもよくできている。
操作もタップとスワイプだけでいろんなアクションをおこせて、操ってる感覚も悪くない。

しかしゲームとしては異常なほど単調なものだったのが残念でした。
相手の攻撃をブロックして、攻撃、相手の攻撃をブロックして、攻撃、の繰り返しで、大技が入ってもダメージはそんなになく、カウンターもありませんでした。(流血はあります)
そのメリハリのない状態を3分から8分くらい繰り返すので、途中から「めんどうくさいなあ。勝てなくてもいいかなあ」とか考えるようになってきます。

そして何よりも痛いのが、キャラクターごとの違いは少々の体力ゲージや攻撃力の違いしかなく、ほとんど同じ技でした。
キャラクターは10人以上いるのにさすがにそれはもったいないな、って思いました。
個人的に「もうちょっと」が欲しかったゲームです。
 
追記:
ちなみに日本の格闘ゲームみたいにコンボゲーと思ってやると痛い目にあいます。
入力した操作は入力された順に確実に実行されます。
よってブロックしたいときにブロックできないし、当てたいタイミングで技が出せず数秒後にテンカオが出てくるとかたくさんありました。
開発者は先行入力を3,4個までで切るべきだったのではと思いました。

posted by B.cos at 19:09| Comment(0) | TrackBack(0) | ゲームレビュー | このブログの読者になる | 更新情報をチェックする

2015年10月18日

学校英語とプログラミングは学習方法が似ている

「学校で習う英語」の成績がよかった人ってプログラマーには向いてるだろうなーと思うのです。

@文法をおぼえて

A単語を覚えて

B文章の意味をくみ上げたり文章を書く

ってで、個人差で限度はあれど学校英語は普通に成績を上げられます。
プログラム言語も「学校の英語」と同様、

@文法をおぼえて

A基礎的な命令文やできあいのごにょごにょを覚えて

B他人の書いたプログラムの意図を読みとったり自分でプログラムを書く

という全く似た基礎学習があります。
ここで重要なのは「習ったことに疑問を覚えずにそのまま為す」ってこと。
プログラム言語を習う人にありがちなのは「どうしてこの文法ははこうなの?」という疑問を覚えてつまづく人がいるのですが、そうなるように作った人がいるからそうなるだけ、としかいえない。
あたりまえですが言葉だって人が作ったもので、人がそうルールを決めてそのルールに従って長年使ってきたんだからそういうもんだとしかいえない。
考えなくていいところで立ち止まって時間を無駄にするくらいなら「さっさと何か作れや」ってな話で。
「ここがよくないとかいうのは人前に出せるもん作ってからにしろや、ひよっこめ」とも言いたくなります(笑)
(C言語でポインタとかで「イメージがつかめなくて」ひっかかる人がいますが、教科書やサンプルにあるものをルールどおりにやればとりあえず動くんですよ。考える前にやってみよーぜってなわけで)

ルール(文法)を守ってそれを繰り返して繰り返して、できることの幅を増やしていくことがプログラミングのオーソドックスな上達法なわけで、それは学校英語の成績をあげるのと似ていると思います。
そこに余計な詮索やオリジナリティは要りません。
僕は情けないことに英会話はできず、学校英語で学んだことは受験と大学内でしか使う機会がここ最近まではなかったのですが、ただ今になってみるとその学習姿勢の基礎があったから全く無縁だったプログラミング言語を独学で使えるようになったのかなと今では思います。(大学での専攻は乱暴に言えばマクロ生物学です)

ここ最近までは……と書きましたが、今は逆に英語の基礎程度の読み書きができないとプログラマーの仕事はできなくなってくるのかもしれません。
わからない技術、ほしい技術があっても、日本語の文献や検索結果がない技術のほうがまだまだ多いからです、、、、、、っていうか日本語で解説されてるのなんて一部に過ぎません。
日進月歩でどんどん効率的に広範囲に使える技術が増えていく昨今です。
ますますそうなっていくでしょう。
また外国人とやり取りする際は絶対英語です。(どんな仕事でも外国人とやりとりできる手を持たないとこれからは厳しいでしょうけど(^^;))
読み書きだけに特化した教育も無駄ではなかったと痛感する今日この頃、37歳の秋です。

posted by B.cos at 22:18| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2015年10月04日

【cocos2d-x】なぜか「assets」ディレクトリが消えた件

メモとして。

cocos2d-x 3.7。

Eclipseでプロジェクトをクリーンしたときは「assets」はちゃんとあった。

実機でテストをしたら画像を読み込む段階で

「assets is nullptr」

と出て実行時エラーで強制終了。

よくみるとプロジェクト内にあった「assets」ディレクトリがない。

あれ?

クリーンをするとまた「assets」は生成される、が、実機テストすると消える。

????

Eclipse再起動してからまたクリーン、実機テストしたら今度は消えなかった。

なんだったんだろ?

posted by B.cos at 14:23| Comment(0) | TrackBack(0) | cocos2d-x | このブログの読者になる | 更新情報をチェックする

【cocos2d-x】runActionに渡すActionインスタンスをシーンクラスのメンバーにしたらアプリが落ちた件(Android)

cocos2d-x 3.7において。

たとえば画面外に置いたSpriteのインスタンスを画面内に引き出して、しばらくしてまた引っ込めるというのをやるときは、よくあるサンプルプログラムではActionのサブクラスを使ってこんな感じで組むと思います。


〜GameScene.cpp〜
bool GameScene::init()
{
〜略〜


}
bool GameScene::onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *event)
{
auto _move1 = EaseOut::create(MoveBy::create(2.0f, Vec2(64.0f, 0.0f)),4);
auto _move2 = DelayTime::create(2.0f);//MoveBy::create(2, Vec2(0.0f, 0.0f));
auto _move3 = EaseIn::create(MoveBy::create(2.0f, Vec2(-64.0f/2, 0.0f)),4);
auto m_moveSequence = Sequence::create(_move1, _move2, _move3, nullptr);
_obj->runAction(m_moveSequence);//_objは初期化済みのSprite等
return true;
}


これでうまくいきます。

ただ僕はここでSequenceのインスタンスをシーン内で共有して使えないかと、GameSceneクラスのメンバ変数にしてみました。


〜GameScene.h〜
public:
Sequence *m_moveSequence;

〜GameScene.cpp〜
bool GameScene::init()
{
〜略〜
auto _move1 = EaseOut::create(MoveBy::create(2.0f, Vec2(64.0f, 0.0f)),4);
auto _move2 = DelayTime::create(2.0f);//MoveBy::create(2, Vec2(0.0f, 0.0f));
auto _move3 = EaseIn::create(MoveBy::create(2.0f, Vec2(-64.0f/2, 0.0f)),4);
m_moveSequence = Sequence::create(_move1, _move2, _move3, nullptr);
}

bool GameScene::onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *event)
{
_obj->runAction(m_moveSequence);//_objは初期化済みのSprite等
return true;
}


これをやったらタッチイベント起こした瞬間に落ちました(笑)

よくわからないけれどcocos2d-xの内部まで追う気力も今のところないので、そういう仕様だと思ってローカルで必要な時にActionを生成して動かすのがあまり時間を食わないで済みそうです。

cocos2d-xは本当にわからないことだらけで、たとえば「自分独自のシーンクラスをつくってそれをスーパークラスにしてぐへへへへへw」とやろうとしてことが過去にありまして。
結果としてよくわからない実行時エラーで落ちて動かず、むしろ「そのまま使った方が楽じゃね?」と悩まされた時期もありました。
人の作ったプラットフォームで便利なのはあるのですが、独学のなんちゃってプログラマーとはいえそろそろ20年選手、もっとうまく(頭を)使えないかなあーとか考える今日この頃でした。
posted by B.cos at 14:13| Comment(0) | TrackBack(0) | cocos2d-x | このブログの読者になる | 更新情報をチェックする

2015年08月07日

シフトシューター - 弾幕相殺ごり押し対戦シューティング、の紹介

シフトシューター - 弾幕相殺ごり押し対戦シューティング
https://play.google.com/store/apps/details?id=com.matsukesoft.Sh2&hl=ja



このゲームはステキです。
何がステキかって、タイマンであることと、指一本で操作することにこだわってよく工夫している点です。

スマホのアクションゲームというのはほとんどゲームコントローラーを模したボタンをスクリーンに置いてしまいがちです。
それはプレイヤーにも比較的伝わりやすいし、他にアイデアがないならば間違いではないでしょう。
ただし指で画面の視界が狭まること、コントローラーと違って押した感触がないため思い通りに操作できているのか混乱する、という2点のデメリットがあります。

そこでコントローラーをスクリーンに貼るのではなく、画面全体をセンサーにして一本の指の挙動だけでキャラを動かす、という選択は一つの正解だと僕は考えています。

シフトシューターは単一のタップがキャラの上移動と攻撃を兼ねているので少々のクセはあって最初は戸惑いますが、上下左右のスワイプと合わせていろんなことができるのでそのうち楽しくなってきます。
(とはいっても僕はゲームは作れても基本へたくそなのでまだ序盤で詰まっていますw)
指一本で移動、射撃、防御、レーザー、ため攻撃などなどが可能で、成長のさせ方で遊び方も変わる。
ボリュームもあって、お得な逸品です。
ポチポチゲームに飽きてきたならば、一度手に取ってみて損はないと思います。

今までゲーム機やPCであったジャンルのゲームをスマホ用に落とし込む際はスマホ用の工夫が必要になると思っているのですが、シフトシューターはその可能性のひとつを示していると僕は考えています。
指一本で自由に操作するために残しておくところと、削るべきところをちゃんと明確にして精査するということはデザイン能力の見せ所だと思います。

少し言葉足らずですが今日はここまで。

posted by B.cos at 00:44| Comment(0) | TrackBack(0) | ゲームレビュー | このブログの読者になる | 更新情報をチェックする

2015年01月20日

【cocos2d-x】ローカルのXMLファイルの読み込み&解析

cocos2d-xでasset内のXMLを読み込んで解析して使う方法を試してみた。
開発環境はEclipse4.4、cocos2d-xはver.3.2、動かした実機はXperiaVL SOL21、AndroidのOSバージョンは4.1。

test.xml(読み込むXMLファイル)

<charadata>
<item>
<id>0</id>
<reach>0.0</reach>
<power>8</power>
<target>0</target>
</item>
<item>
<id>1</id>
<reach>0.0</reach>
<power>8</power>
<target>0</target>
</item>
<item>
<id>2</id>
<reach>0.0</reach>
<power>8</power>
<target>2</target>
</item>
……
</charadata>


cocos2d-x内、cppファイル。
テストXML読み込み、解析、表示。

//ファイルパスの取得
FileUtils* fileUtils = FileUtils::getInstance();
const char* path = "test.xml";
std::string fullpath = fileUtils->fullPathForFilename(path);
log("filepath:%s",fullpath.c_str());

//XMLを読み込んでパース
auto content = fileUtils->getDataFromFile(fullpath.c_str());
tinyxml2::XMLDocument *doc = new XMLDocument();
log("xml:%d",(const char*)content.getSize());
auto ret = doc->Parse((const char*)content.getBytes(), content.getSize());
if (ret != tinyxml2::XML_NO_ERROR) {
//xml
log("xml:fail:%d",ret);
return;
}

//XMLのルートを呼び出す
auto rootElement = doc->RootElement();
if (!rootElement){
log("xml:rootElement Error");
return;
}

//最初の要素を呼ぶ
tinyxml2::XMLElement* childElement = rootElement->FirstChildElement("item");

while (childElement) {
tinyxml2::XMLElement* element_id = childElement->FirstChildElement("id");
log("id:%s",element_id->GetText());
tinyxml2::XMLElement* element_reach = childElement->FirstChildElement("reach");
log("reach:%s",element_reach->GetText());
tinyxml2::XMLElement* element_power = childElement->FirstChildElement("power");
log("power:%s",element_power->GetText());
tinyxml2::XMLElement* element_target = childElement->FirstChildElement("target");
log("target:%s",element_target->GetText());
//次の要素を呼ぶ
childElement = childElement->NextSiblingElement("item");
}


プログラム実行、XML内容表示

01-20 01:43:40.148: D/cocos2d-x debug info(18446): id:0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): reach:0.0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): power:8
01-20 01:43:40.148: D/cocos2d-x debug info(18446): target:0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): id:1
01-20 01:43:40.148: D/cocos2d-x debug info(18446): reach:0.0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): power:8
01-20 01:43:40.148: D/cocos2d-x debug info(18446): target:0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): id:2
01-20 01:43:40.148: D/cocos2d-x debug info(18446): reach:0.0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): power:8
01-20 01:43:40.148: D/cocos2d-x debug info(18446): target:2
01-20 01:43:40.148: D/cocos2d-x debug info(18446): id:3
01-20 01:43:40.148: D/cocos2d-x debug info(18446): reach:0.0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): power:8
01-20 01:43:40.148: D/cocos2d-x debug info(18446): target:2
01-20 01:43:40.148: D/cocos2d-x debug info(18446): id:4
01-20 01:43:40.148: D/cocos2d-x debug info(18446): reach:0.0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): power:8
01-20 01:43:40.148: D/cocos2d-x debug info(18446): target:2

……


こんな感じでできました。

ちなみにファイル読み込み時にtinyxml2::XMLDocument::LoadFileを使ってみたのですが、正常に動けば0を返すところが、Androidでは3を返してちゃんと動作しませんでした。

const char* path = "test.xml";
std::string fullpath = fileUtils->fullPathForFilename(path);
tinyxml2::XMLDocument *doc = new XMLDocument();
auto ret= doc ->LoadFile(fullpath.c_str());
if (ret != tinyxml2::XML_NO_ERROR) {
//xml
log("xml:fail:%d",ret);
return;
}

この3が何を意味するのか詳しく調べないとわからないのですが、できればLoadFileメソッドを使いたかったなと。
こちらのほうがコードが簡素に書けるので。
iPhoneだとどうなんだろうか?

posted by B.cos at 02:17| Comment(0) | TrackBack(0) | cocos2d-x | このブログの読者になる | 更新情報をチェックする

2015年01月08日

cocos2d-x、開発基礎、まとめ2

@[C++] Cocos2D-xでゲームを作る前の準備
http://qiita.com/edo_m18/items/4a53eee51bbc95974770
↑C++の使い方の復習、、、というかそれ以前に知らんことだらけ。

ApicoJsonに関して
cocos2d-xでJSONを使う
http://nirasan.hatenablog.com/entry/2013/10/24/232905

picojsonを使ってみる
http://ameblo.jp/systemtelescope/entry-11820880734.html

【cocos2d-x】picojsonでJSONファイルを読み込む
http://tsuyushiga.hatenablog.jp/entry/2014/06/04/232104
(ローカルファイルから読み込む方法)

picojsonを使用してHTTP(POST)通信する
http://qiita.com/hkomo746/items/214d0482b6090c0a3ce0
(HTTP通信使用)

BHTTP通信をcocos2d-xで使う際の注意
cocos2d::network::HttpClientを使う際はAndroid.mk内の

LOCAL_WHOLE_STATIC_LIBRARIES += cocos_network_static

及び

$(call import-module,network)

のコメントアウトを外す。


CXMLを解析
【cocos2dx】XMLを利用してサーバーと通信する。
http://albatrus.com/main/cocos2d/6239

DC++のキャストについて
C++ のキャスト - static_cast
http://yohshiy.blog.fc2.com/blog-entry-17.html

C++のキャスト演算子
http://www.geocities.jp/bleis_tift/cpp/newcast.html

static_cast
http://www.wdic.org/w/TECH/static_cast

Eオマケ
どう見ても確信犯…!! 表紙詐欺に全力を尽くした「ヤマノススメ」のパロディ本が話題に
表紙をめくったら、女子高生がゴツいおっさんに…
http://togech.jp/2015/01/05/17258

俺のあおいたんが・・・・・・俺みたいに・・・・・・ッッ!!
posted by B.cos at 01:38| Comment(0) | TrackBack(0) | cocos2d-x | このブログの読者になる | 更新情報をチェックする

2014年12月20日

cocos2d-x、開発基礎情報、まとめ

@データ連携
Cocos2d-xでシングルトンによる画面間データ連携
http://qiita.com/prototechno/items/5eca8aab0dbd3f33273c
cocos2d-xは画面を一個のクラスとして扱うのが"作法"なのでこれが一番効率がいい。
さらにベストなのは画面の基底クラスを作って、ステージをサブクラスで表現するように作成することだろう。

A9-patch画像の使用方法。
Scale9Spriteを使う。
Androidベースのやり方と違ってて、半日無駄にした。

Cocos2d-x V3.0 rc0 で extensions 系の使用
http://qiita.com/yonesuke/items/07f91a826506685b32b8

cocos2d-xのCCScale9Spriteで画像を部分的に引き延ばす
http://brbranch.jp/blog/201312/cocos2d-x/cocos2dx_ccscale9sprite/


B画像アクションについて
cocos2d-xのアクションまとめ
http://brbranch.jp/blog/201309/cocos2d-x/cocos2d-x_animation/


C文字列の使い方
リンク先はLua言語(from Brazil)だけど。

ラベルを使う基本
http://qiita.com/senchan05/items/65b43a8ec7c3899c4eb9


Dver.3.xを使う上で必要なポイント
未だに書籍はV2仕様のものだらけなので。
(ゲーム会社によっては今運営しているゲームがver.2.xを使っているからver.3.xへ移行できないという事情もある)

COCOS2D-X-V2からV3 への変換まとめ
http://kaniace.com/blog/tech-blog/cocos2d-x-v2-%E3%81%8B%E3%82%89-v3-%E3%81%B8%E3%81%AE%E5%A4%89%E6%8F%9B%E3%81%BE%E3%81%A8%E3%82%81/

posted by B.cos at 16:05| Comment(0) | TrackBack(0) | cocos2d-x | このブログの読者になる | 更新情報をチェックする

2014年11月23日

「GROUNDLESS」単行本化と影待蛍太さんという漫画家。

DSC_2229.jpg


無料版は本家HP、有料からは「パブー」で読んでたWEBコミックの「GROUNDLESS」が単行本化されていた。
やはり紙の本のほうが読みやすい。
話は何もかもを失った武器商人の未亡人が狙撃手としての生き方を選んだって話なんだけど、細かいこと抜きでとても面白い。
舞台は島国アストリア、人種差別、主権国と属国、伝染病「腸腐れ」、市民解放軍、島軍、各町の自警団、複雑すぎる事情のなかで登場人物が「いろいろな事情」をもって生きてる、その人物描写だけでも僕はおなか一杯になる。

作者の影待蛍太さんを知ったのには5,6年くらい前にみた2ちゃんのWEB漫画まとめで、そこの読み切りが病気退職してしばらく呆けてたときの気持ちとシンクロするところもあったんだけど、深くのめりこんでしまったんですね。
ホームページ:http://www.coldturbine.com/
無料漫画:http://www.coldturbine.com/manga_free.html

GROUNDLESSもそうなんだけど、影待蛍太という作家の描く「周囲との距離の取り方が下手な人間」とその「周囲」の感覚が、僕だけかもしれませんが、リアリティがあるんです。
特に眼が猫と同じで、猫と同じく夜行性で差別の対象になってる主人公を描いた「猫眼」、主人公と会社同僚の本音が交錯して実はすれ違っていたときの居心地の悪さは秀逸だと思った。
ネガな人間の気持ちの微細な部分を描くのがうまいな、と思ったのですよ。
猫眼:http://www.coldturbine.com/nekome01.html

P.S.GROUNDLESSは最初の方と最新話だけ無料でもみられます。
http://www.coldturbine.com/manga_ppv.html
posted by B.cos at 00:18| Comment(0) | TrackBack(0) | 書籍 | このブログの読者になる | 更新情報をチェックする