ゆとりーなの日記

日記的な事を書いて行くと思はれる

まさかの実機購入

だってですね、無改造のPSPで自作アプリが動かせるって言うんですよ。市場に出回ってるPSP改造するの面倒だから実機購入見送ってたわけですが、動かせるなら購入ですね。
購入して分かったこと。

  • BGMのテンポと音程の狂いはエミュのバグ

実機再生では普通に問題ありませんでした。

  • 頂点構造体は専用の関数から領域を引っ張ってくる。

なんかエミュでは普通に動いていたんですが、実機動作させたところ描画が物凄くバグってたので調査したところ原因が判明しました。

  sceGuTexImage(0, 128, 128, 128, texture_list_[id_].pixel());
  // const配列で初期化とかは駄目
  const std::array<image_vertex, 4> vertex = {{
    {u, v, 0xFFFFFFFF, rotate_x(-width, -height, x, angle), rotate_y(-width, -height, y, angle), 0.f},
    {u + width, v, 0xFFFFFFFF, rotate_x(width, -height, x, angle), rotate_y(width, -height, y, angle), 0.f},
    {u, v + height, 0xFFFFFFFF, rotate_x(-width, height, x, angle), rotate_y(-width, height, y, angle), 0.f},
    {u + width, v + height, 0xFFFFFFFF, rotate_x(width, height, x, angle), rotate_y(width, height, y, angle), 0.f}
  }};
  sceGuDrawArray(GU_TRIANGLE_STRIP, GU_TEXTURE_32BITF | GU_COLOR_8888 |GU_VERTEX_32BITF | GU_TRANSFORM_2D, 4, 0, &vertex.front());
  // 大人しく専用関数を使うべし
  image_vertex * const vertex =static_cast<image_vertex * const>(sceGuGetMemory(4 * sizeof(*vertex)));
  vertex[0].u_ = vertex[2].u_ = u;
  vertex[1].u_ = vertex[3].u_ = u + width;
  vertex[0].v_ = vertex[1].v_ = v;
  vertex[2].v_ = vertex[3].v_ = v + height;
  vertex[0].color_ = vertex[1].color_ = vertex[2].color_ = vertex[3].color_ = 0xFFFFFFFF;
  vertex[0].x_ = rotate_x(-width, -height, x, angle);
  vertex[1].x_ = rotate_x(width, -height, x, angle);
  vertex[2].x_ = rotate_x(-width, height, x, angle);
  vertex[3].x_ = rotate_x(width, height, x, angle);
  vertex[0].y_ = rotate_y(-width, -height, y, angle);
  vertex[1].y_ = rotate_y(width, -height, y, angle);
  vertex[2].y_ = rotate_y(-width, height, y, angle);
  vertex[3].y_ = rotate_y(width, height, y, angle);
  vertex[0].z_ = vertex[1].z_ = vertex[2].z_ = vertex[3].z_ = 0.f;
  sceGuDrawArray(GU_TRIANGLE_STRIP, GU_TEXTURE_32BITF | GU_COLOR_8888 |GU_VERTEX_32BITF | GU_TRANSFORM_2D, 4, 0, vertex);

勝手にサンプルを脳内補完してはいけないということですね。