Re: blackStoneをクリックした場所にずっと表示したい ( No.1 ) |
- 名前:管理人 日時:2018/06/11 00:27
クリックした座標を変数に保存しておけばクリックした場所に表示させ続けることができます
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更,初期化,裏画面設定
int x, y, Mouse, Wheel, Image;
int blackStoneX, blackStoneY;
int blackStone = LoadGraph("黒石.png");//画像ロード
int blackStoneFlag = 0;
// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) {
Mouse = GetMouseInput(); //マウスの入力状態取得
GetMousePoint(&x, &y); //マウスの座標取得
//左クリックしたら絵が画面上に残るようにしたい。
if (Mouse & MOUSE_INPUT_LEFT && blackStoneFlag == 0)
{ //マウスの左ボタンが押されていたら
blackStoneFlag = 1;
//座標を保存しておく
blackStoneX = x;
blackStoneY = y;
}
DrawGraph(x , y, blackStone, true);
if (blackStoneFlag == 1)
{
//保存した座標に描画
DrawGraph(blackStoneX, blackStoneY, blackStone, true);
}
if (CheckHitKey(KEY_INPUT_ESCAPE) == 1) {
break;
}
}
DxLib_End();
return 0;
}
|
Re: blackStoneをクリックした場所にずっと表示したい ( No.2 ) |
- 名前:lateNight 日時:2018/06/11 21:13
大変ありがとうございました。
クリックした場所に黒石表示させ続けることができました。
この後、同じように、またクリックしたら、
別な個所に黒石表示させ続ける、またクリックしたら、さらに別の個所に
黒石表示させ続けるという具合に
クリックするごとに黒石を打てるようにしたいのですが、
どうすればよいでしょうか?
|
Re: blackStoneをクリックした場所にずっと表示したい ( No.3 ) |
- 名前:管理人 日時:2018/06/12 02:04
クリックされた座標を全部保存しておけば表示させ続けることができます
クリックされた回数を int型変数( blackStoneNum )に、クリックされた座標を
配列( blackStoneX, blackStoneY )に保存しておきます
以下のプログラムは、#define で定義されている BLACK_STONE_MAX_NUM の数( 60個 )まで表示させておくことができます
// 保存できる座標の数
#define BLACK_STONE_MAX_NUM (60)
#include "DxLib.h"
int blackStoneNum = 0;
int blackStoneX[ BLACK_STONE_MAX_NUM ], blackStoneY[ BLACK_STONE_MAX_NUM ];
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更,初期化,裏画面設定
int x, y, Mouse = 0, PrevMouse = 0, EdgeMouse = 0, Wheel, Image;
int blackStone = LoadGraph("黒石.png");//画像ロード
// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) {
// ひとつ前のフレームのマウスのボタン押下状態を保存
PrevMouse = Mouse;
// 現在のフレームのマウスのボタン押下状態を取得
Mouse = GetMouseInput();
// 今回のフレームで押されたボタンのみを抽出
EdgeMouse = Mouse & ~PrevMouse;
GetMousePoint(&x, &y); //マウスの座標取得
//左クリックしたら絵が画面上に残るようにしたい。
if( (EdgeMouse & MOUSE_INPUT_LEFT) != 0)
{ //マウスの左ボタンが押されていたら
//座標の数が限界を超えていなければ座標を保存しておく
if( blackStoneNum < BLACK_STONE_MAX_NUM )
{
blackStoneX[ blackStoneNum ] = x;
blackStoneY[ blackStoneNum ] = y;
//保存した座標の数を1増やす
blackStoneNum += 1;
}
}
DrawGraph(x , y, blackStone, true);
for( int i = 0; i < blackStoneNum; i++ )
{
//保存した座標に描画
DrawGraph(blackStoneX[ i ], blackStoneY[ i ], blackStone, true);
}
if (CheckHitKey(KEY_INPUT_ESCAPE) == 1) {
break;
}
}
DxLib_End();
return 0;
}
 |
