今日の雑記

<< 2013/11 >>
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

back to TOP PAGE

 | 

2013-11-22

[][] Monacaをちょっといじってみた

どうも。某方には「ヒマな人」と認識されているプログラマですw

それはさておき。

クロスプラットフォーム (主に?)モバイル開発環境「Monaca」 http://monaca.mobi/

を軽くいじってみました。

この手のものをいじるとボクはまず「サウンドプレイヤー」を作る性癖があるので、今回もその例に漏れずチャレンジしてみた。

んだけど、そもそも「JavaScript」自体にほとんど親しみがない。というわけで今回も「端末の特定のディレクトリ(それも決め打ち)の中のファイル一覧を取得する」だけでえらい大騒ぎというか大変な思いをした。

その結果が以下。

f:id:isshiki:20131123044626p:image

(↑クリックした先で「オリジナルサイズを表示」をクリックすると大きいサイズで見られます

軽く触ってみた感じ、悪くないとは思います。先にも書いたけど、ボクが肝心なJavaScriptに親しめてないので余慶に時間を食っているのもあって、正確な判断はできませんが。

だってまあ、ボクのJavaScript経験って、↓程度のもので、これだっておそらく10年位前のものですよ。

本日の諺〜日本の心〜 http://homepage2.nifty.com/isshiki/JavaScript/kotowaza.html

最近はこういうくだらないネタさえも作ってないので、正直いろいろイカンなと思っているんですが。

トラックバック - http://d.hatena.ne.jp/isshiki/20131122

2013-11-21

[][]Ingressというゲームを始めた

今日で4日目。詳細はお近くのGoogle先生にお尋ねください。というかGoogle謹製だし。

以下雑感とかその他もろもろ。

今日の成果が勤務中に酷いことになった。レベル上げないとまともに太刀打ちできないなあこれは。そのレベル上げも大変というかチャンスを移動して見つけないといけないのがこれまたなんだけど。やっぱこの手のゲームは初動者が強いというか有利なのはどうしようもないんかねぇ?なんか防ぎようと言うか運営方法はあるとは思うんだが。

基本、(↓)こんなパターンでどうにもこうにもという。

  • ポータルをハックする
  • ポータルに(レベルが低い)レゾーネータを設置
  • 高レベル者に撃破される
  • そいつに占拠されてどうにもこうにも
  • 自軍のポータルの空いてるところにレゾネータを設置
  • 高レベル者に撃破される
  • そいつに占拠されてどうにもこうにも

空っぽのポータルとかあってそれが密集とかしてればまだAPRPGでいうところの経験値)が稼げるんだけど、そんなところはそうそう無いし(あったとしても移動制約の都合上、普段の移動系路上にないとどうしようもない)、ボクが占拠した場所を撃破した上で放置している敵方(これはどうも「また占拠してAP稼いでね!」という意思表示らしいんだが)がいる一方で、そこをさくっと占拠してしまう高レベルの敵方もいましてね。もう、どうしろと。

さらに、ポータルは自分で作ることができるんだけど、当たり前と言うかまあ運営の承認が降りて始めて設置されるんだけど、設置要請出して帰ってきた返信メールには「数週間待ってね!」という、これまた至極全うな返答が返ってきてですね。

結局、レベル上げに数万のAP必要なんだけど、上に書いたような都合の良いポータルが見つからない限りは自軍のポータルのエネルギー回復で地味に稼ぐ(10AP)しかないんですよねー。

運営レベルでなーんかやりようあると思うんだけどなあ。せっかく面白いゲームなんだけど。

トラックバック - http://d.hatena.ne.jp/isshiki/20131121

2013-11-20

[] 3年前に作ってて公開するの忘れてたのを今更公開してみる

LinearRythm http://homepage2.nifty.com/isshiki/LR/LR.zip

ちょっとした事情があって自宅のPCHDDあさってたら出てきて、中の「Readme.txt」見てみたら「2010/05/01」に公開してたことになってるんだけど、どうも公開してないくさいので今更公開してみる。

公開するにあたってちょっといじった。

ちなみにゲーム内容は(Readmeから引用)、

左右から迫りくる。リズム距離感シューティング

左右から敵が迫りくるので、左右ショットで倒してください。

敵に当たるとゲームオーバーです。

