Reverseフラグ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
まりも。
記事: 5
登録日時: 1年前

Reverseフラグ

#1

投稿記事 by まりも。 » 1年前

ビジュアルスタジオc++です。

コード:

//CHARA構造体の定義
struct CHARA {

	float px;
	float py;
	float mx;
	float my;
	
};


//CHARA構造体変数の宣言
CHARA pos[4] = {
	{ 0,0,10,0 }, 
	{ 768,0,10,0 },
	{ 768,512,10,0 },
	{ 0,512,0,-10 } 
};

コード:

//移動範囲の境界
	int scLeft   = 0;
	int scRight  = g_pGraphics->GetTargetWidth();
	int scTop    = 0;
	int scBottom = g_pGraphics->GetTargetHeight();

	//画像の大きさ
	int imgWidth  = gTexture.GetWidth();
	int imgHeight = gTexture.GetHeight();


	//移動処理
	for (int i = 0; i < 4; i++)
	{
		pos[i].px += pos[i].mx;
		pos[i].py += pos[i].my;

		float limitX = scRight - imgWidth;
		float limitY = scBottom - imgHeight;

		//右に進んでいるときに右端出たら
		if (pos[i].mx > 0 && pos[i].px > limitX)
		{
			pos[i].px = limitX;

			pos[i].mx = 0;
			pos[i].my = 10;
		}
		//下に進んでいるときに下に出たら
		else if (pos[i].my > 0 && pos[i].py > limitY)
		{
			pos[i].py = limitY;

			pos[i].my = 0;
			pos[i].mx = -10;

		}
		//左に進んでいるときに左端出たら
		else if (pos[i].mx < 0 && pos[i].px < 0)
		{
			pos[i].px = 0;

			pos[i].mx = 0;
			pos[i].my = -10;

		}
		//上に進んでいるときに上に出たら
		else if (pos[i].my < 0 && pos[i].py < 0)
		{
			pos[i].py = 0;
			pos[i].my = 0;
			pos[i].mx = 10;
		}
	}
このように時計回りに一定の速さで回っている四枚の画像があります。ここから
CHARA構造体に反転用のReverseフラグを追加し、Reverseフラグがtrueのキャラクターは反時計回りで移動をおこなうように処理を作成
Reverseフラグはキャラクターをクリックした際にtrue/falseを切り替えるものとする。
 構造体名:CHARA
 構造体メンバー:x座標、y座標、x移動量、y移動量、Reverseフラグ

この方法がわかりません。
教えていただきたいです。

まりも。
記事: 5
登録日時: 1年前

Re: Reverseフラグ

#2

投稿記事 by まりも。 » 1年前

わかりにくくてすみません
回転ではなく、四角の領域を壁に沿って回っています

・構造体にbool reverse;を追加
・従来の移動に関する部分を関数化(逆回りを考えなかった頃のもの)
・逆回りに移動する関数も作る
・reverseがtrue/falseで上記の関数を呼び分ける。

だということはわかっているのですが、書き方がわからず困っています
また、画像をクリックしてture/falseをどうやって切り替えるかなどがわかりません
動いている画像のクリックはどう考えればよいのでしょうか?

アバター
usao
記事: 1889
登録日時: 11年前

Re: Reverseフラグ

#3

投稿記事 by usao » 1年前

逆方向にどうこういう話については

・位置 += 移動量
・位置 -= 移動量

の一方を「正方向」,他方を「逆方向」と呼ぶだけの話なのでは? としか思えません.そこを{あえて? わざわざ?}

> 逆回りに移動する関数も作る

という大仰な話とせねばならない必要性があるのか疑問です.

位置 += ( reverse ? -移動量 : 移動量 );

くらいではダメな話なのでしょうか?

---

> 動いている画像のクリック

各画像の位置を管理しているのはあなたなのですから,例えば「位置(100,200)がクリックされたぞ」という時,それが画像の範囲にあるのか否かをチェックすれば良いだけであろうと思うのですが.
(もちろん判定には画像の形状に関する情報も必要となるでしょうけど.四角形限定ならば「サイズ」とかかな)

---

…と言う感じで,あなたが現在行き詰っている要因が何なのかを知らない側からしたら「何をどうすれば良いのかなんてことは自明すぎるのでは…?」としか見えません.
そのような簡単な話では済まない事情等があるからこそ困っているのでしょうが,であれば,そこのところをまず説明しないと,このような場でのやり取り自体が成立しないように思えます.

アバター
usao
記事: 1889
登録日時: 11年前

Re: Reverseフラグ

#4

投稿記事 by usao » 1年前

