2台同時
Re: 2台同時
#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を使いますか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 2台同時
キーボードの制約でキーの同時押しが取得出来ない状況ではないでしょうか?
同時押しが可能なキーボードとなるとゲーミングキーボード等を購入する必要が出てくると思います。
同時押しが可能なキーボードとなるとゲーミングキーボード等を購入する必要が出てくると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 2台同時
ハードウェア(この場合キーボード)の性能ですので対策は残念ながらありません。アタゴ さんが書きました:多分そうだと思います。softya(ソフト屋) さんが書きました:キーボードの制約でキーの同時押しが取得出来ない状況ではないでしょうか?
制約を変える方法があるならぜひ教えてください。おねがいします。
個人での利用なら、上に書いたようにゲーミングキーボードを購入すれば解決します。
配布を前提にしたゲームなら仕様から考えなおさないと難しいです。
あるいは、ジョイパッド前提とするのも方法です。
下記に掲載されているソフトで同時押しの限界を知ることができます。
「キーボードの同時押し検出ソフト - forPCActionGamer Wiki*」
http://wikiwiki.jp/fpag/?%A5%AD%A1%BC%A ... 5%D5%A5%C8
ただし、これはキーボード毎に違うと思ってください。自分のキーボードだけを調べることが出来るだけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2台同時
正直、記載している情報が少ないと感じますが。。。アタゴ さんが書きました:多分そうだと思います。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;
}
どのように表示されますか?
まぁ、これで意図した動作がしなければ、ソフト屋さんが言ったようにキーボードの制約なのかもしれません。