10. 沢山の弾を発射する。2
先ほど説明しなかったサンプルの青い部分について説明します。
弾は発射する時の初期座標は全部同じではありません。(キャラの中心から発射しているわけではありません)
拡大写真を見て判るとおり、中心ほど前に、両側は外へ広がっていますね。
これがもし、全部が同じ座標から発射されると初め直線にみえてしまいます。
前節の移動するX座標のように、また個別に発射する初期座標を配列で決めましょう。
この写真で、弾の列の数字を確認してください。
0列の弾の初期X座標はプレイヤーのX座標と同じです。(+0です)
1列の弾の初期X座標はプレイヤーのX座標-10です。
2列の弾の初期X座標はプレイヤーのX座標+10です。。。。。
これを11まで配列に格納したのが
int positionx[11]={0,-10,10,-10,10,-15,15,-10,10,-10,10};
です。
0列の弾の初期Y座標はプレイヤーのY座標-15です。
1列の弾の初期Y座標はプレイヤーのY座標-2です。
2列の弾の初期Y座標はプレイヤーのY座標-2です。。。。。
これを11まで配列に格納したのが
int positiony[11]={-15,-2,-2,6,6,-6,-6,2,2,10,10};
です。
特定の列の弾の座標を初期化するときは、この値を個別にたす必要があります。
それを書いたのがこれです。
int positionx[11]={0,-10,10,-10,10,-15,15,-10,10,-10,10},positiony[11]={-15,-2,-2,6,6,-6,-6,2,2,10,10}; if(Key[KEY_INPUT_Z]==1 && counter%5==0){//Zが押されていて、5周に1回なら for(i=0;i<ShotLevel;i++){//現在のショットレベル(列)までループ for(j=0;j<PLAYER_MAX_SHOT2;j++){//最高15個までループ if(PlayerShot[i][j].flag==0){//発射していない弾があれば PlayerShot[i][j].flag=1;//発射したフラグを立てる PlayerShot[i][j].x=Player.x+(double)positionx[i];//弾のx座標を初期化 PlayerShot[i][j].y=Player.y+(double)positiony[i];//弾のy座標を初期化 break; } } } }
これで、処理ができますね。
このソースは先ほどと同じです。コピーする必要はありません。色付けも同じです。実行結果も同じです。
/* player.cpp */
/* 素材 ver1.00以上必要*/
#include "DxLib.h" #include "ExternGV.h" void PlayerControl(){ if(Key[KEY_INPUT_LEFT]==1){ Player.x-=4.0f; if(Player.x<10.0) Player.x=10.0; } if(Key[KEY_INPUT_RIGHT]==1){ Player.x+=4.0f; if(Player.x>409.0) Player.x=409.0; } if(Key[KEY_INPUT_UP]){ Player.y-=4.0f; if(Player.y<15.0) Player.y=15.0; } if(Key[KEY_INPUT_DOWN]==1){ Player.y+=4.0f; if(Player.y>465.0) Player.y=465.0; } DrawGraph((int)Player.x-16,(int)Player.y-24,img_player[0],TRUE); } void PlayerShotCalc(){ int i,j; int positionx[11]={0,-10,10,-10,10,-15,15,-10,10,-10,10},positiony[11]={-15,-2,-2,6,6,-6,-6,2,2,10,10}; if(Key[KEY_INPUT_Z]==1 && counter%5==0){ for(i=0;i<ShotLevel;i++){ for(j=0;j<PLAYER_MAX_SHOT2;j++){ if(PlayerShot[i][j].flag==0){ PlayerShot[i][j].flag=1; PlayerShot[i][j].x=Player.x+(double)positionx[i]; PlayerShot[i][j].y=Player.y+(double)positiony[i]; break; } } } } int sab[11]={0,-1,1,-3,3,0,0,-2,2,-5,5}; for(i=0;i<PLAYER_MAX_SHOT1;i++){ for(j=0;j<PLAYER_MAX_SHOT2;j++){ if(PlayerShot[i][j].flag==1){ PlayerShot[i][j].x+=(double)sab[i]; PlayerShot[i][j].y-=10.0; if(PlayerShot[i][j].y<-20) PlayerShot[i][j].flag=0; } } } } void PlayerShotDisp(){ int i,j; for(i=0;i<PLAYER_MAX_SHOT1;i++){ for(j=0;j<PLAYER_MAX_SHOT2;j++){ if(PlayerShot[i][j].flag==1){ switch(i){ case 0: case 5: case 6: DrawGraph((int)PlayerShot[i][j].x-10,(int)PlayerShot[i][j].y-18,img_player_shot[0],TRUE); break; default: DrawGraph((int)PlayerShot[i][j].x-8,(int)PlayerShot[i][j].y-10,img_player_shot[1],TRUE); break; } } } } }
実行画面
DXライブラリ著作権表示
DX Library Copyright (C) 2001-2006 Takumi
Yamada.