(´・ω・`)

kerotan0820
記事: 91
登録日時: 14年前

(´・ω・`)

投稿記事 by kerotan0820 » 14年前

ITパスポートが7月10日… あと一ヶ月です!
毎日電車の中で気合いれて勉強してます(笑)

ところで本題ですが
以前も質問させていただいた、的の移動処理を関数化したいものの、きちんと動作しないという件。

ポインタについて勉強することをおすすめしますと、バッサリと言われてしまったので教本で確認しなおしてみたものの、何をどう修正すればいいのか、頭が回らず挫折寸前です(´・ω・`)

ウィンドウズプログラムを少し触ってみようかなと発言しただけで、GRAMさんには俺が挑戦しても挫折すると思うみたいなこと言われるし。

実力の無さ、頭の悪さを実感、なんてのはずっと前からしてるものの、何を頑張ればいいのかさえ分からなくなってきました…

ただ暗記するだけの勉強である ITパスポート の勉強に力を入れることが今のなんというか、支えです。



質問サイトで書きこんで、またポインタを勉強するように言われるんじゃないかと思うと質問もしにくいし、

なんとなく日記に書き込みました。

少しだけ修正してみたものの、未だきちんと動かずじまいです…。

CODE:

#include "DxLib.h"
 
int MouseInput;
int menu=0,playmusic=1,Key[256],White;
int back1/*menu*/,back2/*play1*/,mato1;
int Sound1/*menu*/,Sound2/*play1*/,Sound3;
 
/***********色の定義*********/
 
 
int Movemato( int *count,int *move,int *x, int *y, int *x1, int *y1,int *x2, int *y2){

	static int x_1=0,y_1=0;
 
             if(*count%50 == 0 || *count == 1 ){
            PlaySoundMem( Sound3, DX_PLAYTYPE_BACK ); // 効果音を再生する
            *count+=1;
        }
 
        if( *count == 1 ){
        *x1=GetRand(500);
        *y1=GetRand(340);
        }
        
        if(*move==0){
            *move=1;
        }else{
            *count=0;
        }
 
    if(*move == 1){
		x_1=*x1-*x;
        y_1=*y1-*y;
 
        if(x_1== 0 && y_1 == 0){// 座標が一致したら停止
            *move=0;
 
 
 
        }
        else{
            // 座標がずれていたら近い方へ10ピクセル移動
            if (x_1) x_1 < 0 ? *x-=10 : *x+=1; // X座標
            if (y_1) y_1 < 0 ? *y-=10 : *y+=1; // Y座標
        }
    }
 
    return 0;
}
 
/*******************************************************
                      ステージ1
*******************************************************/
void Start1(void){ 
    MouseInput = GetMouseInput(); //マウスの入力状況を取得
    static int x=250,y=130,x1=0,y1=0,x2=0,y2=0;
    static int count=0,move=0;
 
    White = GetColor( 255 , 255 , 255 );
 
    
 
    /*******************************************
    的をクリックしたら、点を加算、的を移動させる
    *******************************************/
    if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0){
        move=1;
        Movemato( &count, &move, &x, &y, &x1, &y1, &x2, &y2);
    }
 
 
    /************
    BGM 再生処理
    ************/
    if(playmusic==0){//playmusicが0ならば音楽を再生(playmusicを2で初期化)
        StopSoundMem( Sound1 ) ;
        playmusic=2;
    }
 
    if(playmusic==2)
    PlaySoundMem( Sound2 , DX_PLAYTYPE_LOOP );//バックグラウンド再生
 
    DrawGraph( 0 , 0 , back1  , FALSE ) ;
    DrawGraph( x , y , mato1  , TRUE  ) ;
    playmusic=3;
 
    DrawFormatString(  100,  100, White , "count=%d"   , count  );//文字列表示
}
 
 
 
 
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
        else                            GetHitKeyStateAll_InputKey[i]=0;
    }
    return 0;
}
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
    SetMouseDispFlag( TRUE ) ;
    
    /*******色の定義*******************/
    White = GetColor( 255 , 255 , 255 );
 
    /*******画像のメモリ読み込み*******/
    back1 = LoadGraph( "image/back(play).png" ) ;
    back2 = LoadGraph( "image/back(menu).png" ) ;
    mato1 = LoadGraph( "image/mato(play1).png") ;
 
    /*******音声のメモリ読み込み*******/
    Sound1 = LoadSoundMem( "Sound/backmusic/menu(music).wav" );
    Sound2 = LoadSoundMem( "Sound/backmusic/play(music).wav" );
    Sound3 = LoadSoundMem( "Sound/se/click1.wav" );
 
 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
 
 
        if(menu==0){ //(menuが0の時)メニュー画面(トップ)
            if(playmusic == 1){
                PlaySoundMem( Sound1 , DX_PLAYTYPE_LOOP );//バックグラウンド再生
            }
 
            DrawGraph( 0 , 0 , back2  , FALSE ) ;
            DrawString(100,100,"スペースキーでゲームスタート\n",White);
            playmusic=0; 
        }
        
        if(Key[KEY_INPUT_SPACE]==1 || menu==1){ //スペースキーが押された時、またはmenuが1の時(
                Start1();
                menu=1;
        }
 
 
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}
何故なんですかね…。

もう頭が働きません。

バイトにレポートにITパスポートに… 寝る間もほとんどなければ遊ぶ暇もなかなかなく。。。
ただストレスが貯まるばかりの毎日です。


ITパスポートを乗り越えたら夏休み  友人等と海へ行く予定もあるので、なんとか頑張りたいです。

過去に勉強をサボってきた事による大きな学力のハンデを背負ってはいるものの、専門学校、大学なりになんとか進学して、自分の限界に挑戦したいと本当に思いますね。

お前は口だけだみたいなことをずっと言われてきたけど、口だけじゃなくてやる気もある。理想の自分をいつも考えてる。 けど一つのことに集中出来ない。
なぜなら努力をしてこなかったから。
今、それを乗り越えようと頑張ってる。 それを知らずに小さい頃から当たり前に勉強してきた人が、偉そうに見下すようなことを言うのは人間として最低だおともう。
最後に編集したユーザー kerotan0820 on 2011年6月15日(水) 03:13 [ 編集 1 回目 ]

アバター
MNS
記事: 35
登録日時: 14年前

RE: (´・ω・`)

