トップページ > 記事閲覧
アクションゲーム作成中です
名前:RON 日時: 2014/11/18 12:32

初投稿です。 いきなりで恐縮ですが 今、題名通りアクションゲームを作成しています。 FCメトロイド風のステージを作成してるのですが、 メトロイドの動画を参考にしたところ、縦スクロール のステージがあり、その縦スクロールの構造が理解できない状況です。 できればその事を教えていただけないでしょうか? よろしくお願い致します。
メンテ

Page: 1 |

Re: アクションゲーム作成中です ( No.1 )
名前:管理人 日時:2014/11/19 02:58

縦スクロールの構造が理解できないとのことですが、横スクロールについては理解されているのでしょうか? 横スクロールと同じ手法で縦スクロールも実現できるのですが・・・
メンテ
Re: アクションゲーム作成中です ( No.2 )
名前:RON 日時:2014/11/19 09:24

朝起きて拝見しました。 その事も踏まえて教えて頂けたら大変助かります!
メンテ
Re: アクションゲーム作成中です ( No.3 )
名前:Ketty 日時:2014/11/20 21:51

こんにちは(^^) RONさんは、スクロールについて知りたいとのことですが、 何を教えてほしいのか、もうちょっと具体的に書かれてみてはどうでしょうか? そうすれば管理人様(あるいは別の人)からの回答をもらえやすいと思います。 、 マップスクロールについては、管理人様がスクロールのサンプルを公開してくれてます。 http://homepage2.nifty.com/natupaji/DxLib/dxprogram.html#N4 これは、読まれましたか? まだ読んでないなら是非読んでみてください(^^) 読んだけれど分からないなら、 例えば、「○行目のコードの意味がわからない」とか、 あるいは、 「自分の求めてるスクロールはそれじゃなくて、これこれこういうやつです。」とか、 もっとピンポイントに具体的に質問を書かれると、RONさんの解決の近道になると思います。
メンテ
Re: アクションゲーム作成中です ( No.4 )
名前:管理人 日時:2014/11/21 00:28

私が申し上げたいことはKettyさんと同じです こちらにスクロールのサンプルがありますので、よろしければご覧になってみてください http://homepage2.nifty.com/natupaji/DxLib/dxprogram.html#N4
メンテ
Re: アクションゲーム作成中です ( No.5 )
名前:RON 日時:2014/11/21 09:06

わかりました(^^) どうしてもわからないことがあればちょくちょくお世話になるかと思いますので、その時はまた投稿させて頂きます。 貴重なアドバイスありがとうございます!
メンテ
Re: アクションゲーム作成中です ( No.6 )
名前:RON 日時:2014/11/25 09:41

