三角関数で弾幕(3)
Posted: 2010年6月14日(月) 17:59
こんにちは。
三角関数で弾幕(2)での皆様の回答を参考に、ソースを作ってみました。
今後どうしたらいいかなどのアドバイスや、感想などをお待ちしています。
(たとえば、この後はさらに弾の種類を増やすのか、敵を登場させたほうがいいのかなど)
あと、全方向ショットが、キーで発射させられるようになったものの、Zを押している間しか広がらないのでどのような方法でそれを改善すればいいのでしょうか?
(ソースではなく、やり方のみで大丈夫です。)
弾は、XキーとZキーで操作です。
実行ファイルはhttp://www1.axfc.net/uploader/Sc/so/123784で、キーは12345です。
ソースは以下の通りです。
実行時は、実行ファイルの中にある画像を入れ忘れないように注意してください。
#include "DxLib.h"
#include<math.h>
#define PI 3.14159265358979323846264338327950288419
#define BALL_SPEED 10
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
//変数作成/////////////////////////////////////////////////////////////////////
char key[256];
int i,j;
int color;
color=GetColor(255,255,255);
//自機設定/////////////////////////////////////////////////////////////////////
typedef struct {
int x,y,flag;
}ch_t;
ch_t jiki;
int jimage;
jiki.x=300;
jiki.y=440;
jiki.flag=1;
jimage=LoadGraph("inbe-da-.png");
//弾1変数など//////////////////////////////////////////////////////////////////
int tx1[5],ty1[5],tz1=3,tflag1[5],tcount1=0;
for(i=0;i<5;i++){
tflag1=0;
}
int t1image;
t1image=LoadGraph("tama1.png");
//弾2変数など//////////////////////////////////////////////////////////////////
struct {
double x[20],y[20],z,ang[20];
int flag,counter;
}ball2;
for(i=0;i<20;i++){
ball2.x=320;
ball2.y=240;
ball2.ang=18*i*PI/180;
}
ball2.flag=0;
ball2.z=3;
ball2.counter=0;
//描画先を裏画面へ/////////////////////////////////////////////////////////////
SetDrawScreen(DX_SCREEN_BACK);
while(1){
GetHitKeyStateAll(key);
if(ProcessMessage()==-1){//メッセージ処理
break;
}
ClearDrawScreen();
//自機表示/////////////////////////////////////////////////////////////////////
if(jiki.flag==1){
DrawGraph(jiki.x,jiki.y,jimage,TRUE);
}
//自機移動/////////////////////////////////////////////////////////////////////
if(key[KEY_INPUT_RIGHT]==1){
jiki.x+=5;
}
if(key[KEY_INPUT_LEFT]==1){
jiki.x-=5;
}
if(key[KEY_INPUT_UP]==1){
jiki.y-=5;
}
if(key[KEY_INPUT_DOWN]==1){
jiki.y+=5;
}
//自機移動制限/////////////////////////////////////////////////////////////////
if(jiki.x<0){
jiki.x=0;
}
if(jiki.x>607){
jiki.x=607;
}
if(jiki.y<0){
jiki.y=0;
}
if(jiki.y>455){
jiki.y=455;
}
//弾1【Xキーで上へ発射】//////////////////////////////////////////////////////////
//フラグ0の弾を自機に合わせて移動
for(i=0;i<5;i++){
if(tflag1==0){
tx1=jiki.x+15;
ty1=jiki.y;
}
}
//Xが押されて、且つフラグが0ならフラグを1に
if(key[KEY_INPUT_X]==1&&tcount1>10){
for(i=0;i<5;i++){
if(tflag1==0){
tflag1=1;
tcount1=0;
break;
}
}
}
//弾1描画
for(i=0;i<5;i++){
if(tflag1==1){
DrawGraph(tx1[i],ty1[i],t1image,TRUE);
ty1[i]-=10;
}
}
//弾が場外に出たらフラグを0に戻す
for(i=0;i<5;i++){
if(ty1[i]<0&&tflag1[i]==1){
tflag1[i]=0;
}
}
//カウンター
tcount1++;
//弾2【全方向ショット】/////////////////////////////////////////////////////////
//Xキーで発射フラグを立てる
if(key[KEY_INPUT_Z]==1){
ball2.flag=1;
}
if(ball2.flag==0){
for(i=0;i<20;i++){
ball2.x[i]=jiki.x+15;
ball2.y[i]=jiki.y;
}
}
if(ball2.flag==1){
for(i=0;i<20;i++){
ball2.x[i]+=cos(ball2.ang[i])*BALL_SPEED;
ball2.y[i]+=sin(ball2.ang[i])*BALL_SPEED;
}
//描画
for(i=0;i<20;i++){
DrawCircle(ball2.x[i],ball2.y[i],ball2.z,color,TRUE);
}
if(ball2.counter>10){
ball2.flag=0;
ball2.counter=0;
}
ball2.counter++;
}
ScreenFlip();//表画面へ反映
}
WaitKey() ; // キーの入力待ち(『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
三角関数で弾幕(2)での皆様の回答を参考に、ソースを作ってみました。
今後どうしたらいいかなどのアドバイスや、感想などをお待ちしています。
(たとえば、この後はさらに弾の種類を増やすのか、敵を登場させたほうがいいのかなど)
あと、全方向ショットが、キーで発射させられるようになったものの、Zを押している間しか広がらないのでどのような方法でそれを改善すればいいのでしょうか?
(ソースではなく、やり方のみで大丈夫です。)
弾は、XキーとZキーで操作です。
実行ファイルはhttp://www1.axfc.net/uploader/Sc/so/123784で、キーは12345です。
ソースは以下の通りです。
実行時は、実行ファイルの中にある画像を入れ忘れないように注意してください。
#include "DxLib.h"
#include<math.h>
#define PI 3.14159265358979323846264338327950288419
#define BALL_SPEED 10
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
//変数作成/////////////////////////////////////////////////////////////////////
char key[256];
int i,j;
int color;
color=GetColor(255,255,255);
//自機設定/////////////////////////////////////////////////////////////////////
typedef struct {
int x,y,flag;
}ch_t;
ch_t jiki;
int jimage;
jiki.x=300;
jiki.y=440;
jiki.flag=1;
jimage=LoadGraph("inbe-da-.png");
//弾1変数など//////////////////////////////////////////////////////////////////
int tx1[5],ty1[5],tz1=3,tflag1[5],tcount1=0;
for(i=0;i<5;i++){
tflag1=0;
}
int t1image;
t1image=LoadGraph("tama1.png");
//弾2変数など//////////////////////////////////////////////////////////////////
struct {
double x[20],y[20],z,ang[20];
int flag,counter;
}ball2;
for(i=0;i<20;i++){
ball2.x=320;
ball2.y=240;
ball2.ang=18*i*PI/180;
}
ball2.flag=0;
ball2.z=3;
ball2.counter=0;
//描画先を裏画面へ/////////////////////////////////////////////////////////////
SetDrawScreen(DX_SCREEN_BACK);
while(1){
GetHitKeyStateAll(key);
if(ProcessMessage()==-1){//メッセージ処理
break;
}
ClearDrawScreen();
//自機表示/////////////////////////////////////////////////////////////////////
if(jiki.flag==1){
DrawGraph(jiki.x,jiki.y,jimage,TRUE);
}
//自機移動/////////////////////////////////////////////////////////////////////
if(key[KEY_INPUT_RIGHT]==1){
jiki.x+=5;
}
if(key[KEY_INPUT_LEFT]==1){
jiki.x-=5;
}
if(key[KEY_INPUT_UP]==1){
jiki.y-=5;
}
if(key[KEY_INPUT_DOWN]==1){
jiki.y+=5;
}
//自機移動制限/////////////////////////////////////////////////////////////////
if(jiki.x<0){
jiki.x=0;
}
if(jiki.x>607){
jiki.x=607;
}
if(jiki.y<0){
jiki.y=0;
}
if(jiki.y>455){
jiki.y=455;
}
//弾1【Xキーで上へ発射】//////////////////////////////////////////////////////////
//フラグ0の弾を自機に合わせて移動
for(i=0;i<5;i++){
if(tflag1==0){
tx1=jiki.x+15;
ty1=jiki.y;
}
}
//Xが押されて、且つフラグが0ならフラグを1に
if(key[KEY_INPUT_X]==1&&tcount1>10){
for(i=0;i<5;i++){
if(tflag1==0){
tflag1=1;
tcount1=0;
break;
}
}
}
//弾1描画
for(i=0;i<5;i++){
if(tflag1==1){
DrawGraph(tx1[i],ty1[i],t1image,TRUE);
ty1[i]-=10;
}
}
//弾が場外に出たらフラグを0に戻す
for(i=0;i<5;i++){
if(ty1[i]<0&&tflag1[i]==1){
tflag1[i]=0;
}
}
//カウンター
tcount1++;
//弾2【全方向ショット】/////////////////////////////////////////////////////////
//Xキーで発射フラグを立てる
if(key[KEY_INPUT_Z]==1){
ball2.flag=1;
}
if(ball2.flag==0){
for(i=0;i<20;i++){
ball2.x[i]=jiki.x+15;
ball2.y[i]=jiki.y;
}
}
if(ball2.flag==1){
for(i=0;i<20;i++){
ball2.x[i]+=cos(ball2.ang[i])*BALL_SPEED;
ball2.y[i]+=sin(ball2.ang[i])*BALL_SPEED;
}
//描画
for(i=0;i<20;i++){
DrawCircle(ball2.x[i],ball2.y[i],ball2.z,color,TRUE);
}
if(ball2.counter>10){
ball2.flag=0;
ball2.counter=0;
}
ball2.counter++;
}
ScreenFlip();//表画面へ反映
}
WaitKey() ; // キーの入力待ち(『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
