龍神録を参考にしたゲーム公開しました【雑談?】
龍神録を参考にしたゲーム公開しました【雑談?】
以前、テストプレイをお願いしていた龍神録を参考にしたゲームをようやく公開することができましたので、ご報告させていただきます。以前のスレが過去ログに流れていたので、新スレを作らせていただきました。
フリーソフトですので、どうぞお気軽に・・・
http://www.vector.co.jp/soft/winnt/game/se486596.html
テスト版では、未完成だったグラフィックが完成しております。
遅ればせながら、テストプレイに協力して下さった方、本当に有難うございました。
また、さらなるバグや、バージョンアップに向けたご意見、単純なご感想等ありましたら書き込みいただけるとうれしいです。
宣伝になってしまい申し訳ありませんが、龍神録に縁のあるゲームということで、ご容赦いただけると幸いです。
フリーソフトですので、どうぞお気軽に・・・
http://www.vector.co.jp/soft/winnt/game/se486596.html
テスト版では、未完成だったグラフィックが完成しております。
遅ればせながら、テストプレイに協力して下さった方、本当に有難うございました。
また、さらなるバグや、バージョンアップに向けたご意見、単純なご感想等ありましたら書き込みいただけるとうれしいです。
宣伝になってしまい申し訳ありませんが、龍神録に縁のあるゲームということで、ご容赦いただけると幸いです。
Re:龍神録を参考にしたゲーム公開しました【雑談?】
完成ということでおめでとう御座います!
ということでプレイさせて頂きました。
シナリオについては読んでて先が期待できるような物で面白いと思います
戦闘システムはアクションならでは(?)のやりこみ感があり、面白いと思います
ということでプレイさせて頂きました。
シナリオについては読んでて先が期待できるような物で面白いと思います
戦闘システムはアクションならでは(?)のやりこみ感があり、面白いと思います
Re:龍神録を参考にしたゲーム公開しました【雑談?】
http://www.vector.co.jp/soft/winnt/game/se486596.html
に、
動作環境
機種 x64 IBM-PC
ってなってますけど、Windows 7 32bit で動きましたよ。
に、
動作環境
機種 x64 IBM-PC
ってなってますけど、Windows 7 32bit で動きましたよ。
Re:龍神録を参考にしたゲーム公開しました【雑談?】
>jonさん
プレイしていただき有難うございます。
シナリオについて誉めていただきうれしいです。少し長すぎるかもしれませんが、気長に読んでいただけると嬉しいです。
>あたっしゅさん
えーと、「x64でも動く」という意図だったのですが・・・確かに「x64でしか動かない」ようにも取れますね。
一応、x64については、はずすよう申請しました。ご報告有難うございました。
プレイしていただき有難うございます。
シナリオについて誉めていただきうれしいです。少し長すぎるかもしれませんが、気長に読んでいただけると嬉しいです。
>あたっしゅさん
えーと、「x64でも動く」という意図だったのですが・・・確かに「x64でしか動かない」ようにも取れますね。
一応、x64については、はずすよう申請しました。ご報告有難うございました。
Re:龍神録を参考にしたゲーム公開しました【雑談?】
制作お疲れ様です^^
操作性上がってますね!
特に同時押しや撃ちながら移動などよくなったと思います。
全部プレイしたいのですが、なかなか時間が取れず;
本当は何度もプレイして改善点、バグ報告などしたいのですが、とりあえず少しだけ;
・「始めからプレイする」の字
→どちらでもいいのかもしれませんが、「最初から」と同じ意味であることから「初めから」の方が自然な気がします。
・ボスの近くで被弾覚悟で突進すると何度も神回避になる
・1面クリア後、mission選択STAGE1クリア後、会話のシーンで会話進むボタンを連打していたら「やるしかないだろ、行くぜ」みたいなことを男の子が言った後フリーズしました。
少ししかまだプレイしていませんが、この辺が気になった点でしょうか。
いや~楽しいですね!
ブレード攻撃の威力が高いので硬い敵もザクっと倒せるのが爽快です♪
時間を見つけてちょこちょこプレイさせてもらいたいとおもいます!
操作性上がってますね!
特に同時押しや撃ちながら移動などよくなったと思います。
全部プレイしたいのですが、なかなか時間が取れず;
本当は何度もプレイして改善点、バグ報告などしたいのですが、とりあえず少しだけ;
・「始めからプレイする」の字
→どちらでもいいのかもしれませんが、「最初から」と同じ意味であることから「初めから」の方が自然な気がします。
・ボスの近くで被弾覚悟で突進すると何度も神回避になる
・1面クリア後、mission選択STAGE1クリア後、会話のシーンで会話進むボタンを連打していたら「やるしかないだろ、行くぜ」みたいなことを男の子が言った後フリーズしました。
少ししかまだプレイしていませんが、この辺が気になった点でしょうか。
いや~楽しいですね!
ブレード攻撃の威力が高いので硬い敵もザクっと倒せるのが爽快です♪
時間を見つけてちょこちょこプレイさせてもらいたいとおもいます!
Re:龍神録を参考にしたゲーム公開しました【雑談?】
有難うございます^^
試しプレイもしていただいたみたいでうれしいです。
・「始めからプレイする」の字
⇒「最初からプレイする」に修正しました
・ボスの近くで被弾覚悟で突進すると何度も神回避になる
⇒これは確かに気になってはいました。とりあえず弾が発射されてから数カウントはグレイズにならないようにしてみました。
・1面クリア後、~~フリーズ
⇒自分も連打してみましたが、事象の再現ができません><必ず発生するでしょうか?また、何か連打以外にも条件はないでしょうか・・・
あまり頻繁にバージョンアップするのもよくないと思うので、もう少し様子をみてから再投下したいと思います。
楽しいと言っていただきお世辞でも光栄です^^有難うございました。
試しプレイもしていただいたみたいでうれしいです。
・「始めからプレイする」の字
⇒「最初からプレイする」に修正しました
・ボスの近くで被弾覚悟で突進すると何度も神回避になる
⇒これは確かに気になってはいました。とりあえず弾が発射されてから数カウントはグレイズにならないようにしてみました。
・1面クリア後、~~フリーズ
⇒自分も連打してみましたが、事象の再現ができません><必ず発生するでしょうか?また、何か連打以外にも条件はないでしょうか・・・
あまり頻繁にバージョンアップするのもよくないと思うので、もう少し様子をみてから再投下したいと思います。
楽しいと言っていただきお世辞でも光栄です^^有難うございました。
Re:龍神録を参考にしたゲーム公開しました【雑談?】
完成したのかーと思ってやってみたら楽しかったです。
あっというまに1時間はやってしまいました。
いろいろと細かいところや本編のストーリーが楽しいです。
ゲームの難易度も楽しいくらいに強くなってよかったです。
私は連打してなかったので上のフリーズ現象にはなっていません。
製作お疲れ様でした。
あっというまに1時間はやってしまいました。
いろいろと細かいところや本編のストーリーが楽しいです。
ゲームの難易度も楽しいくらいに強くなってよかったです。
私は連打してなかったので上のフリーズ現象にはなっていません。
製作お疲れ様でした。
Re:龍神録を参考にしたゲーム公開しました【雑談?】
操作しやすくなったのでトレーニングモードの記録を更新してみました。
かっこ内の数字は前回から何秒縮められたかです。
1.00:53 (-1)
2.01:08 (-6)
3.01:15 (-10)
4.01:25 (-10)
5.01:26 (-15)
6.01:31 (-5)
7.02:19 (-30)
デバッグバージョンからのデータの引き継ぎは問題ないようです。
あと、宇宙求星旅の感想ありがとうございました。
かっこ内の数字は前回から何秒縮められたかです。
1.00:53 (-1)
2.01:08 (-6)
3.01:15 (-10)
4.01:25 (-10)
5.01:26 (-15)
6.01:31 (-5)
7.02:19 (-30)
デバッグバージョンからのデータの引き継ぎは問題ないようです。
あと、宇宙求星旅の感想ありがとうございました。
Re:龍神録を参考にしたゲーム公開しました【雑談?】
>ひよこさん
まだまだ改善するべきところはありますが、楽しいと仰っていただきうれしいです。
ストーリーも気に入っていただけたみたいで、幸いです。
ぜひぜひ、クリアしてみて下さい^^
>Tatuさん
うわー、完成版もプレイしていただけたみたいで有難いです。
そして、更にタイムを短縮するとは・・・
スピードスターですねw
#誤字修正
まだまだ改善するべきところはありますが、楽しいと仰っていただきうれしいです。
ストーリーも気に入っていただけたみたいで、幸いです。
ぜひぜひ、クリアしてみて下さい^^
>Tatuさん
うわー、完成版もプレイしていただけたみたいで有難いです。
そして、更にタイムを短縮するとは・・・
スピードスターですねw
#誤字修正