スコアは自機との距離に応じて加算されます。遠いほど高得点です。

ショットは画面中に1発しか撃てません。ですが、撃てない間にショットボタン(左右 キー)を押すことで「リズム」を刻むことができます

刻んだリズムはそのまま敵を倒したときのスコアの倍率になります。よりたくさんのリ ズムを刻んでください。

リズムは、「ショットが当たらずにを画面外までいってしまう」とリセットされます

というものらしいです。

あ、あと「D言語」で作ってますソースも中に入ってます。3年前のものなので鼻毛が抜けるほどアレですが。どれだよ。

トップページでの告知はそのうちやるつもりですが、今更感が過ぎるのでやらないかも。

と思ったら、2010/04/30に実験的に公開してたのね...。

でもまあ、TOPページで告知してないしなあ。やっぱ改めてTOPで告知しておくか。そのうちやります(<やらないフラグ<ぉぃ)。

トラックバック - http://d.hatena.ne.jp/isshiki/20131120

2013-11-15

[] cursesテトリス

以前書いた「cursesテトリス」がまあ形になったので公開する。コンソール環境上でC言語環境cursesライブラリインストールされていれば動かせる。

操作方法は「左右」でブロック移動。「上」でブロック回転(時計回り固定)。「下」でブロック落下。「Q」キーで終了。

#include <curses.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

#define FIELD_W (12)
#define FIELD_H (20)

#define BLOCK_N (4)

#define NONE  (0)
#define VWALL (1)
#define HWALL (2)
#define BLOCK (3)
#define V     (VWALL)
#define H     (HWALL)

static int field[FIELD_H][FIELD_W] = {
  { V,0,0,0,0,0,0,0,0,0,0,V },
  { V,0,0,0,0,0,0,0,0,0,0,V },
  { V,0,0,0,0,0,0,0,0,0,0,V },
  { V,0,0,0,0,0,0,0,0,0,0,V },
  { V,0,0,0,0,0,0,0,0,0,0,V },
  { V,0,0,0,0,0,0,0,0,0,0,V },
  { V,0,0,0,0,0,0,0,0,0,0,V },
  { V,0,0,0,0,0,0,0,0,0,0,V },
  { V,0,0,0,0,0,0,0,0,0,0,V },
  { V,0,0,0,0,0,0,0,0,0,0,V },
  { V,0,0,0,0,0,0,0,0,0,0,V },
  { V,0,0,0,0,0,0,0,0,0,0,V },
  { V,0,0,0,0,0,0,0,0,0,0,V },
  { V,0,0,0,0,0,0,0,0,0,0,V },
  { V,0,0,0,0,0,0,0,0,0,0,V },
  { V,0,0,0,0,0,0,0,0,0,0,V },
  { V,0,0,0,0,0,0,0,0,0,0,V },
  { V,0,0,0,0,0,0,0,0,0,0,V },
  { V,0,0,0,0,0,0,0,0,0,0,V },
  { H,H,H,H,H,H,H,H,H,H,H,H }
};

static int block_base[][BLOCK_N][2] = {
  { { +0, +0 }, { -1, +0 }, { +0, +1 }, { +0, +2 } },
  { { +0, +0 }, { +1, +0 }, { +0, +1 }, { +0, +2 } },
  { { +0, +0 }, { +1, +0 }, { +0, +1 }, { -1, +1 } },
  { { +0, +0 }, { +1, +0 }, { +0, -1 }, { -1, -1 } },
  { { +0, +0 }, { +0, +1 }, { +0, -1 }, { +0, -2 } },
  { { +0, +0 }, { +0, +1 }, { -1, +0 }, { -1, +1 } },
  { { +0, +0 }, { +0, +1 }, { +0, -1 }, { -1, +0 } },
};

static int block_tbl[BLOCK_N][2];

static int key;

static int lines;
static int score;
static int px;
static int py;
static int fall_time;
static int fall_wait;
static int block_num;

static void initApp(void)
{
  srand(time(NULL));
  initscr();
  noecho();
  cbreak();
  timeout(16);
  keypad(stdscr, TRUE);
  curs_set(0);
  lines = 0;
  score = 0;
  block_num = -1;
}

static void exitApp(void)
{
  curs_set(1);
  endwin();
}

