//ショット登録部 void enter_shot(){ //ショットボタンが押されていたら if(CheckStatePad(configpad.shot)>0){ ch.shot_cnt++; if(ch.shot_cnt%3==0){//3カウントに1回 if(CheckStatePad(configpad.slow)>0)//低速移動中なら ch1_shot_pattern(); else ch0_shot_pattern(); } } else ch.shot_cnt=0; }
//自機描画 void graph_ch(){ double sx,sy,ny=(sin(2.0*PI*(count%50)/50)*3),ang=2.0*PI*(count%120)/120; if(CheckStatePad(configpad.slow)>0)//低速移動中なら sx=15,sy=15+ny;//引き寄せる else sx=30,sy=30+ny;//普通の位置に DrawRotaGraphF( ch.x-sx+FX, ch.y+sy+FY, 1.0f, ang, img_chetc[2], TRUE ); DrawRotaGraphF( ch.x+sx+FX, ch.y+sy+FY, 1.0f, -ang, img_chetc[2], TRUE ); if(ch.mutekicnt%2==0){//無敵中なら点滅 //自機表示 DrawRotaGraphF(ch.x+FX+dn.x,ch.y+FY+dn.y,1.0f,0.0f,img_ch[0][ch.img],TRUE); if(CheckStatePad(configpad.slow)>0)//低速移動中なら当たり判定表示 DrawRotaGraphF( ch.x+FX, ch.y+FY, 1.0f, 2.0*PI*(count%120)/120, img_chetc[0], TRUE ); } }
//自機描画 void graph_ch(){ if(ch.flag!=0){ if(ch.bcnt > 0){ double rand = 2.0; double ang = PI2/(ch.bcnt%6); DrawRotaGraphF( ch.x+(rand*cos(ang)), ch.y+(rand*sin(ang)), 1.0f, 0.0f, img_ch[ch.img], TRUE ); }else{ DrawRotaGraphF(ch.x,ch.y,1.0f,0.0f,img_ch[ch.img],TRUE); } if(CheckStatePad(configpad.slow)>0 && ch.slow_flag==0){ //低速移動中なら当たり判定表示 DrawRotaGraphF( ch.x, ch.y, 1.0f, 2.0*PI*(count%120)/120, img_etc[0], TRUE ); } } }
//渡されたパッドキー番号の入力状態を返す。返り値が-1なら不正 int CheckStatePad(int Pl_n,unsigned int Handle){ int i,j,k,maximam,ValidPlayer,ValidFlag,flag=0; flag+=0; if(0<=Handle && Handle<PAD_MAX && 0<=Pl_n && Pl_n<PLAYER_MAX){ if (Handle==PAD_NUM_LEFT) return pad[Pl_n].key[configpad[Pl_n].left]; if (Handle==PAD_NUM_UP) return pad[Pl_n].key[configpad[Pl_n].up]; if (Handle==PAD_NUM_RIGHT) return pad[Pl_n].key[configpad[Pl_n].right]; if (Handle==PAD_NUM_DOWN) return pad[Pl_n].key[configpad[Pl_n].down]; if (Handle==PAD_NUM_HOLD) return pad[Pl_n].key[configpad[Pl_n].hold]; if (Handle==PAD_NUM_TURN_L) return pad[Pl_n].key[configpad[Pl_n].turn_L]; if (Handle==PAD_NUM_TURN_R) return pad[Pl_n].key[configpad[Pl_n].turn_R]; if (Handle==PAD_NUM_KEY1) return pad[Pl_n].key[configpad[Pl_n].key1]; if (Handle==PAD_NUM_KEY2) return pad[Pl_n].key[configpad[Pl_n].key2]; if (Handle==PAD_NUM_KEY3) return pad[Pl_n].key[configpad[Pl_n].key3]; if (Handle==PAD_NUM_PAUSE) return pad[Pl_n].key[configpad[Pl_n].pause]; } else if (0<=Handle && Handle<PAD_MAX && Pl_n==-1) { if (gameflag==0 || all_cpu_flag==1) { if (Handle==PAD_NUM_LEFT) return pad[PLAYER_MAX].key[configpad[0].left]; if (Handle==PAD_NUM_UP) return pad[PLAYER_MAX].key[configpad[0].up]; if (Handle==PAD_NUM_RIGHT) return pad[PLAYER_MAX].key[configpad[0].right]; if (Handle==PAD_NUM_DOWN) return pad[PLAYER_MAX].key[configpad[0].down]; if (Handle==PAD_NUM_HOLD) return pad[PLAYER_MAX].key[configpad[0].hold]; if (Handle==PAD_NUM_TURN_L) return pad[PLAYER_MAX].key[configpad[0].turn_L]; if (Handle==PAD_NUM_TURN_R) return pad[PLAYER_MAX].key[configpad[0].turn_R]; if (Handle==PAD_NUM_KEY1) return pad[PLAYER_MAX].key[configpad[0].key1]; if (Handle==PAD_NUM_KEY2) return pad[PLAYER_MAX].key[configpad[0].key2]; if (Handle==PAD_NUM_KEY3) return pad[PLAYER_MAX].key[configpad[0].key3]; if (Handle==PAD_NUM_PAUSE) return pad[PLAYER_MAX].key[configpad[0].pause]; } else { maximam=-1; for (i=0;i<Pl_num;i++) { if (maximam<(k=CheckStatePad(i,Handle)) || i==0) { maximam=k; PadPushPlayer=i; } } return maximam; } } else { printfDx("CheckStatePadに渡した値が不正です\n"); return -1; } }
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){ //FullscreenMessage(); ChangeWindowMode( FALSE ); SetMainWindowText("高橋テトリスver0.04"); if (DxLib_Init() == -1) return -1; //初期化 load(); if (SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//裏画面化 exe_cnt=0; func_state=0; while(ProcessLoop()==0){//メインループ music_ini(); switch(func_state){ case 0: //初期ロード launch_ini(); mode=0; menu_ini(); func_state=1; break; case 1: //ロゴ画面 graph_logo(); break; case 2: //メニュー画面 control_menu(); graph_menu(); break; case 50: //モード選択画面 control_menu(); graph_menu(); break; case 51: //モード選択後移行画面 graph_menu(); menu_selected_cnt++; if (menu_selected_cnt>30) { first_ini(); func_state=100; } break; case 100: //ゲームメイン画面 control_main(); block_main(); cal_score(); graph_main(); stage_cnt++; if (gameover_flag==1 && CheckStatePad(-1,PAD_NUM_HOLD)==1) { result_ini(); func_state=101; } if (CheckStatePad(-1,PAD_NUM_PAUSE)==1) { pause_push_Pl=PadPushPlayer; StopSoundMem( bgm_handle[bgm_num] ) ; pause_select=0; func_state=999; } break; case 999: //ポーズ画面 control_game_pause(); graph_main(); if (CheckStatePad((all_cpu_flag==0)?pause_push_Pl:-1,PAD_NUM_HOLD)==1) { switch (pause_select) { case 0: PlaySoundMem( bgm_handle[bgm_num] , DX_PLAYTYPE_LOOP , FALSE ) ; func_state=100; break; case 1: first_ini(); func_state=100; break; case 2: menu_ini(); func_state=50; break; } } if (CheckStatePad((all_cpu_flag==0)?pause_push_Pl:-1,PAD_NUM_PAUSE)==1) { PlaySoundMem( bgm_handle[bgm_num] , DX_PLAYTYPE_LOOP , FALSE ) ; func_state=100; } break; case 101: //リザルト画面 control_result(); graph_main(); stage_cnt++; if (CheckStatePad(-1,PAD_NUM_HOLD)==1) func_state=102; break; case 102: //ゲームオーバー後選択画面 control_over_select(); graph_main(); stage_cnt++; if (CheckStatePad(-1,PAD_NUM_HOLD)==1) { switch (over_select) { case 0: first_ini(); func_state=100; break; case 1: menu_ini(); menu_select=mode; func_state=50; break; case 3: func_state=101; break; } } break; default: printfDx("error:不明なfunc_state\n"); break; } control_func_state(); exe_cnt++; music_play(); if(CheckStateKey(KEY_INPUT_ESCAPE)==1) break;//エスケープが入力されたらブレイク ScreenFlip();//裏画面反映 } DxLib_End();//DXライブラリ終了処理 return 0; }
void ch_move(){ int i,sayu_flag=0,joge_flag=0; double x,y,mx,my,naname=1; double move_x[4]={-4.0,4.0,0,0},move_y[4]={0,0,4.0,-4.0}; int inputpad[4],inputslow,inputbom; inputpad[0]=CheckStatePad(configpad.left); inputpad[1]=CheckStatePad(configpad.right); inputpad[2]=CheckStatePad(configpad.down); inputpad[3]=CheckStatePad(configpad.up); inputslow=CheckStatePad(configpad.slow); inputbom=CheckStatePad(configpad.bom); //リプレイ再生なら、操作をリプレイから取得 if(replay_flag == 1){ for(int i = 0;i < 4;i++){ inputpad[i] = replay.move[i][count]; } inputslow = replay.slow[count]; inputbom = replay.bom[count]; }else{//リプレイ再生でないなら、リプレイに記録 for(int i = 0;i < 4;i++){ replay.move[i][count] = inputpad[i]; } replay.slow[count] = inputslow; replay.bom[count] = inputbom; } //ボム処理 if(inputbom==1 && ch.bom > 0){ ch.bcnt = 60; //ボム効果時間 --ch.bom; se_flag[5]=1; } if(inputpad[0]>0)//左キーが押されていたら ch.img+=4*2;//画像を左向きに else if(inputpad[1]>0)//右キーが押されていたら ch.img+=4*1;//画像を右向きに for(i=0;i<2;i++)//左右分 if(inputpad[i]>0)//左右どちらかの入力があれば sayu_flag=1;//左右入力フラグを立てる for(i=2;i<4;i++)//上下分 if(inputpad[i]>0)//上下どちらかの入力があれば joge_flag=1;//上下入力フラグを立てる if(sayu_flag==1 && joge_flag==1)//左右、上下両方の入力があれば斜めだと言う事 naname=sqrt(2.0);//移動スピードを1/ルート2に for(int i=0;i<4;i++){//4方向分ループ if(inputpad[i]>0){//i方向のキーボード、パッドどちらかの入力があれば x=ch.x , y=ch.y;//今の座標をとりあえずx,yに格納 mx=move_x[i]; my=move_y[i];//移動分をmx,myに代入 if(inputslow>0 && ch.slow_flag==0){//低速移動なら mx=move_x[i]/3; my=move_y[i]/3;//移動スピードを1/3に } x+=mx/naname , y+=my/naname;//今の座標と移動分を足す if(!(x<FX+10 || x>FX+FMX-10 || y<FY+10 || y>FY+FMY-10)){//計算結果移動可能範囲内なら ch.x=x , ch.y=y;//実際に移動させる } } } //無敵カウント減少 if(ch.bcnt){ ch.bcnt--; } }