三角関数で弾幕(3)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Ultimate

三角関数で弾幕(3)

#1

投稿記事 by Ultimate » 15年前

こんにちは。

三角関数で弾幕(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 ; // ソフトの終了
} 画像

シエル

Re:三角関数で弾幕(3)

#2

投稿記事 by シエル » 15年前

とりあえず普通のシューティングゲームから作っていけばよいのではないでしょうか?

Ultimate

Re:三角関数で弾幕(3)

#3

投稿記事 by Ultimate » 15年前

ありがとうございます。

つまり、この後は敵などを表示させて、当たり判定などをつけた普通のシューティングに、機能を追加するべきだということでしょうか?

とりあえず、頑張って作ってみたので、一度実行していただけたら嬉しいです。

シエル

Re:三角関数で弾幕(3)

#4

投稿記事 by シエル » 15年前

if(ball2.counter>10){
ball2.flag=0;
ball2.counter=0;
}

↑10カウント超えたらフラグを戻してるから描画がされないですよ。
描画する条件はball2のフラグが1のときなのですから。

シエル

Re:三角関数で弾幕(3)

#5

投稿記事 by シエル » 15年前

とりあえず敵を出して、弾が当たったら敵を消す、弾を消す。
それができるようになったら、弾の発射音を出す、弾のショット音、敵の消滅音を出す。
それ以降は、敵の弾幕の種類を増やすなど。
基本はまず普通のシューティングをまず作ってみるべきですよ。

自機の絵がそのままインベーダーですね。自分で描いたんですか?

Ultimate

Re:三角関数で弾幕(3)

#6

投稿記事 by Ultimate » 15年前

ありがとうございました。

原因がわかり、うまく改善できました。

if(ball2.counter>10){
ball2.flag=0;
ball2.counter=0;
}



for(i=0;i<20;i++){
if(ball2.y<0){
ball2.flag=0;
}
}

に直してください。

これで改善できました。

Ultimate

Re:三角関数で弾幕(3)

#7

投稿記事 by Ultimate » 15年前

インベーダーは

http://dic.nicovideo.jp/b/a/31-

の33番目のものを参考に(一部色をコピー)してペイントで書きました。

とりあえず、自機の画像を考えるのが大変だったので・・・。 画像

Ultimate

Re:三角関数で弾幕(3)

#8

投稿記事 by Ultimate » 15年前

さらに改善

for(i=0;i<20;i++){
for(j=0;j<20;j++){
if(ball2.y<-100&&ball2.y[j]>600){
ball2.flag=0;
}
}
}

シエル

Re:三角関数で弾幕(3)

#9

投稿記事 by シエル » 15年前

URLのページが見つからないって出ますね。。

自分で描いたんですね。自分は絵が下手なので描ける人は羨ましいです。

↓たぶん下記のように修正しても、キャラが画面の上のほうに居るときに
全方向ショットを撃つとたぶん途中で消えちゃいますよ。

for(i=0;i<20;i++){
if(ball2.y<0){
ball2.flag=0;
}
}

ROM

Re:三角関数で弾幕(3)

#10

投稿記事 by ROM » 15年前

この素材は再配布OKなんですか?

ROM

Re:三角関数で弾幕(3)

#11

投稿記事 by ROM » 15年前

>シエルさん

全角URLが含まれていないからでしょう。

シエル

Re:三角関数で弾幕(3)

#12

投稿記事 by シエル » 15年前

>ROMさん
>全角URLが含まれていないからでしょう。
全角文字もURLだったのか。。ありがとうございます。。。

シエル

Re:三角関数で弾幕(3)

#13

投稿記事 by シエル » 15年前

↓のように修正しても、自機が左下のほうにある状態で、
全方向ショットを撃つと一部の弾が途中で消えちゃいますよ。
答えは分かりますが、あえて教えません。自分で考えましょう。

for(i=0;i<20;i++){
for(j=0;j<20;j++){
if(ball2.y<-100&&ball2.y[j]>600){
ball2.flag=0;
}
}
}

Ultimate

Re:三角関数で弾幕(3)

#14

投稿記事 by Ultimate » 15年前

使っていいのか考えていなかったので、もう少しオリジナル性のあるインベーダーを今から描き、出来次第新しいものをアップロードします。

青い弾は完全自作です。

Ultimate

Re:三角関数で弾幕(3)

#15

投稿記事 by Ultimate » 15年前

さらに数値を大きくして

for(i=0;i<20;i++){
for(j=0;j<20;j++){
if(ball2.y<-300&&ball2.y[j]>700){
ball2.flag=0;
}
}
}

ではだめですよね?

これでは、無駄に数値を大きくしただけですから・・・

もう少しよい方法を考えます。

Ultimate

Re:三角関数で弾幕(3)

#16

投稿記事 by Ultimate » 15年前

インベーダー画像完全オリジナルバージョン完成です。

これに画像を変更してください。

シエル

Re:三角関数で弾幕(3)

#17

投稿記事 by シエル » 15年前

オリジナルに変えたのであれば、アップしたファイルは消して、あげなおしたほうがいいのでは?

Ultimate

Re:三角関数で弾幕(3)

#18

投稿記事 by Ultimate » 15年前

http://www1.axfc.net/uploader/Sc/so/123821

に場所変更しました。

パスは今まで通り12345です。

閉鎖

“C言語何でも質問掲示板” へ戻る