忍者ブログ
まったくのプログラミング素人の筆者がC++/HSPを使用してSTG(シューティングゲーム)を作っていく過程を書くブログでしたが最近は脱線気味。プログラミング以外にも、ゲーム関連の記事、日々の戯言など。
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

自機狙い弾を追加してみました。
s-WS000334.jpg
とりあえず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関数を使って
自機の方向に回転させて表示させています。

PR
ネットで見かけて、これは便利!と思ったので勝手に掲載↓
rgb.gif*画像クリックで拡大します
色の早見表。
RGBと16進数で書いてあるので、使いたい色の数字を見れば簡単に入力出来ます。
こういうのって地味に調べるの面倒なので、この表作った人に感謝ですね^^

自機弾処理を追加しようと思って、まず自機弾画像をメタセコイアで作成。
s-s-4_61.jpg
こんなモデルを作ってレンダリングした物をEdge2で並べたのがコレ↓
s-jikitama01.jpg
この画像を使って自機弾処理を追加しました。
s-4_63.jpg
プロジェクトファイルはコチラ↓
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で作成しました。
s-4_62.jpg
こんな画像でも、ものの5分もあれば作れるので便利です^^

敵キャラのアニメはメタセコイアで角度を変えてレンダリングして作成。
TEKI01.GIF
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に敵キャラ画像を入れておいて変化させています。

敵の出現処理を追加しようと思って、とりあえず敵をデザインしてみました。
s-s-4_52.jpg
とりあえずこんな感じ。
これを元に敵キャラ画像を作って、配列変数を使って敵が出現するようにしました。
プロジェクトファイルはコチラ↓
https://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1238877409

このファイルを動かすとこんな感じ↓
s-4_51.jpg
とりあえず、上から下に向かって移動するだけです。

敵出現&移動用の関数はこんな感じで書いてます↓
////////////////////////////敵発生処理////////////////////////////////////////////////////////////
//引数 なし
//返値 なし
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と記述するだけで良いので便利です^^
XBOX用ソフトのNINJA GAIDENで、スカラベを全部(50個)集めると
スーパーファミコン版忍者龍剣伝の1,2,3が遊べるようになるって事を知って
頑張って集めてみた。
で、ムラマサの店に持っていくと
s-DSCF6912.jpg
忍者龍剣伝1のディスク入手!

これを持っているとタイロンにあるのハンズ・バーのゲーム機で忍者龍剣伝がプレイ出来るらしい
s-DSCF6918.jpg
アップライトの筐体が置いてあります。
筐体を調べてみると・・・
s-DSCF6915.jpg
ゲームの選択画面が。
早速プレイしようと思ってwktkしながらスタートボタンを押しました。



s-DSCF6917.jpg
・・・・・・・アレレ?本体バグッた???本体がフリーズしてしまって動きません。
何度やってみても結果は同じ。
で、調べてみるとXBOX360では動かないみたいですorz
ちゃんと調べてから集めれば良かった・・・

それにしてもNINJA GAIDEN1、NINJA GAIDEN2共にクリア後もずっと遊んでいて
ここ最近で遊んだゲームの中でプレイ率No.1です。
そして、NINJA GAIDEN2はNINJA GAIDEN Σ2としてPS3で発売されるようで
(NINJA GAIDEN1はNINJA GAIDEN Σとして発売中)
こちらもプレイしたいのですが、まずはPS3を買わないといけないので、かなりハードル高いです^^;
Twitter
カレンダー
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
最新コメント
[04/20 kt.]
[04/19 うぇむ]
[11/24 kt.]
[11/21 NONAME]
[11/24 kt.]
プロフィール
HN:
kt.
性別:
男性
自己紹介:
プログラミング経験は昔ファミリーベーシックでちょっとさわったくらい。
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
ブログ内検索
忍者ブログ [PR]