投稿記事 by MNS » 14年前

とりあえず、現状で的の移動処理が左クリックされている間だけ実行されることになってるのはどうなんでしょ
移動はクリックされているか否かに関わらず行われるもんだと思います
もし、移動処理に的のクリック判定の処理がはいっているなら、
どうにかして分離したほうがいいでしょうね

あと、的の移動量が、左右、上下で異なるのもどうにかしたほうがいいのでは?
確かに、片方の移動量を1ピクセルにすれば、移動はちゃんと遂行されるでしょうが、
結局のところ変な動きになってまた考えなおすことになりそうな気がします
移動量を一定でなく可変なものにすることを考えてみてはどうでしょ?

dic
記事: 658
登録日時: 14年前

Re: (´・ω・`)

投稿記事 by dic » 14年前

私は独学ですが、ポインタの理解にはとても苦しみました
ポインタだけで3ヶ月~6ヶ月かかりましたね
それくらい粘らないと独学は厳しいです
ただ、ポインタにはそれだけ苦しいだけのメリットはあります
あせらず、今回はポインタ変数を何個も使わずに
ひとつひとつていねいに習得しましょう

アバター
へろりくしょん
記事: 92
登録日時: 14年前

RE: (´・ω・`)

投稿記事 by へろりくしょん » 14年前

今朝ちょっと時間があったのでざっくり書いてみました。
普通に書いたらちょっと行数が長くなったので、あっちこっち削ったりしてたら、なんだかとても汚いコードになりましたが、参考になれば幸いです。

外部からファイルの読み込みとかは一切してないので、このままで動くはずです。

CODE:

#include 
#include 

