シューティングの館 18

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

シューティングの館 18

#1

投稿記事 by SONY » 17年前

たびたびすみません。今度はシューティングの館 18の敵に弾を発射させるで悩んでいます。
プログラムをまねて実行したところエラーにより強制終了させられてしまいます。
コンパイル時にエラーは表示されません。どうしたらよいのかアドバイスお願いします。
使用している開発環境はBCC Developerを使っています。

通りすがり

Re:シューティングの館 18

#2

投稿記事 by 通りすがり » 17年前

質問する姿勢として回答者がその文章で把握出来るかどうか考慮するようにしましょう。

それだけの情報では全くわかりません。コードはそっくり一緒なのでしょうか?
異なっている部分があるならそこが原因でしょう。
その異なっている部分は私達には全くわかりません。

医者に行って何も話さず「腹が痛いんですが、何故でしょう」とだけ聞いても医者は何もわからないであろうことと同じように、詳しく話さないとこちらにはわからないです。

SONY

Re:シューティングの館 18<メイン関数>

#3

投稿記事 by SONY » 17年前

どうもすみません。基本的にコード自体は変数名や関数名が違うだけです。とりあえずコードを書いておきます。明らかに問題なさそうなところは省きました。現在は、エラーは直せましたが、敵の弾が発射されません。誰かアドバイスよろしくお願いします。コメントが長すぎるためいくつかに分けます。
<メイン関数(ウィンメイン部は省略)>
#include "Ex.h"

/*グローバル変数ども*/
int counter = 0;
int color_white;
int Lv = 11; //弾レベル
char Key[256];
/*画像ファイルハンドル*/
int img_background[2]; //背景用
int img_player[4]; //プレイヤー画像用
int img_player_shot[2]; //弾
int img_enemy_shot[20];
int img_enemy1[5]; //敵
int sound_player_shot[2];//音声ファイルハンドル
int sound_enemy_shot[2];//敵の弾の音声
MUSUKA_player_t Player;
SHOT_t PlayerShot[MAXSHOT1][MAXSHOT2];
TEKI enemy[TEKIMAX];
TEKITAMA1 enemyshots[ENEMAXSHOT];
TEKITAMAKUMI enemyshot[TEKIMAX];

SONY

Re:シューティングの館 18<座標等初期化>

#4

投稿記事 by SONY » 17年前

<座標等初期化>
#include"Ex.h"

void syokika(){
int i;
Player.x = 200.0;
Player.y = 400.0;
Player.counter = 0;
Player.status = 0;
for(i=0;i<MAXSHOT1;i++)
for(int j = 0;j<MAXSHOT2;j++)
PlayerShot[j].flag = 0;
for(i=0;i<TEKIMAX;i++){
enemy.flag = 0;
enemyshot.flag = 0;
for(int j=0;j<ENEMAXSHOT;j++){
enemyshot.enemyshots[j].flag = 0;
}
}
}

SONY

Re:シューティングの館 18<ヘッダファイル>

#5

投稿記事 by SONY » 17年前

<ヘッダファイル>
#include"DxLib.h"
#include<math.h>
#define MAXSHOT1 11
#define MAXSHOT2 15
#define TEKIMAX 100
#define TEKISIZEX 140.0
#define TEKISIZEY 128.0
#define PAI 3.141592653589793238462643383279
#define PATASPI 4.0f
#define ENEMAXSHOT 200

/*グローバル変数ども*/
extern int counter;
extern int color_white;
extern int Lv; //弾レベル
extern char Key[/url];
/*画像ファイルハンドル*/
extern int img_background[/url]; //背景用
extern int img_player[/url]; //プレイヤー画像用
extern int img_player_shot[/url]; //弾
extern int img_enemy_shot[/url]; //敵弾
extern int img_enemy1[/url]; //敵
extern int sound_player_shot[/url];//音声ファイルハンドル
extern int sound_enemy_shot[/url];

/*構造体(自キャラ)*/
typedef struct{
double x;
double y;
int status;
int counter;
int shot[11][15];
}MUSUKA_player_t;
extern MUSUKA_player_t Player;

