2012年5月15日火曜日

確率操作とか煽ってますが

コンプガチャ、カギはネトゲ廃人・搾り取り加減

これって、当たり前じゃないの?

「MMOであるアイテムのドロップ率が異様に低くて掲示板に苦情が殺到したので、次のアップデートで確率を上げました。」

を、すごい短いスパンでやってるよ! ってだけだと思うんだけども・・・。

この記事を見ると、

「廃人リストみたいなのがあって、その人にだけ確率を低めで設定して、対象者の課金が10万に達した途端に確率を上げて目的のカードを出させている!」
 
みたいにも読み取れてしまうのがなんていうか罠。

さすがにんなことやってないと思いたい。 いや、実際のところわからないけども、そこが明確になってないこの記事からは叩くところも擁護するところも出てこないと思うんだけどな。

個人的にはUFOキャッチャーもリアルタイムで確率変動されてると思うんだけどどうでしょか。

2012年5月10日木曜日

Android OpenGLゲームプログラミング

Android OpenGLゲームプログラミング Android 2/3/4 & OpenGL ES 1.0/2.0対応 まったくもって売ってない。 しかもAmazonの評価は一つしか無い上に星2つ。 なんなんだ。 どうしてほしいんだ。

2012年5月9日水曜日

ソーシャルゲーム業界が慌ただしいんだが

なんでそんなに騒ぐのかよくわからない。
声高々に「ザマー見ろ!」と言っている人というのはなんかそれによって実害を被った人なのでしょうか。
実際にガチャで月10万だの20万だのを支払った人だとすれば多分その時は自分の意思でボタンを押して購入したんでしょうし。
明細を見て正気に戻ったとか言うんであればそれはそいつが愚かなだけでしょ。普通に。
それで「射幸心を煽られた! 金返せ!」ってみっともないにも程がある。

あと、小学生が数十万使ったとか抜かす親御が幾人かいるみたいだけど、それはあんたらの教育が悪いよ。
なんかのきっかけで海外の友達が出来て毎日海外にその携帯で電話してて月末に数十万の請求が来たら誰を訴えるのさ。

電話代ってそもそも常に確認できるものでもなくて、自分で管理するものでしょ。
その管理能力が無いガキンチョに簡単に規制もかけてない携帯を渡す親の気が知れない。

んで。
なんていうか、このweb界隈で「さっさと規制しろ!」って言っている人っていうのは、ソーシャルゲームをやったことがない、もしくはやってみたけど何が面白いか理解できない人が、「あんなのの何が面白いんだっふんっ!」って拗ねているようにしか見えない。 イソップ童話の「どうせあの葡萄はすっぱいだろう」って言っている狐のごとく。

もしくは。
視点を変えると、ユーザではなく、ゲームクリエイターの可能性もあるかなと思い始めてきた。

つまりソーシャルの方がローリスクハイリターンで会社のマンパワーがそこに集中されていて、作りたくもないソーシャルゲームを作らされている技術者の訴え??

だとすると納得が行くんだけど、そんなに大人数いるとも思えないしなぁ。

ゲーム好きが「最近面白いゲームが出ないのはどの会社もソーシャルゲーム開発に注力してるからだ!」っていう

閑話休題

今回のコンプリートガチャ規制の一番のポイントは

「デジタルデータって景品なの?」

という一点につきると思う。

各種レアカードの『絵』に価値があるわけではないですよね。見たいだけならちょっとググれば出てくるんだし(そもそもそれが問題なのかもだけど)、そのカードを『ゲーム内で使う権利』を示すビットデータのフラグを上げ下げしているだけ。 すなわち『アクセス権』ですよね。
 
この『アクセス権』を一種の優待権、まぁ、ゴルフの会員権みたいなものだと捉えて「景品」とするのでしょうか。

まぁ、なんにせよ消費者庁はコンプで得られるデジタルデータを「景品」とみなしたと。
でもそのコンプのためのカードは、ただの「絵合わせ」の絵であってそれらは景品ではないという状態。

