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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tkto

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

#1

投稿記事 by tkto » 14年前

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

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

tkto

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

#2

投稿記事 by tkto » 14年前

描画するものが多くなると難しいのでaaa.pngとbbb.pngの二つの画像を使ってやっています
一から分かりません

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#3

投稿記事 by softya(ソフト屋) » 14年前

まず、難しいことを考える前にaaa.pngとbbb.pngの2つを並べて表示する事はできますか?
ところで、aaa.pngとbbb.pngのドットサイズは幾つですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

tkto

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

#4

投稿記事 by tkto » 14年前

座標を指定して横に並べるということならできます
ドットサイズというのは16×16とかそういうことでしょうか?
でしたら16×16だと思います
これはスクロールのときに重要になるのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#5

投稿記事 by softya(ソフト屋) » 14年前

>でしたら16×16だと思います。これはスクロールのときに重要になるのでしょうか?

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

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

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

[追記]
黒の部分を置き換えると画面が見づらいと思ったら白の部分をaaa.pngに置き換えるだけで良いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

tkto

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

#6

投稿記事 by tkto » 14年前

すいません
ドットサイズってのを勘違いしていました 実際には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)
でしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#7

投稿記事 by softya(ソフト屋) » 14年前

座標としては有っていますが、
DrawGraphScreen(J*32,i*32,"aaa.png",TRUE)
だとロードと表示が込みの関数ですので使い方として間違っています。
ロードLoadGraph()と表示DrawGraph()に分けないといけません。

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

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

このまま続けることも出来ますが、先に「C言語~ゲームプログラミングの館~」を勉強されたほうがより理解できると思いますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

tkto

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

#8

投稿記事 by tkto » 14年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#9

投稿記事 by softya(ソフト屋) » 14年前

じゃあ、一気に3ステップステップ進めてみましょう。
(1)マップ配列内に2の値の所を作って、こちらはbbb.pngを表示。
(2)マップ配列の横の大きさを広げて画面よりも大きくしてください。スクロールは出来なくて良いです。
(3)マップ配列のX=1から15までを表示するように
以上が出来たらソースをcodeタグで囲って貼ってもらえますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

tkto

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

#10

投稿記事 by tkto » 14年前

コード:

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 ) ;
                                  }
		}
	}
私が書いたコードですのでどこかしらに間違いがあると思います ごめんなさい

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#11

投稿記事 by softya(ソフト屋) » 14年前

幾つか間違いがあるのとこれだとエラー出ませんか?
あと全体を載せてくださいね。

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

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

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

以上を再度考えてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

tkto

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

#12

投稿記事 by tkto » 14年前

はい、見直してみます
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 },
};
これだと宣言の構文エラーになるのですが多次元配列の宣言って間違ってますかね

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#13

投稿記事 by softya(ソフト屋) » 14年前

こっちも書き間違えました。
(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)方向の大きさを表します。

それとソースコードのインデントを合わせるクセを付けたほうが良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

tkto

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

#14

投稿記事 by tkto » 14年前

インデントをつける癖ですか・・・ やっぱり人に見せるものですし気をつけます  
当方の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(ソフト屋)

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

tkto

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

#15

投稿記事 by tkto » 14年前

すみませんコードタグ失敗しました
それといきなりannpannmann.pngなんて画像の名前だしてごめんなさい
当方のパソコンよくデーターがぶっとぶので代わりの画像を使用させてもらいました
aaa.png=siro.png iii.png=annpannmann.pngです ごめんなさい

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#16

投稿記事 by softya(ソフト屋) » 14年前

正しいインデントは、こうなります。画像の名前はこちらの都合で変えてます。

あと間違いがまだ有ります。
それと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;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

tk

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

#17

投稿記事 by tk » 14年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#18

投稿記事 by softya(ソフト屋) » 14年前

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

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


>・(3)の要件を満たしていないのはなぜか?
こちらにも答えてくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

#19

投稿記事 by » 14年前

複文はなしですか・・・ 言葉自体は知っているんですがね勉強不足です ごめんなさい
それとプログラムの方ですがまさか割り算が間違っていたとは、小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の質問にも答えられていると思います

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#20

投稿記事 by softya(ソフト屋) » 14年前

すこし強引すぎると思います。

・インデントが不正確なので正しくお願いします。
・グラフィックを縦に伸ばして合わすのは後々問題があるので、素直に縦に15ブロックパーツを並べた方が良いと思います。7x68だと476で4ドット不足する上に32x68の背景パーツを書くのが大層困難です。
・横が0~20を表示しています。私のお願いしたいのは1~21(訂正します)1~20をお願いします。
・今ので文法的にはあってますが、for文にも{}を使うようにしてください。
 今後のためにも余程の場合をのぞいて単文は避けてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

tkto

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

#21

投稿記事 by tkto » 14年前

いままでのように座標系÷画像の数でドットサイズを求めているのですが
なぜか画像がうまく描画されません(画像が大きくなります)
ソースに原因はありますか

コード:

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 );
                             }
                          }
                       }

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#22

投稿記事 by softya(ソフト屋) » 14年前

こちらでは狙い通りに表示されます。
pngのドットサイズはちゃんと32x32でしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

box
記事: 2002
登録日時: 14年前

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

#23

投稿記事 by box » 14年前

tkto さんが書きました:

コード:

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

ghandoru
とは別物となりますが、この点は大丈夫ですか?
最後に編集したユーザー box on 2011年5月05日(木) 22:46 [ 編集 2 回目 ]
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

tkto

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

#24

投稿記事 by tkto » 14年前

あ、画像サイズの問題ですかね?
ペイントで適当に描いた絵ですので・・・
描きなおしてみます

box
記事: 2002
登録日時: 14年前

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

#25

投稿記事 by box » 14年前

あ、失礼しました。別物でよかったんですね。
やっぱり素人が横からしゃしゃり出ない方がよかったです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

tkto

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

#26

投稿記事 by tkto » 14年前

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の位置がおかしくなります お許しください

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#27

投稿記事 by softya(ソフト屋) » 14年前

正しいインデントはこんな感じです。
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と変化するようにしてください。
左も同様です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

tkto

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

#28

投稿記事 by tkto » 14年前

最初に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;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#29

投稿記事 by softya(ソフト屋) » 14年前

すいません外出してました。
で、問題の点はX座標に移動に合わせて参照する配列の番号を操作していないからです。
いまのX座標はピクセル単位ですから、0~31の間は配列の0から表示します。
32~63までは、配列の1から表示すると言う具合に変更していけば良いです。
これは単純な計算式でfor文のループ範囲を制御すればできます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る