//敵
typedef struct{
double x;
double y;
double size;
//double range;
int flag;
int counter;
int hp;
int pattern;
}TEKI;
extern TEKI enemy[TEKIMAX];

//弾
typedef struct{
double x;
double y;
int flag;//発射判定フラグ
}SHOT_t;
extern SHOT_t PlayerShot[MAXSHOT1][MAXSHOT2];

//敵弾単体
typedef struct{
int flag;
double x;
double y;
}TEKITAMA1;
extern TEKITAMA1 enemyshots[ENEMAXSHOT];
//敵弾組
typedef struct{
int flag;
int pattern;
int counter;
int img;
double mem_ex;
double mem_ey;
double mem_px;
double mem_py;
double angle[ENEMAXSHOT];//200
TEKITAMA1 enemyshots[ENEMAXSHOT];//200
}TEKITAMAKUMI;
extern TEKITAMAKUMI enemyshot[TEKIMAX];//100

void img_sound_load(); //画像ロード
void syokika(); //初期化
void SetColor(); //色取得
void Background(); //背景描画
void tamakeisan(); //弾計算
void tamabyouga(); //弾描画
void PlayerControl();//プレイヤー描画
void enemycontrol(); //敵移動パターンを呼び出す関数
void enemybyouga(); //敵描画
void Background2(); //得点盤描画
void fpstime(); //fps描画
void enemyscontrol();
void ttt();

SONY

Re:シューティングの館 18<敵パターン関数>

#6

投稿記事 by SONY » 17年前

<敵パターン関数>
#include"Ex.h"

//敵移動パターン1
/*
void enemypattern1(int i){
enemy.y += 1.5f;
}
*/
//敵移動パターン2
void enemypattern2(int i){
int j;
if(enemy.counter < 50)
enemy.y += 4.0f;
if(enemy.counter == 75){
for(j=0;j<TEKIMAX;j++){
if(enemyshot[j].flag == 0) break;
enemyshot[j].mem_ex = enemy.x;//敵の座標
enemyshot[j].mem_ey = enemy.y;//同上
enemyshot[j].mem_px = Player.x; //プレイヤー座標
enemyshot[j].mem_py = Player.y; //同上
enemyshot[j].counter = 0;//カウンター初期化
enemyshot[j].flag = 1;//発射フラグ
enemyshot[j].pattern = 1;//パターン
enemyshot[j].img = 0;
}
}

if(enemy.counter > 100)
enemy.y -= 4.0f;
}

//敵移動パターン3
/*
void enemypattern3(int i){
enemy.x += sin(PAI*(enemy.counter / 40.0f))*5.0f; //80カウントで1周期
enemy[i].y += 1.5f;
// enemy[i].x += cos(PAI*(enemy[i].counter / 40.0f))*5.0f;
}

//敵移動パターン4
void enemypattern4(int i){
if(enemy[i].counter < 100)
enemy[i].y += 2.5f;
if(enemy[i].counter >= 100){
enemy[i].x += sin(PAI*(enemy[i].counter - 100.0f)/80.0f)*5.0f; //カウンターを100引くと0になる
enemy[i].y += sin(PAI*(enemy[i].counter - 60.0f)/80.0f)*5.0f; //20引くと半周期進む
}
}
*/
//敵移動パターンを呼び出す関数
void enemycontrol(){
for(int i=0;i<100;i++){
if(enemy[i].flag == 1){ //出現フラグがたったら
//if(enemy[i].pattern == 1)
// enemypattern1(i); //パターン呼び出し
if(enemy[i].pattern == 2)
enemypattern2(i);
//if(enemy[i].pattern == 3)
// enemypattern3(i);
//if(enemy[i].pattern == 4)
// enemypattern4(i);
}
}
}