また投稿致します。 実は参考書を頼りに作成していまして、そこで分からないところがありましたのでお時間があるときに返して頂けたらと思っています。 長文になります。申し訳ありません!m(_ _)m 問題になっている部分はスクロール時に当たり判定とブロックの画像がずれてしまいます。 void DrawHero(int ac){ int key = GetJoypadInputState(DX_INPUT_KEY_PAD1); DrawKnife(key); float mv = 200.0f * g_frametime; //移動量計算 float hx = g_stagedata.hero.x; float hy = g_stagedata.hero.y; //ジャンプ処理 if (g_stagedata.hero.jumping == TRUE){ mv = 0; //ジャンプ中は自力で移動させない g_stagedata.hero.jumppower -= GRAVITY; hy -= (g_stagedata.hero.jumppower * g_frametime); hx += (g_stagedata.hero.jumpforward * g_frametime); } if (key & PAD_INPUT_LEFT) { hx -= mv; g_stagedata.hero.turn = TRUE; } if (key & PAD_INPUT_RIGHT) { hx += mv; g_stagedata.hero.turn = FALSE; } //マップ当たり判定 AtariInfo atari = CheckBlock(hx, hy, g_stagedata.hero.x); if (g_stagedata.hero.turn == FALSE){ if (atari.DR == TRUE || atari.UR == TRUE){ hx = g_stagedata.hero.x; } } else { if (atari.DL == TRUE || atari.UL == TRUE){ hx = g_stagedata.hero.x; } } //接地チェック if (atari.GL == TRUE || atari.GR == TRUE) { g_stagedata.hero.noground = FALSE; g_stagedata.hero.jumping = FALSE; g_stagedata.hero.jumppower = 0; g_stagedata.hero.jumpforward = 0; //ジャンプ後に地面に埋まらないよう補正 hy = (float)((int)(hy / IMG_CHIPSIZE) * IMG_CHIPSIZE); } else { g_stagedata.hero.noground = TRUE; //重力で落下 g_stagedata.hero.jumping = TRUE; } //天井チェック if (g_stagedata.hero.jumping == TRUE){ if (atari.UL == TRUE || atari.UR == TRUE){ g_stagedata.hero.jumppower = 0; g_stagedata.hero.jumpforward = 0; } } //ジャンプ処理その2 if (g_stagedata.hero.jumping == FALSE){ if (IsAKeyTrigger(key) == TRUE && g_stagedata.hero.noground == FALSE) { g_stagedata.hero.jumping = TRUE; g_stagedata.hero.jumppower = JUMP_POWER; if (key & PAD_INPUT_LEFT) { g_stagedata.hero.jumpforward = -JUMP_FORWARD; } if (key & PAD_INPUT_RIGHT) { g_stagedata.hero.jumpforward = JUMP_FORWARD; } } } //スクロール補正 if (hx - g_stagedata.scrollx > SCROLL_RIGHT){ g_stagedata.scrollx += (hx - g_stagedata.hero.x); } else if(hx - g_stagedata.scrollx < SCROLL_LEFT){ g_stagedata.scrollx += (hx - g_stagedata.hero.x); } if(hy - g_stagedata.scrolly > SCROLL_TOP ){ g_stagedata.scrolly += (hy - g_stagedata.hero.y); } if(hy - g_stagedata.scrolly < SCROLL_BOTTOM ){ g_stagedata.scrolly += (hy - g_stagedata.hero.y); } g_stagedata.hero.x = hx; g_stagedata.hero.y = hy; DrawRotaGraph2((int)(g_stagedata.hero.x - g_stagedata.scrollx), (int)g_stagedata.hero.y, 0, 0, 0.8, 0, g_imghandles.hero[ac % ANIMFRAME], TRUE, g_stagedata.hero.turn); } //ブロックとの当たり判定 BOOL _CheckBlockSub(float x, float y){ int mx = (int)(x / IMG_CHIPSIZE); int my = (int)(y / IMG_CHIPSIZE); //マップの範囲外ならFALSE if ((mx < 0) || (mx >= g_stagedata.mapwidth) || (my >= MAP_HEIGHT) || (my < 0)){ return FALSE; } if (g_mapdata[my][mx] != '0') return TRUE; return FALSE; } AtariInfo CheckBlock(float x, float y, float rx){ AtariInfo result; result.UL = _CheckBlockSub(x, y); result.UR = _CheckBlockSub(x + IMG_CHIPSIZE - 1, y); result.DL = _CheckBlockSub(x, y + IMG_CHIPSIZE -1); result.DR = _CheckBlockSub(x + IMG_CHIPSIZE - 1, y + IMG_CHIPSIZE -1); result.GL = _CheckBlockSub(rx, y + IMG_CHIPSIZE); result.GR = _CheckBlockSub(rx + IMG_CHIPSIZE - 1, y + IMG_CHIPSIZE); return result; } void DrawMap(){ int sc = (int)(g_stagedata.scrollx / IMG_CHIPSIZE); int sa = (int)(g_stagedata.scrolly / IMG_CHIPSIZE); int shiftx = (int)g_stagedata.scrollx % IMG_CHIPSIZE; int shifty = (int)g_stagedata.scrolly % IMG_CHIPSIZE; for (int y = 0; y < SCR_HEIGHT + 1; y++){ for (int x = 0; x < SCR_WIDTH + 1; x++){ if (x + sc >= g_stagedata.mapwidth)break; //else if (y + sa >= g_stagedata.mapheight)break; if (g_mapdata[y + sa][x + sc] == '1'){ DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty, 0,0,0.8,0, g_imghandles.block[0], TRUE); } if (g_mapdata[y + sa][x + sc] == '2'){ DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty, 0,0,0.8,0, g_imghandles.block[1], TRUE); } if (g_mapdata[y + sa][x + sc] == '3'){ DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty, 0,0,0.8,0, g_imghandles.block[2], TRUE); } if (g_mapdata[y + sa][x + sc] == '4'){ DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty, 0,0,0.8,0, g_imghandles.block[3], TRUE); } if (g_mapdata[y + sa][x + sc] == '5'){ DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty, 0,0,0.8,0, g_imghandles.block[4], TRUE); } if (g_mapdata[y + sa][x + sc] == '6'){ DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty, 0,0,0.8,0, g_imghandles.block[5], TRUE); } if (g_mapdata[y + sa][x + sc] == '7'){ DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty, 0,0,0.8,0, g_imghandles.block[6], TRUE); } if (g_mapdata[y + sa][x + sc] == '8'){ DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty, 0,0,0.8,0, g_imghandles.block[7], TRUE); } if (g_mapdata[y + sa][x + sc] == '9'){ DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty, 0,0,0.8,0, g_imghandles.block[8], TRUE); } if (g_mapdata[y + sa][x + sc] == 'a'){ DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty, 0,0,0.8,0, g_imghandles.block[9], TRUE); } if (g_mapdata[y + sa][x + sc] == 'b'){ DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty, 0,0,0.8,0, g_imghandles.block[10], TRUE); } if (g_mapdata[y + sa][x + sc] == 'c'){ DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty, 0,0,0.8,0, g_imghandles.block[11], TRUE); } if (g_mapdata[y + sa][x + sc] == 'd'){ DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE - shifty, 0,0,0.8,0, g_imghandles.block[12], TRUE); } } } }
メンテ
Re: アクションゲーム作成中です ( No.7 )
名前:管理人 日時:2014/11/28 00:26

載せて頂いたプログラムを拝見する限りでは原因かもしれない箇所が 幾つかあるのですが、やはり実際に実行してみないと何とも言えません お手数で申し訳ありませんが、現在作成されているソフトのフォルダを丸ごと圧縮してメールでこちら BQE00322(あっとまーく)nifty.com ((あっとまーく)を@に置き換えてください) に送っていただけないでしょうか? あと、素朴な疑問なのですが、DrawMap 関数でマップの描画に DrawRotaGraph2 を使用されていますが、 拡大率が 0.8 と、若干縮小して描画しています、プレイヤーも 0.8 になっていますが、何故でしょうか?
メンテ
Re: アクションゲーム作成中です ( No.8 )
名前:RON 日時:2014/12/25 09:51

管理人様 申し訳ありません! 色々と用事が重なり、返答を返すことを忘れてしましました・・・。 この答を返答することはないと思いますが、書かせていただきます。 この疑問はブロックとキャラクターのピクセル数が同じなので統一させて全体を見えるようにしたいと考えたからでございます。 今更、この答を返答するのは重々承知でございます。
メンテ
Re: アクションゲーム作成中です ( No.9 )
名前:管理人 日時:2014/12/27 23:53

当たり判定とブロックの画像がずれてしまう問題は解決したのでしょうか?
メンテ
Re: アクションゲーム作成中です ( No.10 )
名前:RON 日時:2014/12/29 15:20

はい、早くお返事を返せばよかったのですが、ご迷惑をおかけして申し訳ありませんでした。 次、ご質問する機会があるときは返答が来ましたらすぐに返信するように心掛けます。 大変申し訳ありませんでした。
メンテ
Re: アクションゲーム作成中です ( No.11 )
名前:管理人 日時:2014/12/30 01:50

いえ、私もご返信はのんびりなのでそんなに気を遣っていただかなくても大丈夫です また何かありましたらお書き込みください
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存