enum HITCODE {ST_NORMAL, ST_CHIT, ST_OHIT};
struct TARGET{
	POINT from;			//ターゲットの移動開始位置
	POINT to;			//    ・・    移動先位置
	HITCODE hitCode;
	int moveCount;		//    ・・    移動フレーム数(10フレームで移動先へ到達する)
	int image;
};

union SCORE{
	unsigned int score;
	struct{
		unsigned int shot : 16;		//ショット回数
		unsigned int great : 8;		//いい当たり回数
		unsigned int good : 8;		//まぁまぁ当たり回数
	};
};

struct SHOOTST{
	TARGET target;
	SCORE score;
	BOOL play;
	int time;
};

//ターゲットの色[HITCODE][0: 外側、1: 内側]
static const int Colors[][2] = {
	{RGB(0, 0, 124), RGB(0, 0, 255)},
	{RGB(0, 0, 124), RGB(255, 255, 255)},
	{RGB(255, 255, 0), RGB(0, 0, 255)}
};

static BOOL Mouse;
static void (*SceneFunction)(SHOOTST*);

static void initialize(SHOOTST *sst);
static void playScene(SHOOTST *sst);
static void scoreScene(SHOOTST *sst);
static void addHole(TARGET *tg, int x, int y);
static void drawTarget(TARGET *targ, int x, int y);
static void drawScope(int x, int y);
static void drawScore(SCORE *scr, int x, int y, double per);
static void drawTimerBoard(int time);

///////////////////////////////////////////////////////////////////////////////////////////////////
//エントリーポイント                                                                             //
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)/////////
{
	SHOOTST sootSt = {0};
	ChangeWindowMode(TRUE);

	if(DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK)) return -1;
	SetDrawValidGraphCreateFlag(TRUE);
	SetDrawValidAlphaChannelGraphCreateFlag(TRUE);

	initialize(&sootSt);
	SceneFunction = playScene;
	while(!ProcessMessage() && !ClearDrawScreen() && !CheckHitKey(KEY_INPUT_ESCAPE)){
		SceneFunction(&sootSt);
		ScreenFlip();
    }

	DxLib_End();

	return 0;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//初期化                                                                                         //
void initialize(SHOOTST *sst)//////////////////////////////////////////////////////////////////////
{
	sst->target.from.x = sst->target.to.x = 320;
	sst->target.from.y = sst->target.to.y = 240;
	sst->target.hitCode = ST_NORMAL;
	if(!sst->target.image){
		sst->target.image = MakeGraph(100, 100);
	}else{
		SetDrawScreen(sst->target.image);
		SetDrawBlendMode(DX_BLENDMODE_MUL, 0);
		DrawBox(0, 0, 100, 100, GetColor(0, 0, 0), TRUE);
		SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 255);
		SetDrawScreen(DX_SCREEN_BACK);
	}
	sst->play = FALSE;
	sst->score.score = 0;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//メインのシーン                                                                                 //
void playScene(SHOOTST *sst)///////////////////////////////////////////////////////////////////////
{
	DrawBox(0, 0, 640, 480, GetColor(205, 205, 255), TRUE);

	static const double Accell[] = {0.2, 0.3, 0.4, 0.6, 0.8, 0.85, 0.91, 0.95, 0.97, 0.98, 0.99};
	int txp, typ, mx, my;

	if(sst->play){
		int tim = GetNowCount() - sst->time;
		if(tim time);
		}else{
			SceneFunction = scoreScene;
		}
	}else{
		sst->time = GetNowCount();
	}

	//ターゲット・マウスの描画
	GetMousePoint(&mx, &my);
	txp = (int)(sst->target.from.x + (sst->target.to.x - sst->target.from.x) * Accell[sst->target.moveCount]);
	typ = (int)(sst->target.from.y + (sst->target.to.y - sst->target.from.y) * Accell[sst->target.moveCount]);
	drawTarget(&sst->target, txp, typ);
	drawScope(mx, my);
	drawScore(&sst->score, 0, 400, 1);

	//ターゲットの移動
	if(sst->target.moveCount != -1 && sst->target.moveCount++ == 10){
		sst->target.from = sst->target.to;
		sst->target.moveCount = -1;
		sst->target.hitCode = ST_NORMAL;
	}

	if(GetMouseInput() & MOUSE_INPUT_LEFT){
		if(!Mouse){			//撃った
			double len = sqrt(pow((double)(txp - mx), 2) + pow((double)(typ - my), 2));
			sst->score.shot++;

			if(len target.hitCode = ST_CHIT;
					sst->score.great++;
				}else{						//まぁまぁ当たり
					sst->target.hitCode = ST_OHIT;
					sst->score.good++;
				}
				addHole(&sst->target, mx - txp + 50, my - typ + 50);

				//ターゲットの新しい移動先を設定
				sst->target.from.x = txp;
				sst->target.from.y = typ;
				sst->target.moveCount = 0;
				sst->target.to.x = 50 + GetRand(540);
				sst->target.to.y = 50 + GetRand(380);
			}else{					//はずれた
				sst->target.hitCode = ST_NORMAL;
			}
			Mouse = sst->play = TRUE;
		}
	}else Mouse = FALSE;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//終わった後にスコアを表示するシーン                                                             //
