ページ 11

2台同時

Posted: 2013年6月09日(日) 12:09
by アタゴ
カーゲームをサイトなどを見ながら作ったのですが複数同時に動かすことができません。
何度も見直しましたが間違ってるところはないです。さらに、これはカーゲームに限ったことではないんです。
どうしてでしょうか?

Re: 2台同時

Posted: 2013年6月09日(日) 12:21
by h2so5
質問の意味が分かりません。フォーラムルールをよく読んで、テンプレートを参考にして質問してください。

Re: 2台同時

Posted: 2013年6月09日(日) 12:36
by アタゴ

コード:

#include<DxLib.h>
#include<math.h>
#define PI 3.141592652
#define CAR_MAX 2
int Key[256];
double ssin[360],ccos[360];

int count=0;
    
void wait_fanc(){
    int term;
    static int t=0;
    term = GetNowCount()-t;
    if(16-term>0)
            Sleep(16-term);
    t=GetNowCount();
    return;
} 
void fps(){
    int i;
    static int t=0,ave=0,f[60];
 
    f[count%60]=GetNowCount()-t;
    t=GetNowCount();
    if(count%60==59){
        ave=0;
        for(i=0;i<60;i++)
            ave+=f[i];
        ave/=60;
    }
    if(ave!=0){
        DrawFormatString(0, 0,GetColor(0,0,0),"%.1fFPS",1000.0/(double)ave);
        DrawFormatString(0,20,GetColor(0,0,0),"%dms"  ,ave);
    }
    return;
}

int Game_Init(void)
{
	for(int i=0;i<360;i++)
	{
		ssin[i]=sin(PI/180*i);
		ccos[i]=cos(PI/180*i);
	}
	return 0;
}

class ccar
{
	int gazou;
	double x,y,Aangle;
	int ue,sita,hidari,migi;
	int handle,angle;
	int spead,backspead;
public:
	void CarInit(char *hgazou,double hx,double hy,int up,int down,int left,int right);
	void MoveCar(void);
	void DrawCar(void);
};

void ccar::CarInit(char *hgazou,double hx,double hy,int up,int down,int left,int right)
{
	gazou=LoadGraph(hgazou);
	x=hx;
	y=hy;
	handle=90;
	angle=0;
	spead=5;
	backspead=-3;
	ue=up;
	sita=down;
	hidari=left;
	migi=right;
}

void ccar::MoveCar(void)
{
	if(Key[ue]>=1)
	{
		if(Key[hidari]>=1)
		{
			handle=(handle+3)%360;
			angle=(angle+357)%360;
		}
		if(Key[migi]>=1)
		{
			handle=(handle+357)%360;
			angle=(angle+3)%360;
		}
		y=y-spead*ssin[handle];
		x=x+spead*ccos[handle];
	}
	if(Key[sita]>=1)
	{

		if(Key[hidari]>=1)
		{
			handle=(handle+357)%360;
			angle=(angle+3)%360;
		}
		if(Key[migi]>=1)
		{
			handle=(handle+3)%360;
			angle=(angle+357)%360;
		}
		y=y-backspead*ssin[handle];
		x=x+backspead*ccos[handle];
	}
		Aangle=PI/180*angle;
}



void ccar::DrawCar(void)
{
	DrawRotaGraphF((float)x,(float)y,1.0,Aangle,gazou,FALSE);
}
int gpUpdateKey(void)
{
	char TmpKey[256];
	GetHitKeyStateAll(TmpKey);
	for(int i=0;i<256;i++)
	{
		if(TmpKey[i])
			Key[i]++;
		else
			Key[i]=0;
	}
	return 0;
}



int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
	ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);
	Game_Init();
	ccar car[CAR_MAX];
	car[0].CarInit("画像/car.png",480.0,240.0,200,208,203,205);
	car[1].CarInit("画像/car.png",160.0,240.0,18,32,31,33);
	while(!ScreenFlip()&&!ProcessMessage()&&!gpUpdateKey()&&!ClearDrawScreen())
	{
		DrawBox(0,0,640,480,GetColor(255,255,255),TRUE);
		for(int i=0;i<CAR_MAX;i++)
		{
			car[i].MoveCar();
			car[i].DrawCar();
		}
            fps();
            count++;
            wait_fanc();
	}
	DxLib_End();
	return 0;
}
コードはこれです。
これを使って車を複数動かしたいということです。
もしかしてfpsを使いますか?

Re: 2台同時

Posted: 2013年6月09日(日) 13:03
by taketoshi
パッと見た感じ、このコードだと上を押したら二台とも上にいっちゃいませんか?

コード:

int Key[256];
ここの変数を両方のクラスから参照しているためです。
グローバル変数を共有せずにそれぞれのクラスへ分けましょう。

これだと、車は二台あるけどハンドルは一個で操縦している感じです。

Re: 2台同時

