ページ 11

マップスクロールの仕組み

Posted: 2011年5月03日(火) 00:52
by tkto
http://d.hatena.ne.jp/aidiary/20050624/1255786339
こちらのサイトを参考にコードを書いているのですが分かりません
概念自体は図もあるため、なんとなくイメージできるのですが
javaのコードのどの部分がCのどの部分になるかが分かりません

やりたいことはこのページのオフセットの概念をつかい、Cでコードを書きたいです

Re: マップスクロールの仕組み

Posted: 2011年5月03日(火) 00:57
by tkto
描画するものが多くなると難しいのでaaa.pngとbbb.pngの二つの画像を使ってやっています
一から分かりません

Re: マップスクロールの仕組み

Posted: 2011年5月03日(火) 01:31
by softya(ソフト屋)
まず、難しいことを考える前にaaa.pngとbbb.pngの2つを並べて表示する事はできますか?
ところで、aaa.pngとbbb.pngのドットサイズは幾つですか?

Re: マップスクロールの仕組み

Posted: 2011年5月03日(火) 02:01
by tkto
座標を指定して横に並べるということならできます
ドットサイズというのは16×16とかそういうことでしょうか?
でしたら16×16だと思います
これはスクロールのときに重要になるのでしょうか?

Re: マップスクロールの仕組み

Posted: 2011年5月03日(火) 11:27
by softya(ソフト屋)
>でしたら16×16だと思います。これはスクロールのときに重要になるのでしょうか?

画面を埋めるのに何個必要かという意味でお聞きしました。かなりひつようですね。
出来れば32x32のパーツをご用意頂けると説明しやすいですね。

それでは段階を追ってマップスクロールを実装してみましょう。

このサイトのコンテンツである「C言語~ゲームプログラミングの館~」は読まれてましたか?
http://dixq.net/g/
その中に
「C言語~ゲームプログラミングの館~ 24. 行けない所を作る。~2D~」
http://dixq.net/g/26.html
ってのがあると思いますが、このマップ表示で白黒で行っているのをそれぞれaaa.pngとbbb.pngに置き換えできますでしょうか?

[追記]
黒の部分を置き換えると画面が見づらいと思ったら白の部分をaaa.pngに置き換えるだけで良いです。

Re: マップスクロールの仕組み

Posted: 2011年5月03日(火) 14:54
by tkto
すいません
ドットサイズってのを勘違いしていました 実際には16×16ではなく縦横比率も二つの画像も大きさも≠でした 
最初なので二つの画像だけを描画してスクロールできればなぁ~と思っていました・・・

CもDXライブラリもそんなに詳しくないのですが
DrawBox(j*32,i*32,(j+1)*32,(i+1)*32,GetColor(255,255,255),TRUE);
多分、ここが変わるんですよね
DrawGraphScreen(J*32,i*32,"aaa.png",TRUE)
でしょうか?

Re: マップスクロールの仕組み

Posted: 2011年5月03日(火) 16:03
by softya(ソフト屋)
座標としては有っていますが、
DrawGraphScreen(J*32,i*32,"aaa.png",TRUE)
だとロードと表示が込みの関数ですので使い方として間違っています。
ロードLoadGraph()と表示DrawGraph()に分けないといけません。

DXライブラリを理解されるためにもまず
「C言語~ゲームプログラミングの館~」
http://dixq.net/g/
を一通り勉強されたほうが良いと思います。
ゲームの基本中の基本の知識が散りばめらています。

その上で多分、tkto さんは他言語経験者だと思いますがC言語で分からないことも勉強してください。
「苦しんで覚えるC言語」
http://9cguide.appspot.com/

このまま続けることも出来ますが、先に「C言語~ゲームプログラミングの館~」を勉強されたほうがより理解できると思いますよ。

Re: マップスクロールの仕組み

Posted: 2011年5月03日(火) 17:59
by tkto
大丈夫です
Cはよく分かりませんといったのは間違っていた時の保険で言ってしまいました
実際にはCを勉強し始めてから1ヶ月くらい立っています
ゲームプログラミングの館は一通り、目を通しています
マップスクロールが分からない時点で大丈夫ではないと思うのですがね

Re: マップスクロールの仕組み