//敵描画
void enemybyouga(){
int i;
for(i=0;i<100;i++)
if(enemy[i].flag == 0) //出現フラグが立っていないならループ脱出
break;
switch(counter){
case 50:
enemy[i].pattern = 2; //どんな軌道か
enemy[i].flag = 1; //出現フラグを立てる
enemy[i].counter = 0; //出現して何カウントなのか測定するのを初期化
enemy[i].size = 0.5f; //大きさ
enemy[i].x = 100.0; //xの初期座標
enemy[i].y = -10.0; //yの初期座標
break;
/* case 200:
enemy[i].pattern = 2; //どんな軌道か
enemy[i].flag = 1; //出現フラグを立てる
enemy[i].counter = 0; //出現して何カウントなのか測定するのを初期化
enemy[i].size = 0.5f; //大きさ
enemy[i].x = 100.0; //xの初期座標
enemy[i].y = -10.0; //yの初期座標
break;
case 350:
enemy[i].pattern = 3;
enemy[i].flag = 1;
enemy[i].counter = 0;
enemy[i].size = 0.5f;
enemy[i].x = 200.0;
enemy[i].y = -10.0;
break;
case 500:
enemy[i].pattern = 4;
enemy[i].flag = 1;
enemy[i].counter = 0;
enemy[i].size = 1.0f;
enemy[i].x = 100.0;
enemy[i].y = -10.0;
break;

case 51:
counter = 0;
break;
*/
default:
break;
}

for(i=0;i<100;i++){
if(enemy[i].flag == 1){ //出現フラグが立っているなら
enemy[i].counter++; //カウンターを増やす
int enemy_img[8] = {0, 1, 2, 3, 4, 3, 2, 1}; //敵アニメーション
DrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[enemy_img[counter%32/16]] , TRUE );

if(enemy[i].x<0.0-TEKISIZEX/2.0*enemy[i].size || enemy[i].x>420.0+TEKISIZEX/2.0*enemy[i].size || enemy[i].y<0.0-TEKISIZEY/2.0*enemy[i].size || enemy[i].y<0.0-TEKISIZEY/2.0*enemy[i].size)
enemy[i].flag=0;
}
}
}

SONY

Re:シューティングの館 18<敵弾コントロール部>

#7

投稿記事 by SONY » 17年前

<敵弾コントロール部>
#include"Ex.h"

//敵攻撃パターン1
void enemyspattern1(int i){
if(enemyshot.counter == 0){
enemyshot.enemyshots[0].flag = 1; //1個の弾の発射フラグ
enemyshot.enemyshots[0].x = enemyshot.mem_ex; //初期座標代入(敵の座標x)
enemyshot.enemyshots[0].y = enemyshot.mem_ey; //同上(y)
enemyshot.angle[0] = atan2(enemyshot.mem_py-enemyshot.mem_ey, enemyshot.mem_px-enemyshot[i].mem_ex);//yとxを渡してラジアンを得る
PlaySoundMem(sound_enemy_shot[0], DX_PLAYTYPE_BACK); //敵弾発射音
}
enemyshot[i].enemyshots[0].x += PATASPI * cos(enemyshot[i].angle[0]);//斜辺*cosラジアン=xの距離
enemyshot[i].enemyshots[0].y += PATASPI * sin(enemyshot[i].angle[0]);//斜辺*sinラジアン=yの距離
}

//敵攻撃パターン呼び出し
void enemyscontrol(){
int i;
for(i=0;i<TEKIMAX;i++){//敵の最大数(100)ループ
if(enemyshot[i].flag == 1){//ショット中の弾があれば
if(enemyshot[i].pattern == 1)//攻撃パターン1ならば
enemyspattern1(i);//攻撃1呼び出し
}
}
}