キャラにそれぞれ番号を登録する
何度か質問している者ですがよろしくお願いします。
キャラクターが適当に移動しているプログラムに、当たり判定を組み込もうと思い、
まずキャラごとに番号をつけて移動させようと思ったのですがうまくいきません
添付した画像のようにキャラごとに番号がついており
当たり判定の時に総当りで計算して、当たっているかいないかを判定させようと考えています。
アドバイス等よろしくお願いします。
キャラクターが適当に移動しているプログラムに、当たり判定を組み込もうと思い、
まずキャラごとに番号をつけて移動させようと思ったのですがうまくいきません
添付した画像のようにキャラごとに番号がついており
当たり判定の時に総当りで計算して、当たっているかいないかを判定させようと考えています。
アドバイス等よろしくお願いします。
#include <math.h> #include "DxLib.h" #define NUM 7 // 物体の個数 typedef struct{ double bx,by; double sx,sy; double ex,ey; double Esx,Esy; double Ang,Spd; double Sb; double range; int flag; }Ch_t; //キャラクター構造体 Ch_t *c[NUM]; //キャラクターのポインタ Ch_t c[NUM]; int Image; //キャラクターの画像 void c_pattern(){ //キャラの情報 for (int i=0; i<NUM; i++){ double sbx,sby; c->bx=GetRand(640); //初期x座標 c->by=GetRand(480); //初期y座標 c->sx=GetRand(640); //目的x座標 c->sy=GetRand(480); //目的y座標 sbx=c->sx-c->bx; //x座標の差 sby=c->sy-c->by; //y座標の差 c->Spd=2.0; //移動速度 c->Sb=sqrt(sbx*sbx+sby*sby); //移動距離 c[i]->ex=0; c[i]->ey=0; //初期化 c[i]->Ang=atan2(sby,sbx); //角度 c[i]->Esx=sbx/c[i]->Sb*c[i]->Spd; //x方向への移動速度 c[i]->Esy=sby/c[i]->Sb*c[i]->Spd; //y方向への移動速度 c[i]->range=20.0; //当たり判定の大きさ } } void CalcMove(){ // for(int i=0; i<NUM; i++){ c[i]->ex+=c[i]->Esx; c[i]->ey+=c[i]->Esy; } } void Graph(Ch_t c[/url]){ //画像の描画 for(int i=0; i<NUM; i++){ double Sb=sqrt(c[i].ex*c[i].ex+c[i].ey*c[i].ey); if(c[i].Sb<Sb){ DrawRotaGraphF(c[i].sx,c[i].sy,0.5f,c[i].Ang,Image,TRUE); }else{ DrawRotaGraph(c[i].bx+c[i].ex,c[i].by+c[i].ey,0.5f,c[i].Ang,Image,TRUE); } } } int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ Ch_t Ch[NUM]; if( ChangeWindowMode(TRUE)||DxLib_Init()||SetDrawScreen( DX_SCREEN_BACK )) return -1; Image = LoadGraph("char1.png"); while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()&&!CheckHitKey(KEY_INPUT_ESCAPE)){ for(int i=0; i<NUM; i++){ c_pattern(); CalcMove(); Graph(Ch[NUM]); } } DxLib_End(); return 0; }
Re:キャラにそれぞれ番号を登録する
どのように「うまくいきません」か詳細に書いてもらえますか?
非常に感覚的なので、きつねさんと他の人の考えることは違うと思います。
画像データもないので回答者が再現は難しいので、出来れば画像不要の物が良いです。
非常に感覚的なので、きつねさんと他の人の考えることは違うと思います。
画像データもないので回答者が再現は難しいので、出来れば画像不要の物が良いです。
Re:キャラにそれぞれ番号を登録する
プログラムがビルドエラーになってしまいます。
( error C2664: 'c_pattern' : 1 番目の引数を 'Ch_t *' から 'Ch_t *[/url]' に変換できません。)
( error C2664: 'CalcMove' : 1 番目の引数を 'Ch_t *' から 'Ch_t *[/url]' に変換できません。 )
( error C2664: 'Graph' : 1 番目の引数を 'Ch_t' から 'Ch_t [/url]' に変換できません。)
と下の方に出てきます・・・、ポインタや構造体のどこかがおかしいのですが、ポインタ等の理解がよく出来ていないので、どのように解決したらよいのかわかりません・・・
画像を使用してないプログラムに書き換えました。
#include <math.h>
#include "DxLib.h"
#define NUM 7 //
typedef struct{
double bx,by;
double sx,sy;
double ex,ey;
double Esx,Esy;
double Ang,Spd;
double Sb;
double range;
int flag;
}Ch_t; //キャラクター構造体
void c_pattern(Ch_t*c[NUM],double bx,double by,double sx,double sy){ //キャラの情報
double sbx,sby;
int i;
c->bx=bx; //初期x座標
c->by=by; //初期y座標
c->sx=sx; //目的x座標
c->sy=sy; //目的y座標
sbx=c->sx-c->bx; //x座標の差
sby=c->sy-c->by; //y座標の差
c->Spd=2.0; //移動速度
c->Sb=sqrt(sbx*sbx+sby*sby); //移動距離
c[i]->ex=0; c[i]->ey=0; //初期化
c[i]->Ang=atan2(sby,sbx); //角度
c[i]->Esx=sbx/c[i]->Sb*c[i]->Spd; //x方向への移動速度
c[i]->Esy=sby/c[i]->Sb*c[i]->Spd; //y方向への移動速度
c[i]->range=20.0; //当たり判定の大きさ
}
void CalcMove(Ch_t*c[NUM]){ //動き計算
int i;
c[i]->ex+=c[i]->Esx;
c[i]->ey+=c[i]->Esy;
}
void Graph(Ch_t c[NUM]){ //描画
int i;
double Sb=sqrt(c[i].ex*c[i].ex+c[i].ey*c[i].ey);
if(c[i].Sb<Sb){
DrawCircle(c[i].sx,c[i].sy,c[i].range,GetColor(255,255,255),FALSE);
}else{
DrawCircle(c[i].bx+c[i].ex,c[i].by+c[i].ey,c[i].range,GetColor(255,255,255),FALSE);
}
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
Ch_t Ch[NUM];
if( ChangeWindowMode(TRUE)||DxLib_Init()||SetDrawScreen( DX_SCREEN_BACK )) return -1;
for(int i=0; i<NUM; i++){
c_pattern( &Ch[i],GetRand(640),GetRand(480), GetRand(640),GetRand(480));
}
while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()&&!CheckHitKey(KEY_INPUT_ESCAPE)){
for(int i=0; i<NUM; i++){
CalcMove(&Ch[i]);
Graph(Ch[i]);
}
}
DxLib_End();
return 0;
}
( error C2664: 'c_pattern' : 1 番目の引数を 'Ch_t *' から 'Ch_t *[/url]' に変換できません。)
( error C2664: 'CalcMove' : 1 番目の引数を 'Ch_t *' から 'Ch_t *[/url]' に変換できません。 )
( error C2664: 'Graph' : 1 番目の引数を 'Ch_t' から 'Ch_t [/url]' に変換できません。)
と下の方に出てきます・・・、ポインタや構造体のどこかがおかしいのですが、ポインタ等の理解がよく出来ていないので、どのように解決したらよいのかわかりません・・・
画像を使用してないプログラムに書き換えました。
#include <math.h>
#include "DxLib.h"
#define NUM 7 //
typedef struct{
double bx,by;
double sx,sy;
double ex,ey;
double Esx,Esy;
double Ang,Spd;
double Sb;
double range;
int flag;
}Ch_t; //キャラクター構造体
void c_pattern(Ch_t*c[NUM],double bx,double by,double sx,double sy){ //キャラの情報
double sbx,sby;
int i;
c->bx=bx; //初期x座標
c->by=by; //初期y座標
c->sx=sx; //目的x座標
c->sy=sy; //目的y座標
sbx=c->sx-c->bx; //x座標の差
sby=c->sy-c->by; //y座標の差
c->Spd=2.0; //移動速度
c->Sb=sqrt(sbx*sbx+sby*sby); //移動距離
c[i]->ex=0; c[i]->ey=0; //初期化
c[i]->Ang=atan2(sby,sbx); //角度
c[i]->Esx=sbx/c[i]->Sb*c[i]->Spd; //x方向への移動速度
c[i]->Esy=sby/c[i]->Sb*c[i]->Spd; //y方向への移動速度
c[i]->range=20.0; //当たり判定の大きさ
}
void CalcMove(Ch_t*c[NUM]){ //動き計算
int i;
c[i]->ex+=c[i]->Esx;
c[i]->ey+=c[i]->Esy;
}
void Graph(Ch_t c[NUM]){ //描画
int i;
double Sb=sqrt(c[i].ex*c[i].ex+c[i].ey*c[i].ey);
if(c[i].Sb<Sb){
DrawCircle(c[i].sx,c[i].sy,c[i].range,GetColor(255,255,255),FALSE);
}else{
DrawCircle(c[i].bx+c[i].ex,c[i].by+c[i].ey,c[i].range,GetColor(255,255,255),FALSE);
}
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
Ch_t Ch[NUM];
if( ChangeWindowMode(TRUE)||DxLib_Init()||SetDrawScreen( DX_SCREEN_BACK )) return -1;
for(int i=0; i<NUM; i++){
c_pattern( &Ch[i],GetRand(640),GetRand(480), GetRand(640),GetRand(480));
}
while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()&&!CheckHitKey(KEY_INPUT_ESCAPE)){
for(int i=0; i<NUM; i++){
CalcMove(&Ch[i]);
Graph(Ch[i]);
}
}
DxLib_End();
return 0;
}
Re:キャラにそれぞれ番号を登録する
とりあえず動くようにはしてみましたが、肝心の当たり判定らしき処理が見当たりません。
#include <math.h>
#include "DxLib.h"
#define NUM 7 //
typedef struct{
double bx,by;
double sx,sy;
double ex,ey;
double Esx,Esy;
double Ang,Spd;
double Sb;
double range;
int flag;
}Ch_t; //キャラクター構造体
void c_pattern(Ch_t *c,double bx,double by,double sx,double sy){ //キャラの情報
double sbx,sby;
int i;
c->bx=bx; //初期x座標
c->by=by; //初期y座標
c->sx=sx; //目的x座標
c->sy=sy; //目的y座標
sbx=c->sx-c->bx; //x座標の差
sby=c->sy-c->by; //y座標の差
c->Spd=2.0; //移動速度
c->Sb=sqrt(sbx*sbx+sby*sby); //移動距離
c->ex=0; c->ey=0; //初期化
c->Ang=atan2(sby,sbx); //角度
c->Esx=sbx/c->Sb*c->Spd; //x方向への移動速度
c->Esy=sby/c->Sb*c->Spd; //y方向への移動速度
c->range=20.0; //当たり判定の大きさ
}
void CalcMove(Ch_t *c){ //動き計算
c->ex+=c->Esx;
c->ey+=c->Esy;
}
void Graph(Ch_t *c){ //描画
int i;
double Sb=sqrt(c->ex*c->ex+c->ey*c->ey);
if(c->Sb<Sb){
DrawCircle(c->sx,c->sy,c->range,GetColor(255,255,255),FALSE);
}else{
DrawCircle(c->bx+c->ex,c->by+c->ey,c->range,GetColor(255,255,255),FALSE);
}
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
Ch_t Ch[NUM];
if( ChangeWindowMode(TRUE)||DxLib_Init()||SetDrawScreen( DX_SCREEN_BACK )) return -1;
for(int i=0; i<NUM; i++){
c_pattern( &Ch,GetRand(640),GetRand(480), GetRand(640),GetRand(480));
}
while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()&&!CheckHitKey(KEY_INPUT_ESCAPE)){
for(int i=0; i<NUM; i++){
CalcMove(&Ch);
Graph(&Ch);
}
}
DxLib_End();
return 0;
}
#include <math.h>
#include "DxLib.h"
#define NUM 7 //
typedef struct{
double bx,by;
double sx,sy;
double ex,ey;
double Esx,Esy;
double Ang,Spd;
double Sb;
double range;
int flag;
}Ch_t; //キャラクター構造体
void c_pattern(Ch_t *c,double bx,double by,double sx,double sy){ //キャラの情報
double sbx,sby;
int i;
c->bx=bx; //初期x座標
c->by=by; //初期y座標
c->sx=sx; //目的x座標
c->sy=sy; //目的y座標
sbx=c->sx-c->bx; //x座標の差
sby=c->sy-c->by; //y座標の差
c->Spd=2.0; //移動速度
c->Sb=sqrt(sbx*sbx+sby*sby); //移動距離
c->ex=0; c->ey=0; //初期化
c->Ang=atan2(sby,sbx); //角度
c->Esx=sbx/c->Sb*c->Spd; //x方向への移動速度
c->Esy=sby/c->Sb*c->Spd; //y方向への移動速度
c->range=20.0; //当たり判定の大きさ
}
void CalcMove(Ch_t *c){ //動き計算
c->ex+=c->Esx;
c->ey+=c->Esy;
}
void Graph(Ch_t *c){ //描画
int i;
double Sb=sqrt(c->ex*c->ex+c->ey*c->ey);
if(c->Sb<Sb){
DrawCircle(c->sx,c->sy,c->range,GetColor(255,255,255),FALSE);
}else{
DrawCircle(c->bx+c->ex,c->by+c->ey,c->range,GetColor(255,255,255),FALSE);
}
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
Ch_t Ch[NUM];
if( ChangeWindowMode(TRUE)||DxLib_Init()||SetDrawScreen( DX_SCREEN_BACK )) return -1;
for(int i=0; i<NUM; i++){
c_pattern( &Ch,GetRand(640),GetRand(480), GetRand(640),GetRand(480));
}
while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()&&!CheckHitKey(KEY_INPUT_ESCAPE)){
for(int i=0; i<NUM; i++){
CalcMove(&Ch);
Graph(&Ch);
}
}
DxLib_End();
return 0;
}
Re:キャラにそれぞれ番号を登録する
ご回答ありがとうございます。
当たり判定の式なのですが、自分とそれ以外の円が当たっている時にだけ減速する、という処理を入れようとしています。
Ch[0]とCh[1]、Ch[2]、[3]....
Ch[1]とCh[0]、Ch[2]、[3]....
Ch[2]とCh[0]、Ch[1]、[3]....
のように自分とそれ以外の円すべてと当たり判定を総当りで行い、当たっていたら当たっている円のflagを1にして、減速の処理をいれようとしているのですが、うまい事そのような式が作れません・・・
説明がうまくなくて申し訳ありません・・・
void hit_judge(Ch_t c[/url],int i,int s){//当たり判定計算
double x,y,r;
for(i=0;i<NUM;i++){
for(s=0;s<NUM;s++)
x=((c.bx+c.ex)-(c.bx+c.ex));//自分と自分以外のxの差
y=((c.by+c.ey)-(c.by+c.ey));//自分と自分以外のyの差
r=c.range;
if(x*x+y*y<r*r){
c.flag=1;
c.flag=1;
}
}
}
void hit_flag(Ch_t c){
if(c.flag==1){
c.Spd=1.0;
}
}
当たり判定の式なのですが、自分とそれ以外の円が当たっている時にだけ減速する、という処理を入れようとしています。
Ch[0]とCh[1]、Ch[2]、[3]....
Ch[1]とCh[0]、Ch[2]、[3]....
Ch[2]とCh[0]、Ch[1]、[3]....
のように自分とそれ以外の円すべてと当たり判定を総当りで行い、当たっていたら当たっている円のflagを1にして、減速の処理をいれようとしているのですが、うまい事そのような式が作れません・・・
説明がうまくなくて申し訳ありません・・・
void hit_judge(Ch_t c[/url],int i,int s){//当たり判定計算
double x,y,r;
for(i=0;i<NUM;i++){
for(s=0;s<NUM;s++)
x=((c.bx+c.ex)-(c.bx+c.ex));//自分と自分以外のxの差
y=((c.by+c.ey)-(c.by+c.ey));//自分と自分以外のyの差
r=c.range;
if(x*x+y*y<r*r){
c.flag=1;
c.flag=1;
}
}
}
void hit_flag(Ch_t c){
if(c.flag==1){
c.Spd=1.0;
}
}
Re:キャラにそれぞれ番号を登録する
とりあえず、先に進む前にCh_t *cとした理由は理解してもらったのでしょうか?
ポインタや配列の理解が不十分なまま先に進んでも後で困ることになると思いますが、
ちなみに
void hit_judge(Ch_t c[/url],int i,int s){
の引数を全て説明してもらって良いですか?
これと
void hit_flag(Ch_t c){
は他のものと違いますが何か意図はありますか?
ポインタや配列の理解が不十分なまま先に進んでも後で困ることになると思いますが、
ちなみに
void hit_judge(Ch_t c[/url],int i,int s){
の引数を全て説明してもらって良いですか?
これと
void hit_flag(Ch_t c){
は他のものと違いますが何か意図はありますか?
Re:キャラにそれぞれ番号を登録する
申し訳ありませんCh_t*cになさった理由がよくわかりません・・・
ポインタや配列は本を見たりいろんなサイトを見て勉強しているのですが、どういうときに使うのか、使い方などいまいちわかりません。ポインタの勉強も兼ねて今回質問を投稿させていただきました。
わかるのはポインタcは構造体のメンバを参照するときに->を使う、くらいです・・・
void hit_judge(Ch_t c[/url],int i,int s){
ですが、()の中のCh_t c[/url]は構造体をcで宣言(?)していて
int i,sも for()の中で使うから宣言しました・・・(使い方がおかしいことに今気づきました)
void hit_flag(Ch_t c){
は構造体cの中のflagを参照するからvoid hit_flag()の中の括弧に入れてしまいました。
違う質問なのですが
void c_pattern(Ch_t *c,double bx,double by,double sx,double sy){
の引数が
c_pattern( &Ch,GetRand(640),GetRand(480), GetRand(640),GetRand(480));
である、という解釈であっていますか?
そうすると
void hit_judge(Ch_t c[/url],int i,int s){
がおかしいというのがわかるのですが。
乱文失礼しました。
ポインタや配列は本を見たりいろんなサイトを見て勉強しているのですが、どういうときに使うのか、使い方などいまいちわかりません。ポインタの勉強も兼ねて今回質問を投稿させていただきました。
わかるのはポインタcは構造体のメンバを参照するときに->を使う、くらいです・・・
void hit_judge(Ch_t c[/url],int i,int s){
ですが、()の中のCh_t c[/url]は構造体をcで宣言(?)していて
int i,sも for()の中で使うから宣言しました・・・(使い方がおかしいことに今気づきました)
void hit_flag(Ch_t c){
は構造体cの中のflagを参照するからvoid hit_flag()の中の括弧に入れてしまいました。
違う質問なのですが
void c_pattern(Ch_t *c,double bx,double by,double sx,double sy){
の引数が
c_pattern( &Ch,GetRand(640),GetRand(480), GetRand(640),GetRand(480));
である、という解釈であっていますか?
そうすると
void hit_judge(Ch_t c[/url],int i,int s){
がおかしいというのがわかるのですが。
乱文失礼しました。
Re:キャラにそれぞれ番号を登録する
構造体のポインタで渡すのは、渡した先の関数で構造体の中身を書き換えたい場合です。
こんな風なコンソールアプリを試してみてください。
#include <stdio.h>
typedef struct {
int x;
int y;
} CHt;
void func_a(CHt ch)
{
ch.y=1;
}
void func_b(CHt *ch)
{
ch->x=2;
}
int main(void)
{
CHt ch;
ch.x=0;
ch.y=0;
func_a(ch);
func_b(&ch);
printf( "x=%d y=%d\n", ch.x, ch.y );
return 0;
}
func_aとfunc_bで違う動きをしますよね。
自分で納得出来るまで、こんな風なテストプログラムを作って徹底的に確認して見ることが大事です。
配列にしたらどうかとか、色々やってみることが勉強になりますよ。
この理解が
>違う質問なのですが
>void c_pattern(Ch_t *c,double bx,double by,double sx,double sy){
>の引数が
>c_pattern( &Ch,GetRand(640),GetRand(480), GetRand(640),GetRand(480));
>である、という解釈であっていますか?
の答えにもなります。
こんな風なコンソールアプリを試してみてください。
#include <stdio.h>
typedef struct {
int x;
int y;
} CHt;
void func_a(CHt ch)
{
ch.y=1;
}
void func_b(CHt *ch)
{
ch->x=2;
}
int main(void)
{
CHt ch;
ch.x=0;
ch.y=0;
func_a(ch);
func_b(&ch);
printf( "x=%d y=%d\n", ch.x, ch.y );
return 0;
}
func_aとfunc_bで違う動きをしますよね。
自分で納得出来るまで、こんな風なテストプログラムを作って徹底的に確認して見ることが大事です。
配列にしたらどうかとか、色々やってみることが勉強になりますよ。
この理解が
>違う質問なのですが
>void c_pattern(Ch_t *c,double bx,double by,double sx,double sy){
>の引数が
>c_pattern( &Ch,GetRand(640),GetRand(480), GetRand(640),GetRand(480));
>である、という解釈であっていますか?
の答えにもなります。
Re:キャラにそれぞれ番号を登録する
テストプログラムありがとうございます。
func_a で ch.y=1 としても int main(void) の中でch.y=0 となっているため結果は0と表示されました。
これは関数内だけでyの値が変わっているだけで、構造体の中のyが変わっているわけでないということですか?
(main関数の中でch.yの値を変えると、変えた数値が表示されました)
func_b で はch->x=2 にすると構造体の中のxが2になって main 関数で構造体chのxを参照しているから
main関数内でch.x=0としても func_b で指定した数値になるということでしょうか。
そこでmain関数中のch.y=0を消してみたら、 -858993460 という数値が出てきました。
ch.xも消してみたらエラーになってしまいましたがこれはなぜでしょうか?
質問ばかりで申し訳ありません・・・
func_a で ch.y=1 としても int main(void) の中でch.y=0 となっているため結果は0と表示されました。
これは関数内だけでyの値が変わっているだけで、構造体の中のyが変わっているわけでないということですか?
(main関数の中でch.yの値を変えると、変えた数値が表示されました)
func_b で はch->x=2 にすると構造体の中のxが2になって main 関数で構造体chのxを参照しているから
main関数内でch.x=0としても func_b で指定した数値になるということでしょうか。
そこでmain関数中のch.y=0を消してみたら、 -858993460 という数値が出てきました。
ch.xも消してみたらエラーになってしまいましたがこれはなぜでしょうか?
質問ばかりで申し訳ありません・・・
Re:キャラにそれぞれ番号を登録する
>func_a で ch.y=1 としても int main(void) の中でch.y=0 となっているため結果は0と表示されました。
>これは関数内だけでyの値が変わっているだけで、構造体の中のyが変わっているわけでないということですか?
>(main関数の中でch.yの値を変えると、変えた数値が表示されました)
まず、変数のスコープを意識しないと行けません。
http://www.geocities.jp/ky_webid/c/022.html
ローカル変数の値の変更は他の関数には伝わらないと言うことです。
次に引数の問題です。
引数は基本的に同じ名前でもローカル変数として扱われますので、値だけがコピーされただけの別物です。
main側からfunc_aに値はコピーされますが、コピーなので値を変更してものmain側には影響を与えません。
これを確認するのがfunc_aです。
>func_b で はch->x=2 にすると構造体の中のxが2になって main 関数で構造体chのxを参照しているから
>main関数内でch.x=0としても func_b で指定した数値になるということでしょうか。
func_bでは、ポインタで構造体を受け取っています。
こうすると、ポインタが指すのは構造体の実体でmain側の構造体そのものを扱えます。
ch->x=2とすれは、main側でch.x=2;とやること同じ意味になりますので、main側でも変更されたことが確認できます。
>そこでmain関数中のch.y=0を消してみたら、 -858993460 という数値が出てきました。
ローカル変数の値は初期化されない場合はC言語の規格上は不定です。つまり、何が入っているかは分かりません。大体は同じ値が入っていると思いますが、とんでもない値であることには変わりませんので非常に良くない事だと覚えておいてください。
>ch.xも消してみたらエラーになってしまいましたがこれはなぜでしょうか?
コンパイラが値が不定の変数を使っていることを警告したんです。
●つぎは少々変えて、こうして見ましょう。
配列を使ったときに受け渡しがよく分かると思います。
#define NUM 3
int main(void)
{
CHt ch[NUM];
int i;
for( i=0 i<NUM ; i++ ) {
ch.x=0;
ch.y=0;
}
func_a(ch[2]);
func_b(&ch[1]);
for( i=0 i<NUM ; i++ ) {
printf( "ch[%d].x=%d ch[%d].y=%d\n", i, ch.x, i, ch.y );
}
return 0;
}
>これは関数内だけでyの値が変わっているだけで、構造体の中のyが変わっているわけでないということですか?
>(main関数の中でch.yの値を変えると、変えた数値が表示されました)
まず、変数のスコープを意識しないと行けません。
http://www.geocities.jp/ky_webid/c/022.html
ローカル変数の値の変更は他の関数には伝わらないと言うことです。
次に引数の問題です。
引数は基本的に同じ名前でもローカル変数として扱われますので、値だけがコピーされただけの別物です。
main側からfunc_aに値はコピーされますが、コピーなので値を変更してものmain側には影響を与えません。
これを確認するのがfunc_aです。
>func_b で はch->x=2 にすると構造体の中のxが2になって main 関数で構造体chのxを参照しているから
>main関数内でch.x=0としても func_b で指定した数値になるということでしょうか。
func_bでは、ポインタで構造体を受け取っています。
こうすると、ポインタが指すのは構造体の実体でmain側の構造体そのものを扱えます。
ch->x=2とすれは、main側でch.x=2;とやること同じ意味になりますので、main側でも変更されたことが確認できます。
>そこでmain関数中のch.y=0を消してみたら、 -858993460 という数値が出てきました。
ローカル変数の値は初期化されない場合はC言語の規格上は不定です。つまり、何が入っているかは分かりません。大体は同じ値が入っていると思いますが、とんでもない値であることには変わりませんので非常に良くない事だと覚えておいてください。
>ch.xも消してみたらエラーになってしまいましたがこれはなぜでしょうか?
コンパイラが値が不定の変数を使っていることを警告したんです。
●つぎは少々変えて、こうして見ましょう。
配列を使ったときに受け渡しがよく分かると思います。
#define NUM 3
int main(void)
{
CHt ch[NUM];
int i;
for( i=0 i<NUM ; i++ ) {
ch.x=0;
ch.y=0;
}
func_a(ch[2]);
func_b(&ch[1]);
for( i=0 i<NUM ; i++ ) {
printf( "ch[%d].x=%d ch[%d].y=%d\n", i, ch.x, i, ch.y );
}
return 0;
}
Re:キャラにそれぞれ番号を登録する
main 関数の中で構造体を ch で宣言して
for( i=0 i<NUM ; i++ ) {
ch.x=0;
ch.y=0;
}
ですべての ch のx,yの値が 0 になる。
ch[0].x=0 ch[0].y=0
ch[1].x=0 ch[1].y=0
ch[2].x=0 ch[2].y=0
そのあとfunc_a(ch[2])でch.y=1になるが、それはコピーされた構造体ch[2]のyを 1 にしているだけで本体の構造体は0のまま。
func_b(&ch[1])でポインタが指している構造体の本体ch[1]のxが2に書き換えられる。
その結果
ch[0].x=0 ch[0].y=0
ch[1].x=2 ch[1].y=0
ch[2].x=0 ch[2].y=0
になる、という感じですか?
for( i=0 i<NUM ; i++ ) {
ch.x=0;
ch.y=0;
}
ですべての ch のx,yの値が 0 になる。
ch[0].x=0 ch[0].y=0
ch[1].x=0 ch[1].y=0
ch[2].x=0 ch[2].y=0
そのあとfunc_a(ch[2])でch.y=1になるが、それはコピーされた構造体ch[2]のyを 1 にしているだけで本体の構造体は0のまま。
func_b(&ch[1])でポインタが指している構造体の本体ch[1]のxが2に書き換えられる。
その結果
ch[0].x=0 ch[0].y=0
ch[1].x=2 ch[1].y=0
ch[2].x=0 ch[2].y=0
になる、という感じですか?
Re:キャラにそれぞれ番号を登録する
>ch[0].x=0 ch[0].y=0
>ch[1].x=2 ch[1].y=0
>ch[2].x=0 ch[2].y=0
>
>になる、という感じですか?
はい。そのとおりですね。
だいぶ分かった思いますので、作成に戻って当たり判定を作り直してみてください。
>ch[1].x=2 ch[1].y=0
>ch[2].x=0 ch[2].y=0
>
>になる、という感じですか?
はい。そのとおりですね。
だいぶ分かった思いますので、作成に戻って当たり判定を作り直してみてください。
Re:キャラにそれぞれ番号を登録する
返信遅くなって申し訳ありません。
当たり判定の部分を考えていたのですが、どうもピンときません。
当たり判定を作るにあたり、構造体のメンバに索敵範囲をつくりました。その索敵範囲と、キャラがぶつかったら索敵範囲を持っているキャラのフラグ1にするという感じです。索敵範囲はキャラの進行方向にあります。
当たり判定の計算の引数がおかしいのでしょうか?
#include <math.h>
#include "DxLib.h"
#define NUM 3 //
typedef struct{
double bx,by;
double sx,sy;
double ex,ey;
double hit_x,hit_y;//索敵範囲の中心座標
double Esx,Esy;
double Ang,Spd;
double Sb;
double range;
double hit_range;//索敵範囲の大きさ
int flag;
}Ch_t; //キャラクター構造体
void c_pattern(Ch_t *c,double bx,double by,double sx,double sy){ //キャラの情報
double sbx,sby;
int i;
c->bx=bx; //初期x座標
c->by=by; //初期y座標
c->sx=sx; //目的x座標
c->sy=sy; //目的y座標
sbx=c->sx-c->bx; //x座標の差
sby=c->sy-c->by; //y座標の差
c->Spd=2.0; //移動速度
c->Sb=sqrt(sbx*sbx+sby*sby); //移動距離
c->ex=0; c->ey=0; //初期化
c->Ang=atan2(sby,sbx); //角度
c->Esx=sbx/c->Sb*c->Spd; //x方向への移動速度
c->Esy=sby/c->Sb*c->Spd; //y方向への移動速度
c->range=20.0; //当たり判定の大きさ
c->hit_x=cos(c->Ang)*40;
c->hit_y=sin(c->Ang)*40;
c->hit_range=20;
}
void CalcMove(Ch_t *c){ //動き計算
c->ex+=c->Esx;
c->ey+=c->Esy;
}
void Graph(Ch_t *c){ //描画
double Sb=sqrt(c->ex*c->ex+c->ey*c->ey);
if(c->Sb<Sb){
DrawCircle(c->sx,c->sy,c->range,GetColor(255,255,255),FALSE);
DrawCircle(c->sx+c->hit_x,c->sy+c->hit_y,c->hit_range,GetColor(255,0,0),FALSE);
}else{
DrawCircle(c->bx+c->ex,c->by+c->ey,c->range,GetColor(255,255,255),FALSE);
DrawCircle((c->bx+c->ex)+c->hit_x,(c->by+c->ey)+c->hit_y,c->hit_range,GetColor(255,0,0),FALSE);
}
}
void hit_judge(Ch_t *c[/url]){//当たり判定の計算
double x,y,r;
for(int i=0;i<NUM;i++){
for(int j=0;j<NUM;j++){
x=(c->bx+c->ex+c->hit_x)+(c[j]->bx+c[j]->ex);
y=(c->by+c->ey+c->hit_y)+(c[j]->by+c[j]->ey);
r=c->hit_range+c[j]->range;
if(i=j){
c->flag=0;
}
if(x*x+y*y<r*r){
c->flag=1;
}
}
}
}
void hit_flag(Ch_t*c){
if(c->flag=1)
c->Spd=c->Spd/2;
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
Ch_t Ch[NUM];
if( ChangeWindowMode(TRUE)||DxLib_Init()||SetDrawScreen( DX_SCREEN_BACK )) return -1;
for(int i=0; i<NUM; i++){
c_pattern( &Ch,GetRand(640),GetRand(480), GetRand(640),GetRand(480));
}
while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()&&!CheckHitKey(KEY_INPUT_ESCAPE)){
for(int i=0; i<NUM; i++){
CalcMove(&Ch[i]);
Graph(&Ch[i]);
}
}
DxLib_End();
return 0;
}
当たり判定の部分を考えていたのですが、どうもピンときません。
当たり判定を作るにあたり、構造体のメンバに索敵範囲をつくりました。その索敵範囲と、キャラがぶつかったら索敵範囲を持っているキャラのフラグ1にするという感じです。索敵範囲はキャラの進行方向にあります。
当たり判定の計算の引数がおかしいのでしょうか?
#include <math.h>
#include "DxLib.h"
#define NUM 3 //
typedef struct{
double bx,by;
double sx,sy;
double ex,ey;
double hit_x,hit_y;//索敵範囲の中心座標
double Esx,Esy;
double Ang,Spd;
double Sb;
double range;
double hit_range;//索敵範囲の大きさ
int flag;
}Ch_t; //キャラクター構造体
void c_pattern(Ch_t *c,double bx,double by,double sx,double sy){ //キャラの情報
double sbx,sby;
int i;
c->bx=bx; //初期x座標
c->by=by; //初期y座標
c->sx=sx; //目的x座標
c->sy=sy; //目的y座標
sbx=c->sx-c->bx; //x座標の差
sby=c->sy-c->by; //y座標の差
c->Spd=2.0; //移動速度
c->Sb=sqrt(sbx*sbx+sby*sby); //移動距離
c->ex=0; c->ey=0; //初期化
c->Ang=atan2(sby,sbx); //角度
c->Esx=sbx/c->Sb*c->Spd; //x方向への移動速度
c->Esy=sby/c->Sb*c->Spd; //y方向への移動速度
c->range=20.0; //当たり判定の大きさ
c->hit_x=cos(c->Ang)*40;
c->hit_y=sin(c->Ang)*40;
c->hit_range=20;
}
void CalcMove(Ch_t *c){ //動き計算
c->ex+=c->Esx;
c->ey+=c->Esy;
}
void Graph(Ch_t *c){ //描画
double Sb=sqrt(c->ex*c->ex+c->ey*c->ey);
if(c->Sb<Sb){
DrawCircle(c->sx,c->sy,c->range,GetColor(255,255,255),FALSE);
DrawCircle(c->sx+c->hit_x,c->sy+c->hit_y,c->hit_range,GetColor(255,0,0),FALSE);
}else{
DrawCircle(c->bx+c->ex,c->by+c->ey,c->range,GetColor(255,255,255),FALSE);
DrawCircle((c->bx+c->ex)+c->hit_x,(c->by+c->ey)+c->hit_y,c->hit_range,GetColor(255,0,0),FALSE);
}
}
void hit_judge(Ch_t *c[/url]){//当たり判定の計算
double x,y,r;
for(int i=0;i<NUM;i++){
for(int j=0;j<NUM;j++){
x=(c->bx+c->ex+c->hit_x)+(c[j]->bx+c[j]->ex);
y=(c->by+c->ey+c->hit_y)+(c[j]->by+c[j]->ey);
r=c->hit_range+c[j]->range;
if(i=j){
c->flag=0;
}
if(x*x+y*y<r*r){
c->flag=1;
}
}
}
}
void hit_flag(Ch_t*c){
if(c->flag=1)
c->Spd=c->Spd/2;
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
Ch_t Ch[NUM];
if( ChangeWindowMode(TRUE)||DxLib_Init()||SetDrawScreen( DX_SCREEN_BACK )) return -1;
for(int i=0; i<NUM; i++){
c_pattern( &Ch,GetRand(640),GetRand(480), GetRand(640),GetRand(480));
}
while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()&&!CheckHitKey(KEY_INPUT_ESCAPE)){
for(int i=0; i<NUM; i++){
CalcMove(&Ch[i]);
Graph(&Ch[i]);
}
}
DxLib_End();
return 0;
}
Re:キャラにそれぞれ番号を登録する
テストプログラムで以下のようなものを作りました。
#include <stdio.h>
#define NUM 10
typedef struct {
int x;
int y;
}Ch_t;
void func(Ch_t*c,int x,int y){
c->x=x;
c->y=y;
}
void out(Ch_t ch[/url]){
for(int i=0;i<NUM;i++)
printf("x=%d y=%d\n",ch.x,ch.y);
}
int main(void){
Ch_t ch[NUM];
for(int i=0;i<NUM;i++){
func(&ch,i,i);
}
out(ch);
return 0;
}
void out(Ch_t ch[/url]).....の部分を(Ch_t *ch[/url])にして実行すると
#include <stdio.h>
#define NUM 10
typedef struct {
int x;
int y;
}Ch_t;
void func(Ch_t*c,int x,int y){
c->x=x;
c->y=y;
}
void out(Ch_t*ch[/url]){
for(int i=0;i<NUM;i++)
printf("x=%d y=%d\n",ch->x,ch->y);
}
int main(void){
Ch_t ch[NUM];
for(int i=0;i<NUM;i++){
func(&ch,i,i);
}
out(&ch[/url]);
return 0;
}
main関数内のoutの部分の引数がおかしいのでビルドに失敗してしまいます。
理由がよくわからないのですが、どうしてでしょうか・・・?
#include <stdio.h>
#define NUM 10
typedef struct {
int x;
int y;
}Ch_t;
void func(Ch_t*c,int x,int y){
c->x=x;
c->y=y;
}
void out(Ch_t ch[/url]){
for(int i=0;i<NUM;i++)
printf("x=%d y=%d\n",ch.x,ch.y);
}
int main(void){
Ch_t ch[NUM];
for(int i=0;i<NUM;i++){
func(&ch,i,i);
}
out(ch);
return 0;
}
void out(Ch_t ch[/url]).....の部分を(Ch_t *ch[/url])にして実行すると
#include <stdio.h>
#define NUM 10
typedef struct {
int x;
int y;
}Ch_t;
void func(Ch_t*c,int x,int y){
c->x=x;
c->y=y;
}
void out(Ch_t*ch[/url]){
for(int i=0;i<NUM;i++)
printf("x=%d y=%d\n",ch->x,ch->y);
}
int main(void){
Ch_t ch[NUM];
for(int i=0;i<NUM;i++){
func(&ch,i,i);
}
out(&ch[/url]);
return 0;
}
main関数内のoutの部分の引数がおかしいのでビルドに失敗してしまいます。
理由がよくわからないのですが、どうしてでしょうか・・・?
Re:キャラにそれぞれ番号を登録する
&ch[/url]
と
Ch_t*ch[/url]
は型が違います。
配列の先頭を受渡したいなら
void out(Ch_t*ch){
か
void out(Ch_t ch[/url]){
で呼出しは、
out(&ch[0]);
か
out(ch);
が正しいです。
こちらとか
http://www.geocities.jp/ky_webid/c/030.html
こちらを参考にしてください。
http://homepage3.nifty.com/mmgames/c_guide/15-06.html
と
Ch_t*ch[/url]
は型が違います。
配列の先頭を受渡したいなら
void out(Ch_t*ch){
か
void out(Ch_t ch[/url]){
で呼出しは、
out(&ch[0]);
か
out(ch);
が正しいです。
こちらとか
http://www.geocities.jp/ky_webid/c/030.html
こちらを参考にしてください。
http://homepage3.nifty.com/mmgames/c_guide/15-06.html