おはようございます。
初めまして、惰眠と申します。
横スクロールアクションの製作中に詰まってしまったので、今回質問させて頂きます。
私はC言語暦は約一ヶ月、ゲーム製作は約二週間のまだまだ未熟な者です。
環境は、BorlandC++Compiler5.5+BCCDeveloperです。
質問はマップスクロールの作り方についてです。
マップに画像を描画する事は出来たのですが、
その後、マップをどうやってスクロールさせれば良いのかわかりません。
具体的には、今の状態では2の画像まで辿り着く事が出来ないので、
キャラがウィンドウの中心に到達したら、キャラを中心にマップがスクロールする様にしたいのです。(往復は可能で)
いろいろなサイトを閲覧し、試行錯誤を重ねてはみたのですが上手くいきませんでした。
もし宜しければ、ヒントだけでも教えて頂けないでしょうか。
メッセージが長いとエラーが出たので↓にソースを張ります。
マップのスクロールについて
Re:マップのスクロールについて
(以下ソースです)
※1と2の画像に当たり判定はつけていません
初めての投稿で至らない点もあるとは思いますが、お手柔らかに御指導の程宜しくお願い致します。
連投すみませんでした。
#include "DxLib.h" //画面の大きさ #define WINDOW_SIZE_X 640 #define WINDOW_SIZE_Y 480 //表示するチップの最大数 #define MAP_WIDTH 20 #define MAP_HEIGHT 15 //全体のチップの数 #define MAP_MAX_WIDTH 40 #define MAP_MAX_HEIGHT 15 //マップチップの大きさ #define MAPCHIP_SIZE 32 typedef struct{ int x,y,img; }ch_t; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ char Key[256]; ch_t ch; if(ChangeWindowMode(TRUE)!=DX_CHANGESCREEN_OK||DxLib_Init()==-1)return-1; ch.x =32; ch.y =416; SetDrawScreen( DX_SCREEN_BACK ); int img_box[2]; img_box[1] = LoadGraph("box.jpg");//茶の■を読み込み img_box[2] = LoadGraph("box2.jpg");//緑の■を読み込み int chara; chara = LoadGraph("char.jpg");//青の■(キャラ)を読み込み while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){ int map[MAP_MAX_HEIGHT][MAP_MAX_WIDTH]={ {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} }; for(int b=0; b<MAP_MAX_HEIGHT;b++){ for(int a=0; a<MAP_MAX_WIDTH;a++) switch(map[a]){ case 1: DrawRectGraph(a*32,b*32,0,0,32,32,img_box[1],TRUE,FALSE);//茶の■を設置 break; case 2: DrawRectGraph(a*32,b*32,0,0,32,32,img_box[2],TRUE,FALSE);//緑の■を設置 break; } } if(Key[KEY_INPUT_RIGHT]==1) ch.x++; else if(Key[KEY_INPUT_LEFT]==1) ch.x--; ch.img=chara;//青の■(キャラ) DrawGraph(ch.x,ch.y,ch.img,TRUE);//キャラを描画 ScreenFlip(); } DxLib_End(); return 0; }
※1と2の画像に当たり判定はつけていません
初めての投稿で至らない点もあるとは思いますが、お手柔らかに御指導の程宜しくお願い致します。
連投すみませんでした。
Re:マップのスクロールについて
この問題は簡単そうに思えて意外と面倒だったりします。
以前ここの回答者であるJustyさんがそのサンプルを生成していて、
今自分の手元にそのファイルがあります。
さすがに無断掲載はできないので、
Justyさんのgoサインが出てからアップしようかと思います。
なのでしばし御持ちを。
自分でも作ってみますが、Justyさんのサンプルが
綺麗に管理されていて、自分ではこれ以上うまく書けない気がするので、
こんなスレになってしまいました^^;ごめんなさい。。
#最近Justyさんの姿をみないからもしかしたら
忙しいのかもしれないので、確認をすぐにとれない可能性があるのでご了承を。
以前ここの回答者であるJustyさんがそのサンプルを生成していて、
今自分の手元にそのファイルがあります。
さすがに無断掲載はできないので、
Justyさんのgoサインが出てからアップしようかと思います。
なのでしばし御持ちを。
自分でも作ってみますが、Justyさんのサンプルが
綺麗に管理されていて、自分ではこれ以上うまく書けない気がするので、
こんなスレになってしまいました^^;ごめんなさい。。
#最近Justyさんの姿をみないからもしかしたら
忙しいのかもしれないので、確認をすぐにとれない可能性があるのでご了承を。
Re:マップのスクロールについて
スクロールさせる仕組みは解りますか?
添付画像を見て下さい。
青線枠の外が見えない部分だと思って下さい。
画像の左のマップを右から左に流れるように
スクロールさせる場合、画像右のようにずらして
描画していきます。
添付画像を見て下さい。
青線枠の外が見えない部分だと思って下さい。
画像の左のマップを右から左に流れるように
スクロールさせる場合、画像右のようにずらして
描画していきます。
Re:マップのスクロールについて
このような関数を作ってみると考えやすいのではないかと。
キャラクタのy座標を元にa0を決定してください。
例えばこう。※動作確認などしていないので、おかしいかも。
void DrawMap(int a0) { for(int b=0; b<MAP_HEIGHT;b++){ for(int a=0; a<MAP_WIDTH;a++){ // 範囲の違いに注意 switch(map[a0+a]){ // mapの見る位置を変更 case 1: DrawRectGraph(a*32,b*32,0,0,32,32,img_box[1],TRUE,FALSE);//茶の■を設置 break; case 2: DrawRectGraph(a*32,b*32,0,0,32,32,img_box[2],TRUE,FALSE);//緑の■を設置 break; } } } }
キャラクタのy座標を元にa0を決定してください。
例えばこう。※動作確認などしていないので、おかしいかも。
if (ch.y / 32 < MAP_WIDTH / 2) a0 = 0; else a0 = MAP_WIDTH / 2 - ch.y / 32;
Re:マップのスクロールについて
私からの提案としては、作るときに良く分からい場合は、まず単純化してから作る様にすると解決出来たりします。今後ゲームを作っていくときに使えるテクニックだと私は思いますので検討してみて下さい。
単純化するため、まずキャラクタは表示しない。または動かさず放置。※ややこしくなるから。
マップのパーツを単純に横スクロールしてみる。※キー制御があるとややこしいでコメントアウト。
足らなくなったパーツの処理はしないので20x15のブロックがそのまま横に流れていくだけです。※当然ながら20x15のパーツ外は表示しないので、真っ黒なままです。
これが第一段階です。
第二段階としては、キー入力でマップを自在にスクロール出来るようにします。
この場合も20x15のブロックのまま自在に動くだけです。
こっから先は難しくなるので、まずここまでやってみましょうか。
※ みなさんの答えを見せてから考えて貰うと言う方法の真逆です。どっちが良いかは御本人が決めて下さい。
単純化するため、まずキャラクタは表示しない。または動かさず放置。※ややこしくなるから。
マップのパーツを単純に横スクロールしてみる。※キー制御があるとややこしいでコメントアウト。
足らなくなったパーツの処理はしないので20x15のブロックがそのまま横に流れていくだけです。※当然ながら20x15のパーツ外は表示しないので、真っ黒なままです。
これが第一段階です。
第二段階としては、キー入力でマップを自在にスクロール出来るようにします。
この場合も20x15のブロックのまま自在に動くだけです。
こっから先は難しくなるので、まずここまでやってみましょうか。
※ みなさんの答えを見せてから考えて貰うと言う方法の真逆です。どっちが良いかは御本人が決めて下さい。
Re:マップのスクロールについて
kazuoniさん
おお、是非見てみたいですね。
全く急いではいないので、気長にお待ちしています!
SooAさん
画像(背景)を使用してのスクロールは出来ていたのですが、
マップを使用してのスクロールの仕組みがわからなかったのです・・・。
たいちうさん
作って頂いた関数を使用させて頂いたところ、マップのスクロールに成功致しました!
今まで微動だにしなかったので感激です。
私好みに修正を加えながら、使わせて頂きたいと思います。
softyaさん
確かに答えを見せてもらうのと比べると、遥かに自分の為になりそうですね。
今回は解決出来ましたが、また詰まる様な事があれば単純化して考えたいと思います!
単純化させてもわからなかった時は、また質問させて頂きますね。
返答が遅れてしまい申し訳ありませんでした。
ネットでの質問は初めてで内心不安でしたが、皆様お優しい回答で嬉しかったです!
また何かあった時は質問させて頂きますので、その時はまた宜しくお願いします。
回答を下さった皆様方、本当に有難う御座いました。
おお、是非見てみたいですね。
全く急いではいないので、気長にお待ちしています!
SooAさん
画像(背景)を使用してのスクロールは出来ていたのですが、
マップを使用してのスクロールの仕組みがわからなかったのです・・・。
たいちうさん
作って頂いた関数を使用させて頂いたところ、マップのスクロールに成功致しました!
今まで微動だにしなかったので感激です。
私好みに修正を加えながら、使わせて頂きたいと思います。
softyaさん
確かに答えを見せてもらうのと比べると、遥かに自分の為になりそうですね。
今回は解決出来ましたが、また詰まる様な事があれば単純化して考えたいと思います!
単純化させてもわからなかった時は、また質問させて頂きますね。
返答が遅れてしまい申し訳ありませんでした。
ネットでの質問は初めてで内心不安でしたが、皆様お優しい回答で嬉しかったです!
また何かあった時は質問させて頂きますので、その時はまた宜しくお願いします。
回答を下さった皆様方、本当に有難う御座いました。
Re:マップのスクロールについて
>マップを使用してのスクロールの仕組みがわからなかったのです・・・。
う~ん、そのつもりでの説明だったのですが^^;
MAP内を移動するだけのサンプルです。
VC++2008ですが、主要な部分は main.cpp に全て書いてあります。
http://www42.tok2.com/home/tuk2nd/bbs/img/34.zip
キャラ画像 data/char.png は 『角屋』様からお借りしました。
http://deli.cubic2.net/member/taoc/kadoya/
追記
カーソルキーで移動します。
う~ん、そのつもりでの説明だったのですが^^;
MAP内を移動するだけのサンプルです。
VC++2008ですが、主要な部分は main.cpp に全て書いてあります。
http://www42.tok2.com/home/tuk2nd/bbs/img/34.zip
キャラ画像 data/char.png は 『角屋』様からお借りしました。
http://deli.cubic2.net/member/taoc/kadoya/
追記
カーソルキーで移動します。

Re:マップのスクロールについて
kazuoniさん
> ここの回答者であるJustyさんがそのサンプルを生成していて
> ~
>さすがに無断掲載はできないので
あーと、これですかね。
http://www.play21.jp/board/formz.cgi?ac ... &rln=11335
http://www.play21.jp/board/formz.cgi?ac ... &rln=35276
別に私的には掲載していただいても一向に構わないです。
ただ、たしかこれは元々の質問者さんのコードを改変して作ったものなので、厳密には私だけのコードではありません。
まぁそれを言い出したらさらに元は Dixqさんのコードということになるのですが。
> ここの回答者であるJustyさんがそのサンプルを生成していて
> ~
>さすがに無断掲載はできないので
あーと、これですかね。
http://www.play21.jp/board/formz.cgi?ac ... &rln=11335
http://www.play21.jp/board/formz.cgi?ac ... &rln=35276
別に私的には掲載していただいても一向に構わないです。
ただ、たしかこれは元々の質問者さんのコードを改変して作ったものなので、厳密には私だけのコードではありません。
まぁそれを言い出したらさらに元は Dixqさんのコードということになるのですが。
Re:マップのスクロールについて
SooAさん
私には読解力が不足している様です・・・。すみませんでした。
もう一度よく読み返してみます!
それとサンプルのzip頂きました。有難う御座います!
自分の作った物と見比べて、より良い物を作れる様頑張りたいと思います。
Justyさん
リンク先を全文読ませて頂きました。
カメラの概念が非常に分かり易いと思いました。
頂いた沢山の資料を基に、精進して行きたいと思います。
解決後にも関わらず、回答をして頂き有難う御座いました。
私には読解力が不足している様です・・・。すみませんでした。
もう一度よく読み返してみます!
それとサンプルのzip頂きました。有難う御座います!
自分の作った物と見比べて、より良い物を作れる様頑張りたいと思います。
Justyさん
リンク先を全文読ませて頂きました。
カメラの概念が非常に分かり易いと思いました。
頂いた沢山の資料を基に、精進して行きたいと思います。
解決後にも関わらず、回答をして頂き有難う御座いました。
Re:マップのスクロールについて
kazuoniさん
早速頂きました!
解決はしましたが、いろいろな資料を見れるのは大変嬉しいです。
zipの添付と二度のレス、どうも有難う御座いました!
早速頂きました!
解決はしましたが、いろいろな資料を見れるのは大変嬉しいです。
zipの添付と二度のレス、どうも有難う御座いました!