static void initField(void)
{
  int i, j;

  for(i = 0; i < (FIELD_H - 1); i++){
    for(j = 1; j < (FIELD_W - 1); j++){
      field[i][j] = NONE;
    }
  }
}

static void drawField(void)
{
  int i, j;

  for(i = 0; i < FIELD_H; i++){
    for(j = 0; j < FIELD_W; j++){
      if(field[i][j] == VWALL){
        mvaddch(i, j, '|');
      }
      if(field[i][j] == HWALL){
        mvaddch(i, j, '-');
      }
    }
  }
}

static void initBlock(void)
{
  int i, n;

  do{
    n = rand() % 7;
    if(block_num == n){
      continue;
    }
    block_num = n;
    break;
  }while(TRUE);

  for(i = 0; i < BLOCK_N; i++){
    block_tbl[i][0] = block_base[block_num][i][0];
    block_tbl[i][1] = block_base[block_num][i][1];
  }

  px = 5;
  py = 1;
  fall_time = 30;
  fall_wait = 0;
}

static void eraseLine(int y)
{
  int i, j;

  for(i = y; i >= 0; i--){
    for(j = 1; j < (FIELD_W - 1); j++){
      if(i > 0){
        field[i][j] = field[i - 1][j];
        if(field[i][j] == NONE){
          mvaddch(i, j, ' ');
        }else{
          mvaddch(i, j, '#');
        }
      }else{
        field[i][j] = NONE;
        mvaddch(i, j, ' ');
      }
    }
  }
}

static void eraseCheck(int y)
{
  int i, j, add;
  bool erase;

  add = 0;
  for(i = y; i >= 0; i--){
    erase = TRUE;
    for(j = 1; j < (FIELD_W - 1); j++){
      if(field[i][j] != BLOCK){
        erase = FALSE;
      }
    }
    if(erase == TRUE){
      lines++;
      add += add + 10;
      eraseLine(i);
      i++;
    }
  }
  score += add;
}

static void fixBlock(int y, int x)
{
  int i, cx, cy;

  for(i = 0; i < BLOCK_N; i++){
    cy = y + block_tbl[i][0];
    cx = x + block_tbl[i][1];
    field[cy][cx] = BLOCK;
    mvaddch(cy, cx, '#');
  }
  eraseCheck(FIELD_H - 2);
}

static bool collideBlock(int y, int x)
{
  bool ret = FALSE;
  int i, cx, cy;

  for(i = 0; i < BLOCK_N; i++){
    cy = y + block_tbl[i][0];
    cx = x + block_tbl[i][1];
    if(field[cy][cx] != 0){
      ret = TRUE;
      break;
    }
  }

  return ret;
}

static void fallBlock(void)
{
  int fy = 0;
  bool down = FALSE;

  fall_wait++;
  if(fall_wait >= fall_time){
    fy = +1;
    fall_wait = 0;
  }else if(key == KEY_DOWN){
    fy = +1;
    down = TRUE;
  }else{
    return;
  }

  do{
    if(collideBlock(py + fy, px) == TRUE){
      fixBlock(py, px);
      initBlock();
      down = FALSE;
      break;
    }
    py += fy;
    if(down == TRUE){
      score++;
    }
  }while(down == TRUE);
}

static void rotateBlock(void)
{
  int i, x, y;
  int tbl[BLOCK_N][2];

  for(i = 0; i < BLOCK_N; i++){
    tbl[i][0] = block_tbl[i][0];
    tbl[i][1] = block_tbl[i][1];
  }

  for(i = 0; i < BLOCK_N; i++){
    y = +1 * block_tbl[i][1];
    x = -1 * block_tbl[i][0];
    block_tbl[i][0] = y;
    block_tbl[i][1] = x;
  }

  if(collideBlock(py, px) == TRUE){
    for(i = 0; i < BLOCK_N; i++){
      block_tbl[i][0] = tbl[i][0];
      block_tbl[i][1] = tbl[i][1];
    }
  }
}

static void moveBlock(void)
{
  int vx = 0, vy = 0;

  if(key == KEY_UP)    rotateBlock();
  if(key == KEY_LEFT)  vx = -1;
  if(key == KEY_RIGHT) vx = +1;

  if(collideBlock(py + vy, px + vx) == FALSE){
    px += vx;
    py += vy;
  }

  fallBlock();
}

