2台同時

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

2台同時

#1

投稿記事 by アタゴ » 12年前

カーゲームをサイトなどを見ながら作ったのですが複数同時に動かすことができません。
何度も見直しましたが間違ってるところはないです。さらに、これはカーゲームに限ったことではないんです。
どうしてでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 2台同時

#2

投稿記事 by h2so5 » 12年前

質問の意味が分かりません。フォーラムルールをよく読んで、テンプレートを参考にして質問してください。

アタゴ
記事: 31
登録日時: 12年前

Re: 2台同時

#3

投稿記事 by アタゴ » 12年前

コード:

#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を使いますか?

taketoshi
記事: 222
登録日時: 14年前
住所: 日本国

Re: 2台同時

#4

投稿記事 by taketoshi » 12年前

パッと見た感じ、このコードだと上を押したら二台とも上にいっちゃいませんか?

コード:

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

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

トントン
記事: 100
登録日時: 15年前

Re: 2台同時

#5

投稿記事 by トントン » 12年前

実行してみました。

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

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

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

アタゴ
記事: 31
登録日時: 12年前

Re: 2台同時

#6

投稿記事 by アタゴ » 12年前

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

アタゴ
記事: 31
登録日時: 12年前

Re: 2台同時

#7

投稿記事 by アタゴ » 12年前

//パッと見た感じ、このコードだと上を押したら二台とも上にいっちゃいませんか?

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

taketoshi
記事: 222
登録日時: 14年前
住所: 日本国

Re: 2台同時

#8

投稿記事 by taketoshi » 12年前

失礼しました。大丈夫でしたね。

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 2台同時

#9

投稿記事 by softya(ソフト屋) » 12年前

キーボードの制約でキーの同時押しが取得出来ない状況ではないでしょうか?
同時押しが可能なキーボードとなるとゲーミングキーボード等を購入する必要が出てくると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アタゴ
記事: 31
登録日時: 12年前

Re: 2台同時

#10

投稿記事 by アタゴ » 12年前

こちらはバックならうまく作動するのですが前に進む時には曲がれません
もしそちらで前後左右に自由自在で動けるのならパソコンの性能の問題になるのですか?

アタゴ
記事: 31
登録日時: 12年前

Re: 2台同時

#11

投稿記事 by アタゴ » 12年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 2台同時

#12

投稿記事 by softya(ソフト屋) » 12年前

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

下記に掲載されているソフトで同時押しの限界を知ることができます。
「キーボードの同時押し検出ソフト - forPCActionGamer Wiki*」
http://wikiwiki.jp/fpag/?%A5%AD%A1%BC%A ... 5%D5%A5%C8
ただし、これはキーボード毎に違うと思ってください。自分のキーボードだけを調べることが出来るだけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

トントン
記事: 100
登録日時: 15年前

Re: 2台同時

#13

投稿記事 by トントン » 12年前

アタゴ さんが書きました:
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キー以上押したとき
どのように表示されますか?

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

アタゴ
記事: 31
登録日時: 12年前

Re: 2台同時

#14

投稿記事 by アタゴ » 12年前

無事に意図した通りに動きました。
教えてくださった方々ありがとうございます。

閉鎖

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