Posted: 2013年6月09日(日) 13:22
by トントン
実行してみました。

car[1]のkey入力を追うのがめんどくさいなぁと思いつつ。。。
最低限コメントがあればうれしいなぁと思います。

さて、僕の環境では同時に動いているか?
と言われれば同時に動いているように見えますが。

アタゴさんの環境ではどのような動きになっていて、どのように動けば良いのでしょうか?

Re: 2台同時

Posted: 2013年6月09日(日) 13:39
by アタゴ
トントン さんが書きました:アタゴさんの環境ではどのような動きになっていて、どのように動けば良いのでしょうか?
片方が曲がっていると片方が曲がれないという状況です。
一緒に前後左右に自由に複数で動き回れるようにしたいんです。

Re: 2台同時

Posted: 2013年6月09日(日) 13:50
by アタゴ
//パッと見た感じ、このコードだと上を押したら二台とも上にいっちゃいませんか?

keycodeをCarInit()で設定してるから大丈夫だと思いますが。。。

Re: 2台同時

Posted: 2013年6月09日(日) 13:59
by taketoshi
失礼しました。大丈夫でしたね。

動かしてみたところ、左側の車はEとDで上下しFで右に曲がりました
テンキーの上下左で右側の車が上下、そして左に曲がりました。
DとF同時に押し、更に上と左を押したところ、左右の車が二台同時にくるくる回りました。

アタゴさんが仰る目的の動作はしているように思えます。

Re: 2台同時

Posted: 2013年6月09日(日) 14:11
by softya(ソフト屋)
キーボードの制約でキーの同時押しが取得出来ない状況ではないでしょうか?
同時押しが可能なキーボードとなるとゲーミングキーボード等を購入する必要が出てくると思います。

Re: 2台同時

Posted: 2013年6月09日(日) 14:13
by アタゴ
こちらはバックならうまく作動するのですが前に進む時には曲がれません
もしそちらで前後左右に自由自在で動けるのならパソコンの性能の問題になるのですか?

Re: 2台同時

Posted: 2013年6月09日(日) 14:25
by アタゴ
softya(ソフト屋) さんが書きました:キーボードの制約でキーの同時押しが取得出来ない状況ではないでしょうか?
多分そうだと思います。
制約を変える方法があるならぜひ教えてください。おねがいします。

Re: 2台同時

Posted: 2013年6月09日(日) 14:32
by softya(ソフト屋)
アタゴ さんが書きました:
softya(ソフト屋) さんが書きました:キーボードの制約でキーの同時押しが取得出来ない状況ではないでしょうか?
多分そうだと思います。
制約を変える方法があるならぜひ教えてください。おねがいします。
ハードウェア(この場合キーボード)の性能ですので対策は残念ながらありません。
個人での利用なら、上に書いたようにゲーミングキーボードを購入すれば解決します。
配布を前提にしたゲームなら仕様から考えなおさないと難しいです。
あるいは、ジョイパッド前提とするのも方法です。

下記に掲載されているソフトで同時押しの限界を知ることができます。
「キーボードの同時押し検出ソフト - forPCActionGamer Wiki*」
http://wikiwiki.jp/fpag/?%A5%AD%A1%BC%A ... 5%D5%A5%C8
ただし、これはキーボード毎に違うと思ってください。自分のキーボードだけを調べることが出来るだけです。

Re: 2台同時

Posted: 2013年6月09日(日) 15:10
by トントン
アタゴ さんが書きました:
softya(ソフト屋) さんが書きました:キーボードの制約でキーの同時押しが取得出来ない状況ではないでしょうか?
多分そうだと思います。
制約を変える方法があるならぜひ教えてください。おねがいします。
正直、記載している情報が少ないと感じますが。。。
多分で行動するにも、行動する順番が違うような気がします。
先に以下を試してみてください。

コード:

#include<DxLib.h>
#include<math.h>
#define PI 3.141592652
#define CAR_MAX 2
int Key[256];
double ssin[360],ccos[360];
 
int count=0;
    
void wait_fanc(){
    int term;
    static int t=0;
    term = GetNowCount()-t;
    if(16-term>0)
            Sleep(16-term);
    t=GetNowCount();
    return;
} 
void fps(){
    int i;
    static int t=0,ave=0,f[60];
 
    f[count%60]=GetNowCount()-t;
    t=GetNowCount();
    if(count%60==59){
        ave=0;
        for(i=0;i<60;i++)
            ave+=f[i];
        ave/=60;
    }
    if(ave!=0){
        DrawFormatString(0, 0,GetColor(0,0,0),"%.1fFPS",1000.0/(double)ave);
        DrawFormatString(0,20,GetColor(0,0,0),"%dms"  ,ave);
    }
    return;
}
 
int Game_Init(void)
{
    for(int i=0;i<360;i++)
    {
        ssin[i]=sin(PI/180*i);
        ccos[i]=cos(PI/180*i);
    }
    return 0;
}
 
