[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
自機狙い弾を追加してみました。
とりあえず10フレームに1回発射するようにしています。
プロジェクトファイルはコチラ↓
https://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1239168186
自機狙い弾についてはコチラで詳しく書いていますが、サイン、コサイン、アークタンジェントを
使って計算しています。
プログラムとしてはこんな感じ↓
////////////////////////////敵弾発生処理////////////////////////////////////////////////////////////
//引数 x軸敵位置、y軸敵位置
//返値 なし
void teki01tama(int x,int y){
int i;
double r=0.;//敵弾角度
double ds=5.;//弾の速さ
for(i=0;i<ENEMY_TAMA_MAX;i++){//敵弾初期化
if(enemy_tama[i].etf==0) {
enemy_tama[i].etf=1;//弾の存在を有に
enemy_tama[i].etx=x+24;//初期位置
enemy_tama[i].ety=y+24;
r=atan2((ch.y+24)-(y+24), (ch.x+24)-(x+24));//敵と自機との角度を求める
enemy_tama[i].etr=r;
enemy_tama[i].etmx=cos(r)*ds;//移動量
enemy_tama[i].etmy=sin(r)*ds;
break;
}
}
}
////////////////////////////////////////////////////////////////////////////////////////
このteki01tama関数でまず自機と敵の角度を調べて、弾の移動方向を決めます。
2点の角度を調べるにはアークタンジェントを使うのですが、HSPの場合はatanのみで良かった
のですがC言語の場合はatan2関数「double atan2(double y, double x)」となるようです。
なので、このatan2関数を使ってr=atan2((ch.y+24)-(y+24), (ch.x+24)-(x+24))みたいな
感じで角度を調べます。
ついでに敵弾画像回転用にenemy_tama[i].etr=r;として角度を代入しておきました。
で、サインとコサインで移動量を計算します。
enemy_tama[i].etmx=cos(r)*ds;
enemy_tama[i].etmy=sin(r)*ds;
こんな感じ。
ちなみにatan2関数を使う為には#include <math.h>の記述が必要です。
次は弾の移動です。
敵弾の移動関数はこんな感じ↓
/////////////////////////////敵弾移動処理///////////////////////////////////////////////////////////
//引数 なし
//返値 なし
void tekitamamove(){
int i;
g_tekitamacount=0;
for(i=0;i<ENEMY_TAMA_MAX;i++){//敵弾初期化
if(enemy_tama[i].etf==1) {//敵弾が画面にある時
g_tekitamacount++;
enemy_tama[i].etx=enemy_tama[i].etx+enemy_tama[i].etmx;//敵弾移動
enemy_tama[i].ety=enemy_tama[i].ety+enemy_tama[i].etmy;
DrawRotaGraph( enemy_tama[i].etx , enemy_tama[i].ety , 1.0f , enemy_tama[i].etr , g_tekitama01 , TRUE ) ;//敵弾表示
if(enemy_tama[i].etx>500) enemy_tama[i].etf=0;//画面からはみ出したら削除
if(enemy_tama[i].etx<140 ) enemy_tama[i].etf=0;
if(enemy_tama[i].ety>480) enemy_tama[i].etf=0;
if(enemy_tama[i].ety<-48 ) enemy_tama[i].etf=0;
}
}
}
////////////////////////////////////////////////////////////////////////////////////////
弾の現在の座標enemy_tama[i].etx , enemy_tama[i].ety に
移動量enemy_tama[i].etmx , enemy_tama[i].etmyを足してDrawRotaGraph関数を使って
自機の方向に回転させて表示させています。
自機弾処理を追加しようと思って、まず自機弾画像をメタセコイアで作成。
こんなモデルを作ってレンダリングした物をEdge2で並べたのがコレ↓
この画像を使って自機弾処理を追加しました。
プロジェクトファイルはコチラ↓
https://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1238947519
画面が寂しかったので背景と敵のアニメーションも追加してます。
自機弾処理は以前書いた記事を参考に追加してます。プログラムはこんな感じ↓
////////////////////////////自機弾移動処理////////////////////////////////////////////////////////////
//引数 なし
//返値 なし
void jikitamamove(){
int i;
g_jikishottime--;//連射時間制御
if( g_jikishottime<0 ) {//連射時間制御が0以下の時
if( Key[ KEY_INPUT_Z ] == 1 ) {//zキーが押された時
int eh=0;//一度に出現する数
for(i=0;i<JIKITAMA;i++){
if(jikitama[i].tf==0) {
eh++;//一度に出現する数
jikitama[i].tf=1;//自機弾の存在を有に
jikitama[i].tx=ch.x;//初期位置
jikitama[i].ty=ch.y;
g_jikishottime=3;//連射間隔
if(eh>0){//任意数出現してbreak
break;
}
}
}
}
}
for(i=0;i<JIKITAMA;i++){//自機弾の数だけ繰り返す
if(jikitama[i].tf==1) {//自機弾が画面にある時
jikitama[i].tx=jikitama[i].tx;//X軸敵弾移動
jikitama[i].ty=jikitama[i].ty-15;//Y軸敵弾移動
DrawGraph( jikitama[i].tx , jikitama[i].ty , g_jikitama01 , TRUE ) ;//自機弾表示
if(jikitama[i].tx>500) jikitama[i].tf=0;//画面からはみ出したら削除
if(jikitama[i].tx<136 ) jikitama[i].tf=0;
if(jikitama[i].ty>480) jikitama[i].tf=0;
if(jikitama[i].ty<-48 ) jikitama[i].tf=0;
}
}
}
////////////////////////////////////////////////////////////////////////////////////////
連射制御の為の変数g_jikishottimeを使うのがポイントです。
背景はコチラを参考にGIMP2で作成しました。
こんな画像でも、ものの5分もあれば作れるので便利です^^
敵キャラのアニメはメタセコイアで角度を変えてレンダリングして作成。
DrawGraph( enemy[i].ex , enemy[i].ey , g_teki01image[enemy[i].img] , TRUE ) ;//敵表示
if(g_gtime%2 == 0) enemy[i].img++;
if(enemy[i].img>=15) enemy[i].img=0;
こんな感じでenemy[i].imgに敵キャラ画像を入れておいて変化させています。
とりあえずこんな感じ。
これを元に敵キャラ画像を作って、配列変数を使って敵が出現するようにしました。
プロジェクトファイルはコチラ↓
https://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1238877409
このファイルを動かすとこんな感じ↓
とりあえず、上から下に向かって移動するだけです。
敵出現&移動用の関数はこんな感じで書いてます↓
////////////////////////////敵発生処理////////////////////////////////////////////////////////////
//引数 なし
//返値 なし
void teki01move(){
int eh=0;
int i;
if(g_gtime%20 == 0) {//20ループに1回出現
for(i=0;i<ENEMY;i++){//敵弾初期化
if(enemy[i].ef==0) {
eh++;//一度に出現する数
enemy[i].ef=1;//敵の存在を有に
enemy[i].ex=GetRand( 312 )+140;//初期位置
enemy[i].ey=-48;
enemy[i].emx=0;//X軸移動量
enemy[i].emy=2;//Y軸移動量
if(eh>1){//任意数出現してbreak
break;
}
}
}
}
////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////敵移動処理///////////////////////////////////////////////////////////
for(i=0;i<ENEMY;i++){//敵の数だけ繰り返す
if(enemy[i].ef==1) {//敵が画面にある時
enemy[i].ex=enemy[i].ex+enemy[i].emx;//X軸敵弾移動
enemy[i].ey=enemy[i].ey+enemy[i].emy;//Y軸敵弾移動
DrawGraph( enemy[i].ex , enemy[i].ey , g_teki01 , TRUE ) ;//敵表示
if(enemy[i].ex>500) enemy[i].ef=0;//画面からはみ出したら削除
if(enemy[i].ex<140 ) enemy[i].ef=0;
if(enemy[i].ey>480) enemy[i].ef=0;
if(enemy[i].ey<-48 ) enemy[i].ef=0;
}
}
}
////////////////////////////////////////////////////////////////////////////////////////
まず、敵出現用の変数を使って、敵が出現しているかどうかを調べて
出現している場合はenemy[i].ef=1として敵を表示するって感じ。
こうしておけば、敵の消滅の時もenemy[i].ef=0と記述するだけで良いので便利です^^
スーパーファミコン版忍者龍剣伝の1,2,3が遊べるようになるって事を知って
頑張って集めてみた。
で、ムラマサの店に持っていくと
忍者龍剣伝1のディスク入手!
これを持っているとタイロンにあるのハンズ・バーのゲーム機で忍者龍剣伝がプレイ出来るらしい
アップライトの筐体が置いてあります。
筐体を調べてみると・・・
ゲームの選択画面が。
早速プレイしようと思ってwktkしながらスタートボタンを押しました。
・・・・・・・アレレ?本体バグッた???本体がフリーズしてしまって動きません。
何度やってみても結果は同じ。
で、調べてみるとXBOX360では動かないみたいですorz
ちゃんと調べてから集めれば良かった・・・
それにしてもNINJA GAIDEN1、NINJA GAIDEN2共にクリア後もずっと遊んでいて
ここ最近で遊んだゲームの中でプレイ率No.1です。
そして、NINJA GAIDEN2はNINJA GAIDEN Σ2としてPS3で発売されるようで
(NINJA GAIDEN1はNINJA GAIDEN Σとして発売中)
こちらもプレイしたいのですが、まずはPS3を買わないといけないので、かなりハードル高いです^^;
| 07 | 2026/08 | 09 |
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!