オフトピック
> そのような簡単な話では済まない事情等

例えば,画像(を表示するための手段のような何か)毎にクリックのイベントをハンドルする処理を書く必要があるような仕組みの上で実装しているのだ,とかいう場合なら,その仕組みの中で「イベントをハンドルする処理を書く」ってのは一体どうすれば? という話はあるでしょう.

(しかし,あなたがどんな世界で実装しているのかを知らない人にはそんな事情は知る由もない.いきなり「クリック」とだけ言われても伝わるわけない)

アバター
あたっしゅ
記事: 665
登録日時: 14年前
住所: 東京23区
連絡を取る:

Re: Reverseフラグ

#5

投稿記事 by あたっしゅ » 1年前

東上☆海美☆「
貴方のなぞなぞ『使用しているライブラリを当てろ』への回答ですが、
『g_pGraphics』『gTexture』とか検索してみましたが、『GameApp.h』ぐらいしか、わからなかったみみ。
最後に編集したユーザー あたっしゅ on 2022年11月22日(火) 16:42 [ 編集 1 回目 ]
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

参照魚
記事: 109
登録日時: 6年前

Re: Reverseフラグ

#6

投稿記事 by 参照魚 » 1年前

ひとつのサンプルとして参考までに。できるだけ元のコードに沿った修正をしています。

コード:

struct {
	static int GetTargetWidth() { return 768;	}
	static int GetTargetHeight(){ return 512;	}
} *g_pGraphics;

struct {
	static int GetWidth() { return 16;	}
	static int GetHeight(){ return 16;	}
} gTexture;

struct CHARA {
	bool	reverse;
	float 	px;
	float 	py;
	float 	mx;
	float 	my;
	float	speed;
};

constexpr int CHARA_SPEED	= 10;
constexpr int CHARA_NUM		= 4;

void sample(){
	int		scLeft		= 400;
	int		scTop    	= 200;
	int		scRight  	= scLeft + g_pGraphics->GetTargetWidth();
	int		scBottom 	= scTop  + g_pGraphics->GetTargetHeight();

	int		imgWidth	= gTexture.GetWidth();
	int		imgHeight	= gTexture.GetHeight();

	float	minX		= scLeft;
	float	minY		= scTop;
	float	maxX		= scRight  - imgWidth;
	float	maxY		= scBottom - imgHeight;

	static CHARA	pos[CHARA_NUM] = {
		{ false, scLeft,         scTop,          +CHARA_SPEED,            0, CHARA_SPEED },
		{ false, scLeft+scRight, scTop,                     0, +CHARA_SPEED, CHARA_SPEED },
		{ false, scLeft+scRight, scTop+scBottom, -CHARA_SPEED,            0, CHARA_SPEED },
		{ false, scLeft,         scTop+scBottom,            0, -CHARA_SPEED, CHARA_SPEED },
	};

	for ( int i = 0; i < CHARA_NUM; i++ ) {
		extern void click_chara( CHARA*, int, int );
		extern void move_chara(  CHARA*, int, int, int, int );
		extern void draw_chara( const CHARA*, int, int );

		click_chara( &pos[i], imgWidth, imgHeight );
		move_chara(  &pos[i], minX, minY, maxX, maxY );
		draw_chara(  &pos[i], imgWidth, imgHeight );
	}
}

void click_chara( CHARA* pos, int imgWidth, int imgHeight ){

	if ( pos ) {
		extern bool hit_chara( const CHARA* );

		if ( hit_chara( pos ) ) {
			pos->reverse = !pos->reverse;
			pos->mx *= -1;
			pos->my *= -1;
		}
	}
}

void move_chara( CHARA* pos, int minX, int minY, int maxX, int maxY ){

	if ( pos ) {
		pos->px += pos->mx;
		pos->py += pos->my;

		if ( pos->px > maxX ) { pos->px = maxX; pos->my = pos->reverse ? -pos->speed : +pos->speed; pos->mx = 0; return; } // →
		if ( pos->py > maxY ) { pos->py = maxY; pos->mx = pos->reverse ? +pos->speed : -pos->speed; pos->my = 0; return; } // ↓
		if ( pos->px < minX ) { pos->px = minX; pos->my = pos->reverse ? +pos->speed : -pos->speed; pos->mx = 0; return; } // ←
		if ( pos->py < minY ) { pos->py = minY; pos->mx = pos->reverse ? -pos->speed : +pos->speed; pos->my = 0; return; } // ↑
	}
}

bool hit_chara( const CHARA* pos ) { return false; }

void draw_chara( const CHARA* pos, int imgWidth, int imgHeight ){}


返信

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