だから結局ガチャそのものは規制されないし、また抜け道のようなコンプガチャよりも秀逸なシステムが出来上がるだけでしょう。

そうだなぁ。
今ちょっと思いついたのは、特定の5枚を集めたら、すごいレアなカードと「交換」してくれるとか。
当然元の5枚はなくなるわけなんだけど、そのレアをまた5枚のカードに「再交換」も出来るなんてのはどうでしょうかね。 あくまでも「トレード」。 そのトレードの相手が胴元であるゲーム提供会社そのものってだけで。

あんまり変わりないかな。 法律には詳しくないなりに調べながら書いたけどー。

まぁ、なんにせよ。
面白いゲームやりたいなら自分でつくりなってことですな。

2012年2月28日火曜日

Androidでポリライン

シューティングゲームなんかでよく見るグネグネ曲がったホーミングレーザー

これを実際に作ろうとすると、中々に負荷がかかるです。
普通のテクスチャと違って頂点が固定化できないのでAndroidでは無理かなーと思ってたんだけどもとりあえずやってみた。

private static final int VMAX = 128;
 private static float v[] = new float[VMAX * 4];
 private static float t[] = new float[VMAX * 4];

 public static void renderPolyLine(Texture tex, Vector vlist, RenderParam param) {
  if (tex.isEnable == false) return;

  GL11 gl = Global.gl;

  int vCnt = vlist.size();
  if (vCnt <= 1) return;
  if (vCnt > VMAX) return;

  final float w = param.sx / 2;
  tex.bind();
  gl.glColor4f(param.r, param.g, param.b, param.a);
  param.setAlpha();

  float uv = 1.0f;
  Vec2 prevPos, pos, nextPos;
  float vx, vy, len;

  for (int i = 0; i < vCnt; i++) {
   prevPos = vlist.get(Math.max(0, i - 1));
   pos = vlist.get(i);
   nextPos = vlist.get(Math.min(vCnt - 1, i + 1));
   //一つ手前と、一つ先のベクトルから、向いている方向を得る
   vx = prevPos.x - nextPos.x;
   vy = prevPos.y - nextPos.y;
   len = (float) Math.sqrt(vx * vx + vy * vy);
   if(len == 0.0f)len = 1;
   vx *= w / len;
   vy *= w / len;

   //指定した横幅に広げる
   v[i * 4] = pos.x + vy;
   v[i * 4 + 1] = pos.y - vx;
   v[i * 4 + 2] = pos.x - vy;
   v[i * 4 + 3] = pos.y + vx;

   //テクスチャもセットする
   t[i * 4] = 0;
   t[i * 4 + 1] = uv;
   t[i * 4 + 2] = 1;
   t[i * 4 + 3] = uv;

   uv -= 1.0f / vCnt;
  }

  gl.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0);
  gl.glTexCoordPointer(2, GL11.GL_FLOAT, 0, Util.makeFloatBufferArchive(t));
  gl.glVertexPointer(2, GL11.GL_FLOAT, 0, Util.makeFloatBufferArchive(v));

  gl.glDrawArrays(GL11.GL_TRIANGLE_STRIP, 0, vCnt*2);

  Vbo.repair();
 }
ソースはこんな感じ。 どこかで見かけたソースなんだけど、描画しようとしているある点の一つ前と1つ後から進行方向を求めて、直行ベクトル(と、その反対)に幅を広げてあげている頂点をセットする感じ。 3Dだと外積だけど、2Dなおでxとyを入れ替えるだけ。 で、UVをちょっとずつずらす(綺麗に0~1に収まるようにする)。 テストでホーミングレーザーをした図
予想通り激重いけど、馬鹿みたいにばらまかなければ使えるかな。 でも、ホーミングレーザーって馬鹿みたいにばら撒くから綺麗なのに。 だめじゃな。 ちなみに、レーザー画像を
にすればこんな感じでファンシー(?)になるのがステキング。

2012年1月11日水曜日

toURI()は使えないの?