void scoreScene(SHOOTST *sst)//////////////////////////////////////////////////////////////////////
{
	static const char *RankC[] = {"F-", "F", "F+", "E-", "E", "E+", "D-", "D", "D+", "C-", "C", "C+", "B-", "B", "B+", "A-", "A", "A+"};

	double gr = sst->score.great ? sst->score.great * 100.0 / sst->score.shot : 0;
	double gd = sst->score.good ? sst->score.good * 100.0 / sst->score.shot : 0;
	int score = sst->score.great * 2 + sst->score.good + (sst->score.great + sst->score.good - sst->score.shot) * 2;

	int rank = (int)((score * gr * 2 + score * gd + score) / 2000);
	if(rank  17) rank = 17;

	DrawBox(0, 0, 640, 480, GetColor(255, 255, 255), TRUE);
	drawScore(&sst->score, 20, 250, 3);
	DrawExtendFormatString(170, 50, 5, 5, GetColor(0, 0, 0), "RANK %s", RankC[rank]);
	DrawBox(550, 440, 630, 470, GetColor(127, 127, 127), TRUE);

	int mx, my;
	BOOL btn = FALSE;
	GetMousePoint(&mx, &my);
	if(mx >= 550 && mx = 440 && my image);
	DrawCircle(xo, yo, 3, GetColor(0, 0, 0), TRUE);
	DrawCircle(xo, yo, 1, GetColor(127, 127, 127), TRUE);
	SetDrawScreen(DX_SCREEN_BACK);
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//ターゲットの描画                                                                               //
void drawTarget(TARGET *tg, int x, int y)//////////////////////////////////////////////////////////
{
	DrawCircle(x, y, 50, Colors[tg->hitCode][0], TRUE);
	DrawCircle(x, y, 16, Colors[tg->hitCode][1], TRUE);

	DrawGraph(x - 50, y - 50, tg->image, TRUE);
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//スコープの描画                                                                                 //
void drawScope(int x, int y)///////////////////////////////////////////////////////////////////////
{
	DrawLine(0, y, 640, y, GetColor(127, 127, 127));
	DrawLine(x, 0, x, 480, GetColor(127, 127, 127));
	DrawCircle(x, y, 50, GetColor(0, 0, 0), FALSE);
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//スコアの描画                                                                                   //
void drawScore(SCORE *scr, int x, int y, double per)///////////////////////////////////////////////
{
	DrawExtendFormatString(x, (int)(y + 0 * per), (int)per, (int)per, GetColor(0, 0, 0), "Shot:  %u", scr->shot);
	DrawExtendFormatString(x, (int)(y + 15 * per), (int)per, (int)per, GetColor(0, 0, 0), "Great: %u", scr->great);
	DrawExtendFormatString(x, (int)(y + 30 * per), (int)per, (int)per, GetColor(0, 0, 0), "Good:  %u", scr->good);
	DrawExtendFormatString(x, (int)(y + 45 * per), (int)per, (int)per, GetColor(0, 0, 0), "Hit:   %u", scr->great + scr->good);
	DrawExtendFormatString(x, (int)(y + 60 * per), (int)per, (int)per, GetColor(0, 0, 0), "Score: %d",
		scr->great * 2 + scr->good + (scr->great + scr->good - scr->shot) * 2);
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//残り時間を表示するアレの描画                                                                   //
void drawTimerBoard(int time)//////////////////////////////////////////////////////////////////////
{
	char buf[10];
	double per = time / 30000.0, ox = 320 * per, oy = 240 * per;
	sprintf_s(buf, 10, "%2.3f", 30 - time / 1000.0);
	int wid = GetDrawExtendStringWidth(per, buf, 7);

	DrawBox((int)(320 - ox), (int)(240 - oy), (int)(320 + ox), (int)(240 + oy), GetColor(164, 164, 205), TRUE);

	per *= 4;
	DrawExtendString(320 - (wid / 2 * 4), 240, per, per, buf, GetColor(0, 0, 0));
}

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前

Re: (´・ω・`)

投稿記事 by MoNoQLoREATOR » 14年前

kerotan0820さん、人は誰でもハンデとか不得意なことがあるんです。
だから、私はこんなハンデがあるからとか、これが不得意だからだとか、それは全部言い訳になってしまいます。
そうすると、無意識のうちに妥協してしまいます。
kerotan0820さんは やる気を持っているのですから、きっとどんな目標でも達成できるはずです。
あせらず、本当に少しずつでもいいので、習得していきましょう。

kerotan0820
記事: 91
登録日時: 14年前

Re: (´・ω・`)

投稿記事 by kerotan0820 » 14年前

皆様コメントありがとうございます。

>>NMSさん
クリックの判定については、クリックしている間は count の値が増えていって、そのカウントが 1 のときのみ、要するにクリックした瞬間のみしか判定されないようにしていたのですが、
関数化しようとしているうちに消してしまったか、いじってしまったようです。
修正したいと思います。

的の移動に関して、仰るとおりです。
x軸、y軸の移動の割合を求める計算式を考えて、加速度を変動させれるようにしたいと思います。
ご指摘ありがとうございます。

kerotan0820
記事: 91
登録日時: 14年前

Re: (´・ω・`)

投稿記事 by kerotan0820 » 14年前

>>dicさん
ポインタについて、以前学習してある程度は学べているつもりだったのですが、全く体に染み付いていませんでした。
習得には時間がかかるというのを今から構えて、地道に習得していきたいと思います。
あと、ポインタ変数をなんこも使わずに、一つずつ習得する、とはどういうことでしょうか。
ちょっとした処理をする関数の実現から、練習していくように、ということでしょうか。

kerotan0820
記事: 91
登録日時: 14年前

Re: (´・ω・`)

投稿記事 by kerotan0820 » 14年前

>>へろりさん
いつも私が質問をするたびに、時間を割いてプログラムを組んでいただき本当にありがとうございます。
ぱっとみてみたところ、構造体や多数の関数が出てきていて非常に難しそうです…。
現状では、難しすぎて理解できそうにないので、自分のプログラムを少しずつ修正していく過程で参考になる点が有りましたら反映させていただきたいと思います。
毎度本当にありがとうございます。

kerotan0820
記事: 91
登録日時: 14年前

Re: (´・ω・`)

投稿記事 by kerotan0820 » 14年前

>> MoNoQLoREATOR さん
たしかにそうですね。
私は、努力をしよう、と思う過程でたくさんの妥協をしていることに気づきました。
地道に、無心で頑張っていきたいと思います。
ありがとうございます

dic
記事: 658
登録日時: 14年前

Re: (´・ω・`)

投稿記事 by dic » 14年前

>ポインタ変数をなんこも使わずに、一つずつ習得する、とはどういうことでしょうか。
>ちょっとした処理をする関数の実現から、練習していくように、ということでしょうか。
そうです ポインタ変数を5、6個一気に使わないで
1個使って、ポインタを理解してから
2個、3個とじょじょに増やしていくのがいいですね