static void drawBlock(void)
{
  int i, x, y;

  for(i = 0; i < BLOCK_N; i++){
    y = block_tbl[i][0];
    x = block_tbl[i][1];
    mvaddch(py + y, px + x, '#');
  }
}

static void clearBlock(void)
{
  int i, x, y;

  for(i = 0; i < BLOCK_N; i++){
    y = block_tbl[i][0];
    x = block_tbl[i][1];
    mvaddch(py + y, px + x, ' ');
  }
}

static void drawApp(void)
{
  drawBlock();
  mvprintw(1, FIELD_W + 1, "LINE  %d", lines);
  mvprintw(2, FIELD_W + 1, "SCORE %d", score);
  mvaddch(FIELD_H, px - 1, ' ');
}

static bool isExecApp(void)
{
  if(key == 'q'){
    return FALSE;
  }

  return TRUE;
}

static bool execApp(void)
{
  bool exec = TRUE;

  drawField();
  drawApp();

  while(exec){
    key = getch();
    exec = isExecApp();
    clearBlock();
    moveBlock();
    drawApp();
  }

  return exec;
}

int main(int argc,  char *argv[])
{
  initApp();
  atexit(exitApp);

  while(TRUE){
    initField();
    initBlock();
    if(execApp() == FALSE){
      break;
    }
  }

  return 0;
}

Zaurus通勤中にポチポチ作っていたんだが(主に常磐線内)、正確な時間は計ってないんだけど計4時間くらいかな?行数は350行。まあ無駄とかかなりあって長い。フィールドもテーブル直書きだし。ちなみにエディタvi。ZEditor使っても良かったんだけど。

トラックバック - http://d.hatena.ne.jp/isshiki/20131115

2013-11-14

[] 溜めの演出というか『途中で止める』という演出

PS2を起動したくなって起動した。

んでまあ、「GUNSTER HEROS TRESURE BOX」とうタイトルがあって、何気に遊んでいた。

このゲームステージクリアするときの演出が良いんですね。文章で伝えるのは難しいんだけど、一言で表すとタイトルのような感じ。

たとえば、普通に作ると「爆発しきった」ところで「STAGE CLEAR!」という文字が入ると思うんだけど、このゲーム場合ボスとかが「爆発途中」のタイミングでそれが入るんですよ。カッコいいサウンドと共に。んでまあ、その続きが「STAGE CLEAR!」のキャプションの後に続く、という感じで。

久しぶりに見て、「あー『演出』だよなー。」と思いました。

こういう感性大事にしていきたい。

トラックバック - http://d.hatena.ne.jp/isshiki/20131114

2013-11-13

[] Curses日記

通勤中にZaurusSL-C3200)でCursesテトリスを作ってるんだが(作ってたんかい)、4つブロックの回転とかができた。当たり判定もライン消去もできてるっぽい。まあ回転はまだ問題あると思うけど(回転の当たり判定してないし)、もうちょっと進めたら完成としてもいいかな?

Zaurusプログラムするのはやっぱり楽しい。あんなちっこくて性能も今の基準で考えると比較にならないくらいしょぼいけど、Curses+Cでプログラムする分には十分だ。次はなに作ろうかな?もうちょっと規模大きいものを作るか。いっそオレオレRogue作ってもいいかもしれん。

もうちょっとCurses勉強せんとなあ。テトリス作ってた時も全画面書き換えして豪快に遅くなったので試行錯誤して解決させたんだが、「何をやるとどうなるのか」ということをもうちょっと実験しないといけんな。

完成と見込めるものができたらここに全ソース公開する。Cursesが動く環境ならどのプラットフォームでも動くはず。もちろん市販品の完成度なんて期待しないで欲しい。

[] 突然インターネットに接続できなくなった(笑)

いや笑い事ではなくて。

んでまあ、「どうもお外(つまりプロバイダ)に接続できてないっぽい」様子だったのでスマフォ(笑)(<いやだから笑い事ではなくて)でniftyの障害ページに行ってみたけど特に報告もなく。

まずモデム...っていうんだっけ?つまりお外と直接つながっている機械の電源を入れなおす...。駄目ですね...。