Posted: 2011年5月03日(火) 18:48
by softya(ソフト屋)
じゃあ、一気に3ステップステップ進めてみましょう。
(1)マップ配列内に2の値の所を作って、こちらはbbb.pngを表示。
(2)マップ配列の横の大きさを広げて画面よりも大きくしてください。スクロールは出来なくて良いです。
(3)マップ配列のX=1から15までを表示するように
以上が出来たらソースをcodeタグで囲って貼ってもらえますか?

Re: マップスクロールの仕組み

Posted: 2011年5月03日(火) 19:48
by tkto

コード:

int i , j
int MapData[ 15 ][ 8 ] =
{
	{ 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1} ,
	{ 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1} ,
	{ 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1} ,
	{ 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1} ,
	{ 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1} ,
	{ 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1} ,
	{ 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1} ,
	{ 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1} 
} ;

GHandle = LoadGraph( "aaa.bmp" ) ;
gHandle = LoadGraph( "iii.bmp" ) ;

	for( i = 0 ; i < 15 ; i ++ )
	{
		for( j = 0 ; j < 8 ; j ++ )
		{
			if( MapData[ i ][ j ] == 1 )
			{ 
                                         DrawGraph( i*32 , j*32 , GHandle , FALSE ) ;
			}

                                 if( MapData[ i ][ j ] == 2 )
                                  {
                                  DrawGraph( i*32 , j*32 , gHandle , FALSE ) ;
                                  }
		}
	}
私が書いたコードですのでどこかしらに間違いがあると思います ごめんなさい

Re: マップスクロールの仕組み

Posted: 2011年5月03日(火) 21:09
by softya(ソフト屋)
幾つか間違いがあるのとこれだとエラー出ませんか?
あと全体を載せてくださいね。

(1)マップ配列内に2の値の所を作って、こちらはbbb.pngを表示。
0は残して、2を加えてくださいね。今のだと1と2だけになっています。

(2)マップ配列の横の大きさを広げて画面よりも大きくしてください。スクロールは出来なくて良いです。
配列が大きくならずに、初期値だけ増えています。配列も大きくしてください。

(3)マップ配列のX=1から15までを表示するように
表示範囲が変わっていません。for( i = 0 ; i < 15 ; i ++ )だとループする範囲はなんでしょうか?

以上を再度考えてみてください。

Re: マップスクロールの仕組み

Posted: 2011年5月03日(火) 22:05
by tkto
はい、見直してみます
int hantei[15][20] = {
{ 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 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1 },
};
これだと宣言の構文エラーになるのですが多次元配列の宣言って間違ってますかね

Re: マップスクロールの仕組み

Posted: 2011年5月03日(火) 22:15
by softya(ソフト屋)
こっちも書き間違えました。
(3)マップ配列のX=1から15までを表示するように
じゃなくて、
(3)マップ配列のX=1から21までを表示するように
が正しいです。
tkto さんが書きました:はい、見直してみます
int hantei[15][20] = {
{ 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 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1 },
};
これだと宣言の構文エラーになるのですが多次元配列の宣言って間違ってますかね
いえ、正しいですよ。こちらではコンパイルが通ります。
元のソースコードコピペしてコンパイルが通るなら、この宣言ではなく前後関係でまずいことになっている可能性が高いです。
ちなみにint hantei[15][20] の宣言で20は横(X)方向、15は縦(Y)方向の大きさを表します。

それとソースコードのインデントを合わせるクセを付けたほうが良いと思います。

Re: マップスクロールの仕組み

Posted: 2011年5月03日(火) 22:36
by tkto
インデントをつける癖ですか・・・ やっぱり人に見せるものですし気をつけます  
当方のjava講師が汚いコードで教授していたから講師のせいですね  ・・・絶対

コード:

#include "DxLib.h"
 

 
int hantei[7][27] = {
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
};
 

 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    int i,j;
    int Ghandoru , ghandoru ;
 
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
 
    SetDrawScreen( DX_SCREEN_BACK ) ;                                                 //描画先を裏画面に設定

    while(!ProcessMessage() && !ClearDrawScreen()){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
 
    Ghandoru = LoadGraph( "siro.png" ); 
    ghandoru = LoadGraph( "annpannmann.png" ); 
               
	        /*白い壁を描画*/
                for(i=0;i<7;i++)
                        for(j=0;j<21;j++)
                                if(hantei[i][j]==1)
                                         DrawGraph( j*32,i*32 , Ghandoru, TRUE );
		   if(hantei[i][j]==2)	 
                                         DrawGraph( j*32,i*32 , ghandoru, TRUE );


        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}
