DXlibでのマス目作り
DXlibでのマス目作り
学校の課題で「マス目を作り、マウスが左クリックされている状態でマス目の上をなぞり、離したらそのマス目の上を順番にテクスチャを移動させる」というプログラムを組む課題が出たんですが上手くマス目が作れずに悩んでいます。
どのように作ればいいのか助言などお願いします。
イメージとしては任天堂の「ファイアーエムブレム」のような感じです。
環境は
OS : Windows
コンパイラ名 : VC++ 2013
その他
・どの程度C言語を理解しているか
c言語の知識は「明解C言語入門編」を一通りやり理解できる程度です。
・ライブラリを使っている場合は何を使っているか
ライブラリは「DXライブラリ」を使っています。
※こういった所に書き込むのは初めてなので不備などありましたらご指摘をしていただけると助かります。
どのように作ればいいのか助言などお願いします。
イメージとしては任天堂の「ファイアーエムブレム」のような感じです。
環境は
OS : Windows
コンパイラ名 : VC++ 2013
その他
・どの程度C言語を理解しているか
c言語の知識は「明解C言語入門編」を一通りやり理解できる程度です。
・ライブラリを使っている場合は何を使っているか
ライブラリは「DXライブラリ」を使っています。
※こういった所に書き込むのは初めてなので不備などありましたらご指摘をしていただけると助かります。
Re: DXlibでのマス目作り
そうですね、とりあえず指摘するとすると(フォーラムルール)をちゃんと読みましたか?(一番大事な(努力した形跡)を提示していないとなるとどうも一部分だけ読んだ感じがします)air さんが書きました:学校の課題で「マス目を作り、マウスが左クリックされている状態でマス目の上をなぞり、離したらそのマス目の上を順番にテクスチャを移動させる」というプログラムを組む課題が出たんですが上手くマス目が作れずに悩んでいます。
どのように作ればいいのか助言などお願いします。
イメージとしては任天堂の「ファイアーエムブレム」のような感じです。
環境は
OS : Windows
コンパイラ名 : VC++ 2013
その他
・どの程度C言語を理解しているか
c言語の知識は「明解C言語入門編」を一通りやり理解できる程度です。
・ライブラリを使っている場合は何を使っているか
ライブラリは「DXライブラリ」を使っています。
※こういった所に書き込むのは初めてなので不備などありましたらご指摘をしていただけると助かります。
ソースコードは無くとも最低限どんな事を調べたのか、またそれを参考に自分はどんなアルゴリズムを考えたかを文章だけでいいので提示していただけると助言しやすくなるとおもいますよ。
昔と違って今はネットが進化した時代ですし、大抵検索すればヒントだけでも出てきます。
(よくあるのは少ない情報の提供で回答してもらったのに、それは気がついていたと言う流れです。)
ここは丸投げする場所ではなく自分の提示した知識に何が足りていないのか、どこが間違っているのかを指摘してもらうのが中心になる質問掲示板なので、まずはダメ元でいいので調べてみましょう。
また、できる限りでいいので作ってみるのも大事です。(ウィンドウ上に升目だけを出す、またはマウスの座標を出すだけのプログラムなど)
ちなみDxLibでマウス座標を取得するならGetMousePoint関数を使うとあっさり取得できます。
http://karetta.jp/book-node/game-programming/236808
上のサイトが参考になると思います。
ポリゴンやテクスチャ関係ならばリファレンスが役に立つでしょう。
http://homepage2.nifty.com/natupaji/DxL ... nc_3d.html
それとももしかして、ソースコードではなく設計やアルゴリズムの段階でつまづいたということでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXlibでのマス目作り
どこまで出来ているかソースコードは提示できますか?
現状だと課題の丸投げになってしまっています。
ここまでは出来るが、ここは出来ないの具体的な説明をお願いします。
現状だと課題の丸投げになってしまっています。
ここまでは出来るが、ここは出来ないの具体的な説明をお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXlibでのマス目作り
確かに質問が雑で説明も足りませんでした、すみません。
現在はこのような感じになっています。
マスの数は背景画像の上に6×5マスぐらいの予定で。
左クリックが押されている時にマウスカーソルの位置にtest1が向かうようになっており、カーソルとtest1を白い線が繋いでいます。
やろうとしているマス目と関係があるか分かりませんがやる事が分からず迷走してこのような形になってしまいました。
DXライブラリ 関数リファレンスページhttp://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
こちらのサイトを見て考えていましたがどれを使うのか分からず、他のサイトを見ても混乱してしまっています。
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
//初期化処理--------------------------------------------------------------------------------------
ChangeWindowMode(TRUE); //ウィンドウモードに変更
SetGraphMode(1280, 720, 32); //ウィンドウのサイズ
SetMouseDispFlag(TRUE); // マウスを表示状態にする
if (DxLib_Init() == -1) // DXライブラリ初期化処理
return -1; // エラーが起きたら直ちに終了
SetDrawScreen(DX_SCREEN_BACK); //画面を裏画面にセット
//本文-----------------------------------------------------------------------------------------------------
int test1_up = LoadGraph("test1_up.png"); // test1の上向きの画像
int test1_down = LoadGraph("test1_down.png"); // test1の下向きの画像
int test1_right = LoadGraph("test1_right.png"); // test1の右向きの画像
int test1_left = LoadGraph("test1_left.png"); // test1も左向きの画像
int backgh = LoadGraph("dining.png"); //背景画像の読み込み
int hand = LoadGraph("hand.png"); //カーソルの位置に表示する画像
int gh_test1 = test1_right; // test1_right.png画像のメモリへの読みこみ
int test1_x = 50, test1_y = 150; //画像表示座標を宣言
int MouseBufX, MouseBufY; // マウスのX座標、Y座標を格納する
int MouseInput;
int Cr; //色を格納
int PointX = 0, PointY = 0; //ポインタの座標
gh_test1 = test1_right;
//メインループ----------------------------------------------------------------------------------
for (;;)
{
DrawExtendGraph(0, 0, 960, 720, backgh, TRUE); // 読みこんだ背景を拡大描画
DrawExtendGraph(test1_x, test1_y, test1_x + 80, test1_y + 60, gh_test1, TRUE); // 読みこんだtest1を拡大描画
GetMousePoint(&MouseBufX, &MouseBufY); // マウスの位置を取得
DrawExtendGraph(MouseBufX - 60, MouseBufY, MouseBufX + 80, MouseBufY + 100, hand, TRUE); // 読みこんだグラフィックを拡大描画
Cr = GetColor(255, 255, 255); // 白色の値を取得
DrawLine(test1_x, test1_y, MouseBufX, MouseBufY, Cr); // 線を描画
//画像をカーソルのところに移動する
if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0)
{
if (MouseBufX > test1_x)
{
test1_x = test1_x + 2;
gh_test1 = test1_right;
}
if (MouseBufX < test1_x)
{
test1_x = test1_x - 2;
gh_test1 = test1_left;
}
if (MouseBufY > test1_y)
{
test1_y = test1_y + 2;
gh_test1 = test1_down;
}
if (MouseBufY < test1_y)
{
test1_y = test1_y - 2;
gh_test1 = test1_up;
}
}
else
{
// 押されていない
}
ScreenFlip(); //裏画面を表画面に反映する
ClearDrawScreen(); //裏画面に描かれたものを全て消去
if (ProcessMessage() == -1) //ウィンドウのメッセージ処理
{
break; //ウィンドウのメッセージ処理にエラーが発生した場合ループを抜ける
}
}
//終了処理----------------------------------------------------------------------------------------------
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}
マスの数は背景画像の上に6×5マスぐらいの予定で。
左クリックが押されている時にマウスカーソルの位置にtest1が向かうようになっており、カーソルとtest1を白い線が繋いでいます。
やろうとしているマス目と関係があるか分かりませんがやる事が分からず迷走してこのような形になってしまいました。
DXライブラリ 関数リファレンスページhttp://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
こちらのサイトを見て考えていましたがどれを使うのか分からず、他のサイトを見ても混乱してしまっています。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXlibでのマス目作り
マス目自身が描かれていないですが、さきにマス目を描かれては?
手順として
1.マス目を描く
2.マウスがどのマス目をクリックしたか表示
3.マウスのなぞるマス目を覚える仕組み
4.マウスの移動後をスプライトがなぞる動き。
で作成されてはどうでしょうか?
リファレンスですが、すでに使われている関数だけで出来そうです。
手順として
1.マス目を描く
2.マウスがどのマス目をクリックしたか表示
3.マウスのなぞるマス目を覚える仕組み
4.マウスの移動後をスプライトがなぞる動き。
で作成されてはどうでしょうか?
リファレンスですが、すでに使われている関数だけで出来そうです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXlibでのマス目作り
softya(ソフト屋)さん、返信ありがとうございます。softya(ソフト屋) さんが書きました:マス目自身が描かれていないですが、さきにマス目を描かれては?
手順として
1.マス目を描く
2.マウスがどのマス目をクリックしたか表示
3.マウスのなぞるマス目を覚える仕組み
4.マウスの移動後をスプライトがなぞる動き。
で作成されてはどうでしょうか?
リファレンスですが、すでに使われている関数だけで出来そうです。
簡単な質問でお恥ずかしいのですが、工程1のマス目を書くところで真っ先にDrawLineで1行ずつ書く方法が浮かんだのですが、DrowBoxで1マスずつ書いたり他の関数を使ったりしたほうがいいですかね?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXlibでのマス目作り
DrawLineでもDrawBoxでも、どちらも正解だと思います。なのでご自身でお決め下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXlibでのマス目作り
忙しくて返信遅れました。
線を引いてクリックを表示はできたのですが、なぞる仕組みが良くわかりませんでした。
それと量が多くなり見にくくなってしまってforかwhileで見やすくしたかったのですが上手くいかずに悩んでます。
質問ばかりですが、マウスのなぞった場所を覚える仕組みと綺麗に書くのはどうすればいいのかご指導お願いしたいです。
線を引いてクリックを表示はできたのですが、なぞる仕組みが良くわかりませんでした。
それと量が多くなり見にくくなってしまってforかwhileで見やすくしたかったのですが上手くいかずに悩んでます。
DrawLine(0, 120, 960, 120, Cr); // 線を描画
DrawLine(0, 240, 960, 240, Cr); // 線を描画
DrawLine(0, 360, 960, 360, Cr); // 線を描画
DrawLine(0, 480, 960, 480, Cr); // 線を描画
DrawLine(0, 600, 960, 600, Cr); // 線を描画
DrawLine(120, 0, 120, 720, Cr); // 線を描画
DrawLine(240, 0, 240, 720, Cr); // 線を描画
DrawLine(360, 0, 360, 720, Cr); // 線を描画
DrawLine(480, 0, 480, 720, Cr); // 線を描画
DrawLine(600, 0, 600, 720, Cr); // 線を描画
DrawLine(720, 0, 720, 720, Cr); // 線を描画
DrawLine(840, 0, 840, 720, Cr); // 線を描画
DrawLine(960, 0, 960, 720, Cr); // 線を描画
if (PointX <= 120 && PointY <= 120){
DrawString(1080, 240, "1×1", Cr); // 1*1の範囲
if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0)
{
DrawString(1080, 250, "*", Cr);
}
}
if (PointX <= 240 && PointY <= 120 && PointX > 120){
DrawString(1080, 240, "1×2", Cr); // 1*2の範囲
if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0)
{
DrawString(1080, 250, "*", Cr);
}
}
//※全部張ると長くなるので割愛してます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXlibでのマス目作り
両方いっぺんにするのは無理があるので、まずスッキリ片付けましょうか。
座標を構造体配列に入れて、forループで回してやればスッキリしますよ。
マスのサイズが固定だと思いますので、それはそれでconst intで書いておきます。
座標を構造体配列に入れて、forループで回してやればスッキリしますよ。
マスのサイズが固定だと思いますので、それはそれでconst intで書いておきます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXlibでのマス目作り
学校で少し時間があったのでまとめるのを頑張ったらできました。
ですがコメントを見る前だったので関数化は出来ていないです。
正直なところ、マウスのなぞるマス目を覚える仕組みがさっぱりわかりません
ですがコメントを見る前だったので関数化は出来ていないです。
正直なところ、マウスのなぞるマス目を覚える仕組みがさっぱりわかりません
for (i = 1; i <= 5; i++){
DrawLine(0, i * 120, 960, i * 120, Cr); // 線を描画
}
for (i = 1; i <= 8; i++){
DrawLine(i * 120, 0, i * 120, 720, Cr); // 線を描画
}
for (i = 1; i <= 6; i++){
// i行目の範囲
for (j = 1; j <= 8; j++){
if (PointX <= j * 120 && PointY <= i * 120 && PointX >(j - 1) * 120 && PointY > 120 * (i - 1)){
DrawFormatString(1080, 240, Cr, "%d×%d", i, j); // i * jの範囲
if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0)
{
DrawFormatString(1080, 250, Cr, "click.%d×%d", i, j);
}
}
}
}
Re: DXlibでのマス目作り
自分なら碁盤目を二次元配列の構造体で管理し、構造体になぞった順番を記憶する変数を持たせて
なぞった順番に1,2,3と番号を割り振るような仕組みにするかな。
で、マウスを離したら番号の若い順にテクスチャを移動させます。
なぞった順番に1,2,3と番号を割り振るような仕組みにするかな。
で、マウスを離したら番号の若い順にテクスチャを移動させます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXlibでのマス目作り
すいません。構造体配列を使わずに等間隔なら作れましたね。失礼しました。
あとはtaketoshiさんが説明している感じで作れると思います。、
あとはtaketoshiさんが説明している感じで作れると思います。、
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。