Re: blackStoneをクリック ( No.4 ) |
- 名前:ひいちゃ 日時:2018/06/12 06:39
さらにいうなら、盤の目の情報を8*8の配列でもたせ、それに従って盤と駒を書くという手もありますね(^^)
|
Re: blackStoneをクリックした場所にずっと表示したい ( No.5 ) |
- 名前:lateNight 日時:2018/06/13 13:45
>管理人さん
大変ありがとうございました。
黒石を複数表示することができました。
>ひいちゃさん
ありがとうございます!アドバイスしていただいた通りに
作ってみます!!
|
Re: blackStoneをクリックした場所にずっと表示したい ( No.6 ) |
- 名前:lateNight 日時:2018/06/13 14:49
>管理人さん
大変申し訳ございません。
黒石を複数表示することはできましたが、
理解できなかったところがありましたので、
教えて頂けるとありがたいです。
分からないところ:
// ひとつ前のフレームのマウスのボタン押下状態を保存
PrevMouse = Mouse;
// 現在のフレームのマウスのボタン押下状態を取得
Mouse = GetMouseInput();
// 今回のフレームで押されたボタンのみを抽出
EdgeMouse = Mouse & ~PrevMouse;
質問:なぜ今回のフレームで押されたボタンのみを抽出する必要があるのか?
(PrevMouseとEdgeMouseがなくても問題なく黒石を置き続けることができたので、
なぜわざわざフレームで押されたボタンのみを抽出されたのか疑問に思いました。)
すみません。ゲーム制作は難しくてまだまだよくわからないことが多いですが、
教えて頂けるとありがたいです。どうかよろしくお願いします。
|
Re: blackStoneをクリックした場所にずっと表示したい ( No.7 ) |
- 名前:どん 日時:2018/06/13 20:49
PrevMouseとEdgeMouseがなければ、ボタンを押したままだと連続して黒石を置き続け、
一瞬で石をおける数の限界を超えてしまいます
たぶん、目には1つだけおいてるつもりでもプログラム的には同じ座標に重なっているのではないでしょうか?
ユーザーが一瞬押したつもりでもプログラム上は何回もその状態を取得しているからです
なので、前の状態を保存しておくことでボタンが押された瞬間だけを検知することができます
|
Re: blackStoneをクリックした場所にずっと表示したい ( No.8 ) |
- 名前:lateNight 日時:2018/06/15 06:19
>どんさん
わかりやすい解説をありがとうございました。
とても助かりました。
大変申し訳ございませんが、
あと
EdgeMouse = Mouse & ~PrevMouse;
でMouse & ~PrevMouseはどういう意味でしょうか?
他のサイトで&の意味や~の意味を調べましたが、
よくわかりました。
すみません。コンピュータ関係の知識が不足していて
理解が難しいので、教えて頂けるとありがたいです。
どうかよろしくお願いします。
|
Re: blackStoneをクリックした場所にずっと表示したい ( No.9 ) |
- 名前:どん 日時:2018/06/15 17:12
&や~はビット演算を意味します
~はその後ろの値のビットの反転を意味し、&でその前後のビットの論理積をとります
このプログラムでは
Mouse = GetMouseInput();
// 今回のフレームで押されたボタンのみを抽出
EdgeMouse = Mouse & ~PrevMouse;
GetMousePoint(&x, &y); //マウスの座標取得
//左クリックしたら絵が画面上に残るようにしたい。
if( (EdgeMouse & MOUSE_INPUT_LEFT) != 0)
…
となているので
例えば左クリックを検知するときに
(MOUSE_INPUT_LEFT = 1とします)
Mouse = MOUSE_INPUT_LEFT , PrevMouse = MOUSE_INPUT_LEFT
で今回のフレームとその前のフレームの両方で押されていた場合
EdgeMouse = Mouse & ~PrevMouse;は
0 = (0x1) & (0xfffffffe)となります
しかしMouse = MOUSE_INPUT_LEFT , PrevMouse = 0
でその前のフレームではで押されていなかった場合
EdgeMouse = Mouse & ~PrevMouse;は
1 = (0x1) & (0xffffffff)となります
またMouse = 0 , PrevMouse = MOUSE_INPUT_LEFT
で今回のフレームではで押されていなかった場合
EdgeMouse = Mouse & ~PrevMouse;は
0 = (0x0) & (0xffffffff)となります
(もし上のことがわからなければビット演算について勉強してください)
こうすることによって前回は押されてないが、今回は押された場合を検知することができます
|
Re: blackStoneをクリックした場所にずっと表示したい ( No.10 ) |
- 名前:lateNight 日時:2018/06/16 15:25
どんさん
ご回答をありがとうございました。
まだわからないので、ビット演算について勉強します。
あとフレームも何となくわかるくらいなので、
そちらもしっかり理解してきます。
|