//弾描画
void ttt(){
for(int i=0;i<TEKIMAX;i++){//敵の最大数ループ
if(enemyshot[i].flag == 1){//ショット中の弾の組があれば
enemyshot[i].counter++;//ショットカウントをアップ
for(int j=0;j<ENEMAXSHOT;j++){//全ての弾の数だけループ
if(enemyshot[i].enemyshots[j].flag == 1){//ショットしている弾の組で、実際にショットしているなら
//弾描画
DrawRotaGraph((int)enemyshot[i].enemyshots[j].x, (int)enemyshot[i].enemyshots[j].y, 1.0f, 0.0f, img_enemy_shot[enemyshot[i].img], TRUE);
//画面外に出たら発射フラグを戻す
if(enemyshot[i].enemyshots[j].x<-20.0 || enemyshot[i].enemyshots[j].x>440.0 || enemyshot[i].enemyshots[j].y<-20.0 || enemyshot[i].enemyshots[j].y>500)
enemyshot[i].flag = 0;
}
}
}
}
for(int i=0;i<TEKIMAX;i++){//敵最大数ループ
if(enemyshot[i].flag == 1){//敵のショット発射中
for(int j=0;j<ENEMAXSHOT;j++){//一組200個のループ
if(enemyshot[i].enemyshots[j].flag == 1){//1個でも発射なら終了
return;
}
}
enemyshot[i].flag = 0;//全部発射中でないなら発射フラグを戻す
}
}
}

Mist

Re:シューティングの館 18<敵弾コントロール部>

#8

投稿記事 by Mist » 17年前

質問する前に規約ぐらいしっかり読みましょう。
ソースはpreタグで囲んでください。

mat

Re:シューティングの館 18<敵弾コントロール部>

#9

投稿記事 by mat » 17年前

これでは読む気にならないですよ。もう少し見やすい投稿をお願いします。

管理人

Re:シューティングの館 18<敵弾コントロール部>

#10

投稿記事 by 管理人 » 17年前

こんにちは。
うーんとパッとみよくわからないですね。
プロジェクトごと送ってもらえないでしょうか?
こちらで何のエラーが出ているかなど確認したいので。

dixqhp@gmail.com

zipなどに纏める時、○○.ncbファイルなどの不必要で重いファイルは消してまとめてください。

SONY

Re:シューティングの館 18<敵弾コントロール部>

#11

投稿記事 by SONY » 17年前

どうもすみません。具体的にどうすればよいのでしょうか?

toyo

Re:シューティングの館 18<敵弾コントロール部>

#12

投稿記事 by toyo » 17年前

BCC Developerを使っているのなら○○.ncbファイルは無いので気にしなくていいです
圧縮したいファイルをすべて選択しその上で右クリック、送る、圧縮(zip 形式)フォルダとすると圧縮ファイルができます(Windows XPの場合)
それをメールに添付ファイルとして送りましょう。

やそ

Re:シューティングの館 18<敵弾コントロール部>

#13

投稿記事 by やそ » 17年前

管理人さん、相変わらずやさしいなぁ^^

>プログラムをまねて実行したところエラーにより強制終了させられてしまいます。
>コンパイル時にエラーは表示されません。どうしたらよいのかアドバイスお願いします。

もう少し状況を詳しく書ければ、他の皆さんも手の出しようがあると思います。
プログラムを実行したとき、どの処理で落ちるのでしょう?
全く画が出ずに?

「エラーにより~」と言うところから、何かしら画面表示があって、あるタイミングで落ちるのだとは思いますが、エラーのメッセージなどは拾えないのでしょうか?

ところで、Winmainはどこに??

Mist

Re:シューティングの館 18<敵弾コントロール部>

#14

投稿記事 by Mist » 17年前

> ところで、Winmainはどこに??

>> 明らかに問題なさそうなところは省きました。

と書いてあるから省かれているのでは?
エラー自体はソース貼り付けてる時点で直ってるみたいですね。

やそ

Re:シューティングの館 18<敵弾コントロール部>

#15

投稿記事 by やそ » 17年前

そうかぁ(^^;)

目で追って(ウォークスルーして)みたけど、なんとも分からなかった(^^;)

>> 明らかに問題なさそうなところは省きました。

そうでした。けど、本人大丈夫だと思っていてもちょっとしたミスがあることも往々にしてあるからなぁ・・・。
龍神録のリプレイバグの原因然り(笑)
counter(誤)ccounter(正)だったかな?

まあサイは(管理人さんに)投げられたようなのでしばらく外野は黙ってましょうかね?(笑)

閉鎖

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