次、ケーブルというケーブル(具体的にはLANケーブル)を抜き差ししてみる...。やっぱり駄目。

念のため、無線LAN機器で接続を試みる。やっぱり駄目。

困り果てた純平さん。ふと秘密アドレスからルータの設定画面に入ってみる。プロバイダとの接続状況が見られるので見てみるってーと、「プロバイダが応答していません」という非情メッセージ

「接続」ボタンを押すも相変わらず駄目。その後、色々設定をうろうろすると「切断」の2文字を発見。試しに押して、再度「接続」を押してみる...。

繋がりました。

ひょっとしたらまたこういうことがあるかもしれないので、将来の自分に対してここにメモしておく。

実兄実兄 2013/11/13 23:09 「切断」でもって「キャッシュクリア成功」、って感じ?

isshikiisshiki 2013/11/14 04:48 どうなんだろうな?実際何が原因で接続切れてたか解らんし。

トラックバック - http://d.hatena.ne.jp/isshiki/20131113

2013-11-12

[][] Sunabaプログラミング動画

色々経緯があったが、第4回まで撮ってみた。この調子でいくと最低6回(敵が複数出るところまで)か、8回くらい(様々な情報を表示をするところまで)、10回(タイトルとかゲームオーバーの処理まで)くらいは行きそうな感じだなあ。

正直、どこまで作り込む動画にしようかというのは悩みどころだ。いきなり「ほぼ完全な形の流れを作る」のもどうかとは思うけど、そういうのをいきなり提示するのもまあアリかなあ、と思ったりもしてる。「Sunabaだってやればここまでできる」というのを示すのも一つの方向性かな?と。今回は動画なので、写経は出来てもコピペはできないわけだし。あと、「ゲームの全体の流れ」をSunaba上で示すのもまあ悪くないかな、と。

現状はニコ動の制限、「30分」で一区切りの動画として録画しているので、区切りごとに次の目標と言うかそういうのを示して〆てる感じだ。まあ、今回はその区切り毎で判断ようと思う。物足りなかったり思うところがあれば、次の動画を撮るときに反映させよう。

トラックバック - http://d.hatena.ne.jp/isshiki/20131112

2013-11-08

[]最近ER」のオープニングばかり観てる

先日の「エレカシからの流れで、YouTubeで色々観ててたまたま発見した「ER 緊急救命室」のオープニング映像

ER - Final Episode Official Opening [HD]

OP映像観てて、本編観たくなってきた。安かったらDVDが欲しいところだけど、レンタルでも良いかもな。

ボクはこういう映像観るのが好きなんだけど、それというのも、ゲームでも「オープニング」や「エンディング」を作るのが好き、というのがあると思う。最近はそういった部分をプログラマがどうこうすることは全く無くなったけど、今でも機会があればやりたい仕事の一つですね。いわゆる「べた絵2Dプログラムゴリゴリ動かす演出」的な仕事最後にやったのは某M社の某シューティング仕事かな。

そういう現状だけど、まだまだこういう映像観て勉強する価値プログラマにもあって、例えば出来上がってきた映像やら素材やらを見て「もっとこうしたほうが良い」という注文くらいはデザイナに対してできないと、今の世の中プログラマとしてどんだけ価値があるのん?という話だと思う。上がってきた素材をそのまま組み込むだけなら若い奴にだってできるし。

例えばだけど、わりと何も言わないで任せてると(<デザイナに限った話ではない)「場面の切り替わり」で平気で「ブラックフェードイン/アウト」をしてきたりする。「それが何か悪いの?」と思われるかも知れないけど、「いやここはさ、もう一仕事しようよ?」と言わずにはいられないんです。最近同人ソフトだってその辺気を使ってますぜ?

そういうちょっとした細かいところに気を使うだけで、作ってる物の質って上がると思うんですけどねえ。

トラックバック - http://d.hatena.ne.jp/isshiki/20131108

2013-11-07

[] Sunaba本が学校の教材に使われるらしい。

「Sunaba本」とはここをご覧の方は先刻承知だと思われますが、書籍プログラムはこうして作られる」です。

それで、該当記事はこちら。

授業の1/3がプログラム教育 コードアカデミー高等学校設立http://weekly.ascii.jp/elem/000/000/182/182468/

