ヒット判定について
Posted: 2011年2月02日(水) 13:18
またよろしくお願いします。
消す判定で今困っています
鉄人さん同様に近くにある弾を消す作業に入っているのですが
上キーしか反応せずほかの列の弾まで上キーで消してしまいます
また、上キーを長押しすると判定ラインにつくだけで消えてしまいます
いろいろ手直しをしたのですが
直したものは判定ラインに着くだけで弾が消えてしまいます・・・
なぜ上キーしか反応しないのでしょうか?
また力をお貸しください
お願いします。
タグ囲みに失敗していたので修正しました。必ずプレビューで確認してから投稿してください。 by softya(ソフト屋)
消す判定で今困っています
鉄人さん同様に近くにある弾を消す作業に入っているのですが
上キーしか反応せずほかの列の弾まで上キーで消してしまいます
また、上キーを長押しすると判定ラインにつくだけで消えてしまいます
いろいろ手直しをしたのですが
直したものは判定ラインに着くだけで弾が消えてしまいます・・・
なぜ上キーしか反応しないのでしょうか?
また力をお貸しください
お願いします。
#include "DxLib.h"
int Key[256];
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[256]){
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 CheckStateKey(unsigned char Handle){
return Key[Handle];
}
int GetJoypadInputState( int InputType ) ;
//----------------------------------------------------
int haikei[10];//色のハンドル------------------------------------------------
void gazou1(){//これは背景画像ーーーーーーーーーーーーーーーーーーーーーーーー
haikei[0]=LoadGraph("kop3.png");
haikei[1]=LoadGraph("ue1.png");
haikei[2]=LoadGraph("migi1.png");
haikei[3]=LoadGraph("hidari1.png");
haikei[4]=LoadGraph("sita1.png");
}
int tama[10];//たまの画像----------------------------------------------------
void gazou2(){
tama[0]=LoadGraph("dan.png");
tama[1]=LoadGraph("ber.png");
}
//--------------------------------------------------------------
int color[10];//これは色の設定-----------------------------------------------
void load(){
color[0] = GetColor(255,255,255);//白
color[1] = GetColor( 0, 0, 0);//黒
color[2] = GetColor(255, 0, 0);//赤
color[3] = GetColor( 0,255, 0);//緑
color[4] = GetColor( 0, 0,255);//青
color[5] = GetColor(255,255, 0);//黄色
color[6] = GetColor( 0,255,255);//青緑
color[7] = GetColor(255, 0,255);//紫
}//------------------------------------
int music[1];
void kyoku(){
music[0] = LoadSoundMem("校歌.mp3");
}
//--------------------------------------------------------------
//ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
#define BER_UX 65
#define BER_Y 60
#define BER_MX 215
#define BER_HX 370
#define BER_SX 525
#define HIT_UX 80
#define HIT_UY 73
#define HIT_MX 230
#define HIT_HX 385
#define HIT_SX 540
//判定ライン-------------------------------------------------
#define VGOOD_Y 5
#define GOOD_Y 20
#define BAD_Y 30
//ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー//
typedef struct{
int flag;
int knd;
}humen_t;//譜面の構造体
#define HUMEN_MAX 1000
humen_t humen[HUMEN_MAX];
void load_humen(){
int i=0,cnt=0;
int c;
FILE *fp;
fp=fopen("ue.txt","r");
if(fp==NULL)
return;
while((c=fgetc(fp))!=EOF){
if(c==' '||c=='\n')continue;
if(c!='0'){
humen[i].flag=1;
humen[i].knd=c-'0';
}
i++;
if(i>=HUMEN_MAX)break;//オーバーフロー防止
}
fclose(fp);
}
//テキストから譜面(0,1,2,3,4)を読み込む--------------------------------------------------------
typedef struct{
int flag;
}KEY_H;
KEY_H KEY;
void KEY_O(){
if(CheckStateKey(KEY_INPUT_UP)==1){
//DrawString( 0, 0, "hello! DX Library!" , color[1]);
DrawGraph(BER_UX,BER_Y,tama[1],TRUE);
KEY.flag=1;
}
if(CheckStateKey(KEY_INPUT_LEFT)==1){//ひだり
//DrawString( 0, 0, "hello! DX Library!" , color[1]);
DrawGraph(BER_HX,BER_Y,tama[1],TRUE);
KEY.flag=1;
}
if(CheckStateKey(KEY_INPUT_RIGHT)==1){
//DrawString( 0, 0, "hello! DX Library!" , color[1]);
DrawGraph(BER_MX,BER_Y,tama[1],TRUE);
KEY.flag=1;
}
if(CheckStateKey(KEY_INPUT_DOWN)==1){
//DrawString( 0, 0, "hello! DX Library!" , color[1]);
DrawGraph(BER_SX,BER_Y,tama[1],TRUE);
KEY.flag=1;
}}
//キー入力関係--------------------------------------------------------------------------
#define FLAME 60
int fps_count,count0t;//fpsのカウンタ、60フレームに1回基準となる時刻を記録する変数
int f[FLAME];//平均を計算するため60回の1周時間を記録
double ave;//平均fps
void fps_wait(){ //FLAME fps になるようにfpsを計算・制御
int term,i,gnt;
static int t=0;
if(fps_count==0){ //60フレームの1回目なら
if(t==0) //完全に最初ならまたない
term=0;
else //前回記録した時間を元に計算
term=count0t+1000-GetNowCount();
}
else //待つべき時間=現在あるべき時刻-現在の時刻
term = (int)(count0t+fps_count*(1000.0/FLAME))-GetNowCount();
if(term>0) //待つべき時間だけ待つ
Sleep(term);
gnt=GetNowCount();
if(fps_count==0) //60フレームに1度基準を作る
count0t=gnt;
f[fps_count]=gnt-t; //1周した時間を記録
t=gnt;
//平均計算
if(fps_count==FLAME-1){
ave=0;
for(i=0;i<FLAME;i++)
ave+=f[i];
ave/=FLAME;
}
fps_count = (++fps_count)%FLAME ;
}
void draw_fps(int x, int y){ //x,yの位置にfpsを表示
if(ave!=0){
DrawFormatString(x, y,color[0],"[%.1f]",1000/ave);
}
return;
}
void FPS_M(){
fps_wait();
draw_fps(0,0);
}
//FPSの管理------------------------------------------------------------------------------------
typedef struct{
int flag;
int x,y;
int se_flag;
int spd;
int knd;
}bullet_t;//たまの構造体
#define BULLET_MAX 1000
bullet_t bullet[BULLET_MAX];
int flame;
void huru_bullet(){
int i,j;
const int list[]={0,HIT_UX,HIT_MX,HIT_HX,HIT_SX};
i=flame++;
if(i>=HUMEN_MAX)return;
if(humen[i].flag==1){
if(humen[i].knd>=1 && humen[i].knd<=4){
for(j=0;j<BULLET_MAX;j++) {
if(bullet[j].flag==0) {
bullet[j].flag=humen[i].knd;
bullet[j].x=list[humen[i].knd];
bullet[j].y=552;
break;
}
}
}
}
}
//譜面のフラグとkndが1の時・・・
int tama_bullet(){
int i;
for(i=0;i<BULLET_MAX;i++){
if(bullet[i].flag!=0){
bullet[i].y-=3; //座標を8減らす
DrawGraph( bullet[i].x , bullet[i].y , tama[0] ,TRUE);
//ここに当たり判定
//if(KEY.flag==1){
if(bullet[i].y < -32){ //もし画面外まで来たら
bullet[i].y=552; //初期値に戻し、
bullet[i].flag=0; //発射フラグを戻す
}
}
}
return 0;
}
//hit判定
void hit_bullet(){
int i,j,k,knd;
char key[256];
double y,pre_y,y0,y1;
double line_y[3]={VGOOD_Y,GOOD_Y,BAD_Y};
GetHitKeyStateAll(key);
for(i=0;i<BULLET_MAX;i++){//弾分ループ
if(bullet[i].flag!=0){//弾が存在していて
knd=-1;
pre_y=bullet[i].y+bullet[i].spd;
y=bullet[i].y;
for(j=0;j<3;j++){
y0=HIT_UY-line_y[j];
y1=HIT_UY+line_y[j];
// ↓148よりx0が下であるか↓148よりx0が上であるか↓x0がxを下回っているか、x1がxを上回っているか↓初期化
if(y<y0 && y0<pre_y || y<y1 && y1<pre_y || y0<y && y<y1 || y0<pre_y && pre_y<y1){//距離ヒット以内なら
//押したときの現在位置が当たり判定の軸からline_x分離れた中にあるなら決められた範囲の処理を行う
knd=j;//kndに数値を代入する
break;
}
}
//距離OKでその時たたいていたら (ここから)
if(knd!=-1 && (key[KEY_INPUT_UP]==1 && bullet[i].knd==0 || key[KEY_INPUT_DOWN]==1 && bullet[i].knd==1 || key[KEY_INPUT_LEFT]==1 && bullet[i].knd==2 || key[KEY_INPUT_RIGHT]==1 && bullet[i].knd==3)){
//if(||||||)
bullet[i].flag=0;
{break;}
//enter_hit_dat(k,i,knd,bullet[i].x);
}
//bullet[i].flag=1; (ここまで)
}
}
}
void bullet_main(){
huru_bullet();
tama_bullet();
hit_bullet();
}
//弾関係の設定---------------------------------------------------------------------------------
void music_t(){
//WaitTime(60000);
//PlayMusic( "曲.mid" , DX_PLAYTYPE_BACK ) ;
PlaySoundMem(music[0],DX_PLAYTYPE_BACK);
}
void ini(){
memset(bullet,0,sizeof(bullet_t)*BULLET_MAX);//弾情報初期化
memset(humen,0,sizeof(humen_t)*HUMEN_MAX);//結果表示情報初期化
}
//初期化設定------------------------------------------------------------------------------------
void matome(){
gazou1();
gazou2();
DrawGraph(0,0,haikei[0],TRUE);
kyoku();
load();
load_humen();
flame=0;
FPS_M();
DrawBox( 0, 70 , 645 , 75 , color[0] ,TRUE);
DrawBox( 85 , 0 , 95 , 480 , color[2],TRUE );
DrawBox( 235 , 0 , 245 , 480 , color[3],TRUE );
DrawBox( 390 , 0 , 400 , 480 , color[4],TRUE );
DrawBox( 545 , 0 , 555 , 480 , color[5],TRUE );
KEY_O();
}
//まとめ----------------------------------------------------------------------------------------
void graph(){
ClearDrawScreen();
DrawGraph(0,0,haikei[0],TRUE);
DrawGraph(90,0,haikei[1],TRUE);
DrawGraph(240,0,haikei[2],TRUE);
DrawGraph(395,0,haikei[3],TRUE);
DrawGraph(550,0,haikei[4],TRUE);
DrawBox( 0, 70 , 645 , 75 , color[0] ,TRUE);
DrawBox( 85 , 0 , 95 , 480 , color[2],TRUE );
DrawBox( 235 , 0 , 245 , 480 , color[3],TRUE );
DrawBox( 390 , 0 , 400 , 480 , color[4],TRUE );
DrawBox( 545 , 0 , 555 , 480 , color[5],TRUE );
KEY_O();
}
//画像に関するプログラム-----------------------------------------------------------------------
//ループで必ず行う3大処理
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
ini();
music_t();
matome();
kyoku();
music_t();
while(ProcessMessage()==0&&GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
graph();
FPS_M();
bullet_main();
ScreenFlip();
if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
}
DxLib_End();
return 0;
}