codeタグが間違っていたので修正。 投稿前にプレビューしてくださいね。  by softya(ソフト屋)

一応エラーも全て潰しましたがどこかしら間違っていたらごめんなさい

Re: マップスクロールの仕組み

Posted: 2011年5月03日(火) 22:38
by tkto
すみませんコードタグ失敗しました
それといきなりannpannmann.pngなんて画像の名前だしてごめんなさい
当方のパソコンよくデーターがぶっとぶので代わりの画像を使用させてもらいました
aaa.png=siro.png iii.png=annpannmann.pngです ごめんなさい

Re: マップスクロールの仕組み

Posted: 2011年5月03日(火) 22:54
by softya(ソフト屋)
正しいインデントは、こうなります。画像の名前はこちらの都合で変えてます。

あと間違いがまだ有ります。
それとLoadGraph()がループ何にあったので移動させました(元のだと毎フレームロードするのでメモリが浪費されるのと毎フレームロードで遅くなります)。
問題点
・なぜ画面半分の大きさなのか?
・(3)の要件を満たしていないのはなぜか?
・for文の使いたがまずくて、2の値の時の処理がちゃんと働いていません。何が問題かは、考えてみてください。
 動作を確認するためにも2の値の部分は、X座標の小さいところにも1箇所ぐらいは入れてください。
以上を考えてみてください。

コード:

#include "DxLib.h"