こういう事になることは大変喜ばしいことだ。ただ「少なくともあの本は自習用であり、 授業時間目標到達度次第ではあのまま使うのは得策ではないだろう。」とひらしょーさん本人も仰っており、ボクもまあ「そうかな?」と自信は無いけどぼんやりと思っております

授業で使うとして、なんだろう?本の中にひらしょーさんの分身先生として存在し、その上現実先生がいる感じかな?なんか違和感と言うか、そんな感じがした。

話は変わりますが、ボクが最近組んだSunabaのソース晒してないのは、別に出すのが恥ずかしいとか、ひらしょーさんに「こんなコード晒しやがって」と思われるのが怖いから、とかでもなく、例えば何気に「Sunaba 言語」とかでググったらかなり上位(上から2番目とか)にこの雑記がヒットするようになってて、「こりゃまずい」と思ったからなんです。

この言語はその特殊性から、ある部分で「インターネット上に情報が少ない」のが特徴でもあるとボクは思ってるんですが、それがボク程度のものはいえ、ググったらなんらかのソースが出てくるという事は「コピペして再利用されかねない」ことを示すわけで。かなり自意識過剰な文面で顔から火が出てますが。

はいえ、一度出したものを引っ込めると言うのは、内容が余りにも世間的にアレな物でない限り避けたいし。ということで、以前出したものはそのままにしている次第です。

あと、それと前後して「動画」とか言ってるのも、動画だったらコードコピペはできないし、他人がどういう感じでコードを組んでいるのかというのを見るのも勉強にならないかな?とこれもまた自意識過剰で顔が爆発しそうなことを考えたりしてます

動画の方は絶賛撮り直し中ですが...。というか動画撮りながら組むのは疲れますね...。

トラックバック - http://d.hatena.ne.jp/isshiki/20131107

2013-11-05

仕事は順調だった。明日もこうだといいな。

帰宅後、何故か「エレファントカシマシ」欲が高まってたので色々聴く。そういえばAndroid端末に入れてなかったな。と思ったので早速入れる。

思えば昔聴いてて今聴いてない音源ってまだたくさんあるよな。問題はPC音源化されてない事なんだが。暇見てちまちまやるか。

[]エレファントカシマシ「俺たちの明日

エレカシは知らなくても、この曲は聴いたことがあるでしょ。某CMとかで。

エレファントカシマシ「俺たちの明日

トラックバック - http://d.hatena.ne.jp/isshiki/20131105

2013-11-03

[][] 情けないというかくだらないミスを犯してしまった

Sunabaでプログラムをしていて不可解な現象に出会ったので、製作者の平山氏に現象をメールを送ったところ、その原因がボクの方にあったことが今日判明した。

具体的な現象を示すには色々説明しなきゃならないのでここでの掲載は省かせていただくが、平山氏には大変ご迷惑をかけた次第。お怪我なされて退院して本調子でないところに、詳細な調査をしていただいたことも、大変感謝しております

というか、もの凄く情けないこちらのミスだったのが大変悔やまれる。もうちょっとこちらの思慮とかがあれば突き止められた類のバグだったので...。

ということで、改めて自戒の念と共にここに記しておく。

以上、改めて肝に銘じておけよ>ボク

トラックバック - http://d.hatena.ne.jp/isshiki/20131103

2013-11-02

ボクが唯一Apple仕事で認めているもの

D

トラックバック - http://d.hatena.ne.jp/isshiki/20131102

2013-11-01

以前Sunabaで作ったゲーム動画プログラミングではなく出来た成果物の方)を作ってるんだけど、「音どうしよう問題」が浮上。

「某ゲーム」っぽい音にするか、それとも全く関係ない音にするか...。

ニコ動のその辺(音楽関係)ってどうなってたっけ...?

トラックバック - http://d.hatena.ne.jp/isshiki/20131101
 | 
20040203040506070809101112
20050102030405060809101112
2006010203040506070809101112
2007010203040506070809101112
2008010203040506070809101112
2009010203040506070809101112
2010010203040506070809101112
2011010203040506070809101112
2012010203040506070811
201301020708101112
20140203040509101112
2015010203040506070809101112
201601020304101112
201704050910
プロフィール

isshiki

isshiki

上級NEETの実態