マップスクロールの仕組み
マップスクロールの仕組み
http://d.hatena.ne.jp/aidiary/20050624/1255786339
こちらのサイトを参考にコードを書いているのですが分かりません
概念自体は図もあるため、なんとなくイメージできるのですが
javaのコードのどの部分がCのどの部分になるかが分かりません
やりたいことはこのページのオフセットの概念をつかい、Cでコードを書きたいです
こちらのサイトを参考にコードを書いているのですが分かりません
概念自体は図もあるため、なんとなくイメージできるのですが
javaのコードのどの部分がCのどの部分になるかが分かりません
やりたいことはこのページのオフセットの概念をつかい、Cでコードを書きたいです
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: マップスクロールの仕組み
まず、難しいことを考える前にaaa.pngとbbb.pngの2つを並べて表示する事はできますか?
ところで、aaa.pngとbbb.pngのドットサイズは幾つですか?
ところで、aaa.pngとbbb.pngのドットサイズは幾つですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: マップスクロールの仕組み
座標を指定して横に並べるということならできます
ドットサイズというのは16×16とかそういうことでしょうか?
でしたら16×16だと思います
これはスクロールのときに重要になるのでしょうか?
ドットサイズというのは16×16とかそういうことでしょうか?
でしたら16×16だと思います
これはスクロールのときに重要になるのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: マップスクロールの仕組み
>でしたら16×16だと思います。これはスクロールのときに重要になるのでしょうか?
画面を埋めるのに何個必要かという意味でお聞きしました。かなりひつようですね。
出来れば32x32のパーツをご用意頂けると説明しやすいですね。
それでは段階を追ってマップスクロールを実装してみましょう。
このサイトのコンテンツである「C言語~ゲームプログラミングの館~」は読まれてましたか?
http://dixq.net/g/
その中に
「C言語~ゲームプログラミングの館~ 24. 行けない所を作る。~2D~」
http://dixq.net/g/26.html
ってのがあると思いますが、このマップ表示で白黒で行っているのをそれぞれaaa.pngとbbb.pngに置き換えできますでしょうか?
[追記]
黒の部分を置き換えると画面が見づらいと思ったら白の部分をaaa.pngに置き換えるだけで良いです。
画面を埋めるのに何個必要かという意味でお聞きしました。かなりひつようですね。
出来れば32x32のパーツをご用意頂けると説明しやすいですね。
それでは段階を追ってマップスクロールを実装してみましょう。
このサイトのコンテンツである「C言語~ゲームプログラミングの館~」は読まれてましたか?
http://dixq.net/g/
その中に
「C言語~ゲームプログラミングの館~ 24. 行けない所を作る。~2D~」
http://dixq.net/g/26.html
ってのがあると思いますが、このマップ表示で白黒で行っているのをそれぞれaaa.pngとbbb.pngに置き換えできますでしょうか?
[追記]
黒の部分を置き換えると画面が見づらいと思ったら白の部分をaaa.pngに置き換えるだけで良いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: マップスクロールの仕組み
すいません
ドットサイズってのを勘違いしていました 実際には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)
でしょうか?
ドットサイズってのを勘違いしていました 実際には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: マップスクロールの仕組み
座標としては有っていますが、
DrawGraphScreen(J*32,i*32,"aaa.png",TRUE)
だとロードと表示が込みの関数ですので使い方として間違っています。
ロードLoadGraph()と表示DrawGraph()に分けないといけません。
DXライブラリを理解されるためにもまず
「C言語~ゲームプログラミングの館~」
http://dixq.net/g/
を一通り勉強されたほうが良いと思います。
ゲームの基本中の基本の知識が散りばめらています。
その上で多分、tkto さんは他言語経験者だと思いますがC言語で分からないことも勉強してください。
「苦しんで覚えるC言語」
http://9cguide.appspot.com/
このまま続けることも出来ますが、先に「C言語~ゲームプログラミングの館~」を勉強されたほうがより理解できると思いますよ。
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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: マップスクロールの仕組み
大丈夫です
Cはよく分かりませんといったのは間違っていた時の保険で言ってしまいました
実際にはCを勉強し始めてから1ヶ月くらい立っています
ゲームプログラミングの館は一通り、目を通しています
マップスクロールが分からない時点で大丈夫ではないと思うのですがね
Cはよく分かりませんといったのは間違っていた時の保険で言ってしまいました
実際にはCを勉強し始めてから1ヶ月くらい立っています
ゲームプログラミングの館は一通り、目を通しています
マップスクロールが分からない時点で大丈夫ではないと思うのですがね
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: マップスクロールの仕組み
じゃあ、一気に3ステップステップ進めてみましょう。
(1)マップ配列内に2の値の所を作って、こちらはbbb.pngを表示。
(2)マップ配列の横の大きさを広げて画面よりも大きくしてください。スクロールは出来なくて良いです。
(3)マップ配列のX=1から15までを表示するように
以上が出来たらソースをcodeタグで囲って貼ってもらえますか?
(1)マップ配列内に2の値の所を作って、こちらはbbb.pngを表示。
(2)マップ配列の横の大きさを広げて画面よりも大きくしてください。スクロールは出来なくて良いです。
(3)マップ配列のX=1から15までを表示するように
以上が出来たらソースをcodeタグで囲って貼ってもらえますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: マップスクロールの仕組み
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: マップスクロールの仕組み
幾つか間違いがあるのとこれだとエラー出ませんか?
あと全体を載せてくださいね。
(1)マップ配列内に2の値の所を作って、こちらはbbb.pngを表示。
0は残して、2を加えてくださいね。今のだと1と2だけになっています。
(2)マップ配列の横の大きさを広げて画面よりも大きくしてください。スクロールは出来なくて良いです。
配列が大きくならずに、初期値だけ増えています。配列も大きくしてください。
(3)マップ配列のX=1から15までを表示するように
表示範囲が変わっていません。for( i = 0 ; i < 15 ; i ++ )だとループする範囲はなんでしょうか?
以上を再度考えてみてください。
あと全体を載せてくださいね。
(1)マップ配列内に2の値の所を作って、こちらはbbb.pngを表示。
0は残して、2を加えてくださいね。今のだと1と2だけになっています。
(2)マップ配列の横の大きさを広げて画面よりも大きくしてください。スクロールは出来なくて良いです。
配列が大きくならずに、初期値だけ増えています。配列も大きくしてください。
(3)マップ配列のX=1から15までを表示するように
表示範囲が変わっていません。for( i = 0 ; i < 15 ; i ++ )だとループする範囲はなんでしょうか?
以上を再度考えてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: マップスクロールの仕組み
はい、見直してみます
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] = {
{ 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: マップスクロールの仕組み
こっちも書き間違えました。
(3)マップ配列のX=1から15までを表示するように
じゃなくて、
(3)マップ配列のX=1から21までを表示するように
が正しいです。
元のソースコードコピペしてコンパイルが通るなら、この宣言ではなく前後関係でまずいことになっている可能性が高いです。
ちなみにint hantei[15][20] の宣言で20は横(X)方向、15は縦(Y)方向の大きさを表します。
それとソースコードのインデントを合わせるクセを付けたほうが良いと思います。
(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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: マップスクロールの仕組み
インデントをつける癖ですか・・・ やっぱり人に見せるものですし気をつけます
当方のjava講師が汚いコードで教授していたから講師のせいですね ・・・絶対
codeタグが間違っていたので修正。 投稿前にプレビューしてくださいね。 by softya(ソフト屋)
一応エラーも全て潰しましたがどこかしら間違っていたらごめんなさい
当方の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;
}
一応エラーも全て潰しましたがどこかしら間違っていたらごめんなさい
Re: マップスクロールの仕組み
すみませんコードタグ失敗しました
それといきなりannpannmann.pngなんて画像の名前だしてごめんなさい
当方のパソコンよくデーターがぶっとぶので代わりの画像を使用させてもらいました
aaa.png=siro.png iii.png=annpannmann.pngです ごめんなさい
それといきなりannpannmann.pngなんて画像の名前だしてごめんなさい
当方のパソコンよくデーターがぶっとぶので代わりの画像を使用させてもらいました
aaa.png=siro.png iii.png=annpannmann.pngです ごめんなさい
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: マップスクロールの仕組み
正しいインデントは、こうなります。画像の名前はこちらの都合で変えてます。
あと間違いがまだ有ります。
それとLoadGraph()がループ何にあったので移動させました(元のだと毎フレームロードするのでメモリが浪費されるのと毎フレームロードで遅くなります)。
問題点
・なぜ画面半分の大きさなのか?
・(3)の要件を満たしていないのはなぜか?
・for文の使いたがまずくて、2の値の時の処理がちゃんと働いていません。何が問題かは、考えてみてください。
動作を確認するためにも2の値の部分は、X座標の小さいところにも1箇所ぐらいは入れてください。
以上を考えてみてください。
あと間違いがまだ有ります。
それと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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: マップスクロールの仕組み
分かりません
if文を使った時の間違いは多分、予約語(else)が抜けていたからかなと思うのですが
なぜ画面半分にしか描画されないかが分かりません
DXライブラリの座標系を描画するオブジェクトの数で割ってみたりしたのですが
なぜか上半分にしか描画されません ・・・なぜなのでしょう
if文を使った時の間違いは多分、予約語(else)が抜けていたからかなと思うのですが
なぜ画面半分にしか描画されないかが分かりません
DXライブラリの座標系を描画するオブジェクトの数で割ってみたりしたのですが
なぜか上半分にしか描画されません ・・・なぜなのでしょう
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: マップスクロールの仕組み
私としては、初心者はブロック文なしで書くべきではないと思います。tk さんが書きました:分かりません
if文を使った時の間違いは多分、予約語(else)が抜けていたからかなと思うのですが
なぜ画面半分にしか描画されないかが分かりません
DXライブラリの座標系を描画するオブジェクトの数で割ってみたりしたのですが
なぜか上半分にしか描画されません ・・・なぜなのでしょう
if,for,whileなどはブロック文がないと単文にしか影響を与えません。
ブロック文で書いていれば防げた問題です。
あと半分しか描画されないのは縦に7しないので、7x32=224ドットですね。実際縦は480ドット有りますので半分にも足りません。
>・(3)の要件を満たしていないのはなぜか?
こちらにも答えてくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: マップスクロールの仕組み
複文はなしですか・・・ 言葉自体は知っているんですがね勉強不足です ごめんなさい
それとプログラムの方ですがまさか割り算が間違っていたとは、小3の知識から駄目だったんですね
おそらく、3の質問にも答えられていると思います
それとプログラムの方ですがまさか割り算が間違っていたとは、小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;
}
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: マップスクロールの仕組み
すこし強引すぎると思います。
・インデントが不正確なので正しくお願いします。
・グラフィックを縦に伸ばして合わすのは後々問題があるので、素直に縦に15ブロックパーツを並べた方が良いと思います。7x68だと476で4ドット不足する上に32x68の背景パーツを書くのが大層困難です。
・横が0~20を表示しています。私のお願いしたいのは1~21(訂正します)1~20をお願いします。
・今ので文法的にはあってますが、for文にも{}を使うようにしてください。
今後のためにも余程の場合をのぞいて単文は避けてください。
・インデントが不正確なので正しくお願いします。
・グラフィックを縦に伸ばして合わすのは後々問題があるので、素直に縦に15ブロックパーツを並べた方が良いと思います。7x68だと476で4ドット不足する上に32x68の背景パーツを書くのが大層困難です。
・横が0~20を表示しています。私のお願いしたいのは1~21(訂正します)1~20をお願いします。
・今ので文法的にはあってますが、for文にも{}を使うようにしてください。
今後のためにも余程の場合をのぞいて単文は避けてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: マップスクロールの仕組み
いままでのように座標系÷画像の数でドットサイズを求めているのですが
なぜか画像がうまく描画されません(画像が大きくなります)
ソースに原因はありますか
なぜか画像がうまく描画されません(画像が大きくなります)
ソースに原因はありますか
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: マップスクロールの仕組み
こちらでは狙い通りに表示されます。
pngのドットサイズはちゃんと32x32でしょうか?
pngのドットサイズはちゃんと32x32でしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: マップスクロールの仕組み
Ghandoru
と
ghandoru
とは別物となりますが、この点は大丈夫ですか?
最後に編集したユーザー box on 2011年5月05日(木) 22:46 [ 編集 2 回目 ]
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: マップスクロールの仕組み
あ、失礼しました。別物でよかったんですね。
やっぱり素人が横からしゃしゃり出ない方がよかったです。
やっぱり素人が横からしゃしゃり出ない方がよかったです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: マップスクロールの仕組み
boxさん!どこが初心者ですか 伝説なるハッカーじゃないですか
私もよく大文字と小文字の違いで間違えたものですので(そのときはjavaでしたが)
指摘してくださりありがとうございます 精進していきたいと思います
ソースの方は上手く出来ました
プレビューをしているのですが、どうしてもelseの位置がおかしくなります お許しください
私もよく大文字と小文字の違いで間違えたものですので(そのときは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;
}
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: マップスクロールの仕組み
正しいインデントはこんな感じです。
VC++ならCTRL+Aで全選択した後に、メニューで編集→詳細→選択範囲をフォーマットすれば自動インデントされます。
ちなみに、インデントはTABキーを使ってくださいね。
それと
・横が0~20を表示しています。私のお願いしたいのは1~20の表示をお願いします。
が実現できてません。
例を書くと配列の添字hantei[0][1]を(0,0)座標に表示してください。
以下、hantei[0][2]を(32,0)座標・・・と続きます。
でそれが出来たらキー入力で左右に背景を移動できるようにしてください。
つまり、最初は1~20を表示です。右にキーを押したら2~21を表示する、以下押すたびに3~22と変化するようにしてください。
左も同様です。
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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: マップスクロールの仕組み
最初にfor文で(J=0:j<20:j++)と記述すると画面に入りきらないところは描画されていないのですが
どうすればいいのでしょう? BCCではtabキーを使えるのですが掲示板では使えません・・・
(一応、下のコードで動きました)
どうすればいいのでしょう? 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: マップスクロールの仕組み
すいません外出してました。
で、問題の点はX座標に移動に合わせて参照する配列の番号を操作していないからです。
いまのX座標はピクセル単位ですから、0~31の間は配列の0から表示します。
32~63までは、配列の1から表示すると言う具合に変更していけば良いです。
これは単純な計算式でfor文のループ範囲を制御すればできます。
で、問題の点はX座標に移動に合わせて参照する配列の番号を操作していないからです。
いまのX座標はピクセル単位ですから、0~31の間は配列の0から表示します。
32~63までは、配列の1から表示すると言う具合に変更していけば良いです。
これは単純な計算式でfor文のループ範囲を制御すればできます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。