class ccar
{
    int gazou;
    double x,y,Aangle;
    int ue,sita,hidari,migi;
    int handle,angle;
    int spead,backspead;
public:
    void CarInit(char *hgazou,double hx,double hy,int up,int down,int left,int right);
    void MoveCar(void);
    void DrawCar(void);
};
 
void ccar::CarInit(char *hgazou,double hx,double hy,int up,int down,int left,int right)
{
    gazou=LoadGraph(hgazou);
    x=hx;
    y=hy;
    handle=90;
    angle=0;
    spead=5;
    backspead=-3;
    ue=up;
    sita=down;
    hidari=left;
    migi=right;
}
 
void ccar::MoveCar(void)
{
    if(Key[ue]>=1)
    {
        if(Key[hidari]>=1)
        {
            handle=(handle+3)%360;
            angle=(angle+357)%360;
        }
        if(Key[migi]>=1)
        {
            handle=(handle+357)%360;
            angle=(angle+3)%360;
        }
        y=y-spead*ssin[handle];
        x=x+spead*ccos[handle];
    }
    if(Key[sita]>=1)
    {
 
        if(Key[hidari]>=1)
        {
            handle=(handle+357)%360;
            angle=(angle+3)%360;
        }
        if(Key[migi]>=1)
        {
            handle=(handle+3)%360;
            angle=(angle+357)%360;
        }
        y=y-backspead*ssin[handle];
        x=x+backspead*ccos[handle];
    }
        Aangle=PI/180*angle;
}
 
 
 
void ccar::DrawCar(void)
{
    DrawRotaGraphF((float)x,(float)y,1.0,Aangle,gazou,FALSE);
}
int gpUpdateKey(void)
{
    char TmpKey[256];
    GetHitKeyStateAll(TmpKey);
    for(int i=0;i<256;i++)
    {
        if(TmpKey[i])
            Key[i]++;
        else
            Key[i]=0;
    }
    return 0;
}
 
 
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
    ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);
    Game_Init();
    ccar car[CAR_MAX];
    car[0].CarInit("画像/car.png",480.0,240.0,200,208,203,205);
    car[1].CarInit("画像/car.png",160.0,240.0,18,32,31,33);
    while(!ScreenFlip()&&!ProcessMessage()&&!gpUpdateKey()&&!ClearDrawScreen())
    {
        DrawBox(0,0,640,480,GetColor(255,255,255),TRUE);
        for(int i=0;i<CAR_MAX;i++)
        {
            car[i].MoveCar();
            car[i].DrawCar();
        }
		if (Key[KEY_INPUT_UP] >= 1) {
			DrawString(0, 40, "PUSH UP", GetColor(0, 0, 0));
		}
		if (Key[KEY_INPUT_DOWN] >= 1) {
			DrawString(0, 55, "PUSH DOWN", GetColor(0, 0, 0));
		}
		if (Key[KEY_INPUT_LEFT] >= 1) {
			DrawString(0, 70, "PUSH LEFT", GetColor(0, 0, 0));
		}
		if (Key[KEY_INPUT_RIGHT] >= 1) {
			DrawString(0, 85, "PUSH RIGHT", GetColor(0, 0, 0));
		}
		if (Key[KEY_INPUT_E] >= 1) {
			DrawString(0, 100, "PUSH E", GetColor(0, 0, 0));
		}
		if (Key[KEY_INPUT_D] >= 1) {
			DrawString(0, 115, "PUSH D", GetColor(0, 0, 0));
		}
		if (Key[KEY_INPUT_S] >= 1) {
			DrawString(0, 130, "PUSH S", GetColor(0, 0, 0));
		}
		if (Key[KEY_INPUT_F] >= 1) {
			DrawString(0, 145, "PUSH F", GetColor(0, 0, 0));
		}
		for (int i = 0; i < 256; i++) {
			if ((i != KEY_INPUT_UP) && (i != KEY_INPUT_DOWN) && (i != KEY_INPUT_LEFT) && (i != KEY_INPUT_RIGHT) &&
				(i != KEY_INPUT_E) && (i != KEY_INPUT_D) && (i != KEY_INPUT_S) && (i != KEY_INPUT_F)) {
					if (Key[i] >= 1) {
						DrawString(0, 160, "NOT SUBJECT", GetColor(255, 0, 0)); // 翻訳したけどnot subjectで対象外で良いのか?
					}
			}
		}
            fps();
            count++;
            wait_fanc();
    }
    DxLib_End();
    return 0;
}
自分が意図したキーを押したとき、4キー以上押したとき
どのように表示されますか?

まぁ、これで意図した動作がしなければ、ソフト屋さんが言ったようにキーボードの制約なのかもしれません。

Re: 2台同時

Posted: 2013年6月09日(日) 19:23
by アタゴ
無事に意図した通りに動きました。
教えてくださった方々ありがとうございます。