一度ハマった穴にもう一度ハマると死にたくなるのでココに書いておく。

Intentで Intent.ACTION_SEND を指定して、ファイルを添付させたい場合に
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("application/octet-stream");
intent.putExtra(Intent.EXTRA_STREAM,ここに添付ファイルのURIを);
startActivity(intent);

って感じなんだけども、このURIの指定をFileインスタンス.toURI() でURIにして指定すると、実行時でExceptionが。

結局、
intent.putExtra(Intent.EXTRA_STREAM,Uri.parse("file://" + Fileインスタンス.getAbsolutePath()));
 
ってやったら上手く行った。

2011年12月12日月曜日

a9padをバージョンアップさせたらoggが再生できくなった

a9padがここに書いてある通り、2.3にバージョンアップできるといういことで、ついついやってしまいました。

動作とかMarketとかは順調なんですが、
今まで動いていた自作のアプリが動かなく。

で、デバッグウインドウで見ると、MediaPlayer.createでnullぽ。

よくわからないんですが、createしようとするものがoggだとnullるっぽいです。
mp3にしてみたら再生出来たので。
でも、SoundPoolでは普通にoggも再生できるのです。

なにこれ。バグ?バグなの?
どうすればいいの??

2011年10月4日火曜日

AndroidでZipInputStream

最近、ColladaをAndroidで表示しようとか頑張ってたんですが(すでに過去形)

Metaseqoiaしかり、Colladaしかり、バイナリじゃなくて、テキストファイルなんですね。

なので、読みやすいという利点はあるんですが、逆に容量が増えがち(アニメーション入れると平気で2~3Mにはなる)
Androidには何気にファイル容量制限があって、機種によっては1Mを超えたくらいでオープンできなくなるし(経験則なので、実際のところは不明)

なので、荒業で「Zip圧縮したファイルを展開しながら読む」って事ができないかなーーと。

JavaにはもともとZipInputStreamという素敵なストリームクラスがあるので、リソース読むにもAssetsから直接読むにも、ZipInputStreamを挟むだけ。

というわけで、Meshクラスのロード部分抜粋
/**
  * Assetsフォルダ内のzipファイルからMeshを作成
  * @param zipName  zip圧縮されたファイル
  * @param loader 使用するローダー
  * @return
  * @throws IOException
  */
 public static Mesh getFromAssetsZip(String zipName,MeshLoader loader) throws IOException{
  int resID = zipName.hashCode();
  //既に読み込まれている
  if (meshMap.containsKey(resID)) {
   return meshMap.get(resID);
  }
  ZipInputStream zis = new ZipInputStream(Global.view.getContext().getAssets().open(zipName));
  zis.getNextEntry(); //これやらないと、ファイルが読み込めないよ。 1zipに複数ファイル入れないでね。
  Mesh newMesh = loader.load(zis);
  meshMap.put(resID, newMesh);
  return newMesh;
 }
 /**
  * リソースに登録されたzipからMeshを作成
  * @param resID  リソースID
  * @param loader 使用するローダー
  * @return
  * @throws IOException
  */
 public static Mesh getResZip(int resID,MeshLoader loader) throws IOException{
  //既に読み込まれている
  if (meshMap.containsKey(resID)) {
   return meshMap.get(resID);
  }
  ZipInputStream zis = new ZipInputStream(Global.view.getResources().openRawResource(resID));
  zis.getNextEntry(); //これやらないと、ファイルが読み込めないよ。 1zipに複数ファイル入れないでね。
  Mesh newMesh = loader.load(zis);
  meshMap.put(resID, newMesh);
  return newMesh;
 }

気をつけるのは getNextEntry(); をやってあげないと、zip内が1ファイルだとしても読み込み準備ができないということ。
ちなみに複数ファイルを圧縮しちゃった場合は知らんぜよ。

これによって、2MぐらいのColladaファイルも圧縮したら200kぐらいになってくれたので、今まで読めなかったファイルも読めるようになったりしました。

いや、もう、Colladaはアニメーションで挫けたので今更ではあるんですが。