int hantei[7][27] = {
	{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2 },
	{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2 },
	{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
	{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
	{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
	{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
	{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
};



int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

	int i,j;
	int Ghandoru , ghandoru ;

	if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

	Ghandoru = LoadGraph( "siro.png" ); 
	ghandoru = LoadGraph( "aka.png" ); 

	SetDrawScreen( DX_SCREEN_BACK ) ;                                                 //描画先を裏画面に設定

	while(!ProcessMessage() && !ClearDrawScreen()){
		//↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了

		/*白い壁を描画*/
		for(i=0;i<7;i++)
			for(j=0;j<21;j++)
				if(hantei[i][j]==1)
					DrawGraph( j*32,i*32 , Ghandoru, TRUE );
		if(hantei[i][j]==2)     
			DrawGraph( j*32,i*32 , ghandoru, TRUE );


		ScreenFlip();
	}

	DxLib_End();
	return 0;
}

Re: マップスクロールの仕組み

Posted: 2011年5月04日(水) 02:20
by tk
分かりません
if文を使った時の間違いは多分、予約語(else)が抜けていたからかなと思うのですが
なぜ画面半分にしか描画されないかが分かりません
DXライブラリの座標系を描画するオブジェクトの数で割ってみたりしたのですが
なぜか上半分にしか描画されません      ・・・なぜなのでしょう

Re: マップスクロールの仕組み

Posted: 2011年5月04日(水) 10:49
by softya(ソフト屋)
tk さんが書きました:分かりません
if文を使った時の間違いは多分、予約語(else)が抜けていたからかなと思うのですが
なぜ画面半分にしか描画されないかが分かりません
DXライブラリの座標系を描画するオブジェクトの数で割ってみたりしたのですが
なぜか上半分にしか描画されません      ・・・なぜなのでしょう
私としては、初心者はブロック文なしで書くべきではないと思います。
if,for,whileなどはブロック文がないと単文にしか影響を与えません。
ブロック文で書いていれば防げた問題です。

あと半分しか描画されないのは縦に7しないので、7x32=224ドットですね。実際縦は480ドット有りますので半分にも足りません。


>・(3)の要件を満たしていないのはなぜか?
こちらにも答えてくださいね。

Re: マップスクロールの仕組み

Posted: 2011年5月05日(木) 14:15
by
複文はなしですか・・・ 言葉自体は知っているんですがね勉強不足です ごめんなさい
それとプログラムの方ですがまさか割り算が間違っていたとは、小3の知識から駄目だったんですね

コード:


#include "DxLib.h"
 
int Ghandoru , ghandoru ;
  
int hantei[7][27] = {
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 1,1,1,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
};

 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    int i,j;

    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
    Ghandoru = LoadGraph( "aka.png" ); 
    ghandoru = LoadGraph( "ao.png" ); 
 
    SetDrawScreen( DX_SCREEN_BACK ) ;                                                 //描画先を裏画面に設定

    while(!ProcessMessage() && !ClearDrawScreen()){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
               
	        /*白い壁を描画*/
                for(i=0;i<7;i++)
                        for(j=0;j<21;j++)
                                if(hantei[i][j]==1){
                                         DrawGraph( j*32,i*68 , Ghandoru, TRUE );
				         }
				else if(hantei[i][j]==2){	 
                                         DrawGraph( j*32 ,i*68 , ghandoru, TRUE );
                                         }

        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}

おそらく、3の質問にも答えられていると思います

Re: マップスクロールの仕組み

Posted: 2011年5月05日(木) 18:47
by softya(ソフト屋)
すこし強引すぎると思います。

・インデントが不正確なので正しくお願いします。
・グラフィックを縦に伸ばして合わすのは後々問題があるので、素直に縦に15ブロックパーツを並べた方が良いと思います。7x68だと476で4ドット不足する上に32x68の背景パーツを書くのが大層困難です。
・横が0~20を表示しています。私のお願いしたいのは1~21(訂正します)1~20をお願いします。
・今ので文法的にはあってますが、for文にも{}を使うようにしてください。
 今後のためにも余程の場合をのぞいて単文は避けてください。

Re: マップスクロールの仕組み

Posted: 2011年5月05日(木) 20:21
by tkto
いままでのように座標系÷画像の数でドットサイズを求めているのですが
なぜか画像がうまく描画されません(画像が大きくなります)
ソースに原因はありますか

コード:

int hantei[15][27] = {
        { 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
};


                for(i=0;i<15;i++){
                        for(j=0;j<21;j++){
                                if(hantei[i][j]==1){
                                         DrawGraph( j*32,i*32 , Ghandoru, TRUE );
		   }
		      else if(hantei[i][j]==2){	 
                                         DrawGraph( j*32 ,i*32 , ghandoru, TRUE );
                             }
                          }
                       }

Re: マップスクロールの仕組み

Posted: 2011年5月05日(木) 22:15
by softya(ソフト屋)
こちらでは狙い通りに表示されます。
pngのドットサイズはちゃんと32x32でしょうか?

Re: マップスクロールの仕組み

Posted: 2011年5月05日(木) 22:22
by box
tkto さんが書きました:

コード:

                                         DrawGraph( j*32,i*32 , Ghandoru, TRUE );
                                         DrawGraph( j*32 ,i*32 , ghandoru, TRUE );
Ghandoru

ghandoru
とは別物となりますが、この点は大丈夫ですか?

Re: マップスクロールの仕組み

Posted: 2011年5月05日(木) 22:39
by tkto
あ、画像サイズの問題ですかね?
ペイントで適当に描いた絵ですので・・・
描きなおしてみます

Re: マップスクロールの仕組み

Posted: 2011年5月05日(木) 22:46
by box
あ、失礼しました。別物でよかったんですね。
やっぱり素人が横からしゃしゃり出ない方がよかったです。

Re: マップスクロールの仕組み

Posted: 2011年5月05日(木) 23:12
by tkto
boxさん!どこが初心者ですか 伝説なるハッカーじゃないですか
私もよく大文字と小文字の違いで間違えたものですので(そのときはjavaでしたが)
指摘してくださりありがとうございます 精進していきたいと思います 
ソースの方は上手く出来ました

コード:


#include "DxLib.h"
 
int Ghandoru , ghandoru ;
  
int hantei[15][27] = {
        { 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
};

 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    int i,j;

    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
    Ghandoru = LoadGraph( "aka.png" ); 
    ghandoru = LoadGraph( "ao.png" ); 
 
    SetDrawScreen( DX_SCREEN_BACK ) ;                                                 //描画先を裏画面に設定

    while(!ProcessMessage() && !ClearDrawScreen()){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
               
	        /*白い壁を描画*/
                for(i=0;i<15;i++){
                        for(j=0;j<20;j++){
                                if(hantei[i][j]==1){
                                         DrawGraph( j*32,i*32 , Ghandoru, TRUE );
		   }
		      else if(hantei[i][j]==2){	 
                                         DrawGraph( j*32 ,i*32 , ghandoru, TRUE );
                             }
                          }
                       }
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}
プレビューをしているのですが、どうしてもelseの位置がおかしくなります お許しください

Re: マップスクロールの仕組み

Posted: 2011年5月06日(金) 00:05
by softya(ソフト屋)
正しいインデントはこんな感じです。
VC++ならCTRL+Aで全選択した後に、メニューで編集→詳細→選択範囲をフォーマットすれば自動インデントされます。
ちなみに、インデントはTABキーを使ってくださいね。

コード:

#include "DxLib.h"

int Ghandoru , ghandoru ;

int hantei[15][27] = {
	{ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2 },
	{ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2 },
	{ 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
	{ 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
	{ 0,1,1,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
	{ 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
	{ 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
	{ 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
	{ 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
	{ 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
	{ 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
	{ 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
	{ 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
	{ 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
	{ 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
};

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

	int i,j;

	if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

	Ghandoru = LoadGraph( "siro.png" ); 
	ghandoru = LoadGraph( "aka.png" ); 

	SetDrawScreen( DX_SCREEN_BACK ) ;                                                 //描画先を裏画面に設定

	while(!ProcessMessage() && !ClearDrawScreen()){
		//↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了

		/*白い壁を描画*/
		for(i=0;i<15;i++){
			for(j=0;j<20;j++){
				if(hantei[i][j]==1){
					DrawGraph( j*32,i*32 , Ghandoru, TRUE );
				}
				else if(hantei[i][j]==2){  
					DrawGraph( j*32 ,i*32 , ghandoru, TRUE );
				}
			}
		}
		ScreenFlip();
	}

	DxLib_End();
	return 0;
}
それと
・横が0~20を表示しています。私のお願いしたいのは1~20の表示をお願いします。
が実現できてません。
例を書くと配列の添字hantei[0][1]を(0,0)座標に表示してください。
以下、hantei[0][2]を(32,0)座標・・・と続きます。

でそれが出来たらキー入力で左右に背景を移動できるようにしてください。
つまり、最初は1~20を表示です。右にキーを押したら2~21を表示する、以下押すたびに3~22と変化するようにしてください。
左も同様です。

Re: マップスクロールの仕組み

Posted: 2011年5月07日(土) 14:45
by tkto
最初にfor文で(J=0:j<20:j++)と記述すると画面に入りきらないところは描画されていないのですが
どうすればいいのでしょう?  BCCではtabキーを使えるのですが掲示板では使えません・・・
(一応、下のコードで動きました)

コード:

#include "DxLib.h"
 
int Ghandoru , ghandoru ;
 

int hantei[15][27] = {
        { 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
        { 0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 },
};

 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    int i,j;
    int x=32;
    
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
    Ghandoru = LoadGraph( "aka.png" ); 
    ghandoru = LoadGraph( "ao.png" ); 
 
    SetDrawScreen( DX_SCREEN_BACK ) ;                                                 //描画先を裏画面に設定

    while(!ProcessMessage() && !ClearDrawScreen()){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
               
	        if(x<192&&CheckHitKey( KEY_INPUT_RIGHT )){
			x+=32
                     }
	     
	        if(x>0&&CheckHitKey( KEY_INPUT_LEFT )){
	                x-=32;
	        }
		
		
		/*白い壁を描画*/
                for(i=0;i<15;i++){
                        for(j=0;j<27;j++){
                                if(hantei[i][j]==1){
                                         DrawGraph( j*32-x,i*32 , Ghandoru, TRUE );
		      }
		       else if(hantei[i][j]==2){	 
                                         DrawGraph( j*32-x ,i*32 , ghandoru, TRUE );
                      	      }
                      	}
               }
        	
	
	ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}

Re: マップスクロールの仕組み

Posted: 2011年5月09日(月) 01:50
by softya(ソフト屋)
すいません外出してました。
で、問題の点はX座標に移動に合わせて参照する配列の番号を操作していないからです。
いまのX座標はピクセル単位ですから、0~31の間は配列の0から表示します。
32~63までは、配列の1から表示すると言う具合に変更していけば良いです。
これは単純な計算式でfor文のループ範囲を制御すればできます。