|
Name: hiduki ..ぴよぴよ(89ポイント)
Date: 2008/08/24(日) 02:02
No:20493
|
|
Title: stdio.h
|
|
えっとまだ学び始めたばかりなんですが
ちょっと分んなくて教えてください
えっと
#include "DxLib.h"と#include <stdio.h>がありますよね
前者は普通にマニュアル通り動くのですが
後者がなぜかマニュアル通りにいかず過去に#include "DxLib.h"を用いて出力した結果を表示します
今はプログラムの分割のところを勉強してます
これはstdio.hが存在していないからでしょうか?
わかりにくいかもしれませんがご指導お願いします
89ポイント を手に入れた。
|
|
|
|
Name: array ..上級者(20,037ポイント)
Date: 2008/08/24(日) 07:54
No:20501
|
|
Title: Re:stdio.h
|
|
マニュアルがなにを指してるのか分りませんが、DxLib.hをインクルードすると一緒にstdio.hもインクルードされるはずです。
なのでDxLib.hをインクルードすれば別にstdio.hをインクルードする必要はないと思います。
printf()を使用したいと考えてるのなら、DXライブラリではprintfDx()を使うみたいです。
使い方は本家リファレンスに書いてあります。
後私が無知なだけかもしれませんが、マニュアルが何を指しているのか、#include <stdio.h>を用いちて何を出力しようとしたのか明確にした方が、的確な解答をもらえるかと思います。
>後者がなぜかマニュアル通りにいかず過去に#include "DxLib.h"を用いて出力した結果を表示します
特にこの部分が抽象的すぎて何を言ってるのか分らないと思います。
321ポイント を手に入れた。
|
|
|
|
Name: situmon ..かけだし(2,075ポイント)
Date: 2008/08/21(木) 22:31
No:20414
|
|
Title: 画像表示方法について
|
|
#include "DxLib.h"
typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int image[16];
char Key[256];
ch_t ch;
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
ch.x =320;
ch.y =160;
ch.walking_flag=0;
ch.muki=3;
SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "char.png" , 0 , 0 , 0 , 64 , 32 , image ) ;//画像を分割してimage配列に保存
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了
if(ch.x%32==0 && ch.y%32==0){ //座標が32で割り切れたら入力可能
ch.walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.muki=2; //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
}
if(ch.walking_flag==1){ //歩くフラグが立っていたら
if (ch.muki==1) //左向きならch.x座標を減らす
ch.x--;
else if(ch.muki==3) //右向きならch.x座標を増やす
ch.x++;
}
ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4]; //画像をセット
DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
ScreenFlip();
}
DxLib_End();
return 0;
}
が、画像が表示されません。よろしくお願いします。
28ポイント を手に入れた。
|
|
|
|
Name: array ..上級者(19,542ポイント)
Date: 2008/08/21(木) 22:45
No:20415
|
|
Title: Re:画像表示方法について
|
|
画像は1枚ですよね。
それなら
ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4]; //画像をセット
ここが、間違ってると思います。
26ポイント を手に入れた。
|
|
|
|
|
Name: array ..上級者(19,694ポイント)
Date: 2008/08/21(木) 22:53
No:20416
|
|
Title: Re:画像表示方法について
|
|
/* プログラム内容 */
> // 省略 //
> LoadDivGraph( "char.png" , 0 , 0 , 0 , 64 , 32 , image ) ;//画像を分割してimage配列に保存
> // 省略 //
> ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4]; //画像をセット
>
修正は、この2ヶ所で良いのかな。
image[0] = LoadGraph("char.png");
分割読み込みする必要はないと思うので^^
ch.img = image[0];
画像は1枚なので。
152ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..かけだし(2,129ポイント)
Date: 2008/08/22(金) 19:17
No:20447
| 解決!
|
Title: Re:画像表示方法について
|
|
すいません、管理人さんに答えていただいたのですが意味がわかりませんでしたすいません。
arrayさま答えていただきありがとうございました。
54ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(699,839ポイント)
Date: 2008/08/24(日) 01:32
No:20492
|
|
Title: Re:画像表示方法について
|
|
それだけでは解決しないと思いますが,解決しました?
どこがわからないか言ってもらえたら重点的に解説します。
前トピの内容をもう一度コピーして提示します。
(1)
>LoadDivGraph( "char.png" , 1 , 1 , 1 , 64 , 32 , image ) ;//画像を分割してimage配列に保存
32x64なので、ここが反対ですね。
(2)
>ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4]; //画像をセット
配列は理解していますか?
今画像が一つしかないのに、無い画像番号をさしています。
これは16種類画像があって、それを歩くモーションにあわせて画像を変更するための処理です。
今は要素番号0しか使えません。
(3)
>if ( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
> ch.muki=1; //左向きフラグを立てる
>else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
> ch.muki=2; //右向きフラグを立てる
向きは左を1,右を2としているのに
> if (ch.muki==1) //左向きならch.x座標を減らす
> ch.x--;
> else if(ch.muki==3) //右向きならch.x座標を増やす
> ch.x++;
そのように処理されていません。
そして、今回は一区間ずつ歩かせる必要はないので、
私がかいたサンプルのようにキーが入力されていたらそのままそちらに移動させるだけでいいと思います。
(1)は32x64の数字をお互いに入れ替えたらいいということです。
(2)はarrayさんの仰ったようにない番号をさしているので,おかしいですね。今は[0]しかないはずです。
(3)はセットした向きと計算している向きの番号が違うということを言っています。ch.mukiの番号を確認してください。
289ポイント を手に入れた。
|
|
|
|
Name: L ..かけだし(2,049ポイント)
Date: 2008/08/23(土) 15:14
No:20462
|
|
Title: 画像について
|
|
LoadDivGraph( "../dat/img/enemy/0.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] ) ;
龍神録中で上記の敵グラフィックを読み込ませる一文がありますが「, 9 , 3 , 3 , 32 , 32 ,」この数式はどうやって算出するのでしょうか?
83ポイント を手に入れた。
|
|
|
|
Name: J ..初心者(5,993ポイント)
Date: 2008/08/23(土) 15:37
No:20466
|
|
Title: Re:画像について
|
|
引数の内容はあなざぁさんの示したリンクが
数値は自分でペイントソフト系で座標を調べるとかしないと無理でしょうねえ。
使おうとする画像が素材として配布されているならば、サイズぐらいは明記されていると思いますが・・・
自作するならば、やはりペイントソフトで、座標と取りながら区切って作っていくしかないでしょう。
余談ですが、こういった画像の製作を楽にしてくれるフリーソフトがあるかもしれませんね。
172ポイント を落としてしまった。
|
|
|
|
|
Name: あなざぁ ..かけだし(1,166ポイント)
Date: 2008/08/23(土) 15:43
No:20467
|
|
Title: Re:画像について
|
|
Lさん、すみません、答えるべき内容がずれていたようです(汗
> 余談ですが、こういった画像の製作を楽にしてくれるフリーソフトがあるかもしれませんね。
そうですね、自分はEDGEというソフトを使っていまして、それで分割できるかと思うのですが、いざ方法を調べるとなると、HTMLのヘルプが開けないんです・・・(何故)
71ポイント を落としてしまった。
|
|
|
|
|
Name: J ..初心者(6,255ポイント)
Date: 2008/08/23(土) 16:00
No:20468
|
|
Title: Re:画像について
|
|
今思い切ってググってEDGEを落としてみました。
XP SP3ですが、ヘルプファイルは無事開けました。
特に問題は無さそうですが・・・
こういった場合は
・再度ダウンロードする
・「Cannot open the file: mk:@msitstore [ドライブレター]:\...\*.chm」と表示されるならば、
以下のコマンドを打ち込んで実行してみてください
regsvr32 [ウィンドウズがインスコされているドライブレター]:\windows\system32\hhctrl.ocx
regsvr32 [ウィンドウズがインスコされているドライブレター]:\windows\system32\itss.dll
確かこれで・・・間違ってたらすみません
なお、打ち込むウィンドウを出すにはWin + Rキーで出ると思います(ファイル名を指定して実行です
・アーカイバを変えてみる。WinRARとかはzipが苦手らしいです(笑
262ポイント を手に入れた。
|
|
|
|
|
Name: J ..初心者(6,260ポイント)
Date: 2008/08/23(土) 16:02
No:20469
|
|
Title: Re:画像について
|
|
すみません、上記のはXPと98(98だっけな?)のみだったと思います。
NTまたは2000は\windows\の部分をwinNTにしてください。
5ポイント を手に入れた。
|
|
|
|
|
Name: あなざぁ ..かけだし(1,232ポイント)
Date: 2008/08/23(土) 17:33
No:20472
|
|
Title: Re:画像について
|
|
> 今思い切ってググってEDGEを落としてみました。
> XP SP3ですが、ヘルプファイルは無事開けました。
> 特に問題は無さそうですが・・・
わざわざ調べていただいてすいません。m(_ _)m
言い方が少し間違っていました。開けることは開けるのですが、
どのページを開いても「ページを表示できません」というメッセージが出てしまいます。
66ポイント を手に入れた。
|
|
|
|
|
Name: J ..初心者(6,300ポイント)
Date: 2008/08/23(土) 20:31
No:20475
|
|
Title: Re:画像について
|
|
うーん、そうなると私も良く分かりませんね。
ヘルプファイルが破損しているとしか私は思えませんけどね・・・
お力になれなくて申し訳ないです。
40ポイント を手に入れた。
|
|
|
|
Name: Nasu ..ぴよぴよ(230ポイント)
Date: 2008/08/21(木) 23:01
No:20418
|
|
Title: ペンタブレットによる入力
|
|
こんにちは、初めまして。
ペンタブレットの入力について質問させてください。
if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ){〜}
if( ( GetMouseInput() & MOUSE_INPUT_RIGHT ) != 0 ){〜}
でマウスクリックを検出することはできました。
しかし、ペンタブレットで操作をすると、マウスカーソルは問題無く動くものの
マウスクリックに相当するボタン操作(ペン先とペン脇ボタンの操作)を検出してくれません。
ウインドウ右上のアイコン操作や、他のアプリ上では問題なくペンタブが動作しています。
筆圧やペンの角度を検出する必要はありませんので、
ペンタブによるクリックを検出する方法を教えていただけないでしょうか?
よろしくお願いします。
230ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(217,591ポイント)
Date: 2008/08/21(木) 23:14
No:20419
|
|
Title: Re:ペンタブレットによる入力
|
|
環境は何ですか?
GetMouseInput()/MOUSE_INPUT_LEFTが使われていることから
Windows+DXライブラリのようにも見えますが。
仮に Windowsだとして、タブレットが手元にないので確認できませんが、
ウインドウに何かウインドウメッセージが来ていないですか?
139ポイント を手に入れた。
|
|
|
|
|
Name: Nasu ..ぴよぴよ(348ポイント)
Date: 2008/08/21(木) 23:57
No:20424
|
|
Title: Re:ペンタブレットによる入力
|
|
ああ、すみません!
環境について書いていませんでした。
Windowsで編集ツールはBCC Developer、
お察しの通りdxライブラリを使用しております。
しかし、ウインドウメッセージというものを今始めて知りましたので、
それを使って自力で調べなおしてみます。
このような情報不足の質問にもアドバイスをくださって、
本当にありがとうございます。
118ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(217,722ポイント)
Date: 2008/08/22(金) 00:28
No:20426
|
|
Title: Re:ペンタブレットによる入力
|
|
なるほど。
ということであれば。
ダメもとで、
・ DXライブラリの定義には MOUSE_INPUT_LEFT/MOUSE_INPUT_RIGHTだけでなく
MOUSE_INPUT_1〜8とかもあるのでそれを試す。
・ DirectInputを使用しないでマウスの情報取得してみる
SetUseDirectInputFlag(FLASE)を呼ぶ
とかも試してみて下さい。
ひょっとしたら、何か反応を返してくるかもしれません。
131ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(218,172ポイント)
Date: 2008/08/22(金) 21:40
No:20453
|
|
Title: Re:ペンタブレットによる入力
|
|
もう遅いかもしれませんが、WACOMのタブレットで試してみました。
ペンでタッチ、ペンの裏側でタッチ、ペン側面の2つのボタン、タブレット上の2つのボタンを押下したとき
GetMouseInput()の戻り値が MOUSE_INPUT_1〜MOUSE_INPUT_5の間で反応してました。
機種とか設定とかにも依るかもしれませんが、お試し下さい。
136ポイント を手に入れた。
|
|
|
|
|
Name: Nasu ..ぴよぴよ(513ポイント)
Date: 2008/08/22(金) 23:09
No:20454
| 解決!
|
Title: Re:ペンタブレットによる入力
|
|
重ねてのご回答ありがとうございます!
試してみたところ、SetUseDirectInputFlag(FLASE)を使用してDirectInputを切ると、
ペンタブレットによるマウス左クリック&マウス右クリックに相当する操作を検出することが確認できました。
これで私の問題は解決です、ありがとうございました。
※何かの役に立つかも知れないので報告※
環境のせいかも知れませんし、私にとっては問題ないことですが…
DirectInputを切った副作用として、MOUSE_INPUT_LSHIFTとMOUSE_INPUT_RSHIFTが動作しなくなりました。
165ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(218,434ポイント)
Date: 2008/08/23(土) 00:59
No:20456
|
|
Title: Re:ペンタブレットによる入力
|
|
>これで私の問題は解決です
無事解決して何よりです。
>DirectInputを切った副作用として、MOUSE_INPUT_LSHIFTとMOUSE_INPUT_RSHIFTが
MOUSE_INPUT_LEFTですか? KEY_INPUT_LSHIFTですか?
2倍のポイントを手に入れた! 262ポイント を手に入れた。
|
|
|
|
|
Name: Nasu ..ぴよぴよ(543ポイント)
Date: 2008/08/23(土) 08:29
No:20458
|
|
Title: Re:ペンタブレットによる入力
|
|
書き間違いでした。
DirectInputを切った副作用は、KEY_INPUT_LSHIFT と KEY_INPUT_RSHIFT
についてです。
30ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(218,579ポイント)
Date: 2008/08/23(土) 15:16
No:20463
|
|
Title: Re:ペンタブレットによる入力
|
|
>DirectInputを切った副作用は、KEY_INPUT_LSHIFT と KEY_INPUT_RSHIFT
なるほど、ということはキーボード入力の方に影響がある、と。
うーん、不思議ですね。何か解決方法はあるとは思いますが・・・。
環境的なものなのでしょうかねぇ。
145ポイント を手に入れた。
|
|
|
|
Name: 1226 ..ぴよぴよ(50ポイント)
Date: 2008/08/22(金) 04:13
No:20430
|
|
Title: できません
|
|
DxLib_VC2008_and_2005用(.sln)を起動させようと思いダブルクリックしたところ「対応していないファイルです」と出てしまいます。どうしたらよいでしょうか
50ポイント を手に入れた。
|
|
|
|
Name: non ..ぴよぴよ(935ポイント)
Date: 2008/08/22(金) 08:44
No:20431
|
|
Title: Re:できません
|
|
Visual Studio が2003なのではありませんか?
DxLib.sln が同じフォルダに、ありませんか?こちらは、大丈夫だと思いますが。
32ポイント を手に入れた。
|
|
|
|
Name: 神戸 太郎 ..ぴよぴよ(357ポイント)
Date: 2008/08/22(金) 21:11
No:20450
|
|
Title: c言語超初心者
|
|
Borland C++ Compiler 5.5をインストールしました、setbcc を使い設定ファイルの作成と、パスの設定も行い
ました。
作業用ディレクトリを作成して、そこにtest1.cをコピーします。次にDOS窓を起動し、作業用ディレクトリに移動します。ここで、コンソール上で
>bcc32 test1.c
を実行すると、test1.exe が作られることが確認できるらしいのですが、私には作業用ディレクトリの作成法が解りません、ソースファイルは何処に作るのでしょうか?申し訳御座いませんが勉強不足の初心者に解るように教えて頂けますか宜しくお願いします。
258ポイント を手に入れた。
|
|
|
|
Name: 神戸 太郎 ..ぴよぴよ(403ポイント)
Date: 2008/08/22(金) 21:27
No:20452
| 解決!
|
Title: Re:c言語超初心者
|
|
申し訳御座いません昨日と同じ質問をしてしまいました。
管理人さん削除して下さい。
ごめんなさい。
46ポイント を手に入れた。
|
|
|
|
Name: <kor ..かけだし(1,568ポイント)
Date: 2008/08/18(月) 18:42
No:20294
|
|
Title: 14章の弾幕(2)
|
|
どうも。
この前の弾幕の作成方法でたくさんの方にお世話になりました。<korです。
前回教えていただいた方法で2〜7way弾を作って実行してみたのですが、パターン000から006までは正常に
実行されるのですが、それ以降の自分で作ったものはなぜか実行されません。
ちなみに、エクセルファイルとshot.cppも変更しました。エラーも出てません。
なぜ実行されないのか、教えていただけないでしょうか?
138ポイント を手に入れた。
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(693,467ポイント)
Date: 2008/08/18(月) 18:53
No:20295
|
|
Title: Re:14章の弾幕(2)
|
|
恐らく関数ポインタを追加していないからじゃないでしょうか。
弾幕の関数は似たような関数が大量に出てくるので、
ポインタでその関数をさせるようにしてあります。
例えば感覚的に表現するならば
int *p[4];
p[0]=弾幕0の関数のポインタ;
p[1]=弾幕1の関数のポインタ;
p[2]=弾幕2の関数のポインタ;
p[3]=弾幕3の関数のポインタ;
と格納しておけば、3番の弾幕の処理をさせたいときp[処理をさせたい番号=3]を示せばいい事になり
楽が出来ます。
その為、新しく弾幕4を追加した時は
int *p[5];
p[0]=弾幕0の関数のポインタ;
p[1]=弾幕1の関数のポインタ;
p[2]=弾幕2の関数のポインタ;
p[3]=弾幕3の関数のポインタ;
p[4]=弾幕4の関数のポインタ;
のように新しく追加しなければなりません。
これをやってみましょう。
shot.cppファイルの上に
extern void shot_bullet_H000(int);
extern void shot_bullet_H001(int);
extern void shot_bullet_H002(int);
extern void shot_bullet_H003(int);
extern void shot_bullet_H004(int);
extern void shot_bullet_H005(int);
extern void shot_bullet_H006(int);
と長々と書いているところがありますね。
もし今007をshotH.cppに追加したのならば、上の続きに
extern void shot_bullet_H007(int);
を追加して下さい。そして上で言う
p[4]=弾幕4の関数のポインタ;
の作業をしてやります。
void (*shot_bullet[SHOT_KND_MAX])(int) ={
shot_bullet_H000,
shot_bullet_H001,
shot_bullet_H002,
shot_bullet_H003,
shot_bullet_H004,
shot_bullet_H005,
shot_bullet_H006,
};
これがそのポインタの格納ですから
void (*shot_bullet[SHOT_KND_MAX])(int) ={
shot_bullet_H000,
shot_bullet_H001,
shot_bullet_H002,
shot_bullet_H003,
shot_bullet_H004,
shot_bullet_H005,
shot_bullet_H006,
shot_bullet_H007,
};
を追加して下さい。この時SHOT_KND_MAXが
上限を超えていないか注意して下さい。
例えば今の場合は8以上になっている事を確認して下さい。
もしこれで解決しない場合はまたお聞き下さい。
964ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(216,272ポイント)
Date: 2008/08/18(月) 22:14
No:20300
|
|
Title: Re:14章の弾幕(2)
|
|
便乗ですが、ふと疑問に。
>この時SHOT_KND_MAXが上限を超えていないか注意して下さい。
SHOT_KND_MAXの定義って必要なのでしょうか?
37章のソースを見る限り、無くてもいいような気がするのですが。
116ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(693,731ポイント)
Date: 2008/08/18(月) 23:28
No:20303
|
|
Title: Re:14章の弾幕(2)
|
|
そうですね〜、恐らくここでしか使わないので特に定義はしなくてもいいのかもしれません。
void (*shot_bullet[SHOT_KND_MAX])(int)
とかかなくても
void (*shot_bullet[18])(int)
と書けばいいということですよね?
まぁ今回は解らなくはならないと思いますが、
一応後から見たときに、どの数字が何の意味なのかわからなくならないように、
shotの種類を増やしたい時は
#define SHOT_KND_MAX 18
の値を変更したらいいだけにした方がわかりやすいかな?と思い、このようにしました。
あまり必要性の低い定義はしない方がいいでしょうか?
264ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(216,731ポイント)
Date: 2008/08/18(月) 23:57
No:20304
|
|
Title: Re:14章の弾幕(2)
|
|
>void (*shot_bullet[18])(int)
>と書けばいいということですよね?
あ、いえ
void (*shot_bullet[])(int)
こうです。
で、後はshot[i].knd<SHOT_KND_MAXなところはshot[i].knd<sizeof(shot_bullet)/sizeof(shot_bullet[0])な
感じにしておけば配列の要素数を自分で管理する必要が無くなるので、shotの種類を増やしたい時に
楽かなと思いまして。
(sizeof〜の部分はマクロ化した方がいいでしょうけど)
>必要性の低い定義はしない方がいいでしょうか
必要性があるなら定義した方がいいと思いますよ。
ただ、今回のケースで言うと sizeofで要素数をわかるので
敢えて配列の要素数と SHOT_KND_MAXの数を手動で一致させる必要はないかな、と。
特に数が多くなったり幾つか弾の種類をコメントアウトして削ったときとか
修正が面倒で、しかもミスに気付きにくいですし。
でももしこの方式で進めるなら要素数と SHOT_KND_MAXが違っていたら
コンパイル時か実行時に知らせるコードを入れておくとミスに気付けるので
いいのかもしれません。
459ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(694,949ポイント)
Date: 2008/08/19(火) 00:24
No:20307
|
|
Title: Re:14章の弾幕(2)
|
|
>あ、いえ
>void (*shot_bullet[])(int)
>こうです。
ご、、ごもっとも( ̄▽ ̄;)
そうか〜なぜイチイチ定義してたんでしょう;
龍神録もそうなっているので、何も考えずに館のコードもそうしてしまいました。
いや〜しかし館のサンプルはホントに、後から変更が効かない構造ですねorz
123ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(216,815ポイント)
Date: 2008/08/19(火) 01:00
No:20309
|
|
Title: Re:14章の弾幕(2)
|
|
>いや〜しかし館のサンプルはホントに、後から変更が効かない構造ですねorz
あー、なかなか難しいですね、それは。
時系列で複数のプロジェクトが作られてますから、最初の頃からあるコードですと・・・ね。
84ポイント を手に入れた。
|
|
|
|
|
Name: <kor ..かけだし(1,576ポイント)
Date: 2008/08/19(火) 17:20
No:20315
|
|
Title: Re:14章の弾幕(2)
|
|
今確認してみたら、define.cppのSHOT_KND_MAXもちゃんと13になってましたし、shot.cppも上の通りになってました。
8ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(695,047ポイント)
Date: 2008/08/19(火) 19:18
No:20320
|
|
Title: Re:14章の弾幕(2)
|
|
あれ?そうなんですか。
では以下の点をご確認のうえ、それでも原因が解らなかったらこちらに送って下さい。
こちらでバグの原因を見つけてみます。
・今出現させたい弾幕がshot_bullet_H007だとしたら、shot_bullet_H007がshot.cppでextern宣言されているか。
・ポインタ配列にその関数のアドレスが入れてあるか
・エクセルデータの弾幕の呼び出しが7番になっているか
・shot_bullet_H007がshotH.cpp内で正確に実装されているか
214ポイント を手に入れた。
|
|
|
|
|
Name: <kor ..かけだし(2,146ポイント)
Date: 2008/08/20(水) 17:44
No:20352
|
|
Title: Re:14章の弾幕(2)
|
|
すいません、いろんなところをよくわからないのに変更してたからだと思ってプロジェクトをDLしなおして、
shotH.cppとshot.cpp、define.hだけを変更してやってみたらshotH.cppで
識別子が見つかりませんでした
というエラーが弾幕の数だけ出てしまうんですけど、なぜですか?
とりあえず、1つエラーの出たところを載せておきます。龍神録プログラミングも見てみましたが間違ったところはなかったのですが・・・
//1発だけ、自機に向かって直線発射
void shot_bullet_H000(int n){
int k;
if(shot[n].cnt==0){
if(shot[n].flag!=2 && (k=shot_serch(n))!=-1){ //←ここでエラーが起きたらしいです。
shot[n].bullet[k].knd =enemy[shot[n].num].blknd2;
shot[n].bullet[k].angle =shotatan2(n);
shot[n].bullet[k].flag =1;
shot[n].bullet[k].x =enemy[shot[n].num].x;
shot[n].bullet[k].y =enemy[shot[n].num].y;
shot[n].bullet[k].col =enemy[shot[n].num].col;
shot[n].bullet[k].cnt =0;
shot[n].bullet[k].spd =3;
se_flag[0]=1;
}
}
}
570ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(217,452ポイント)
Date: 2008/08/20(水) 22:27
No:20364
|
|
Title: Re:14章の弾幕(2)
|
|
>shotH.cppとshot.cpp、define.hだけを変更してやってみたらshotH.cppで
>識別子が見つかりませんでした
>というエラーが弾幕の数だけ出てしまうんですけど、なぜですか?
えーと、一番肝心の「見つからなかった識別子」の名前は何なのでしょうか。
>ここでエラーが起きたらしいです
shot_serch -> shot_searchだとかいうことは?
215ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(696,571ポイント)
Date: 2008/08/20(水) 23:16
No:20365
|
|
Title: Re:14章の弾幕(2)
|
|
エラーが出たら、そのエラーメッセージをダブルクリックしたらエラーの出た行に飛びます。
その行のどこでエラーが出ているのかそのエラーメッセージから推測します。
例えば「"shot_serch"が見つかりませんでした」のようなエラーメッセージなら
shot_serchを右クリックして「定義に移動」してみて下さい。
恐らくどこにも飛べないと思います。
そうするとスペルミスだとわかります。
こんな感じで一つずつつぶしてみてはどうでしょうか。
195ポイント を手に入れた。
|
|
|
|
|
Name: <kor ..かけだし(2,322ポイント)
Date: 2008/08/21(木) 09:12
No:20377
|
|
Title: Re:14章の弾幕(2)
|
|
今管理人様の方法で見てみたら、shot_searchがshot_serchになってました。ちまちま a を打ち続ける作業に…
で、実行してみたらできたんですけど、やっぱりあとから自分で作ったものが出てきません。
エクセルファイルが悪いんですかね?なんか保存するときに、
story0.csvには、CSV(カンマ区切り)と互換性のない機能が含まれている可能性があります。
この形式でブックを保存しますか。
っていう警告が出てしまいます。
それに、csvで保存できたはいいんですが、60カウントのところを7番に変更してるのに変更前の1番が出てしまいます。いったい何が悪いのか・・・?
176ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(698,143ポイント)
Date: 2008/08/21(木) 09:34
No:20378
|
|
Title: Re:14章の弾幕(2)
|
|
警告はこちらでもでますよ。理由はよく知りませんが・・。
保存して、閉じて、また開いて、保存した時の状態になっていれば、
無事保存できている事が確認できると思います。
(これから何か途中わからない事があれば言って下さい)
これからする作業は本来反対からするべきですが、順番がわからなくなってはいけないので、
最初から書きますね。(1)〜(4)でそれぞれ値がきちんとはいっているか確認してください。
(1)
まず、エクセルデータにおいて、弾幕種類(blknd)にあたるのが弾幕の番号ですね。
これはload.cppのload_story()にて
case 7: enemy_order[n].blknd =atoi(inputc);break;
でenemy_order[*].blkndに読み込まれます。
この時ちゃんと7が入っているかブレイクポイントを用いて確認して下さい。
(printfDxでもいいですが)
(2)
このデータは敵が出現する時刻になったらenemy_enter()関数内で
enemy[*].blkndに格納されるはずです。
またここに7が入っていることを確認して下さい。
(3)
そしてenemy.cpp内のenter_shot(int)関数内で
void enter_shot(int i){
int j;
for(j=0;j<SHOT_MAX;j++){//フラグのたって無いenemyを探す
if(shot[j].flag==0){//未使用の弾幕データがあれば
memset(&shot[j],0,sizeof(shot_t));//初期化して登録
shot[j].flag=1;//フラグをたてる
shot[j].knd=enemy[i].blknd;//弾の種類
shot[j].kndに7が渡されます。
ここも確認してください。
(4)
後は、shot.cpp内の
void shot_main(){
int i;
for(i=0;i<SHOT_MAX;i++){//弾幕データ計算
//フラグが立っていて、設定した種類が間違っていなければ(オーバーフロー対策)
if(shot[i].flag!=0 && 0<=shot[i].knd && shot[i].knd<SHOT_KND_MAX){
shot_bullet[shot[i].knd](i);//.kndの弾幕計算関数を呼ぶ関数ポインタ
shot[i].kndが7なら
shot_bullet[shot[i].knd](i)で
配列の[7]が呼ばれるはずですからenemy_pattern7が呼ばれるはずです。
ここも確認してください。
これらが全てうまくいっていて、それでも、弾幕7が実行されないのなら、
アドバイスだけでは解りませんので、こちらに送って下さい。
715ポイント を手に入れた。
|
|
|
|
|
Name: <kor ..かけだし(2,369ポイント)
Date: 2008/08/22(金) 20:44
No:20449
| 解決!
|
Title: Re:14章の弾幕(2)
|
|
>>管理人様
ごめんなさい。load.cpp内で、story.csvの場所の定義を間違ってただけでした。
迷惑かけちゃってすいませんm(__)m
47ポイント を手に入れた。
|
|
|
|
Name: situmon ..ぴよぴよ(353ポイント)
Date: 2008/08/18(月) 21:10
No:20298
|
|
Title: 弾幕の作り方
|
|
あの、中学生1年生でもわかるような、
シューティング・シューティングの弾幕の作り方はないでしょうか。
シューティングゲームの館は龍神録プログラミングの館より簡単ということですが
確かにプログラムを実行して弾幕が表示されるのはわかりましたが、
いくら説明を読んでも難しすぎて、どうしても壁にぶつかってしまいます。
どうすれば弾幕に使う弾の画像を変えられるのか?
どうすれば弾幕を自分で作れるようになるのか?
どうすればオリジナリティあふれる作品がつくれるか?
いろいろあります。
200ポイント を手に入れた。
|
|
|
|
Name: array ..上級者(18,439ポイント)
Date: 2008/08/18(月) 23:09
No:20301
|
|
Title: Re:弾幕などで
|
|
参考までに私の話を・・・・。
中学生でC言語の知識があるとは凄く驚きなのですが、代替は理解してるのでしょうか。基礎がないと、いきなりプログラムだけみても意味はさっぱりだと思います。
ちなみに私は、型宣言、porintf()などの基本的な関数、if文、for文、while文、ポインタ。程度しか知りませんでした。
そしてシューティングの館で見ててさらに必要だなと思ったのは、switch()、構造体。などでしょうか
弾幕作成は、1章〜20章までを順に・・ある程度でも理解しないと難しいんじゃないかと思います。
敵と弾幕情報が親密な関係にあるので。20章まで理解できれば、後の22章以降は弾幕計算のサンプル程度だと思います。
弾幕の移動計算もsinやcosを使うのが多いいみたいなので、そういうのも章を読みながら理解していきました。私は全章を読み終えるのに、1カ月以上かかったんじゃないかと思います。
>どうすれば弾幕に使う弾の画像を変えられるのか?
EnemyShot[i].img=1;
この数字で
img_enemy_shot[○] に読み込んだ画像に変えれます。
>どうすれば弾幕を自分で作れるようになるのか?
とりあえず、弾幕サンプル動作を理解し、その軌道でなにができそうか考えるとか・・・w
>どうすればオリジナリティあふれる作品がつくれるか?
これは自分にどれだけアイディアがあるかで決まるんじゃないでしょうか。&それに対応できる知識とか?
>管理人さんのようなすばらしい弾幕が作れるように
>どれくらいかかりますか?
たしか四聖龍神録が製作期間6カ月だったような・・・四聖龍神録Plusは8ヶ月みたいですね・・・今みたら体験版の製作期間は1ヶ月・・・参考になるんじゃないでしょうか
プログラムを見る上での私が思うコツは1行ずつ動作を理解することだと思うので、少しずつやっていかないと身が持たないかと、私はいずれ弾幕作成ができるようになれば良いなぁ〜程度で頑張ってました。ちなみに私は3、4ヶ月程度で現在にいたります。
871ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(694,292ポイント)
Date: 2008/08/19(火) 00:03
No:20305
|
|
Title: Re:弾幕などで
|
|
ここのHPの内容はC言語の基本的な知識があることを前提に紹介しています。
ですので、もしC言語についてよくご存知でなければまず基本をおさえる事をお勧めします。
「C言語 入門」で検索して出てくるようなサイトの内容を一通り読んで理解する
↓
ゲームプログラミングの館
↓
自分で簡単なゲームをいくつか作ってみる
↓
龍神録プログラミングの館
という感じで進んでいくといいかもしれません。
龍神録プログラミングの館は読まなくてもいいと思います。
いくつも自分でゲームを作っていく中でゲームの作り方はわかっていくと思いますし。
どれ位で作れるようになるかという事は恐らく誰もが気になることでしょうけど、
こればっかりはどれ位やる気があるかでものすごく違うのでわかりません。
メンドクサイなと思いながらやれば何年たってもろくなものは作れないでしょうし、
面白い!と思って夢中でやれば1ヶ月もすれば自分なりのゲームを作っていけることでしょう。
とりあえず、無理に難しいものを作ろうと背伸びしないことが継続の秘訣だと思います。
難しい・・わからない・・となると、面白くないと感じる事に繋がると思います。
少しずつでいいから自分の思い通りのプログラムが書けるようになれれば、やる気に繋がる事でしょう。
ただ、シューティングには最低限の数学の知識が必要です。
特にベクトルを使った計算や物理的計算などは中学生だと難しいと思いますから、
龍神録プログラミングの館のサンプルはわかりにくいかもしれません。
しかし、それを使わなければ作れないわけじゃありません。
sin,cosさえ意味がわかればシューティングは作れます。
今、中1でどこまで習うか知らないのですが、
sin,cosと後円周率とラジアンの関係がわかってないとキツイかもしれません。
その辺次の投稿で簡単に説明してみます。
561ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(694,826ポイント)
Date: 2008/08/19(火) 00:14
No:20306
|
|
Title: Re:弾幕などで
|
|
あれ・・今中学校でsin,cosって習わないんですか?( ̄  ̄;)
私の時もそうだったっけ・・・・・?
http://www.geisya.or.jp/~mwm48961/math/index_m.htm
ここ見てみると、ピタゴラスの定理すら中3で習うよう・・。
う〜ん、中1の数学の知識がどの程度なのかよくわからないのですが、
少しハードルは高いかもしれませんね。
でも基本的な理論さえわかればいいので、別に難関高校の受験問題がとけるようになるほど
理解する必要もないですからそんなに構える事もないかもしれません。
どりあえず、突然シューティングを作ろうとせず、
りんごがなっている木からリンゴが落ちてきて、下でカゴを持っているおじいさんを左右に動かして操作して
落ちてくるリンゴを入れる・・
みたいな簡単なゲームを作ってみてはどうでしょう?
そういうゲームをしたことが無いとイメージ掴みにくいかな^^;
2倍のポイントを手に入れた! 534ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(695,017ポイント)
Date: 2008/08/19(火) 00:55
No:20308
|
|
Title: Re:弾幕などで
|
|
上で言っていたリンゴの落ちゲー(?)ですが、こんな感じで作ってみました。
プログラムコードも載せておきます。
http://dixq.net/zip/oti_ge.zip
キーボードの十字キーでキャラを操作し、カゴにリンゴを入れて下さい。
こんな感じのゲームをいくつも作っていってみてはどうでしょう?
作っていく中で
「これってどうやったら実現できるかな?」
と疑問に思うことが出てくると思います。
その時その都度新しい事を学んでいけばそれでいいと思います。
※このサンプルにはsin,cosが使われていますが、下に落とすだけならy座標を増やすだけでいいので、省けます。
68ポイント を手に入れた。
|
|
|
|
|
Name: めいらる ..ぴよぴよ(874ポイント)
Date: 2008/08/19(火) 17:24
No:20316
|
|
Title: Re:弾幕などで
|
|
私が中学生の頃はsinとか出てきたはず…といってももう6年前になりますが…^^;
私はいきなりシューティングを作り始めて挫折しかけたタイプですwwその時はHSPでしたが
Cの基礎さえある程度理解できればあとはソースを一行ずつ理解しながら読んでみてちょっと値をいじってどのように変化するかをためしてみたりするのも楽しいですよ^^
管理人さん>
その背景はまさかww
138ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(694,833ポイント)
Date: 2008/08/19(火) 19:14
No:20319
|
|
Title: Re:弾幕などで
|
|
>といってももう6年前になりますが…^^;
そんなこと言ったら私なんてもう10年以上前・・。
ウソー、信じられない( ̄  ̄;
ちと、sin,cos知らない人の為に館に簡単な数学講座作ってもいいかもしれませんね。
そういえば物理講座作ろうとして1章しか作ってない^^;
>その背景はまさかww
めいらるさんはご存知ですねw
昨日ちょうど作って遊んでた背景なんですよ。
適当な背景が無かったんで、ふざけてこれにしてみましたが、
誰からも突込みが入らなかったらどうしようかと^^;
184ポイント を落としてしまった。
|
|
|
|
|
Name: situmon ..ぴよぴよ(429ポイント)
Date: 2008/08/19(火) 19:53
No:20324
|
|
Title: Re:弾幕などで
|
|
sin.cosとは三角関数、サイン、コサイン、タンジェントのことですね。
あとすいません、もう一度弾の画像の変え方を教えてください。
後その背景とは・・・?
52ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(695,417ポイント)
Date: 2008/08/19(火) 20:11
No:20326
|
|
Title: Re:弾幕などで
|
|
サイン、コサインの理論はご存知ですか?
例えば上図の斜辺の長さ1とすると、赤線の長さはいくらかわかりますか?
そしてこれが44°だといくらになりますか?
シューティングで使う数学はその程度です。
弾の画像があるフォルダに、変更したい画像をいれ、
LoadGraphまたはLoadDivGraphのファイル名を変更して下さい。
サンプルでいえば
LoadDivGraph( "img/bullet.png" , 1 , 1 , 1 , 30 , 29 , img_bullet ) ;
ここです。この場合画像サイズの変更も必要です。
この関数の使い方がわからない場合は本家リファレンスで確認して下さい。
216ポイント を手に入れた。
|
|
|
|
|
Name: めいらる ..ぴよぴよ(905ポイント)
Date: 2008/08/19(火) 20:16
No:20329
|
|
Title: Re:弾幕などで
|
|
私は数学をほとんど理解せずに公式に当てはめて軌道計算をやってますww
中、高と…その…数学を…サボってましたので…^^;
31ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(695,719ポイント)
Date: 2008/08/19(火) 20:38
No:20332
|
|
Title: Re:弾幕などで
|
|
>tkさん
今習わないんですかぁ・・。
ゆとり教育とかなんとかで、教育内容下がって来てるんですかね?
でも行列計算は大学に入るまで何してるのか理解出来ませんでしたよ^^;
>めいらるさん
関数の使い方さえわかれば、数学的な理論とかはよく知らなくてもなんとかなりますよねb
加速を使って綺麗に曲線を描いたり、数学的な制御をしない限りsin,cos,atan2だけで何とか凌げますよねw
198ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..ぴよぴよ(508ポイント)
Date: 2008/08/19(火) 20:50
No:20333
|
|
Title: Re:弾幕などで
|
|
あの、申し訳ないのですが
龍神録の1面のような(できればもっとやさしい)プログラムコードを
いただけないでしょうか?
48ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..ぴよぴよ(570ポイント)
Date: 2008/08/19(火) 20:59
No:20335
|
|
Title: Re:弾幕などで
|
|
sinなどは学習サイトですこしわかりました。
あと
>enemy_shot.cpp内のEnemyShotPattern**が弾幕計算関数です。
その中のEnemyShot[*].imgが弾の画像です。
登録された弾はEnemyShotCalcDisp関数で描画しています。
はやはりわかりません。
あとなぜ龍神録の1面がほしいのかとういうと
どんどん敵が出てきて最後のボスというステージにも挑戦したいのですが。
62ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(104,387ポイント)
Date: 2008/08/19(火) 21:26
No:20336
|
|
Title: Re:弾幕の作り方
|
|
三角関数を勉強したいならば、アナログ時計を画面に表示するプログラムを作るといいかもしれませんよ(^-^)
小さなことからコツコツと…が一番の近道だったりします。
54ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(696,311ポイント)
Date: 2008/08/19(火) 21:49
No:20337
|
|
Title: Re:弾幕の作り方
|
|
まず一つずつ回答をもらえるでしょうか。
(1) わからないということですが、何がわからないですか?
(2) プロジェクトはダウンロードしてありますか?
(3) C言語の基本的な部分は理解していますか?
(4) コンパイラは何を使っていますか?
(5) ゲームプログラミングの経験はありますか?
また、ステージ作りはどこにも紹介していませんが、
一通りのことをちゃんと理解しないと難しいと思います。
もしゲーム製作の経験がなければ突然大きなゲームを作ろうとしない方がいいと思います。
バグさんも仰っているように、小さなものを沢山作ってまずはなれることが大事かと思います。
>バグさん
そういえばOpenGLの練習をする為に最初に作ってみたのがアナログ時計でした^^
2倍のポイントを手に入れた! 496ポイント を手に入れた。
|
|
|
|
|
Name: array ..上級者(19,491ポイント)
Date: 2008/08/19(火) 22:02
No:20338
|
|
Title: Re:弾幕の作り方
|
|
弾幕の画像を変えたそうだったので、既存の弾画像で良いなら
32. ボスの弾幕1
のプログラムを見てください。
void EnemyShotPattern12(int i){
if(EnemyShot[i].counter==0){
EnemyShot[i].Enx[0]=EnemyShot[i].mem_ex;
EnemyShot[i].Eny[0]=EnemyShot[i].mem_ey;
for(int j=0;j<6;j++){
EnemyShot[i].EnemyShots[j].x=EnemyShot[i].Enx[0];
EnemyShot[i].EnemyShots[j].y=EnemyShot[i].Eny[0];
EnemyShot[i].EnemyShots[j].flag=1;
if(j==0)
EnemyShot[i].EnemyShots[j].angle=atan2(EnemyShot[i].mem_py-EnemyShot[i].mem_ey,EnemyShot[i].mem_px-EnemyShot[i].mem_ex);
else
EnemyShot[i].EnemyShots[j].angle = EnemyShot[i].EnemyShots[0].angle+2.0f*PI*(double)j/6.0f;
}
PlaySoundMem(sound_enemy_shot[0],DX_PLAYTYPE_BACK);
}
if(EnemyShot[i].counter==80){
double ang[6];
EnemyShot[i].img=1;
for(int s=0;s<6;s++){
// 以下略 //
-------------------------------------------
この赤文字の
EnemyShot[i].img=1;
の数値を変えてやれば良いです。
EnemyShot[i].img=2;
とすれば画像が変わります。
-------------------------------------------
そして画像を変えるタイミング(時間)ですが
EnemyShot[i].counter==80
が時間を表しています。
なので、弾発射から、約1秒後(counter=60が大体1秒になるので)に1の画像を変える、という事です。
よって、
if(EnemyShot[i].counter==80){
// 略 //←ここ
if(EnemyShot[i].counter==160){
//略の間に
if(EnemyShot[i].counter==120)
EnemyShot[i].img=0;
を追加してあげれば、発射から2秒後に◎画像に変わります。
-------------------------------------------
にしても、中学1年でsinが分かるとは凄いです。私が中1の1学期でやってた事は100×(-1)=-100だよ〜とかでしたけどw 大学にいる今でも三角関数って言われると( ̄□ ̄)?って状態になります
858ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..入門者(2,718ポイント)
Date: 2008/08/19(火) 22:06
No:20339
|
|
Title: Re:弾幕の作り方
|
|
中学でラジアンとかに取り組めたら末恐ろしいですね。
私は今でも三角関数とか苦手なのでLAMEとかffmpegとかのフロントエンド作って遊んでます。(せいぜい文字列の処理)
# ffmpeg複雑すぎる・・・
74ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..ぴよぴよ(644ポイント)
Date: 2008/08/19(火) 22:21
No:20340
|
|
Title: Re:弾幕の作り方
|
|
もともとは専用ソフトでシューティングゲームを作っていました。
まず、管理人さんの作ったりんご落としゲームなんかの系統を作ってみようとか思います。
できたら、メールにて送りますので試しにやっていただけませんか?
74ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..ぴよぴよ(837ポイント)
Date: 2008/08/19(火) 22:39
No:20341
|
|
Title: Re:弾幕の作り方
|
|
>(1) わからないということですが、何がわからないですか?
(2) プロジェクトはダウンロードしてありますか?
(3) C言語の基本的な部分は理解していますか?
(4) コンパイラは何を使っていますか?
(5) ゲームプログラミングの経験はありますか?
プログラミングはほぼないといっていいです。
でもノベルゲーム作成ソフトで
多少スクリプトはありました。
http://dixq.net/g/
の24までは読んで実行してみました。
ですがそれを自分の思っていることに当てはめることができないのです。
コンパイラとは
DXライブラリのことでしょうか?
193ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(696,376ポイント)
Date: 2008/08/19(火) 22:52
No:20342
|
|
Title: Re:弾幕の作り方
|
|
まず、(1)〜(5)のうち4,5だけ回答頂けたと思いますが、後はどうですか?
24章までの内容は読んだだけでなく、理解していますか?
似たような仕様を作って欲しいといわれたら作れますか?
例えば24章を拡張して、同時に敵をウロウロさせて欲しいといわれたら出来ますか?
もし読んだだけでしたら、
ゲームプログラミングの館は読むだけでなく、一つ一つ習得していって下さい。
自分で似たような仕様を考え、自分でプログラムを書いて練習して下さい。
恐らく数学の教科書を眺めただけで練習問題が全て解けるようにはならないであろうことと同じように、
プログラミングも演習が大事です。
>できたら、メールにて送りますので試しにやっていただけませんか?
いいですよ。
それか、アップローダかどこかにアップロードして、
ここにリンク貼ってもらえたらみんなで見れると思いますがどうでしょうか。
65ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..かけだし(1,125ポイント)
Date: 2008/08/20(水) 21:54
No:20361
|
|
Title: Re:弾幕の作り方
|
|
>sin,cosさえ意味がわかればシューティングは作れます。
今、中1でどこまで習うか知らないのですが、
sin,cosと後円周率とラジアンの関係がわかってないとキツイかもしれません。
いま、しっかりと勉強中ですがルートなどが出てくるので少し難しいところもあるかもしれません。
>(1) わからないということですが、何がわからないですか?
(2) プロジェクトはダウンロードしてありますか?
(3) C言語の基本的な部分は理解していますか?
わからないのは、いろいろありますがまず、簡単なものから作ることにしましたので、少しは大丈夫かと思います。
すいません、プロジェクトのダウンロードとは?
Microsoft Visual C++ 2008 Express Edition
のことでしょうか?
それなら製品登録もしました。
基本的な部分はもういちどゲームプログラミングの館とシューティングの館で
確認中です。
いろいろ答えてくれた皆様どうもありがとうございます。
まだいろいろ疑問や問題があるので質問するかもしれないのでよろしくお願いします。
288ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..かけだし(1,972ポイント)
Date: 2008/08/20(水) 22:17
No:20363
|
|
Title: Re:弾幕の作り方
|
|
落ちげー?についてなのですが、まずゲームプログラミングの館のプログラムコード
を改造して公開されたりんごゲームのようなものを作れるか調べたいのですが
#include "DxLib.h"
typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int image[16];
char Key[256];
ch_t ch;
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
ch.x =320;
ch.y =160;
ch.walking_flag=0;
ch.muki=3;
SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "char.png" , 1 , 1 , 1 , 64 , 32 , image ) ;//画像を分割してimage配列に保存
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了
if(ch.x%32==0 && ch.y%32==0){ //座標が32で割り切れたら入力可能
ch.walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.muki=2; //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
}
if(ch.walking_flag==1){ //歩くフラグが立っていたら
if (ch.muki==1) //左向きならch.x座標を減らす
ch.x--;
else if(ch.muki==3) //右向きならch.x座標を増やす
ch.x++;
}
ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4]; //画像をセット
DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
ScreenFlip();
}
DxLib_End();
return 0;
}
で64,32画像が表示されません。
添付画像のとおり。
847ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(696,787ポイント)
Date: 2008/08/20(水) 23:23
No:20366
|
|
Title: Re:弾幕の作り方
|
|
>いま、しっかりと勉強中ですがルートなどが出てくるので少し難しいところもあるかもしれません。
そうですね〜。ルートは直接利用する機会は少ないので、まぁわからなくても大丈夫かもしれませんが、
やはり基本なので、知っているのと知らないのでは大きく違うかもしれませんね。
>すいません、プロジェクトのダウンロードとは?
コンパイルする時は、そのプロジェクトを作りますよね。
今無事コンパイルできていると言う事は「プロジェクト」というものを作っていらっしゃるはずです。
シューティングゲームの館のメニュー項目で「プロジェクトのダウンロード」をして、
プロジェクトをお開きになったのではないかと思いますが、それの事です。
216ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(697,036ポイント)
Date: 2008/08/20(水) 23:32
No:20367
|
|
Title: Re:弾幕の作り方
|
|
>LoadDivGraph( "char.png" , 1 , 1 , 1 , 64 , 32 , image ) ;//画像を分割してimage配列に保存
32x64なので、ここが反対ですね。
>ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4]; //画像をセット
配列は理解していますか?
今画像が一つしかないのに、無い画像番号をさしています。
これは16種類画像があって、それを歩くモーションにあわせて画像を変更するための処理です。
今は要素番号0しか使えません。
>if ( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
> ch.muki=1; //左向きフラグを立てる
>else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
> ch.muki=2; //右向きフラグを立てる
向きは左を1,右を2としているのに
> if (ch.muki==1) //左向きならch.x座標を減らす
> ch.x--;
> else if(ch.muki==3) //右向きならch.x座標を増やす
> ch.x++;
そのように処理されていません。
そして、今回は一区間ずつ歩かせる必要はないので、
私がかいたサンプルのようにキーが入力されていたらそのままそちらに移動させるだけでいいと思います。
249ポイント を手に入れた。
|
|
|
|
|
Name: tkmakwins15 [URL] ..比類無きプログラマー(85,253ポイント)
Date: 2008/08/21(木) 11:40
No:20381
|
|
Title: Re:弾幕の作り方
|
|
大まかに数学の学校の進度を図示すると…
中1
・正負の数、絶対値
・文字式
・一次方程式
・比例式
・図形(対称,作図,円と接線,図形の体積,3次元における直線の関係,など…)
中2
・単項文字式の加減乗除
・文字式による説明(証明の基礎)
・2元1次連立方程式
・1次関数
・図形(三角形や平行四辺形などに関する諸定理,三角形の合同,図形の証明問題,など…)
中3
・多項式の展開,2次式の因数分解
・実数解の2次方程式
・2次関数(2次の項のみ)
・図形(三角形の相似,平行線と線分,中点連結定理,三平方の定理,など…)
といったものでしょうか。プログラミングでは、数学の問題を解く力はあまり必要ないので、概念をどれだけ知ってるかがポイントです。
364ポイント を手に入れた。
|
|
|
|
|
Name: 通りすがり ..中級者(11,201ポイント)
Date: 2008/08/21(木) 12:56
No:20383
|
|
Title: Re:弾幕の作り方
|
|
ここのゲームプログラミング講座のSTGの弾のスプライトの表示の仕方は
素人のやり方だからマネしない方がいいぞ。
40ポイント を手に入れた。
|
|
|
|
|
Name: レク ..ぴよぴよ(260ポイント)
Date: 2008/08/21(木) 13:48
No:20384
|
|
Title: Re:弾幕の作り方
|
|
>通りすがりさん
いつも読んでるだけなんですが今回初めて書き込みます。
私はこのサイトに非常に感謝しています。
こんなにも解りやすく、丁寧に、惜しみなく解説してくれるサイトは他に無いと思います。
マネしない方がいいなんて、その言い方はあんまりかと。
もしそう思うなら、もっと参考になると思うサイトを提示すべきです。
または、参考サイトを知らないなら自分が最も適切だと思うアルゴリズムを提示したらどうですか?
批判だけなら誰でも出来ます。あなたの書き込みは多くの人を不快にさせます。
それに、丁寧語使えないんでしょうか?
253ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(698,511ポイント)
Date: 2008/08/21(木) 15:17
No:20386
|
|
Title: Re:弾幕の作り方
|
|
>tkさん
なるほど。
もう昔のことなので覚えてないですが、私の時には一次関数を中2では習わなかった気が・・。
って事はy=xのグラフの傾きは角度45°だってことは中1ではわからないんですかね?
そうなってくると中1では少し難しいですね。
・・・あ!14歳からのワクワクシューティング・・なんとかって本がありますが、
なんで14歳からなのかと思っていましたが、中2を示しているんですね。
なるほど、そういう意味なのか・・。
>素人のやり方
確かに私はプロでもなければ、熟練者でもないので、適切な方法ではないと思います。
ただ、出来るだけわかり易く解説したいなと思っているので、
あえて非効率な書き方になっている部分もあります。
どうしても効率的、汎用的、拡張的であることと、解り易いことは反比例してしまいがちなのですが
少ない知識の中でではありますが出来るだけ適切な方法を保ちながら最大限わかりやすいことを重視しています。
もし、もっと適切な方法をご存知でしたらアドバイス頂けると幸いです。
368ポイント を手に入れた。
|
|
|
|
|
Name: tkmakwins15 [URL] ..比類無きプログラマー(85,412ポイント)
Date: 2008/08/21(木) 15:26
No:20388
|
|
Title: Re:弾幕の作り方
|
|
>って事はy=xのグラフの傾きは角度45°だってことは中1ではわからないんですかね?
うーん、まぁy=axのグラフの傾きがArctan(a)になる、ということは分からないと思いますが、y=xのグラフの傾きの角度ならば見た目でも分かるとは思いますが…
>なんで14歳からなのかと思っていましたが、中2を示しているんですね。
>なるほど、そういう意味なのか・・。
そこまで深い意味はないような…
となると、「15歳から〜DirectX9 3Dプログラミング」なんて15歳向けではありませんよ、ベクトルや行列などが出てくるんですから…
211ポイント を手に入れた。
|
|
|
|
|
Name: こめかみ ..中級者(14,601ポイント)
Date: 2008/08/21(木) 18:15
No:20401
|
|
Title: Re:弾幕の作り方
|
|
14、15歳は16進数だとどこかでみたような・・・
それが本当なら14歳は20歳だということになります。
や、根も葉もないうわさなのですが。
57ポイント を手に入れた。
|
|
|
|
|
Name: 通りすがり ..中級者(11,318ポイント)
Date: 2008/08/21(木) 19:40
No:20405
|
|
Title: Re:弾幕の作り方
|
|
>レクさん
上記の私の忠告は聞いておくことをオススメします。
証拠が欲しいなら、ご自身で ケイブシュー、タイトーシューなど(プロの方々が作られたSTG)を
合法的にハッキングして何がダメか見つけてみることですね。
解析すればあることに気づきますよ。
117ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..かけだし(2,047ポイント)
Date: 2008/08/21(木) 22:24
No:20412
| 解決!
|
Title: Re:弾幕の作り方
|
|
いままで弾幕について答えていただいた皆様、本当に感謝いたします。
だんだん、弾幕についての質問ではなくなったので、
新しく作ります。
本当にありがとうございました。
75ポイント を手に入れた。
|
|
|
|
|
Name: @ ..ぴよぴよ(50ポイント)
Date: 2008/08/21(木) 22:24
No:20413
|
|
Title: Re:弾幕の作り方
|
|
>>通りすがり
お前に脳が足りないのかは知らないが場所を考えろ
煽りなら他でやってろ
お前は精神年齢が低すぎる
50ポイント を手に入れた。
|
|
|
|
|
Name: . ..ぴよぴよ(227ポイント)
Date: 2008/08/21(木) 23:22
No:20420
|
|
Title: Re:弾幕の作り方
|
|
>通りすがり
具体的なこと示せって言われても、何も答えられないわけですね。ハッキングして自分で調べろ?
そうすれば「あること」に気づく?
自分が答えられないからってそういう低レベルな回答するのはどうなの?
しまいには自分で回答できないから、人に答えてみ?と言って代わりに答えさせる気?
今求められてる事は、もっと適切なアルゴリズムがあるのなら自分で示す事ですよ。
文章では答えられないとかCではかけないとかいくらでも言い訳できるけど、
もし自分に本当にスキルがあるのなら、そんないい訳せずに
20行位でみんなが納得できるようなアルゴリズムの解説して下さい。
まぁ出来ない人にこんな事言っても無駄だけど。
227ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(698,869ポイント)
Date: 2008/08/21(木) 23:56
No:20423
|
|
Title: Re:弾幕の作り方
|
|
規約に沿った投稿をお願いします。
まず、丁寧語で投稿して下さいますようお願いいたします。
確かに私の示すプログラムはプロの間で常識となっているアルゴリズムとは違うと思います。
私独自のやり方ですし、私なりに我流で見つけてきた方法です。
ただ、Cをベースにしていても、C++のSTLの機能を使ったり、
リストや動的配列を駆使したりグローバル変数を減らすこと等でもっと効率的になると思いますが、
最大限効率化したコードを紹介することより、わかりやすいコードを紹介する方が
参考サイトとしてはずっと意味があると思ってそうしています。
効率化は、理解したうえで自分で行っていけばいいと思います。
難しいあまり、やる気がなくなって、断念してしまっては本末転倒です。
もっと効率的なアルゴリズムはもちろん存在するはずですし、
私にその事を紹介する技術が無い事も確かです。そこは否定する気もありません。
ただ先ほども書いた通り、もっと効率的なアルゴリズムをご存知なら皆さんが納得するように、
その理論を説明する事がこの話を解決する事になると思いますが、いかがでしょうか?
303ポイント を手に入れた。
|
|
|
|
Name: 神戸 太郎 ..ぴよぴよ(99ポイント)
Date: 2008/08/21(木) 23:33
No:20421
|
|
Title: C言語超入門者
|
|
これからC言語を学ぼうとしている超入門者です。
Borland C++ Compiler 5.5をインストールして設定ファイルの作成と、パスの設定を
bcc55.batを使って行いましたがこの後作業用ディレクトリにソースファイルを書き込
み次にDOS窓を起動し、作業用ディレクトリに移動します。ここで、コンソール上で
>bcc32 test1.c
を実行すると、test1.exe が作られるらしいのですが、作業用ディレクトリとは何の事
でしょうか、何処にあるにでしょうか?どうしたらコンパイル出来るのでしょうか?
教えてください宜しくお願いします。
99ポイント を手に入れた。
|
|
|
|
Name: lbfuvab ..入門者(3,950ポイント)
Date: 2008/08/22(金) 00:18
No:20425
|
|
Title: Re:C言語超入門者
|
|
ん〜と、どこのサイトを参考にしましたか?
まずbcc55.batがよく分からないので答えようがありません。
52ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(218,036ポイント)
Date: 2008/08/22(金) 01:05
No:20429
|
|
Title: Re:C言語超入門者
|
|
>作業用ディレクトリに移動します。ここで、コンソール上で
>bcc32 test1.c
>を実行すると、test1.exe が作られるらしいのですが、
>作業用ディレクトリとは何の事 でしょうか
その例でいうと、test1.cのあるディレクトリのことでしょう。
2倍のポイントを手に入れた! 314ポイント を手に入れた。
|
|
|
|
Name: こめかみ ..上級者(15,166ポイント)
Date: 2008/08/21(木) 19:14
No:20404
|
|
Title: 龍神録の館23,24章について
|
|
報告です。
●23章
---- out.cpp enemyshot_and_ch関数----の項目の
if(ch.flag==0 && ch.mutekicnt==0){
ch.cnt=0;
ch.flag=1;
se_flag[3]=1;
}
---
この箇所ですが、それまでのプログラムの流れからして
フラグが先の方がいいんじゃないでしょうか。
if(ch.flag==0 && ch.mutekicnt==0){
ch.flag=1;
ch.cnt=0;
se_flag[3]=1;
}
この方がいいと思います。
●24章
画像の解説ですが
式についてる番号の「5」と「4」の順番が違うようです。
あと画像の右の方にゴミがついてます。
●24章---- struct.h に追加 ----の項目
//ボスショットに関する構造体
typedef struct{
//フラグ、種類、カウンタ、どの敵から発射されたかの番号、色
int flag,knd,cnt,num;
----
「色」のコメントが余分です。
●プロジェクト1〜23章のfunc.hですが、
全ステージ分のボス弾幕の関数ポインタが入ってるのですが。
解説する予定だったものの名残でしょうか。
こんなところです。
まだ何かあった気がしますが忘れちゃいました。
後続の方にお任せします^^。
◆喰らいボム
crybomには笑ってしまいました。泣いちゃうんですか?
面白いですけど、みょん弾幕の章みたいに自分で突っ込んどいた方が良くないですかー。
565ポイント を手に入れた。
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(699,066ポイント)
Date: 2008/08/22(金) 00:59
No:20428
|
|
Title: Re:龍神録の館23,24章について
|
|
ご報告ありがとうございます。
喰らいボムは英語でなんというのかわからなかったので、
atoi->a2iならぬ、crybomと、適当に発音の同じ単語くっつけました^^;
>自分で突っ込んどいた方が良くないですかー。
まぁよく読んだ人にしかわからないコアなギャグということで・・^^;
ちなみに本当の龍神録のプログラムにもcrybomという関数は存在しますw
123ポイント を手に入れた。
|
|
|
|
Name: lbfuvab ..入門者(3,856ポイント)
Date: 2008/08/21(木) 03:03
No:20372
|
|
Title: 速度が異様に遅くなってしまいます
|
|
斜方投射のシュミレーションをするプログラムを書いてみたのですが
真上に投げて達する高さが120px強で計算どうりなのですが、時間が2倍近くかかっています。(1px=1mで換算)
計算の都合上、左下を原点とするためにyがちょっと複雑になってます。
あと添付は背景画像です。
(WinXpPro,Dxlib,BCC)
//以下ソース
/***************************************************************************
* *
* 真上に投げ上げたときY方向に49m/s(初速度) *
* 頂点に達するまでG=9.8m/s^2より5秒 *
* また、最高点は49*5-9.8*5*5/2よって122.5mのはず *
* *
***************************************************************************/
#include "DxLib.h"
#include<math.h>
#define SPEED 49.0
#define GRAVITY 9.8
#define BASE_X 0
#define BASE_Y 0
typedef struct{
BOOL bAppear;
double Xspeed,Yspeed;
double X,Y;
}BOAL_T;
void fps(){
int i;
static int t=0,ave=0,f[60];
static int count=0;
f[count%60]=GetNowCount()-t;
t=GetNowCount();
if(count%60==59){
ave=0;
for(i=0;i<60;i++)
ave+=f[i];
ave/=60;
}
if(ave!=0){
DrawFormatString(100,0,0,"%.1fFPS",1000.0/(double)ave);
}
count++;
return;
}
int WINAPI WinMain(HINSTANCE, HINSTANCE,LPSTR,int){
int x=120,y=120,hRed,hBgImg,StTime=0,EdTime=0;
BOAL_T Boal={FALSE,0,0,0,0};
double obliq; //斜辺
char Key[256];
if(ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK ||DxLib_Init() == -1 ) return -1;
SetDrawScreen( DX_SCREEN_BACK );
hRed=GetColor(255,0,0);
hBgImg=LoadGraph("Bg.png");
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
DrawGraph(0,0,hBgImg,FALSE);
fps();
if(Boal.bAppear){
Boal.X+=Boal.Xspeed/60; //60fpsの為
Boal.Y+=Boal.Yspeed/60; //同上
Boal.Yspeed-=GRAVITY/60; //同上
if(Boal.Y<0 || Boal.Y>480 || Boal.X>640 || Boal.X<0){ //投射終了時
EdTime=GetNowCount();
Boal.bAppear=FALSE;
}
}
if(GetMouseInput()&MOUSE_INPUT_LEFT && !Boal.bAppear){
if(!GetMousePoint(&x,&y)){
y=480-y;
Boal.bAppear=TRUE;
Boal.X=BASE_X;
Boal.Y=BASE_Y;
obliq=sqrt((x-BASE_X)*(x-BASE_X)+(y-BASE_Y)*(y-BASE_Y));
Boal.Xspeed=SPEED*(x-BASE_X)/obliq;
Boal.Yspeed=SPEED*(y-BASE_Y)/obliq;
StTime=GetNowCount();
}
}
if(StTime<EdTime)
DrawFormatString(500,0,0,"%05dms",EdTime-StTime); //斜方投射にかかった時間の表示
if(Boal.bAppear)
DrawCircle((int)Boal.X,(int)(480-Boal.Y),2,hRed,TRUE);
ScreenFlip();
}
DxLib_End();
return 0;
}
1,138ポイント を手に入れた。
|
|
|
Name: yasya ..ぴよぴよ(635ポイント)
Date: 2008/08/20(水) 17:58
No:20353
|
|
Title: 無題
|
|
こんにちは。
さっそく質問なんですが、ゲームプログラミングの館の25aのサンプルプログラムを参考にして、敵と遭遇させるプログラムを作ってみたのですが、敵と遭遇してマップ画面に戻って来たとき、何もキーを押してないのにキャラが勝手に動いてしまいます。マップ画面に戻ってきてもキャラが勝手に動かなくなるようにするにはどうしたらいいんでしょうか。
76ポイント を手に入れた。
|
|
|
|
Name: kazuoni ..上級者(23,700ポイント)
Date: 2008/08/20(水) 18:18
No:20354
|
|
Title: Re:無題
|
|
ちょっとこれだけだけだと「ここがいけない」ってのが言えないのでコードをみせていただけませんか?そうすればいい回答が得られると思います。
なんだか戦闘シーンに入るときのマップのフラグ処理がいけない(忘れている)気がしますが・・・
84ポイント を手に入れた。
|
|
|
|
|
Name: yasya ..かけだし(2,154ポイント)
Date: 2008/08/20(水) 19:32
No:20357
|
|
Title: Re:無題
|
|
#include "DxLib.h"
char Key[256];
int func_states=0;
int White;
int image[16],i,j;
typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;
ch_t ch;
int hantei[15][20] = {
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
int can_or_cannot(int x,int y,int muki){//進めるかを判定する
if(muki==0)//上向きなら
if(hantei[y/32-1][x/32]==1)//進めるか判定
return 1;//エラー
if(muki==1)//左向きなら
if(hantei[y/32][x/32-1]==1)
return 1;
if(muki==2)//下向きなら
if(hantei[y/32+1][x/32]==1)
return 1;
if(muki==3)//右向きなら
if(hantei[y/32][x/32+1]==1)
return 1;
return 0;//正常
}
void map(){//マップ画面
//長いので省略します(ゲームプログラミングの館の25aを参照してください^^;)//
}
void battle(){ //戦闘画面
//長いので省略します。//
if(Key[ KEY_INPUT_Z ]==1){
func_states=0;
}
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
SetDrawScreen( DX_SCREEN_BACK ); //裏画面に設定
ch.x =320;
ch.y =160;
ch.walking_flag=0;
ch.muki=3;
LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
switch(func_states){
case 0:
map();
break;
case 1:
battle();
break;
}
if( ProcessMessage() == -1 ) break ;
ScreenFlip();
}
DxLib_End();
return 0;
}
こんな感じです。
1,519ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(697,206ポイント)
Date: 2008/08/20(水) 23:38
No:20368
|
|
Title: Re:無題
|
|
25.aのサンプルの中に
if(ch.walking_flag==1)
if(GetRand(4)==0)
printfDx("敵");
このように書かれていると思います。
32,32で割り切れるときに、そして歩くフラグが立っている時に判断しています。
つまり、このまま32ピクセル歩く状態です。
なので、条件にマッチした時(敵に遭遇した時)はch.walking_flagを0にして下さい。
170ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..上級者(23,889ポイント)
Date: 2008/08/21(木) 00:06
No:20369
|
|
Title: Re:無題
|
|
返事が遅れてしまって申し訳ありませんでした。。もし省略の部分が25.aの通りなら管理人さんのおっしゃる通りです。
ほかにも
if(ch.walking_flag==1 && func_states==0){ //歩くフラグが立っていたら(ifの条件を付け加えています)
if (ch.muki==0) //上向きならch.y座標を減らす
ch.y--;
else if(ch.muki==1) //左向きならch.x座標を減らす
...............
でもいけると思います^^
189ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..上級者(24,620ポイント)
Date: 2008/08/21(木) 01:05
No:20371
|
|
Title: Re:無題
|
|
void map(){//マップ画面
if(ch.x%32==0 && ch.y%32==0){ //座標が32で割り切れたら入力可能
ch.walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
ch.muki=0; //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 ) //下ボタンが押されたら
ch.muki=2; //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.muki=3; //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
if(ch.walking_flag==1) //もし歩くなら
if(can_or_cannot(ch.x,ch.y,ch.muki)==1)//行き先が歩けないなら
ch.walking_flag=0; //歩かないフラグを立てる。
if(ch.walking_flag==1)
if(GetRand(10)==0)
func_states=1;
}
if(ch.walking_flag==1 && func_states==0){ //歩くフラグが立っていたら
if (ch.muki==0) //上向きならch.y座標を減らす
ch.y--;
else if(ch.muki==1) //左向きならch.x座標を減らす
ch.x--;
else if(ch.muki==2) //下向きならch.y座標を増やす
ch.y++;
else if(ch.muki==3) //右向きならch.x座標を増やす
ch.x++;
}
ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4]; //画像をセット
DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
}
本当にすみません。。自分はmap()の中身を↑のように解釈しました。なので、今回のエラーは方向キーを押して、敵のフラグが立ったが、chをインクリメント(デクリメント)してしまい、それでbattle()へ。戻ってきたときには32で割れないので進んでしまう・・・
このように解釈していたのでこれでもいいかなと。。勝手な判断でしたので、yasyaさんの回答に直結しないかもしれないですね。。本当にすみませんでした。
731ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..上級者(24,672ポイント)
Date: 2008/08/21(木) 08:15
No:20375
|
|
Title: Re:無題
|
|
ちょっと調べてみましたが、やはりbattle()から戻ってくるとちゃんと何も押さない時のifにあてはまり、座標は変わらずにch.walking_flag=0でした。
そのときのコードです。
52ポイント を手に入れた。
|
|
|
|
|
Name: yasya ..かけだし(2,112ポイント)
Date: 2008/08/21(木) 17:24
No:20400
| 解決!
|
Title: Re:無題
|
|
kazuoniさん、管理人さん、ありがとうございます。
おかげで、無事解決することができました。
本当にありがとうございます^^
42ポイント を落としてしまった。
|
|
|
|
Name: 西村 ..入門者(3,881ポイント)
Date: 2008/08/20(水) 15:32
No:20347
|
|
Title: ロボカップの質問
|
|
Cでロボカップをすることになりました(サッカーのやつです)。シミュレーション部門というやつになると思うのですが・・・現在それに悩んでいます。この掲示版で質問するのは間違いなのかもしれませんが、質問させていただきます。
あまり細かく説明することは僕には出来ないのですが、現在 estimate_current_pos という関数の扱いに困っています。サーバから選手の場所を受信する関数なのですが、それを使うと選手が消えてしまいます。ゴールが視界から出ればこの関数を呼び出す、という風にしたいのですが・・・とりあえず、以下プログラムの一部です。
if(ball->dist <= 1.085){ //ボールがキックかのう距離にある//
if(goal == NULL){ //ゴールの情報が無い//
if(estimate_current_pos(sinf,pstate)) //自分の現在位置情報をサーバから受信//
send_com_kick(sock,20, pstate.dir); //ボールをキック//
}
}
ゴールの情報がない時、連続して estimate_current_pos関数が呼び出されるからプレイヤーが消えてしまうというのは解るのですが・・・こういう時一度しか呼び出さない方法とか無いでしょうか?
こんな質問の書き方でいいのかはなはだ不安です。
追記:指摘を頂いた箇所を修正しました。
2倍のポイントを手に入れた! 924ポイント を手に入れた。
|
|
|
|
Name: KEV ..入門者(4,083ポイント)
Date: 2008/08/20(水) 19:09
No:20355
|
|
Title: Re:ロボカップの質問
|
|
関数の内容を知らないので分からないこと多々ですが、
勝手な推測で言うのをご了承ください。
ボールがシュートできる位置にある かつ
ゴールしてない かつ
プレイヤーがボールの近くにいる かつ
ときにシュートでしょうか。
上記のソースコードでゴールしてないときに複数回関数が読み込まれる場合、
「現在プレイヤーがシュート動作を行っている」フラグみたいなのを追加して
それで判断したらどうでしょうか。
例:if(isShootintFlag == 1){/* 実装 */} みたいな
見当はずれのこと言ってるかもしれません;
今のとこ関数の中身とか変数が何なのかがよく分からないので
説明できる範囲で書いてみるとよいと思います。
特に変数が分からない…。
//ゴールの情報ってどうやって取得してるんだろう。
203ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..上級者(20,722ポイント)
Date: 2008/08/20(水) 19:24
No:20356
|
|
Title: Re:ロボカップの質問
|
|
> 関数の内容を知らないので分からないこと多々ですが、
たぶんこれのことだと思います。
o estimate_current_pos(SeeInfo *sinf, Side side, PosState *pstate)
estimates the current position of the player (absolute position (pos)
and absolute direction (dir) in the field) based on seen landmarks in sinf.
`sinf' specifies SeeInfo, a result of a parse by scan_info.`side' specifies
the side of the team of the player. The result is put into pstate.
プレーヤの現在位置を概算する。
(絶対位置と絶対方向で)
sinf内の見えている目標物を元にして。
結果はpstateに返される。
Absolute position (X,Y) means that the player is X meters forward and Y
meters right from the center mark. Absolute direction DIR is 0 if the
player faces to the opponent goal line, 90 if he faces to the right touch
line, -90 if he faces to the left touch line, and 180 or -180 if he faces
to the own goal line.
絶対位置(x,y)はプレーヤがセンターマークから何メータ前にいて何メータ
右にいるかを意味する。
絶対方向0はプレーヤは相手のゴールラインを向いている。
90は右のタッチラインを向いている。
−90は左のタッチラインを向いている。
180か−180は自分のゴールラインを向いている。
It returns TRUE if the current position is estimated successfully, and
FALSE if it fails.
現在位置の概算に成功したらTRUEを返し、失敗するとFALSEを返す。
> それを使うと選手が消えてしまいます。
これの意味がよくわかりません。
何から選手が消えるんですか?サーバ上の情報?
また、消えるとはどういった状態を指しているのでしょうか。
消えてしまうことが理解できるとの事ですが、そのあたりももう少し詳しい説明が欲しいです。
私は、上の関数説明を読んだ限りでは(何が消えるのかわからないけど)消えてしまうことに問題があるように思ってしまうのですが。
743ポイント を手に入れた。
|
|
|
|
|
Name: 西村 ..入門者(4,208ポイント)
Date: 2008/08/20(水) 19:57
No:20358
|
|
Title: Re:ロボカップの質問
|
|
返答ありがとうございます。
Mistさんへの返事になりますが、消えてしまうというのは選手がディスプレイに表示されるフィールド画面からいなくなるということです。僕自身どういう現象なのか良く解りませんが、関数の処理が重くなりすぎてサーバで処理できなくなるためにいなくなるのだと思います。
KEVさんの質問で気がつきました。ゴールというのは得点が入った時という意味でのゴールではなく、ゴールポストとかのゴールのことです。説明が足りませんでした。つまり「ゴールの情報が無い」というのは「敵のゴールが視界にない」という意味です。すみません。
それにしても、やっぱりロボカップをされている方はなかなかいらっしゃらないようで・・・期待して無かったと言えば嘘ですが、うーん・・・
327ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(217,040ポイント)
Date: 2008/08/20(水) 20:40
No:20359
|
|
Title: Re:ロボカップの質問
|
|
消える問題に関してはこんな断片ソースだけでは何も解りませんが、
この断片を見ると不思議なところが何点かあります。
・ if(ball->dist >= 1.085)
ball->distの変数ってオブジェクトまでの距離ですよね?
距離が大きければ中を実行、になっていますが、それで正しいですか?
・ if(estimate_current_pos(sinf,pstate) == 0)
この判定はサーバーからの現在位置受信に“失敗”したら、send_com_kick()でキック
しているように見えますが、それで正しいですか?
225ポイント を手に入れた。
|
|
|
|
|
Name: 西村 ..入門者(4,290ポイント)
Date: 2008/08/20(水) 21:09
No:20360
|
|
Title: Re:ロボカップの質問
|
|
説明が下手な上に色々と足りなくて本当に申し訳ないです。
Justyさんに指摘して頂いた if(ball->dist >= 1.085) に関しては完全にこちらのミスでした。emacs からのコピペの仕方が解らないものだから全部直接書き込んでたらミスしてしまいました。修正します。
if(estimate_current_pos(sinf, pstate) == 0)も色々と試行錯誤していた時のただの名残でした。本来は
if(estimate_current_pos(sinf, pstate)) だけになるものと思います(自分の勝手な解釈ですが・・・)。
考えてくれている人達がいるのにこんなにミスしまくってて本当にすみません。
82ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(217,237ポイント)
Date: 2008/08/20(水) 22:16
No:20362
|
|
Title: Re:ロボカップの質問
|
|
なるほど。
だとすると。
1つ思いついたのは、estimate_current_pos()は必ず成功するわけではない
(絶対位置を求めるのにはゴールとかライン情報とかの何か目印が必要)ので、
この関数が失敗して FALSEが戻ったとき、プレイヤー消えたように見えてしまっている
ということはないでしょうか。
これが原因でなければ、今ある情報だけではちょっと解りません。
# あ、そういえば estimate_current_pos()はサーバーとは通信しないみたいですよ。
197ポイント を手に入れた。
|
|
|
|
|
Name: 西村 ..入門者(4,363ポイント)
Date: 2008/08/21(木) 11:20
No:20379
|
|
Title: Re:ロボカップの質問
|
|
サーバと通信していないという話を聞いて、「それじゃあつまり自分が思ってなかったようなミスがあるということなのかな?」と思い更に色々調べていたところ、ソースファイルに position.h をインクルードしなければならないことに気がつきました。・・・けれど、ここでまた別の問題が・・・
貰って来たposirion.hがエラーを吐きまくりました。以下がそれなのですが・・・
../include/position.h:31: error: `NUM_FLAGS' undeclared here (not in a function)../include/position.h:31: error: `NUM_GOALS' undeclared here (not in a function)../include/position.h:36: error: `NUM_LINES' undeclared here (not in a function)../include/position.h:60: error: 文法エラー before "Points"
../include/position.h:60: 警告: data definition has no type or storage class
../include/position.h:64: error: 文法エラー before "build_position_knowledge"
../include/position.h:64: 警告: 関数宣言中に(型の無い)仮引数名があります
../include/position.h:64: 警告: data definition has no type or storage class
../include/position.h:65: error: 文法エラー before "init_points_locations"
../include/position.h:65: 警告: 関数宣言中に(型の無い)仮引数名があります
../include/position.h:65: 警告: data definition has no type or storage class
../include/position.h:66: error: 文法エラー before "estimate_current_pos"
../include/position.h:66: error: 文法エラー before '*' token
../include/position.h:66: 警告: data definition has no type or storage class
../include/position.h:67: error: 文法エラー before "int"
../include/position.h:60: 警告: array `Points' assumed to have one element
これだけで判断出来るのか解りませんが、こういうケースは直すべきはこちらのソースファイルなんでしょうか?それとも貰って来た position.h がどこか不完全なのでしょうか? position.h を開示しなければ無理かな・・・
73ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 ..かけだし(2,371ポイント)
Date: 2008/08/21(木) 11:35
No:20380
|
|
Title: Re:ロボカップの質問
|
|
エラー文を見ると、最初の方に定義されていないなどのエラー文がかかれているので、
インクルードする順番に問題があるかも知れません。
もし一番上に position.h をインクルードしていたなら、
宣言されていないエラーが出ているのかもしれません。
他のインクルード文の後に置くようにすると直るかも。
あるいは、 position.h 内で使用している宣言や定義は、
別のファイルにあって、それもインクルードしなければいけないのかもしれません。
155ポイント を手に入れた。
|
|
|
|
|
Name: 西村 ..入門者(4,589ポイント)
Date: 2008/08/21(木) 12:29
No:20382
| 解決!
|
Title: Re:ロボカップの質問
|
|
なるほど!
ありがとうございます、無事にコンパイルを通すことが出来ました!
無事に選手が消えることも無くなった・・・のですが、これまた奇怪な現象が起こるようになってしまいました。でも、とりあえず今回の質問はここで終りにします。とりあえず自分の力でバグにあたってみます。
ここまで導いて下さった方々、本当にありがとうございました。
2倍のポイントを手に入れた! 226ポイント を手に入れた。
|
|
|
|
Name: いけやん ..ぴよぴよ(606ポイント)
Date: 2008/08/12(火) 15:08
No:20101
|
|
Title: 全角文字列取得
|
|
初めまして、いけやんと申します。
さっそく質問します。
開発環境
Windows XP sp2
Visual C++6.0
MFC ダイアログベース
----+--------+--------------------
2000|02-00-00|《ああああああ》
2000|02-01-00| いい掛/うう
現在上記の様な、テキストデータを読み込んで、CTreeCtrlに表示させているのですが
今strtok関数を使ってテキストの中の必要のない物をどけて、文字列を摘出しています。
しかしstrtok関数は、半角の物を意識して作ってあるらしく
全角文字列を読み込ませるのは、よろしくないみたいです。
実際に今のプログラムでは、
実行結果
<<ああああああ>>
いい
/うう
「掛」この文字だけなくなり、
こういった表示になります。
原因は、「全角1文字を半角2文字として扱うため、
場合によっては全角文字の一部が区切り文字と誤認識され、ぶった切られます。」
なので、wcstok関数を使えば全角文字列も読み込み
できるみたいなのでwcstok関数を使う事にしました。
リファレンスより
wchar_t *wcstok(
wchar_t *strToken,
const wchar_t *strDelimit
);
wcstokの第一引数をUnsigned shortに変換に変換できません
というエラーがでます。
http://hw001.gate01.com/eggplant/tcf/cpp/wchar_t_trap.html
この関係なんですかね?
無理やりですが、キャストしたりしてみてもエラーがでます。
使い方に困っています。
なので、wcstok関数の使い方がわかる方
すいませんが、お願いたします。
またwcstok関数以外でも結構ですので
よろしくお願いします。
606ポイント を手に入れた。
|
|
|
|
Name: いけやん ..ぴよぴよ(913ポイント)
Date: 2008/08/12(火) 15:10
No:20102
|
|
Title: Re:全角文字列取得
|
|
これがソースです。
CStdioFile fin;//ファイル変数
CString str;//1行文読込用
int i = 0,count;
if ( !fin.Open("部材.txt", CFile::modeRead, NULL ) ) {return -1;}
while ( fin.ReadString(str) != NULL ) {
int i = 0;
reinterpret_cast<unsigned short *>(str);
for (const char *token = wcstok(str.GetBuffer(str.GetLength()),"+-|0123456789 ");
token != NULL;
token = wcstok(0,"-+|0123456789 ")){
m_HndTree[0] = m_tree.InsertItem(token,TVI_ROOT);
m_HndTree[1] = m_tree.InsertItem(token,m_HndTree[0]);
省略
}
307ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(123,647ポイント)
Date: 2008/08/12(火) 15:30
No:20105
|
|
Title: Re:全角文字列取得
|
|
第1引数は、ポインターでなければならないはずです。
私はwcstok関数を使ったことがないのでナニですが、
> token = wcstok(0,"-+|0123456789 ")){
ここの第1引数は NULL あたりにしなければならないのではないでしょうか。
93ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(15,047ポイント)
Date: 2008/08/12(火) 15:42
No:20106
|
|
Title: Re:全角文字列取得
|
|
部材.txtはシフトJISで書かれているのですよね
掛の0x7Cが'|'とかぶりますね
wcstok( )を使うにはUTF-16にコンバートしないといけません
ファイル自体を変えるか読み込んでから
MultiByteToWideChar( )
で変更するか
でもファイル自体の文字コードを変更できるならEUC-JPにしたら区切り文字とかぶることはなくなりますよ
70ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..かけだし(1,082ポイント)
Date: 2008/08/12(火) 16:48
No:20112
|
|
Title: Re:全角文字列取得
|
|
すいません返信遅れました。
>token = wcstok(0,"-+|0123456789 ")){
直しました。ありがとうございます。
すいません。文字コードの前に
文字列をキャストしているところエラーが出てました。
reinterpret_cast<unsigned short *>(str);
for (const char *token = wcstok(str.GetBuffer(str.GetLength()),"+-|0123456789 ");//エラー
token != NULL;
token = wcstok(NULL,"+-|0123456789 ") ) {//エラー
class CString' から 'unsigned short *' に変換することはできません。
すいませんが、CStringからunsgined shortへの変換の仕方
教えて頂けないでしょうか。お願いします。
169ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(15,339ポイント)
Date: 2008/08/12(火) 17:21
No:20116
|
|
Title: Re:全角文字列取得
|
|
単純なキャストだとASCII文字が2文字で1文字として扱われてしまうのでだめですね
wchar_t型にするなら文字コードもユニコードにするのが本来の使い方だと思います
wchar_t buf[256];
MultiByteToWideChar(CP_THREAD_ACP, MB_PRECOMPOSED, str, 256, buf, 256);
でどうでしょう
あとwcstok関数は第2引数もwchar_t型なので
wcstok(NULL, L"+-|0123456789 ")
とLを付けないといけませんね
個人的な意見としてはマルチバイト文字をユニコード用の関数で扱うのはあまりいいやり方ではないような気がします。
自分ならstr.Mid( )で1バイトずつチェックして0x80以上なら2バイト文字なので読み飛ばすようにします。
292ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..かけだし(1,574ポイント)
Date: 2008/08/12(火) 19:31
No:20130
|
|
Title: Re:全角文字列取得
|
|
う〜ん、MultiByteToWideCharを使ってみたのですが
やっぱりchar * から unsigned short *変換できません
エラーになりますね。
if ( !fin.Open("部材.txt", CFile::modeRead, NULL ) ) {return -1;}
while ( fin.ReadString(str) != NULL ) {
int i = 0;
MultiByteToWideChar(CP_THREAD_ACP,MB_PRECOMPOSED,str,256,buf,256);
//const char *str2 = new char[str.GetLength()+1] = strcpy(str2,str);
//reinterpret_cast<unsigned short *>(str);
for (const char *token = wcstok(str.GetBuffer(str.GetLength()),L"+-|0123456789 ");
token != NULL;
token = wcstok(NULL,L"+-|0123456789 ") ) {
>個人的な意見としてはマルチバイト文字をユニコード用の関数で扱うのは
>あまりいいやり方ではないような気がします。
これは、下記の様な無理?に変換して使うのは、
あまりよろしくないという事ですね?
MultiByteToWideChar(CP_THREAD_ACP, MB_PRECOMPOSED, str, 256, buf, 256);
>str.Mid( )で1バイトずつチェックして0x80以上なら2バイト文字なので読み飛ばすようにします。
toyoさんありがとうございます。
上記の件試したいと思います。
あまりC初心者なので、エラー出しながらなので、返信遅くなると思います。
492ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 ..かけだし(1,211ポイント)
Date: 2008/08/12(火) 19:58
No:20133
|
|
Title: Re:全角文字列取得
|
|
Visual C++6.0 で可能かどうか分かりませんが、以下の方法はどうでしょうか。
wchar_t buf[256];
swprintf(buf,L"%S",str);
もし実行時に日本語部分が出なければ、以下の処理を事前に実行しておくと出ると思います。
// ↓をインクルードする
// #include <locale.h>
set_locale(LC_ALL,"jpn");
MultiByteToWideChar でも上記処理は有効だと思います。
26ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..かけだし(1,882ポイント)
Date: 2008/08/13(水) 14:19
No:20164
|
|
Title: Re:全角文字列取得
|
|
返信、遅くなってすいません。
>Visual C++6.0 で可能かどうか分かりませんが、以下の方法はどうでしょうか。
>もし実行時に日本語部分が出なければ、以下の処理を事前に実行しておくと出ると思います。
御津凪さん参考にさして頂きます。
>自分ならstr.Mid( )で1バイトずつチェックして0x80以上なら2バイト文字なので読み飛ばすようにします。
リファレンスを見ながらやってみたのが
下記の警告がでます。
argument 'const int' から 'char' へ切り詰めます
引数で怒られているみたいなのですが、
使い方をご教授頂けないでしょうか?
#define String str2
while ( fin.ReadString(str) != NULL ) {
//MultiByteToWideChar(CP_THREAD_ACP,MB_PRECOMPOSED,str,256,buf,256);
if(str.Mid(2) >= 0x80 ){
str2 = str.Mid(1);
m_HndTree[0] = m_tree.InsertItem(String,TVI_ROOT);
m_HndTree[1] = m_tree.InsertItem(String,m_HndTree[0]);
308ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(15,434ポイント)
Date: 2008/08/14(木) 07:25
No:20186
|
|
Title: Re:全角文字列取得
|
|
test用のプログラムを作ってみました
参考になりますでしょうか
// 対象文字列
CString str = "2000|02-01-00| いい掛/うう";
// 抜き出し用文字列
CString str2;
// 対象文字列の長さ(バイト数で文字数ではない)だけ繰り返す
for (int i = 0; i < str.GetLength(); i++) {
// 区切り文字でない場所を探す
if (str[i] == '+' || str[i] == '-' || str[i] == '|' ||
(str[i] >= '0' && str[i] <= '9') || str[i] == ' ') {
continue;
}
// 文字列抜き出しの開始
str2.Empty();
while (i < str.GetLength()) {
// 区切り文字があればそこで抜き出し終了
if (str[i] == '+' || str[i] == '-' || str[i] == '|' ||
(str[i] >= '0' && str[i] <= '9') || str[i] == ' ') {
break;
}
// 抜き出し用の文字列に1バイト追加
str2 += str[i];
// 2バイト文字の場合は無条件でもう1バイト追加
// 0xA1-0xDFは半角カナで1バイトなので除外
if ((UCHAR)str[i] >= 0x80 && ((UCHAR)str[i] < 0xA1 || (UCHAR)str[i] > 0xDF)) {
i++;
str2 += str[i];
}
i++;
}
// 確認用のメッセージボックス表示
AfxMessageBox(str2, MB_OK, 0);
}
29ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..かけだし(2,422ポイント)
Date: 2008/08/14(木) 12:20
No:20191
|
|
Title: Re:全角文字列取得
|
|
2バイト文字を弾いてコピーする関数を作っては駄目ですか?
void Copy1ByteOnly(unsigned char *src,unsigned char *dest){ //オーバフロー対策はしてません。
while(*src){
if((*src>=0x81 && *src<=0x9F) || (*src>=0xE0 && *src<=0xFC)) //2byteなら
src++; //取り敢えず1byte進める
else
*dest++=*src;
src++;
}
*dest='\0';
}
78ポイント を落としてしまった。
|
|
|
|
|
Name: いけやん ..かけだし(2,254ポイント)
Date: 2008/08/14(木) 13:55
No:20195
|
|
Title: Re:全角文字列取得
|
|
toyoさん、lbfuvabさん
サンプルありがとうございます。
すいませんが、上記のサンプルで解らない部分があり
自分的には、解らない所を解らないまま書くのは
良くないと思っているので、教えて頂けないでしょう?
@str2.Empty();
リファレンスを見ても「空の文字列を表します。このフィールドは読み取り専用です。 」
としか書いてありませんでした。
これはEmpty()関数で、str2を初期化する又は、空にするという解釈で合っていますか?
お願いします。
A0x80が2バイトなら・・・、0xA1-0xDFは半角カナで1バイト、等と書いてあるのですが
どこで、そういった事が解るのですか?
「文字コード」で検索してもありませんでした。
基本的な事なら、すいません。
教えて頂けないでしょうか?
「○○○」で調べて、出直して来いでも結構です。お願いします。
372ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(15,744ポイント)
Date: 2008/08/14(木) 16:32
No:20201
|
|
Title: Re:全角文字列取得
|
|
str2.Empty(); に関してはstr2の初期化(文字列を空にする)であっています。
str2 = "";
でも同じです。
文字コードの件ですが
「shift jis コード表」あたりで検索すると出てくるかもしれません
実際には1バイト目はlbfuvabさんのように
(*src>=0x81 && *src<=0x9F) || (*src>=0xE0 && *src<=0xFC)
のほうがより正確です。
厳密に言うと2バイト目も0x40〜0x7E, 0x80〜0xFCになるのをチェックしないといけないのでしょうが
今回の例ではASCII文字と半角カナ以外で始まる文字をすべて2バイト文字として扱いました。
228ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..かけだし(2,334ポイント)
Date: 2008/08/14(木) 17:50
No:20211
|
|
Title: Re:全角文字列取得
|
|
toyoさんありがとうございます。
shift jis コード表で調べてみます。
後、本当に勝手なのですが、
これから、ちょっと連休に入るのでサンプル等の返事が
来週の水曜なると思いますので
ご了承下さい。
80ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..入門者(2,747ポイント)
Date: 2008/08/20(水) 11:47
No:20345
|
|
Title: Re:全角文字列取得
|
|
返信遅くなりました。文字列表示できました。
下記で解決しました。
if ( !fin.Open("部材.txt", CFile::modeRead, NULL ) ) {return -1;}
while ( fin.ReadString(str) != NULL ) {
toyoさんのサンプル
m_HndTree[0] = m_tree.InsertItem(String,TVI_ROOT);
}
toyoさんのサンプルを殆ど使わして頂きました。
shift jisの件,
調べてみるとあるページに下記の事が書いてありました。
制御コード
0x00〜0x1F、0x7F
ASCII文字
0x20〜0x7E
半角カタカナ
0xA1〜0xDF
漢字
0x8140〜0x9FFC、0xE040〜0xFCFC
(第1バイト: 0x81〜0x9F、0xE0〜0xFC 第2バイト: 0x40〜0x7E、0x80〜0xFC)
すいません、もう少し聞きたいのですが
>実際には1バイト目はlbfuvabさんのように
>(*src>=0x81 && *src<=0x9F) || (*src>=0xE0 && *src<=0xFC)
>厳密に言うと2バイト目も0x40〜0x7E, 0x80〜0xFCになるのをチェックしないといけないのでしょうが
上記の事を自分なりに解釈すると、
もう少し厳密な、2byte漢字処理が必要という事ですか?
またそれは、何のために必要なんでしょうか?
お手数ですが、お願いします。
413ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 ..かけだし(1,550ポイント)
Date: 2008/08/20(水) 13:11
No:20346
|
|
Title: Re:全角文字列取得
|
|
単純に全角文字を飛ばす等の簡単な処理だと、1バイト目のチェックだけで済みますが、
たとえば、全角文字を検索する場合、1バイト目か2バイト目かを判断しないといけません。
対象となる文字列が正しい(文字化けしていない&ShiftJISコードである)文字列であることが
確定されていない場合は、面倒でも2バイト目もチェックしたほうがいいです。
もし2バイト目が不正な値であれば、読み飛ばすとか、エラーを出すとかして処理すると良いと思います。
193ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..入門者(2,899ポイント)
Date: 2008/08/20(水) 15:33
No:20348
|
|
Title: Re:全角文字列取得
|
|
なるほど、
>対象となる文字列が正しい(文字化けしていない&ShiftJISコードである)文字列であることが
こういう場合とかに必要なんですね。
ありがとうございます。
>もし2バイト目が不正な値であれば、読み飛ばすとか、エラーを出すとかして処理すると良いと思います。
上記を参考に書いてみました。こんな感じで合っていますかね・・・?
if((str[i] >= 0x81 && str[i] <= 0x9F) || (str[i] >= 0xE0 && str[i] <= 0xFC) ||
(str[i] >= 0x40 && str[i] <= 0x7E) || (str[i] >= 0x80 && str[i] <= 0xFC)){
str2 += str[i];
i++;
}
else
AfxMessageBox(strの値が不正です。,MB_OK,0);
i++;
152ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 ..かけだし(2,216ポイント)
Date: 2008/08/20(水) 16:26
No:20349
|
|
Title: Re:全角文字列取得
|
|
2バイト処理の場合、str2への文字の追加は1バイト単位なので、
正しく処理されません。
if文は、1バイト目、2バイト目を一緒にチェックしているため、これも正しく処理されません。
あと、
>AfxMessageBox(strの値が不正です。,MB_OK,0);
文字列が「"」で括られていません。
それと、ここに書くと、文字化けしている文字を読み込んだ場合、
不正値を見つけた回数分メッセージボックスを出してしまうので、
一回メッセージを出したらループから抜けたほうがいいでしょう。
これらをふまえて下記のように修正してみました。
{// ループ内と仮定
char c1,c2;
// 1バイト目判定
c1 = str[i];
if((c1 >= 0x81 && c1 <= 0x9F) || (c1 >= 0xE0 && c1 <= 0xFC)){
// 2バイト目判定
c2 = str[i+1];
if((c2 >= 0x40 && c2 <= 0x7E) || (c2 >= 0x80 && c2 <= 0xFC)){
str2 += c1;// 1バイト目追加
str2 += c2;// 2バイト目追加
i += 2;
}
else{ // 不正値の場合
AfxMessageBox("strの値が不正です。",MB_OK,0);
break; // ループから抜ける
}
}
else{
// 全角文字ではないので読み飛ばす
i++;
}
}
ちなみにこれは str2 に全角文字だけを渡す処理です。
提示して頂いたコードを修正したらこんな感じになりました。
NULL文字とかの確認をしていないので、この処理は不完全です。
全角判定の仕方はなんとなく分かりましたでしょうか?
666ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..入門者(3,067ポイント)
Date: 2008/08/20(水) 16:53
No:20350
|
|
Title: Re:全角文字列取得
|
|
>if文は、1バイト目、2バイト目を一緒にチェックしているため、これも正しく処理されません。
そうなんですか。知りませんでした。
>AfxMessageBox(strの値が不正です。,MB_OK,0);
数々のミスがあり、すいませんでした。
御津凪さん
アドバイスなら、まだしもコードまで書いて頂いて
本当に助かります。
>全角判定の仕方はなんとなく分かりましたでしょうか?
上記のコードが大変、参考になり
尚且つコメントも書いてあるので、僕にも解り易いです。
ありがとうございます。
>NULL文字とかの確認をしていないので、この処理は不完全です。
これは、自分でやってみたいと思います。
168ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..入門者(3,130ポイント)
Date: 2008/08/20(水) 16:58
No:20351
| 解決!
|
Title: Re:全角文字列取得
|
|
すいません。
チェックを付ける事を忘れていました。
boxさん
toyoさん
lbfuvabさん
御津凪さん
みなさんありがとうございました。
63ポイント を手に入れた。
|
|
|
|
Name: k.s ..かけだし(1,233ポイント)
Date: 2008/08/12(火) 23:23
No:20137
|
|
Title: リスト構造のソートについて
|
|
CPad for LSI C-86 Windows2000 の環境です。
質問させていただきます。
「名前」「住所」「生年月日」「電話」の4つの項目を持った構造体を定義しデータを入力できるようにして、1件ごとにメモリの確保を行いデータの追加、削除、終了を選択できるようにして、そのデータを名前順、生年月日順の昇順、降順できるようにする。
という課題なのですがソートの部分がどのようなソートを使い、どう使えばいいのかわりません。
どうかよろしくお願いします。
219ポイント を手に入れた。
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(54,399ポイント)
Date: 2008/08/13(水) 00:49
No:20143
|
|
Title: Re:リスト構造のソートについて
|
|
リスト構造にするのならマージソートを使うのが基本ですね。
> どう使えばいいのかわりません。
マージソートは標準関数にはありませんし、LSI C-86の独自拡張にも無かった気がするので、自分で作るしかありません。自作した関数の使い方は、作った本人が一番よく分かるはずです。
110ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..上級者(23,072ポイント)
Date: 2008/08/13(水) 09:13
No:20151
|
|
Title: Re:リスト構造のソートについて
|
|
qsortを用いても作れるような気がしますが、名前順は自分の力ではローマ字順にしかできません。。日本でいうアイウエオ順にするには・・・どうしたらよいのでしょうね^^;それも自作しないとだめなのかな・・・?^^;
>たかぎさん
マージソート初めて知りましたw今からこれを用いてプログラム作ってきます。まだまだ勉強不足です。。
125ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(123,707ポイント)
Date: 2008/08/13(水) 09:22
No:20152
|
|
Title: Re:リスト構造のソートについて
|
|
> qsortを用いても作れるような気がします
リスト構造の場合はむずかしいのではないでしょうか。
> 日本でいうアイウエオ順にするには
構造体のメンバーに「ふりがな」を設けて、
それでソートすればよいと思います。
60ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..上級者(23,281ポイント)
Date: 2008/08/13(水) 09:35
No:20153
|
|
Title: Re:リスト構造のソートについて
|
|
すみません。。編集しようとしたらすでにレスついていましたw
>リスト構造の場合はむずかしいのではないでしょうか。
すみません。。まだうまく見通しをつける力がないのでイマイチぴんときていないのですが・・・
自分の考えでは、
(1)「最初に登録しますか?」とだして、YESの入力があったら一人分の構造体配列を確保
(2)今までの配列の数より全体の数を把握
(3)名前順、生年月日順を決める
(4)(3)に適したソートへ
....
こんな感じじゃまずいですか?
209ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..中級者(11,777ポイント)
Date: 2008/08/13(水) 09:36
No:20154
|
|
Title: Re:リスト構造のソートについて
|
|
アドレス帳の人数が膨大な量ではない限り、アルゴリズムが理解しやすい
バブルソートで良いかと思います。
num //現在登録されている人数
add //構造体
add.d_name //構造体addのメンバ(カナ読み)
temp // 一時退避
for(i = 0; i < num; i++) //iを0から登録人数までループ
{
for(j = i + 1; j< num; j++) //jを1から登録人数までループ
{
if(strcmp(add[i].d_name,add[j].d_name) > 0) //i番目とj番目をstrcmpで比較
{
temp = add[i]; //先の要素の方が大きければ交換
add[i] = add[j];
add[j] = temp;
}
}
}
私もまだ初心者なので、説明が下手な為、
わからなければバブルソートで検索してみてください。
たかぎさんの言っていたマージソートは私はまだ勉強してないので、
バブルソートを説明させてもらいました。
と、言うことで、同様にマージソートを使用するならばググってみてください。
2倍のポイントを手に入れた! 666ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..中級者(11,923ポイント)
Date: 2008/08/13(水) 09:54
No:20156
|
|
Title: Re:リスト構造のソートについて
|
|
>「名前」「住所」「生年月日」「電話」の4つの項目を持った構造体を定義し...
と、ありますが、boxさんの言うとおり
>> 日本でいうアイウエオ順にするには
>構造体のメンバーに「ふりがな」を設けて、
>それでソートすればよいと思います。
構造体にカナのメンバを入れないと、日本語でのソートは出来ないです。
141ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(123,749ポイント)
Date: 2008/08/13(水) 10:17
No:20158
|
|
Title: Re:リスト構造のソートについて
|
|
> アドレス帳の人数が膨大な量ではない限り、アルゴリズムが理解しやすい
> バブルソートで良いかと思います。
ソート対象が構造体の配列ならばそれでもよいですが、
今回はリスト構造ですからね。
ポインターのつなぎ替えを行なわなければなりませんが、
提示されたコードには見当たりません。
42ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..中級者(11,978ポイント)
Date: 2008/08/13(水) 10:25
No:20159
|
|
Title: Re:リスト構造のソートについて
|
|
>>ソート対象が構造体の配列ならばそれでもよいですが、
>>今回はリスト構造ですからね。
>boxさん
あ・・・orz
大前提を思いっきり無視した回答でしたね(^^;
失礼しました(汗
7ポイント を手に入れた。
|
|
|
|
|
Name: k.s ..入門者(2,651ポイント)
Date: 2008/08/13(水) 23:06
No:20181
|
|
Title: Re:リスト構造のソートについて
|
|
皆様回答ありがとうございます。
いろいろマージソートについて本やサイトで調べてみました。配列のマージソートについては見かけるのですが、リスト構造のマージソートについて説明されているところがなかなか無く行き詰まっている感じです。
とりあえずソート以外のソースです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct list
{
int no;
char name[20];
char birth[10];
struct list *next;
} List;
List *Add(List *list)
{
List *p;
if((p=List*)malloc(sizeof(list))==NULL)
{
printf("エラー\n");
exit(1);
}
p->no = list->no+1;
printf("No.%d\n名前を入力してください", p->no);
scanf("%s",list->name);
printf("生年月日を入力してください");
scanf("%s", p->birth);
p->next = list;
return (p);
}
/*(省略)*/
void main(void)
{
List *list;
int n;
if((list = (List*)malloc(sizeof(List))) == NULL)
{
list->no = 0;
list->next = NULL;
while(1)
{
printf("1:追加 2:削除 3:表示 4:一覧 5:終了\n");
scanf("%d", &n);
switch(n)
{
case 1:
list = Add(list);
break;
case 2:
list = Delete(list);
break;
case 3:
PrintData(list);
break;
case 4:
PrintList(list);
break;
case 5:
Free(list);
exit(0);
default:
continue;
}
}
}
2倍のポイントを手に入れた! 1,738ポイント を手に入れた。
|
|
|
|
|
Name: フリオ ..プログラマー(25,820ポイント)
Date: 2008/08/14(木) 00:21
No:20183
|
|
Title: Re:リスト構造のソートについて
|
|
一手間増えますけど、
リストを作ってから、それをもとに構造体の配列を作り、その配列をソートする
というのはどうでしょう。
63ポイント を手に入れた。
|
|
|
|
|
Name: フリオ ..プログラマー(25,859ポイント)
Date: 2008/08/14(木) 00:27
No:20184
|
|
Title: Re:リスト構造のソートについて
|
|
訂正、
>リストを作ってから、それをもとに構造体の配列を作り、その配列をソートする
"構造体の配列" ー> "構造体へのポインタの配列"
です。
39ポイント を手に入れた。
|
|
|
|
|
Name: k.s ..入門者(2,837ポイント)
Date: 2008/08/14(木) 07:49
No:20188
|
|
Title: Re:リスト構造のソートについて
|
|
上記のソースに一部訂正です。
main関数内
if((list = (List*)malloc(sizeof(List))) == NULL)
{
printf("エラー\n");
exit(2);
}
list->no = 0;
list->next = NULL;
フリオさん、たかぎさんご回答ありがとうございます。
>"構造体の配列" ー> "構造体へのポインタの配列"
についても考えてみたいと思います。
マージソートの手順
1、リストを分割する。
2、分割したリストをそれぞれ整列する。
3、整列した二つのリストをマージする。
とわかったんですが、ポインタを使ってのリストの分割を理解できていないので、そこを勉強したいと思います。
186ポイント を手に入れた。
|
|
|
|
|
Name: k.s ..入門者(2,917ポイント)
Date: 2008/08/19(火) 02:56
No:20310
|
|
Title: Re:リスト構造のソートについて
|
|
何度もすみません。
紹介していただいたサイトを見てもどうしてもできず苦しんでおります。
まずは生年月日を昇順にソートしてみようとしましたが、ソートの部分がどうしてもできませんでした。
どうかご教示お願いいたします。
80ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(15,932ポイント)
Date: 2008/08/19(火) 09:05
No:20311
|
|
Title: Re:リスト構造のソートについて
|
|
if(x->birth <= y->birth) /*2つの先頭要素同士を比較する*/
この部分が間違いです
文字列の比較になるので
if (strcmp(x->birth, y->birth) <= 0)
ですね
2倍のポイントを手に入れた! 102ポイント を手に入れた。
|
|
|
|
|
Name: non ..ぴよぴよ(871ポイント)
Date: 2008/08/19(火) 17:07
No:20314
|
|
Title: Re:リスト構造のソートについて
|
|
学校の課題で、マージソートをやったことがないのにいきなり、リスト構造でマージソートをやれなんて
問題を先生がだすのかなぁ?おそらく、マージソートを使った並び替えでなく、ただたんに、ひとつずつ
データを繋ぎ換えていけって課題じゃないでしょうか?
生年月日を文字列にして比較するのは難しそうなので、名前でソートしたらこのようになります。
先頭から1つずつリストを見ていき、別のリストを作っていってます。
番兵を使った方が、特別解が減っていいとおもいますが・・・
void Sort(void)
{
person *p,*q,*r,*new_head;
new_head=NULL;
while(head!=NULL){
p=head;
head=head->next;
if(new_head==NULL){
new_head=p;
new_head->next=NULL;
}
else{
for(r=q=new_head;q!=NULL && strcmp(p->name,q->name)>0;r=q,q=q->next){}
if(r==q){
p->next=r;
new_head=p;
}
else{
p->next=r->next;
r->next=p;
}
}
}
head=new_head;
}
451ポイント を手に入れた。
|
|
|
|
|
Name: k.s ..入門者(2,978ポイント)
Date: 2008/08/19(火) 23:20
No:20343
| 解決!
|
Title: Re:リスト構造のソートについて
|
|
toyoさん、nonさんありがとうございます。
なんとかマージソートを使ってソートすることができました。
今回は自分にとって本当に難しい課題だったので、すごく時間も掛かってしまいましたが、
みなさんのアドバイスのおかげでとても勉強になりました。
本当にありがとうございました。
61ポイント を手に入れた。
|
|
|
|
|
Name: 組木紙織 ..熟練のプログラマー(59,700ポイント)
Date: 2008/08/20(水) 00:18
No:20344
|
|
Title: Re:リスト構造のソートについて
|
|
>学校の課題で、マージソートをやったことがないのにいきなり、リスト構造でマージソートをやれなんて
マージソートにした理由は
たかぎさんの
>リスト構造にするのならマージソートを使うのが基本ですね。
が原因です。
一般に、実用的にはO(N*logN)のソートを使うべきで、特にリストのソートだとマージソート
を使うべきだと思います。
この課題が学校の課題だとすると、マージソートは少しやりすぎな感じもありますが、
先生によったら加点もあるんじゃないかと思います。
十分プログラミングの練習になったはずです。
こんな実装もあるんだよということで、参考までに。
[Code Zine]マージ・ソート : 巨大データのソート法
ttp://codezine.jp/a/article/aid/2886.aspx
345ポイント を手に入れた。
|
|
|
|
Name: そい。 ..かけだし(1,464ポイント)
Date: 2008/08/19(火) 16:29
No:20313
| 解決!
|
Title: 構造体配列と重複判定。
|
|
自己解決いたしました。
このような場所をお借りできたこと、感謝いたします。
こんにちは。
重複判定をしたいのですが、途中でつまづいてしまいました。
データを
1 - 2
2 - 1
と入力しても、同じ「1-2」として扱い構造体の配列に格納したいのです。
現在は、データの大小を比較し、
1 - 2
1 - 2
であるというところまでは考えたのですが、
そこからどう判定し配列に格納すればよいかがわかりません。
下記プログラムの最後の4行が格納なので(現在は入力そのままが格納されてしまいます)、そこについてアドバイスを頂けないでしょうか?
〜略〜
最後の4行
Data[i].next[Data[i].count] = j;
j = Data[i].next[Data[i].count++];
Data[j].next[Data[j].count] = i ;
i = Data[j].next[Data[j].count++];
↓
for ( a=0;a<Data[i].count;a++ ){
if ( Data[i].next[a] == j ){
.....
}
}
とifで比較する事で解決できました。
777ポイント を手に入れた。
|
|
|
|
Name: non ..ぴよぴよ(903ポイント)
Date: 2008/08/19(火) 17:31
No:20317
|
|
Title: Re:構造体配列と重複判定。
|
|
最後の4行
Data[i].next[Data[i].count] = j;
j = Data[i].next[Data[i].count++];
Data[j].next[Data[j].count] = i ;
i = Data[j].next[Data[j].count++];
何をしたいのか、もう少し説明をお願いします。
構造体のメンバーの意味がわかりません。
32ポイント を手に入れた。
|
|
|
|
|
Name: そい。 ..かけだし(1,566ポイント)
Date: 2008/08/19(火) 19:13
No:20318
| 解決!
|
Title: Re:構造体配列と重複判定。
|
|
自己解決しました。
わざわざ覗いてくださった皆様、ありがとうございました。
>nonさん
構造体は、リスト構造をポインタ無しであらわしたかったものです。
プログラムとしては、接点のリストを作るというものでした。
説明不足で申し訳ございませんでしたorz
きちんと、疑問点が伝わるような文章になるよう、気をつけますね。
102ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(695,162ポイント)
Date: 2008/08/19(火) 19:22
No:20321
|
|
Title: Re:構造体配列と重複判定。
|
|
この掲示板を利用される方の中には質問される方だけでなく、
似たような質問が過去に無かったか検索して解決される方も多くいらっしゃるようです。
そこで、出来るだけ多くの質問を過去ログに残せたらと思っています。
ですから、もし自己解決された場合はその解決方法を明記の上、トピを解決にしてくださると助かります。
どんなトピでもなるべく消したくないのですが、
もしそれでも消して欲しいということでしたら消しますのでお答え頂けると幸いです。
115ポイント を手に入れた。
|
|
|
|
|
Name: そい。 ..かけだし(1,676ポイント)
Date: 2008/08/19(火) 19:35
No:20322
| 解決!
|
Title: Re:構造体配列と重複判定。
|
|
>管理人さま
お返事ありがとうございます。
そうですね、私も過去ログはとても助かっています。
トピを解決にする事、そして解決方法を明記する事了解いたしました。
削除はそうですね、このような質問でも役に立つことがあるならば嬉しいので、
少々恥ずかしくはありますが、このままでお願いいたします。
110ポイント を手に入れた。
|
|
|
|
Name: h2 ..ぴよぴよ(140ポイント)
Date: 2008/08/18(月) 18:30
No:20293
|
|
Title: UDPマルチキャスト
|
|
こんにちは!
UDP/IPマルチキャストに関しての質問です。
仮の送信プログラムを作成して、送信したデータが受信できることを
確認するプログラムを作らなければいけないのですが、どんな感じに
したらいいでしょうか??
ちなみにOSはsolaris8で
言語はCです。よろしくお願いします。
140ポイント を手に入れた。
|
|
|
Name: PIRO ..ぴよぴよ(414ポイント)
Date: 2008/08/17(日) 22:04
No:20279
|
|
Title: タイトル画面からの移動方法のについてです。
|
|
どうもはじめまして。
はじめての投稿失礼いたします。
いつもこのサイトを見て、ゲームのプログラミングの勉強をさせていただいています。
本当にこのサイトにはお世話になっています。
いきなりですみません。
今私は、タイトル画面でAを押すと次の新たな画面を表示する、というプログラムを書いているところです。
しかし、どうしてもうまく作ることができません。
なにかヒントをください。
お願いします。
以下が私が書いたプログラムです。
できましたら、助言をいただきたいのですが・・・・
#include "DxLib.h"
//main関数はタイトル画面の表示です。
void main(){ int white=GetColor(255,0,255);
int y=0;
while(ProcessMessage()==0&&CheckHitKey(KEY_INPUT_ESCAPE)==0){
ClsDrawScreen();
DrawString(170,y,"■",white,TRUE);
DrawString(250,0,"NEWGAME",white,TRUE);
DrawString(250,50,"ギャラリー",white,TRUE);
SetDrawScreen(DX_SCREEN_BACK);
if(CheckHitKey(KEY_INPUT_DOWN)){
y+=50;}
else if(y>50){
y=0;}
else if(CheckHitKey(KEY_INPUT_A)){ClsDrawScreen();break;}
ScreenFlip();
}}
//sub関数はタイトル画面でAを押すと表示される画面についてのものです。
void sub(){
int red=GetColor(255,0,0);
while(ProcessMessage()==0&&CheckHitKey(KEY_INPUT_ESCAPE)==0){
DrawString(250,100,"ギャラリー",red,TRUE);
}
}
int WINAPI WinMain(HINSTANCE hI,HINSTANCE hP,LPSTR lpC,int nC){
ChangeWindowMode(TRUE);
if(DxLib_Init()==-1)return -1;
main();
sub();
DxLib_End();
return 0;
}
414ポイント を手に入れた。
|
|
|
|
Name: 木霊 ..中級者(12,666ポイント)
Date: 2008/08/17(日) 23:58
No:20284
|
|
Title: Re:タイトル画面からの移動方法のについてです。
|
|
本題に入る前に色々突っ込んでみます
まず「タイトルを表示する」関数の名前を「main」以外にした方がいいと思います
少なくともBCCではコンパイルが通りません
関数ごとにwhile(ProcessMessage()==0&&CheckHitKey(KEY_INPUT_ESCAPE)==0){ ・・・}が
あったり、ループ内でSetDrawScreen(DX_SCREEN_BACK);もよくないです
各色はプログラム内で変更する必要がない(Whiteを白以外にはしない)ので、
グローバルな領域でconst宣言してもいいと思います
本題ですが、Sub()関数内にScreenFlip();がありません
「ギャラリー」と表示されないだけならこれでいけます(mainを違う名前にした上で)
ちなみにこのプログラムではWhiteは「紫色」になってますよ
312ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..中級者(12,849ポイント)
Date: 2008/08/18(月) 00:46
No:20286
|
|
Title: Re:タイトル画面からの移動方法のについてです。
|
|
少し訂正です
> 各色はプログラム内で変更する必要がない(Whiteを白以外にはしない)ので、
> グローバルな領域でconst宣言してもいいと思います
の部分ですが、Dxlibを初期化する前にGetColor関数は呼べない(正常に動作しない)ので、
#define White GetColor ( 255, 255, 255 )
とするか、それぞれの値を直接const宣言する変数に入力するしかないようです
2倍のポイントを手に入れた! 168ポイント を手に入れた。
|
|
|
|
|
Name: PIRO ..ぴよぴよ(543ポイント)
Date: 2008/08/18(月) 07:42
No:20288
| 解決!
|
Title: Re:タイトル画面からの移動方法のについてです。
|
|
<管理人さん
すみませんでした、規約を守らずに・・・・
これからは、ルールを守った上での行動をすることを誓います。
管理人さんのおかげで、プログラムをより見やすくかつ便利なものを書くことができました。
ありがとうございます。
これからも日々精進します。
129ポイント を手に入れた。
|
|
|
|
|
Name: PIRO ..ぴよぴよ(645ポイント)
Date: 2008/08/18(月) 07:46
No:20289
| 解決!
|
Title: Re:タイトル画面からの移動方法のについてです。
|
|
<木霊さん
木霊さんが言われたとおり、ScreenFlip();を入れることによって、解決することができました。
適切でかつ分かりやすい回答をありがとうございました。
本当に助かりました。
これからは、見やすいプログラムを書くことに努めていきます。
本当に自分のぐちゃぐちゃなプログラムを見てくださり、ありがとうございました。
102ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(692,503ポイント)
Date: 2008/08/18(月) 08:24
No:20290
|
|
Title: Re:タイトル画面からの移動方法のについてです。
|
|
>すみませんでした、規約を守らずに・・・・
いえいえ。
>ScreenFlip();を入れることによって、解決することができました。
今回はこれで解決すると思いますが、
シーンが変わるたびに
ProcessMessage()やClsDrawScreen(),ScreenFlips()などを書くのは無駄なので、
シーンによる処理の分岐は上で示したリンク先のサンプルのように
同じループ内でswitchかifで条件分岐した方がいいと思います。
なお、ClsDrawScreenはふるいバージョンの関数なので、ClearDrawScreen()をお使い下さい。
もし古いバージョンのDXライブラリをお使いでしたら
最新バージョンに更新することをお勧めします。
229ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..中級者(12,911ポイント)
Date: 2008/08/18(月) 13:30
No:20292
|
|
Title: Re:タイトル画面からの移動方法のについてです。
|
|
もう解決したみたいですので一応作っておいたのを添付します
最初のコードとなるべく同じ動作をするようにしてますので参考程度に
62ポイント を手に入れた。
|
|
|
|
|
Name: PIRO ..ぴよぴよ(766ポイント)
Date: 2008/08/18(月) 19:37
No:20296
| 解決!
|
Title: Re:タイトル画面からの移動方法のについてです。
|
|
<管理人さん
本当にこんな私に助言をくださり、ありがとうございます。
はい、無駄を省いていきたいと思います。
あと、最新のDXライブラリをダウンロードします。
本当に無知な私に教えてくださり、ありがとうございました。
とても親切な回答をくださり、助かりました。
121ポイント を手に入れた。
|
|
|
|
|
Name: PIRO ..ぴよぴよ(874ポイント)
Date: 2008/08/18(月) 19:40
No:20297
| 解決!
|
Title: Re:タイトル画面からの移動方法のについてです。
|
|
<木霊さん
なんか本当に親切にしてくださって、ありがとうございます。
ありがたく、参考程度に見させてもらいます。
本当に感謝です。
親切な方がいらっしゃって、本当に助かりました。
初心者なので、おちげーをまず作っていくことを目指したいと思います。ありがとうございました。
108ポイント を手に入れた。
|
|
|
|
Name: 西村 ..入門者(2,639ポイント)
Date: 2008/08/12(火) 17:05
No:20115
|
|
Title: 平方根に関する質問
|
|
久々に質問をさせていただきます。
平方根の関数を使おうと思っているのですが、何故かさっぱりコンパイラを通ってくれません。色々サイトを見て回ったのですが、どうにも原因がわかりません。以下が取り合えず簡略化したソースです。
#include<stdio.h>
#include<math.h>
typedef struct{
double x;
double y;
}Pos;
int main(void)
Pos pos1;
Pos pos2;
double dist;
puts("点1の座標を入力してください");
printf("X:"); scanf("%lf", &pos1.x);
pirntf("Y:"); scanf("%lf", &pos1.y);
puts("点2の座標を入力してください");
printf("X:"); scanf("%lf", &pos2.x);
pirntf("Y:"); scanf("%lf", &pos2.y);
dist = sqrt(pos1.x);
printf("二点間の距離は%lfです\n", dist);
return(0);
}
本当は二点間の距離を出させるつもりだったのですが、sqrt自体が何故かコンパイラを通らないものだからpos1.xだけです。
よろしくお願いします。
403ポイント を手に入れた。
|
|
|
|
Name: GPGA ..熟練のプログラマー(49,475ポイント)
Date: 2008/08/12(火) 18:05
No:20120
|
|
Title: Re:平方根に関する質問
|
|
エラーが出ているのは本当にsqrtですか?
上記のプログラムをコンパイルしたところ、エラーが出た個所は
・main関数の { がない
・printfがpirntfになっている箇所がある
その他、問題になりそうなところがあります。
printf("二点間の距離は%lfです\n", dist);
にて、scanfの場合double型を取得するのは %lf ですが
printfの場合 double型を出力するのは %f になります。
207ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(54,287ポイント)
Date: 2008/08/12(火) 18:06
No:20121
|
|
Title: Re:平方根に関する質問
|
|
処理系もエラーの内容も不明ですので、正確なことは何も分かりませんが...
> printf("二点間の距離は%lfです\n", dist);
printfの書式に%lfを使っているということはC99対応の処理系でしょうか?
-lmオプションを付ければエラーがなくなるかもしれませんので、試してみてください。
89ポイント を手に入れた。
|
|
|
|
|
Name: 西村 ..入門者(2,802ポイント)
Date: 2008/08/12(火) 18:19
No:20122
|
|
Title: 平方根に関する質問
|
|
素早い返答ありがとうございます。
GAGPさんから御指摘いただいた箇所 (mainの{、printf、%lf) は、こちらの書き込み間違いでした。本来のプログラムではちゃんと書けています。すみません。
/tmp/ccMABD1D.o(.text+0xd0): In function `main':
: undefined reference to `sqrt'
エラーに関しては、上の様な文が返されてきます。普段あまり使わない学校のパソコンでプログラムしていたのでよく解らないのですが・・・
163ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(15,389ポイント)
Date: 2008/08/12(火) 19:24
No:20129
|
|
Title: Re:平方根に関する質問
|
|
#include<math.h>
math.hの関数を使うときはコンパイル時にlibmをリンクしないといけません。
リンクの仕方はたかぎさんが書いておられます。
50ポイント を手に入れた。
|
|
|
|
|
Name: 西村 ..入門者(2,908ポイント)
Date: 2008/08/12(火) 20:13
No:20134
|
|
Title: Re:平方根に関する質問
|
|
返答ありがとうございます。
さっそく試して……と言いたいところなのですが、学校から帰って来てしまった上に、今日から三日間ほど学校は盆休みで完全休校に入ってしまいます。なので、とりあえず結果は四日後に……
106ポイント を手に入れた。
|
|
|
|
|
Name: 西村 ..入門者(2,957ポイント)
Date: 2008/08/18(月) 11:40
No:20291
| 解決!
|
Title: 平方根に関する質問
|
|
四日後といいながら結果が遅れてしまいましたが、無事コンパイルを通すことができました。返答を下さった皆様ありがとうございました。
49ポイント を手に入れた。
|
|
|
|
Name: array ..上級者(17,539ポイント)
Date: 2008/08/17(日) 18:44
No:20271
|
|
Title: ウィルスバスター2008を回避
|
|
環境はOS:Vista Visual C++2008Express Edition です。
デバック開始(F5)をすると、ウィルスバスター2008が『不審な変更を拒否しました』と、原因は分りませんが拒否されます。(ソフト起動時です)
こうなると、シューティングに使うキー入力でShiftが反応しなくなります。他Z、X、Escなどは反応するのですが、とりあえずShiftのみだったので放置していおり、適当な頃合いで改善しようと思っていたのですが、いざ改善を試みても、何をすれば良いのか分りませんでした。
当時は(龍神録を起動してもウィルスバスターは反応しなかったので)ビルドしてできた実行ファイルから起動すれば回避できるのかと思っていたのですが関係なかったみたいです。
・・・解決できなかったのでとりあえず放置しており、それらしい原因が分ってから改善すればいいと思っていました。
それで、これが原因なのかなというのを見つけたので質問させてもらいます。どうやらDXライブラリを使って作成したソフトは勝手にインターネットに接続するらしいのです、多分それをウィルスバスターが感知しているのでは?と思います。
なので、勝手にインターネットに接続しないようにすれば良いのか、と思ったのですがDXライブラリ リファレンスを見ても使えそうなのがありませんでした。
原因自体間違ってるのかもしれませんが、ビルドしてできた実行ファイルをウィルスバスターに拒否されない方法を知ってる方がいましたら、ご教授お願いします。
(というのもせっかく作ったものを、使ってもらう側にいちいちウィルスバスターで除外設定させるのも、あれだと思ったので)
637ポイント を落としてしまった。
|
|
|
|
Name: Justy ..ハッカー(215,578ポイント)
Date: 2008/08/17(日) 19:57
No:20274
|
|
Title: Re:ウィルスバスター2008を回避
|
|
これと同じ現象のようですね。
ウイルスバスターを最新版(多分 5.101.0以降?)にすると出なくなる、
という話が出てますが、とりあえずアップデートしてみてはどうでしょうか。
>DxLibで作ったソフトを起動すると勝手にインターネットに接続しようとする。
インターネットオプションで「発行元証明書の取り消しを確認する」にチェックが
入っていませんか?
もしそうだとすれば DXライブラリじゃなくて、DirectDrawドライバの有効性の
確認の為アプリ内でOSがアクセスしにいってるんじゃないかと。
>ビルドしてできた実行ファイルをウィルスバスターに拒否されない方法を
>知ってる方がいましたら、ご教授お願いします。
あちこちに書かれている通り、確実なのは不正変更の監視設定から、
DLLインジェクションの項目のオフにするか、例外設定でそのプログラムを
指定するしかないと思います。
ただ可能性はかなり低いのですが(ダメもとで)、
SetKeyboardNotDirectInputFlag(FALSE);
SetUseDirectInputFlag(FALSE);
を呼んでから DXライブラリを初期化するとうまくいくかもしれません。
完全に DirectInputとジョイパッドを使わない、ということであれば
他にも手はありそうですが・・・。
676ポイント を手に入れた。
|
|
|
|
|
Name: array ..上級者(18,177ポイント)
Date: 2008/08/17(日) 20:29
No:20275
|
|
Title: Re:ウィルスバスター2008を回避
|
|
>ウイルスバスターを最新版(多分 5.101.0以降?)にすると出なくなる
一応常に最新に更新してるのですが
プログラムバージョン:16.10.1123
検索エンジンのバージョン:8.710.1002
になってるみたいです。
>Justyさん
の言うそのURLと同じ現象みたいですが、解決方法として、私の伝えたい事がやっとわかりました。
私はウィルスバスターやインターネットオプションなどの変更は一切せず。
実行ファイルを起動するという動作のみでウィルスバスターに感知されなければ良いと思っています。
要するに「四聖龍神録」と同じ状態まで持っていきたいと思っているのですが・・・。
その為にコンパイラ(?)の設定やプログラムで可能だと思っています。
>SetKeyboardNotDirectInputFlag(FALSE);
>SetUseDirectInputFlag(FALSE);
試してみましたが、ウィルスバスターは普通に感知しました。
>DxLibで作ったソフトを起動すると勝手にインターネットに接続しようとする。
に関しては、インターネットに勝手に接続しなければウィルスバスターは反応しなくなるのではと思った程度です。
そもそも一番の疑問なのですが「四聖龍神録」はなぜウィルスバスターに引っかからないのでしょうか。
442ポイント を手に入れた。
|
|
|
|
|
Name: array ..上級者(18,408ポイント)
Date: 2008/08/17(日) 21:27
No:20276
| 解決!
|
Title: Re:ウィルスバスター2008を回避
|
|
>Justyさん
SetKeyboardNotDirectInputFlag(FALSE);
SetUseDirectInputFlag(FALSE);
色々調べてみたら、これもDXライブラリ関数だったんですね。これを呼ぶとウィルスバスターは感知しますが、使っているキー判定は正常に取得できました。
他にもどの部分でウィルスバスターが感知しているのか分れば1づつ改善していって直るのかもしれませんが、どこを見れば良いか分らないので。
とりあえず不便も無くなったので もう少し知識がついてからもう一度この問題について調べてみたいと思います。
管理人さん、Justyさん有難うございましたm(_ _*)m
231ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(692,043ポイント)
Date: 2008/08/17(日) 21:27
No:20277
|
|
Title: Re:ウィルスバスター2008を回避
|
|
あぁ、除外設定と仰っているのが例外処理のことだったのですね。
う〜ん、四聖龍神録を作るときに特にそんなことを意識した事は無いですねぇ。。。
サンプル実行用フォルダで作った実行ファイルや、龍神録プログラミングの館で作った実行ファイルはひっかからないのでしょうか?
124ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(215,980ポイント)
Date: 2008/08/17(日) 21:43
No:20278
|
|
Title: Re:ウィルスバスター2008を回避
|
|
>一応常に最新に更新
なるほど。
>試してみましたが、ウィルスバスターは普通に感知しました
あ、SetKeyboardNotDirectInputFlag()の方は TRUEを指定しないと
いけなかったような気もしますが、多分ダメでしょうね。
>実行ファイルを起動するという動作のみでウィルスバスターに
>感知されなければ良いと思っています
私はウイルスバスターを持っていないので、テストができないので推測になりますが、
多分現状、打つ手は上記の方法以外手はないと思います。
>他にもどの部分でウィルスバスターが感知しているのか分れば
DLLを読み込んだだけでダメ、という話も・・・。
2007-11-12 - かそくそうち
ttp://d.hatena.ne.jp/y-hamigaki/20071112#1194879821
402ポイント を手に入れた。
|
|
|
|
|
Name: array ..上級者(17,530ポイント)
Date: 2008/08/17(日) 22:21
No:20280
|
|
Title: Re:ウィルスバスター2008を回避
|
|
サンプルプログラム実行用フォルダ でも 龍神録プログラミングの館で作った実行ファイル でも 現象は同じです。
他にも色々検証し、最終的に
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
みたいDXライブラリ初期化処理のみでもウィルスバスターは検知するみたいです^^;
他に解決案が思い浮かばないので、XPがあるので導入を試みてみたいと思います。(メモリも容量もインターネットも繋いでないので稀にしか使ってませんでしたが)
軽そうなので2005を入れようかと考えてるのですが C++ 2005では 有償版と無償版があるみたいなのですが、何か違う部分があるのでしょうか。
>Justyさん
> あ、SetKeyboardNotDirectInputFlag()の方は TRUEを指定しないと
>いけなかったような気もしますが、多分ダメでしょうね。
SetKeyboardNotDirectInputFlag()はTRUEでもFALSEでも動作変わらないみたいです。呼び出しても、あまり関係ないみたいです。
ちなみにJustyさんが作成したと思われる
DXライブラリプロジェクト
自動生成ツール
のCreateDxLibProject.exeを実行してもウィルスバスターは反応しませんでした。
>DLLを読み込んだだけでダメ、という話も・・・。
よくよく見れば、ウィルスバスターもDLLを検知してるみたいです。
こうなるとXPでコンパイルしても同じ結果になりそうですが、とりあえずXP起動してみます。
ちなみに最終的にDebugからReleaseに変更してビルドをすると思うのですが、その際 他にも変更が必要だったりするのでしょうか?
878ポイント を落としてしまった。
|
|
|
|
|
Name: Justy ..ハッカー(216,156ポイント)
Date: 2008/08/17(日) 23:54
No:20283
|
|
Title: Re:ウィルスバスター2008を回避
|
|
>FALSEでも動作変わらないみたいです
やっぱりそうでしたか。
joyGetDevCaps()や joyGetPostEx()でもウイルスバスターが反応したらしいので、
多分ダメだろうなとは思っていたのですが。
あゆじゅん: 認識している不具合について
ttp://jundatta.cocolog-nifty.com/blog/2008/07/post_4d12.html
>CreateDxLibProject.exeを実行してもウィルスバスターは反応しませんでした
あー、それは DirectXとか DXLibとかを直接実行するものじゃないんで・・・。
176ポイント を手に入れた。
|
|
|
|
|
Name: array ..上級者(17,568ポイント)
Date: 2008/08/18(月) 00:59
No:20287
|
|
Title: Re:ウィルスバスター2008を回避
|
|
やっとDL&インスト終ってテストプログラム実行したらダメでした。
とりあえず、Justyさんの解決案でキー入力は正常(?)にできるようになったので、ウィルスバスターの警告は未だに解決しませんが、とりあえず、このままにしておきます。
38ポイント を手に入れた。
|
|
|
|
Name: こめかみ ..中級者(14,544ポイント)
Date: 2008/08/17(日) 05:51
No:20263
|
|
Title: 龍神録の館22章について
|
|
報告です。
●22章
---- out.cpp のoutmain関数を変更 ----
//当たり判定メイン
void out_main(){
cbom_and_enemy();
cshot_and_enemy();
enemyshot_and_ch();
}
out.cpp のoutmain関数を変更
↓
out.cpp のout_main関数を変更
です。
●22章---- out.cpp の以下の任意の箇所を変更 ----の中の
//ボムと敵のの処理
void cbom_and_enemy(){
int s;
if(bom.flag!=1)return;
//ボムと敵のの処理
↓
//ボムと敵の処理
です。
●22章中盤の解説文
・・・
の3つを用意しました。
bright_set_tで用意する変数は常に255にしておき、暗くする必要があるときに変更します。
don_tで用意する変数は今までどおりの使い方をして登録、計算し、画面を揺らしたい時に使います。
ボムの変数は今までどおりの使い方と同じです。
下準備が終わりました。では実際にエフェクトの計算をやってみましょう。
・・・
don_tで用意する変数
↓
dn_tで用意する変数
です。
●22章---- effect.cpp を変更 ----の中の
void enter_bom()の関数内の注釈
・・・
effect[k].brt=0;//α値
effect[k].ang=PI/2;//画像のムキ
・・・
"//画像のムキ"の"ムキ"ですが
漢字のほうがいいと思います。なんとなくですが。
●22章---- ini.cpp first_ini()関数内以下追加 ----
//例:弾0は76x76ピクセルで、5色あり、当たり範囲17ピクセル
input_bullet_info(&bullet_info[0],76, 76, 5,17.0);
input_bullet_info(&bullet_info[1],22, 22, 6, 4.0);
input_bullet_info(&bullet_info[2], 5,120,10, 2.5);
input_bullet_info(&bullet_info[3],19, 34, 5, 2.0);
input_bullet_info(&bullet_info[4],38, 38,10, 2.0);
input_bullet_info(&bullet_info[5],14, 16, 3, 3.5);
input_bullet_info(&bullet_info[6],14, 18, 3, 2.0);
input_bullet_info(&bullet_info[7],16, 16, 9, 2.5);
input_bullet_info(&bullet_info[8],12, 18,10, 1.5);
input_bullet_info(&bullet_info[9],13, 19, 3, 2.0);
・・・
ここの項目ですが、
21章で既に追加されているので、無くてもいいのではないでしょうか。
以上です。
他にも追加を指摘してないものはあるにはありましたが。
そのあたりはどこかの章で言っていたように、
ダウンロードできるプロジェクトと見比べていくということですよね。
龍神録の館最高です。更新がんばってください。
1,004ポイント を手に入れた。
|
|
|
Name: situmon ..ぴよぴよ(10ポイント)
Date: 2008/08/15(金) 22:21
No:20253
|
|
Title: 透過について
|
|
透過をしたいのですが
こうなってしまいます。
*添付画像*
いろいろ読みましたがわかりません。
教えてくれませんか?
10ポイント を手に入れた。
|
|
|
|
Name: kazuoni ..上級者(23,616ポイント)
Date: 2008/08/15(金) 22:57
No:20254
|
|
Title: Re:透過について
|
|
んん〜もっと詳しく書いてもらわないと何とも言えないですが・・・
DXライブラリを使っているのですか?そうならば
http://dixq.net/g/#4
を読んでみてください。
どこの画像を透過させたいのか、situmonさんがどのようなコードをかいているのか全く分からないので、もう少し詳しく書いてもらえるとよい回答が得られると思います。
161ポイント を手に入れた。
|
|
|
|
|
Name: array ..上級者(18,176ポイント)
Date: 2008/08/15(金) 22:58
No:20255
|
|
Title: Re:透過について
|
|
一応DXLib 関数で透明色を指定できるみたいですが・・・背景が真白の場合
// 透過色を変更
SetTransColor( 255 , 255 , 255 ) ;
で指定すれば良いんじゃないでしょうか。
ただこの場合、拡張子が.bmpでないと効果がないのかもしれません。もしかしたら.jpegでも.pngでも普通に使えるのかもしれませんが、使った事がないのであまり分りません。
詳しくは本家リファレンスを見れば良いと思います。
他には、PhotoShopみたいなソフトウェアがあれば背景を透明にして保存する事もできるみたいです。
134ポイント を手に入れた。
|
|
|
|
|
Name: めいらる ..ぴよぴよ(674ポイント)
Date: 2008/08/15(金) 23:32
No:20256
|
|
Title: Re:透過について
|
|
画像の透過したい部分を完全な黒にしておけば特に設定することなくその部分が透明になってくれると思いますよ♪(・∀・)
画像の形式はBMPやPNG等がいいです。JPEGにするときれいに透過されません
ドット絵の編集をEDGEなどのツールを使って行い、透明にする部分を指定して保存しておく方法もあるのかな…?
129ポイント を手に入れた。
|
|
|
|
|
Name: tkmakwins15 [URL] ..比類無きプログラマー(84,809ポイント)
Date: 2008/08/15(金) 23:40
No:20257
|
|
Title: Re:透過について
|
|
Dxライブラリ本家によると、読み込める画像方式によらず、最終的には同じ方式でメモリ上に存在するそうなので、透過されるかどうかの形式による違いがでる事は無いと思います。
JPEGがうまく透過されないのは、JPEGが不可逆圧縮を行ってるからです。JPEGは特に同じ色が続く部分について、似て非なる色に変化する事があります。ですから、透過したい色の部分が、透過しない色(人の目では分かりづらいんですが…)にしょっちゅう変化します。
ということも考えると、透過しない画像についてはjpgでもかまわないということになります。透けさせない背景などには向いているかも…
205ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..ぴよぴよ(105ポイント)
Date: 2008/08/17(日) 10:19
No:20265
|
|
Title: Re:透過について
|
|
黒にしたら一応透過できましたが
シューティングゲームの館でつかっている素材は黒ではなく白なので・・・
33ポイント を手に入れた。
|
|
|
|
|
Name: めいらる ..ぴよぴよ(736ポイント)
Date: 2008/08/17(日) 11:55
No:20267
|
|
Title: Re:透過について
|
|
あ、確かあれは正確には白ではなくて透明だと思います。フォトショップやそれなりのペイントツール(Windows標準のはだめです)で開くとわかります(αチャネル対応のもの)
私の添付した画像もダブルクリックで開くと弾の周りが白く見えますがその部分は透明です
PNG形式の画像にはαチャネルという一ピクセルごとに透明度のようなものを指定できるので…
62ポイント を手に入れた。
|
|
|
|
Name: ななし ..ぴよぴよ(142ポイント)
Date: 2008/08/16(土) 11:08
No:20258
|
|
Title: 管理人様へ
|
|
全ての章をやっと読み終え、いざ自分もゲームを作ってみよう・・・
となると、どんな工夫が欲しいのか全く検討が付きません。
宜しかったらですが、今まで作ったシューティングゲームの中で
ココのプログラムは少し凝っています。などのような
プログラムソースをお見せしてもらう事はできないでしょうか?
142ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(104,333ポイント)
Date: 2008/08/16(土) 11:23
No:20259
|
|
Title: Re:管理人様へ
|
|
まずは自分が何をしたいのかをハッキリさせて、それを実現するにはどうしたらよいのかという形で質問するべきでしょう。
今のままでは、あまりにも質問が抽象的ですし、ソースを公開せよというのは都合が良すぎです。
94ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(691,758ポイント)
Date: 2008/08/16(土) 11:48
No:20260
|
|
Title: Re:管理人様へ
|
|
>ななしさん
>どんな工夫が欲しいのか全く検討が付きません。
という事ですが、どういうことでしょう?
どうやってゲームを作っていけばいいかわからないということでしょうか?
それとも、ゲームを作っていく中でどうやって工夫したらいいかわからないということでしょうか?
その工夫といっても、ゲームを製作する中で工夫することなんて言い出したらきりが無いので、
何がしたいのか、限定してもらわないとアドバイスがしにくいです。
そうですね〜・・・、
最初の段階で工夫することを強いていうならば、機能をしっかりとわけることでしょうか。
登録・計算・描画・音楽再生など色々すべきことはありますが、これらを
ごっちゃ混ぜに書いてしまったのでは拡張性も低く、管理もしにくいと思います。
ゲームプログラムのサンプルはいくつも館で紹介しているので、
詳しくはそちらをご覧下さい。
DXライブラリの基本的な使い方も、ゲームの作り方も、サンプルも館にあるので、
特にココでいう事は何もありません。
ゲーム製作頑張って下さい。
296ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(54,705ポイント)
Date: 2008/08/16(土) 19:38
No:20261
|
|
Title: Re:管理人様へ
|
|
> となると、どんな工夫が欲しいのか全く検討が付きません。
字面どおりに解釈すると、「工夫が欲しい」の(省略されている)主語は「管理人様が」だと思いますが、それだと意味が理解できません。
真意はどこにあるのでしょうか?
2倍のポイントを手に入れた! 96ポイント を手に入れた。
|
|
|
|
Name: B壱 ..入門者(2,801ポイント)
Date: 2008/08/15(金) 15:53
No:20237
|
|
Title: デバックにて・・・。
|
|
先日のアクションゲームの件、ありがとうございました。m(_ _)m
おかげさまで楽しくプログラムを製作させていただいております。^^
そこで、プログラムを作成したところバグが発生してしまいました。
コメントでは説明しにくいので、画像を添付させていただきました。
@設定していないのに、移動することができないところがある。
A移動できないところの幅が94と85ということ。プログラムのとおりならどちらも64ピクセルのはず。
プログラムの一部 ↓
int hantei[15][20] = {
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};
void Stage(OBJ *jiki)
{
if(jiki->muki == 1){
if( hantei[jiki->y/32][jiki->x/32+1] == 1){
jiki->muki = 0;
}
}
if(jiki->muki == 2){
if(hantei[jiki->y/32][jiki->x/32-1] == 1){
jiki->muki = 0;
}
}
if(jiki->muki == 3){
if(hantei[jiki->y/32-1][jiki->x/32] == 1){
jiki->muki = 0;
}
}
if(jiki->muki == 4){
if(hantei[jiki->y/32+1][jiki->x/32] == 1){
jiki->muki = 0;
}
}
}
これだけの説明では理解することはすごい難しいとは思いますが、よろしくおねがいします。
希望がございましたら、プログラムのほうを添付したいとおもいます。
829ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(123,941ポイント)
Date: 2008/08/15(金) 16:31
No:20238
|
|
Title: Re:デバックにて・・・。
|
|
ご提示の初期化内容に対応するには、
> int hantei[15][20] = {
ではなく
int hantei[20][15] = {
です。
もしかすると、Stage関数においても
配列の行・列の順序を見直す必要があるのかもしれません。
26ポイント を手に入れた。
|
|
|
|
|
Name: B壱 ..入門者(3,462ポイント)
Date: 2008/08/15(金) 17:00
No:20239
|
|
Title: Re:デバックにて・・・。
|
|
int hantei[20][15]={
↑に直し、ビルドしてみたところ、「初期化子の数が多すぎます」とエラーが出ました。
int hantei[20][15] = {
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, ←エラー場所
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};
661ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(691,424ポイント)
Date: 2008/08/15(金) 18:19
No:20243
|
|
Title: Re:デバックにて・・・。
|
|
このコードだけではわからないのでは。
なお、ソースコードはプレタグで囲んでください。
詳しくは規約をご覧下さい。
>プログラムのとおりならどちらも64ピクセルのはず。
それは上下の32*2ということですね?
このプログラムは32ピクセルごとに進むものなのでしょうか?
ゲームプログラミングの館にあるコードを使っているのでしょうか?
151ポイント を手に入れた。
|
|
|
|
|
Name: B壱 ..入門者(4,836ポイント)
Date: 2008/08/15(金) 18:46
No:20245
|
|
Title: Re:デバックにて・・・。
|
|
>それは上下の32*2ということですね?
このプログラムは32ピクセルごとに進むものなのでしょうか?
はい、上下32*2ということです。
このプログラムは32ピクセルごとに進むものではありません。下にあるコードでは、キ−が押されたときに、自機が2ピクセルずつ進むようになっています。
>このコードだけではわからないのでは。
なお、ソースコードはプレタグで囲んでください。
詳しくは規約をご覧下さい。
大変失礼いたしましたm(_ _)m
今度はmainの方を貼らせていただきました。
>ゲームプログラミングの館にあるコードを使っているのでしょうか?
ソースコードはゲームプログラムの館にあるコードを参考に自分なりに考えたものです。
////////////////////////////////////////
//ヘッダーの読み込み
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "WlibDL/wlib_dl.h"
#include "WlibDL/wlib_link.h"
#include "WlibDL/wlibDL_macro.h"
#include <time.h>
#include <stdlib.h>
#include "main.h"
#include "Stage.h"
void main(void){
PAD pad;
//変数宣言
OBJ jiki;
OBJ BG;
OBJ BG2;
//初期化
jiki.x = 320;
jiki.y = 300;
jiki.muki = 0;
jiki.Wflag = 0;
BG.x = 0;
BG.y = 0;
BG2.x = 0;
BG2.y = 416;
while(1){
pad = W.GetPadData(0);
//自機移動フラグ
if(pad.press & PAD_RIGHT){ //右
jiki.muki = 1;
jiki.Wflag = 1;
}
if(pad.press & PAD_LEFT){ //左
jiki.muki = 2;
jiki.Wflag = 1;
}
if(pad.press & PAD_UP){ //上
jiki.muki = 3;
jiki.Wflag = 1;
}
if(pad.press &PAD_DOWN){ //下
jiki.muki = 4;
jiki.Wflag = 1;
}
//jikiフラグが立っているときに、Stage関数を見る
if( jiki.Wflag == 1){
Stage( &jiki );
}
//移動
if(jiki.muki == 1){
jiki.x +=2;
jiki.muki = 0;
}
if(jiki.muki == 2){
jiki.x -= 2;
jiki.muki = 0;
}
if(jiki.muki == 3){
jiki.y -= 2;
jiki.muki = 0;
}
if(jiki.muki == 4){
jiki.y += 2;
jiki.muki = 0;
}
if( pad.press & PAD_B ) break;
//表示
W.DrawLine( jiki.x, jiki.y, jiki.x+10, jiki.y+10,RGBto(255,255,255),2);
W.DrawLine( BG.x, BG.y, BG.x+640, BG.y+64,RGBto(255,255,126),2);
W.DrawLine( BG2.x, BG2.y, BG2.x+640, BG2.y+64,RGBto(255,255,126),2);
W.RefreshScreen(0);
W.Clear(RGBto(0,0,0));
}
}
1,304ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(214,690ポイント)
Date: 2008/08/15(金) 19:36
No:20246
|
|
Title: Re:デバックにて・・・。
|
|
参照するべき hantei配列の位置が間違っています。
mukiフラグによって xや yを +1/-1して参照位置を変えるのはいいのですが、
÷32する前の座標に対して行って下さい
(多分その場合は±1じゃなくて、移動量である±2でしょう)
修正参考例:
void Stage(OBJ *jiki)
{
int x = jiki->x, y = jiki->y;
const int offset = 2;
switch(jiki->muki)
{
case 1:
x += offset;
break;
case 2:
x -= offset;
break;
case 3:
y -= offset;
break;
case 4:
y += offset;
break;
};
x /= 32, y /= 32;
if(x >= 0 && y >= 0 && x < 20 && y < 15 && hantei[y][x] == 1)
jiki->muki = 0;
}
410ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(15,830ポイント)
Date: 2008/08/15(金) 19:54
No:20247
|
|
Title: Re:デバックにて・・・。
|
|
判定の仕方が32ドット単位なのがまずいのでは
移動ドット単位で判定しないといけないのでは
if(jiki->muki == 1){
if( hantei[jiki->y / 32][(jiki->x + 2) / 32] == 1){
jiki->muki = 0;
}
}
if(jiki->muki == 2){
if(hantei[jiki->y / 32][(jiki->x - 2) / 32] == 1){
jiki->muki = 0;
}
}
if(jiki->muki == 3){
if(hantei[(jiki->y - 2) / 32][jiki->x / 32] == 1){
jiki->muki = 0;
}
}
if(jiki->muki == 4){
if(hantei[(jiki->y + 2) / 32][jiki->x / 32] == 1){
jiki->muki = 0;
}
}
43ポイント を手に入れた。
|
|
|
|
|
Name: B壱 ..初心者(5,012ポイント)
Date: 2008/08/15(金) 20:34
No:20248
|
|
Title: Re:デバックにて・・・。
|
|
回答ありがとうございます。
Justy さん の修正参考例をつかわせていただいたところ、@の問題を解決することができました。
ありがとうございます^^
>参照するべき hantei配列の位置が間違っています。
自分のコードは移動距離±2にもかかわらず、参照位置を±1で見ていました。
Justy さんのおっしゃるとおりでした。@@;
修正したところ、Aの問題のほうですが、上が64ピクセル。下が56ピクセルになりました。
その点につきましては、まだ修正できておりません。
これら2点をご報告させていただきます。
ここまで導いてくださった皆さん、本当にありがとうございますm(_ _)m
176ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(214,902ポイント)
Date: 2008/08/15(金) 21:10
No:20251
|
|
Title: Re:デバックにて・・・。
|
|
>修正したところ、Aの問題のほうですが、上が64ピクセル。下が56ピクセルになりました
当たり判定を今は juki.x, juki.yという「点」でとってます。
しかし、表示しているオブジェクトは縦横 10のサイズを持っており、
問題となる点は「右上」だけを表しています。
従って、表示を「点」にしてみると、y座標 414(下からだと 66)までしか進めないように
なるはずです。
では点ではなくサイズを持った判定はというと・・・
まずは B壱さんの方でどうやればいいのかじっくり考えてみて下さい。
212ポイント を手に入れた。
|
|
|
|
|
Name: B壱 ..初心者(5,252ポイント)
Date: 2008/08/15(金) 21:48
No:20252
| 解決!
|
Title: Re:デバックにて・・・。
|
|
回答ありがとうございます。
理解しました・・・。;w;
今の場合、
表向きは x10、y10 のboxを使っていて、それが当たり判定と勘違いしておりました。
実際の当たり判定は、boxの左上の1ピクセルのみ。
上が64ピクセル、下が56ピクセルだったっていうのも納得いきます。
下が56ピクセルだったのは間違えであって、たぶん55ピクセル。
それにboxの1ピクセルから下の、9ピクセル足して、55+9 = 64。
納得しました;w;
皆さん、本当にありがとうございました;w;
143ポイント を手に入れた。
|
|
|
|
Name: B壱 ..ぴよぴよ(757ポイント)
Date: 2008/08/14(木) 12:47
No:20194
|
|
Title: アクションゲームについて
|
|
こんにちは。
〜ゲームプログラミングの館〜で製作されていた「○魔界村」のようにアクションゲームを作りたいと思っているのですが、フィールドの部分で、自機と地面、障害物の当たり判定を作りたいと思っています。
作り方はいろいろあると思いますが、自分の考えているゲームがCAPCOMさんのロックマンの当たり判定(フィールド)に近いものなので、それに近づけたいと思っています。
どのように作ればよろしいでしょうか?
よろしくお願いします。m(_ _)mペコリ
176ポイント を手に入れた。
|
|
|
|
Name: ROL ..上級者(16,999ポイント)
Date: 2008/08/14(木) 14:51
No:20196
|
|
Title: Re:アクションゲームについて
|
|
初心者の私が言うのも何なのですが、ゲーム館は読まれましたでしょうか?
Capcomの出しているロックマンは数が結構あり、どのような感じかはわかりませんが、
とりあえず、ゲーム館23、24を読んで見てください。RPGのように4方向に進ませるのでなく
2方向であれば、座標増減の計算やジャンプの原理を応用すればOKでは無いでしょうか?
壁や地面が無いところを0、壁や地面があれば1とするのであれば、
#include "DxLib.h"
typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;
int hantei[20] = { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 } ;
int can_or_cannot(int x,int y,int muki){//進む方向が通れるか通れないかを判定
if(muki==1)//左向きなら
if(hantei[x/32-1]==1)//通れないなら
return 1;//エラー
if(muki==3)//右向きなら
if(hantei[x/32+1]==1)//通れないなら
return 1;//エラー
return 0;//正常
}
とでもすればOKです。
完璧、ゲーム館のコピペした物ですが^^;
hanteiの中の数字、判定内容を増やしたら障害物も作れますよ^^
525ポイント を手に入れた。
|
|
|
|
|
Name: B壱 ..ぴよぴよ(830ポイント)
Date: 2008/08/14(木) 15:51
No:20199
|
|
Title: Re:アクションゲームについて
|
|
回答ありがとうございます。^^
プログラムを製作してみて、問題がまた出てきましたら、また質問したいと思います。
ありがとうございました><
73ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(690,217ポイント)
Date: 2008/08/14(木) 17:32
No:20208
|
|
Title: Re:アクションゲームについて
|
|
アクションだとRPGと同じようには行かない場合があると思いますが、
基本的な考え方は0と1で行ける場所、いけない場所を作ればいいのではないかと思います。
ただ、それでは斜め地面の表現が出来なかったり、
中途半端な位置に立ったとき、キャラをどう動かすか等、
悩む場合が出てくると思います。
もし本格的に製作されるのでしたら、ちゃんとした書籍を購入される事をお勧めします。
159ポイント を手に入れた。
|
|
|
|
|
Name: B壱 ..かけだし(1,795ポイント)
Date: 2008/08/14(木) 18:30
No:20217
|
|
Title: Re:アクションゲームについて
|
|
回答ありがとうございます^^
今時点での場合、簡単にアクションゲームのフィールドを作ってみたいと思っていました。
今考えている作り方としては
int hantei[15][20] = {
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
このような感じで1画面を表現した場合、ロックマンで例えるとキャラは32ピクセルずつ動くわけではないので、 上図を640×480にするのでしょうか?その場合、横スクロールなら横にひたすら書いていくようになります。
このようなやり方もあるのでしょうか?
965ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 ..かけだし(1,357ポイント)
Date: 2008/08/14(木) 19:01
No:20218
|
|
Title: Re:アクションゲームについて
|
|
そのようなやり方(フィールドの作り方として)もあります。
が、さまざまなフィールドの作成のことを考えると、
直接コードに埋め込むより、フィールドデータとしてファイルを用意するといいと思います。
あと、0と1を任意サイズ(32*32など)のブロックとして当たり判定を表現すればいいと思います。
坂とかの斜め判定は当たり判定表に新しい値(2とか)を追加してそれぞれで処理していけばいいと思います。
たとえば、
// 40*40pxの当たり判定のブロック(1画面分)
// 値の意味:
// 0:移動可
// 1:移動不可
// 2:45度の左上がりの坂
// 3:45度の右上がりの坂
int haitei[16][12] = {
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,1,1,0,0,0,0,0,0,1,1,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,2,0,0,0,0,3,1,1,2,0,0,0,0,3,1 },
{ 1,1,2,0,0,3,1,1,1,1,2,0,0,3,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
こんな感じに。
これを処理するソースコードは書く時間がありませんので載せられませんが、
理解できたでしょうか。
146ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(690,894ポイント)
Date: 2008/08/14(木) 19:23
No:20220
|
|
Title: Re:アクションゲームについて
|
|
以前龍神録を改造してアクションっぽくしてみて遊んでた事があります。
一応プログラムソース置いておきます。
(ソースは読まないほうがいいと思いますが^^;)
http://dixq.net/zip/test_action.zip
御津凪さんの仰るように、データは配列に内部データとして入れておくのは得策じゃないです。
小さなエリアならいいかもしれませんが、これが横に1万ピクセルとかのエリアになると、
とても0と1を手作業で格納していったんじゃ手におえなくなります。
そこで、本格的に作るならアクションツクールみたいなものを作る必要があると思います。
何でもゲームは本格的に作ろうとすると支援ツールが必要になると思います。
一応このサンプルではエクセルファイルから画像データを読み込んで表示しています。
土の画像だとそこは進入不可とか、どの画像番号が進入できる番号かは事前に仕様を決めておくことになると思います。
十字キー:十字移動
左Ctrl:ジャンプ(2段ジャンプできます)
Zキー:ショット(方向キー入れたままでそちらにうちます)
Xキー:ボム
ジャンプ中に方向いれっぱなしで水平ダッシュします。
378ポイント を手に入れた。
|
|
|
|
|
Name: B壱 ..かけだし(1,972ポイント)
Date: 2008/08/14(木) 19:27
No:20221
| 解決!
|
Title: Re:アクションゲームについて
|
|
回答ありがとうございます^^
自分なりに考えをまとめてみました。
自機の移動距離は特に指定は無い。(今の場合、1ピクセルずつの移動に指定)
フィールドは1ピクセルごとではなく、ブロックで作る。(例外もある)
ざっと書いてみました。
実際にやってみないと、わからないとは思いますが、理解することはできたと思います。
解決まで導いてくださった方々、本当にありがとうございました。m(_ _)m
177ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..中級者(12,050ポイント)
Date: 2008/08/15(金) 10:12
No:20230
|
|
Title: Re:アクションゲームについて
|
|
>管理人さん
>以前龍神録を改造してアクションっぽくしてみて遊んでた事があります。
ちょwww
それ、弾避けれるんですか??
72ポイント を手に入れた。
|
|
|
|
|
Name: ROL ..上級者(17,424ポイント)
Date: 2008/08/15(金) 15:31
No:20235
|
|
Title: Re:アクションゲームについて
|
|
ちょっと見ない間に皆さんが解答してくださったのですね^^
いや〜、本当に管理人様は優しいですね。私も↑のゲームをやって見たいので
もう少し置いて置いてください。
>土の画像だとそこは進入不可とか、どの画像番号が進入できる番号かは事前に仕様を決めておくことにな
>ると思います。
そう言う方法があるんですか!
なら、テクテクピクミンにも使えそうですね^^
>B壱さん
がんばってくださいね^^
私も、フィールドに関してはものすごく悩まされます。
あらかじめすべてのゲーム構造を完成させてから作り始めるのがいいのでしょうが、
ちょっとコレ為したいと言うときにフィールド情報を無理やり入れたりしたら、ものすごく
大変な事になるんですよ;なので、新しくソースファイルを作ってからためしのフィールド情報の
部分を入れて試験して、完成したら元のソースに入れるようにしてます。
>>管理人さん
>>以前龍神録を改造してアクションっぽくしてみて遊んでた事があります。
>ちょwww
>それ、弾避けれるんですか??
シューティング=避ける
アクション=正面突破
Haruさん、↑がゲームの楽しみ方ですよ^^b
425ポイント を手に入れた。
|
|
|
|
|
Name: B壱 ..入門者(3,532ポイント)
Date: 2008/08/15(金) 17:11
No:20240
|
|
Title: Re:アクションゲームについて
|
|
本当に助かりました。
プログラムは皆さんに比べたらピヨピヨなもので・・・。;w;
>ROLさん
アドバイスや応援ありがとうございます。
まだまだ未熟者のピヨピヨですが、B壱!がんばります!
本当にありがとうございました^^
70ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(691,273ポイント)
Date: 2008/08/15(金) 18:11
No:20242
|
|
Title: Re:アクションゲームについて
|
|
>それ、弾避けれるんですか??
まぁ左右には移動できるから避けれますが、このままじゃ楽しくないですね^^;
アクションゲーはやっぱジャンプでよけれないと面白くないので。
まぁそこは考えがあったんですが、ちと実装するためのプログラムが難しくなりそうだったので、
そのままになってます;
>ROLさん
いやいや、たんに地面をアクションっぽくしてみただけなんで、
全然ゲームにはなっていませんよw
>B壱さん
サンプルの方がご覧になりました?
242ポイント を手に入れた。
|
|
|
|
|
Name: B壱 ..初心者(5,109ポイント)
Date: 2008/08/15(金) 20:45
No:20250
|
|
Title: Re:アクションゲームについて
|
|
サンプルの方、拝見させていただきました^^
すごぃ@w@;
いろいろゲーム作ってるんですねw
工夫しだいですっごく楽しくなりそうだなぁって思いました>w<
ぜひぜひ完成させてください^^
今回の件。本当にありがとうございました。^^ノ
97ポイント を手に入れた。
|
|
|
|
Name: こめかみ ..中級者(13,085ポイント)
Date: 2008/08/15(金) 12:48
No:20231
|
|
Title: 目に優しい画面設定で、オススメってありますか?
|
|
こんなに長い間画面に向かって文字打ってくのって初めてで、
このままだと急速に目が悪くなっていきそうでちょっと不安なんです。
先輩方の工夫などございましたら教えていただけないでしょうか。
ちょっとググって見たところ、
映像、画質的な工夫はたくさんヒットするんですが、
それをプログラムの環境に実際に適用する方法など話し合えたら幸いです。
あと、これからちょっとバイトなんで返信は遅くなると思います。
よろしくお願いします。
209ポイント を手に入れた。
|
|
|
|
Name: array ..上級者(18,042ポイント)
Date: 2008/08/15(金) 13:26
No:20232
|
|
Title: Re:目に優しい画面設定で、オススメってありますか?
|
|
雑談ということで・・・・とくに対策は持ってませんが
昔は画面に直接 カバー(?)フィルムとは違うと思いますが似たような奴があったと思います。
それを取り付けると、画面は薄暗くなり見にくくはなるのですが、目には優しかったと思います。別に何時間PCをしていたわけでは無いですが、視力は低下しませんでした。(調べてみると昔のPCは画面から紫外線を出していたとか)
その後、自分でパソコンを買ってから、なにもしないで普通に使ってたら急激に視力低下しましたね^^;
できる事といえば、画面のディスプレイのコントラストを下げるなり、定期的な目の休養くらいしか無いんじゃないでしょうか?ただ、液晶は一応 目に優しいらしいです。
あと画面と顔の距離・・・ディスプレイをできるだけ奥に置いてキーボードをできるだけ手前に・・・画面との距離を遠ざけた方が良かったりするのかもしれません。
ただ私は、別に何も対策とらないで目が疲れたかなと思ったら寝たり、マンガ読んでます。紙面の方が目に優しいと思うので。
私もこの対策については興味があるので気軽に実行できそうなのがあれば使わせてもらいます^^
394ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..入門者(2,644ポイント)
Date: 2008/08/15(金) 13:41
No:20233
|
|
Title: Re:目に優しい画面設定で、オススメってありますか?
|
|
一時間に10分程度アイマスクして目を休めてます。
そのまま寝ても気持ちが良いですよwww
41ポイント を手に入れた。
|
|
|
|
|
Name: ROL ..上級者(17,664ポイント)
Date: 2008/08/15(金) 15:46
No:20236
|
|
Title: Re:目に優しい画面設定で、オススメってありますか?
|
|
私も目がものすごく悪いので、目の急速方法をお教えしますね^ー^
まず、画面を自分の目線より少し下に置く事をお勧めします。
人間は、目と同じ高さと思っていても視線は少し上になるようです。視線が上になると
目の空気に触れる面積が増えてドライアイの原因になります。lbfuvabのようにアイマスク
でもいいですが、目の疲れは同じピントを保つために目の筋肉が緊張しているため起こるよ
うです。目の筋肉痛と言ってもいいですね^^なので、水でぬらしたタオルを目の上に置くと、
ドライアイ&疲れ目の両方に効果があります。それと、遠くの景色を見るといいかもしれません。
一点に視野が集中せずにピントがぼやけるので目の筋肉がほぐれていいです。10分程度遠
くを見るとgoodです。慣れれば強制的にピントがはずせるようです^^
最後に雑談ですが;
私の視力は左0.1 右2.0 で遠視の乱視です。なので、疲れてくると
文字が2重に見えてくるんですよ。だから、打ち間違いが多いのかな^^;
240ポイント を手に入れた。
|
|
|
|
|
Name: こめかみ ..中級者(13,540ポイント)
Date: 2008/08/15(金) 20:35
No:20249
|
|
Title: Re:目に優しい画面設定で、オススメってありますか?
|
|
皆さんありがとうございます、全部参考にさせて頂きます。
>arrayさん
>昔は画面に直接 カバー(?)フィルムとは違うと思いますが似たような奴があったと思います。
小中学校のころのPCルームのパソコンに、いくつかついてましたねー、
ただの汚れ防止ではないとは思っていましたが、
見えにくくなるのに目には良いというのは妙なものですね。
>(調べてみると昔のPCは画面から紫外線を出していたとか)
それはCRTモニタの性質ではないでしょうか。
んー、でも中学校のパソコンは液晶ディスプレイだったのでどういうことだろ?
>lbfuvabさん
>一時間に10分程度アイマスクして目を休めてます。
アイマスクいいですね。
調べたら一時間に10分の休息は推奨されていましたが、
10分は大きいなぁ、考えものです。
>Haruさん
紹介していただいたサイト読ませていただきました。
今使ってる椅子だとモニタを見上げるかたちになるので買い換えます。
私のモニタでは、明るさとブライトネスがそれぞれ0〜100の範囲で調整できるみたいですけど、
どうやったら100〜150cd/m2に設定できるんだろ。対応する数値がわからない・・・。
モニタの仕様に載ってるかな?後で見てみます。
>ROLさん
アドバイスありがとうございます。
椅子買ってきます。
遠くと近くを交互に見るってのは外に出た時に良くやってます。
そのお陰かは判りませんが、ゲーム好きにしては視力はいいです。
両目1.2 ですね。一生裸眼で貫きたいものです。
>管理人さん
大変ですね、バイク乗るときに支障は無いんでしょうか。
過去形ですね、治ったんですか?
何かを成し遂げるためには多少の犠牲は已む無しってことでしょうかねー。
管理人さんは例え目が潰れてもプログラマーな気がします。
盲目のプログラマーとかって触れ込みで後世に名を馳せたり馳せなかったり。
455ポイント を手に入れた。
|
|
|
|
Name: Becky ..ぴよぴよ(245ポイント)
Date: 2008/08/14(木) 17:27
No:20206
|
|
Title: 2次関数の最大値・最小値の求め方
|
|
はじめまして、投稿失礼いたします。
プログラミング初心者ですので、説明が至らないところもあると思いますが
どうかよろしくおねがいします。
今回、課題として2次関数の最小値を求めろ
というものが出されました。
与えられた関数は
y = 4(x-3)^2+2でしたので
y = 4*(x-3)*(x-3)+2
とおいて
if文で最小値を求めようとしました。
(最大値は+∞ですよね?;)
xをfor()で移動させて
double型でmin をおいて
y < min
であれば min = y
という様にとりあえず書いたのですが、(全く関数や構文を知らないので)
出力の際に非常に長い列が出力されたり…という現象がおきてしまいます。
↑わかり辛い説明で申し訳ありませんが、
きれいに出力させる書き方はありますでしょうか?
何か説明が足りない部分があれば仰っていただければ幸いです。
よろしくおねがいします。
245ポイント を手に入れた。
|
|
|
|
Name: 組木紙織 ..熟練のプログラマー(58,880ポイント)
Date: 2008/08/14(木) 17:48
No:20209
|
|
Title: Re:2次関数の最大値・最小値の求め方
|
|
>出力の際に非常に長い列が出力されたり…という現象がおきてしまいます。
とりあえず、そのソースコード見せてほしいと思います。
(どのようにして表示しているのか?などの問題があるので。)
後、現象の説明は正確にして欲しいです。
「たり」って他にも別の現象が起きたという意味ですか?
投稿規約にも書いてはあるのですが、
ソースコードを投稿するときは<pre>(ソースコード)</pre>
というようにしてください。
追記:
"<"は半角でお願いします
151ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(690,516ポイント)
Date: 2008/08/14(木) 17:49
No:20210
|
|
Title: Re:2次関数の最大値・最小値の求め方
|
|
単純に作ったプログラムでは
定義域の最大値を+∞にしてしまっては計算が終わらないので、
ある程度適当な範囲で定義域を決めてしまいましょう。
下のサンプルでは
-1000<=x<=1000
としています。0.001ずつxを増やしながら計算し、そのたびに最小値かどうかを
確認していきましょう。
#include <stdio.h>
#define X0 -1000.0
#define X1 1000.0
int main(){
double x,y,min;
//xに定義域の最小値を代入
//最初の計算結果をminに代入
for(x=X0;x<=X1;x+=0.0001){
//yを計算
//もしminよりyの方が小さければminにyを代入
}
printf("最小値は%.3f\n",min);
return 0;
}
実行結果
最小値は2.000
この注釈の部分をプログラムコードに置き換えれば完成です。
また、二次関数においては、傾きが0を跨いで変化した時、そこが頂点だとわかりますから、
それで判定する方法もあるかもしれません。
例えば前回の計算結果傾きが0未満で次の計算結果傾きが0超過だとその中間が頂点ですね
299ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(15,787ポイント)
Date: 2008/08/14(木) 17:51
No:20212
|
|
Title: Re:2次関数の最大値・最小値の求め方
|
|
作ったプログラムを
<pre>
</pre>
ではさんで書いてもらうとわかるかもしれません
43ポイント を手に入れた。
|
|
|
|
|
Name: 組木紙織 ..熟練のプログラマー(58,970ポイント)
Date: 2008/08/14(木) 18:13
No:20216
|
|
Title: Re:2次関数の最大値・最小値の求め方
|
|
あら。管理人さんがアルゴリズムまで実装してしまっている。
質問者さんの質問は
「数値の表示の桁数を制限するためにはどうすればいいでしょうか?」
という質問だと解釈したので、課題内容が正確に分かってない状態では特に、
アルゴリズムの実装はちょっと先走りすぎではないかと思います。
90ポイント を手に入れた。
|
|
|
|
|
Name: レッツ ..ぴよぴよ(333ポイント)
Date: 2008/08/14(木) 19:03
No:20219
|
|
Title: Re:2次関数の最大値・最小値の求め方
|
|
実装してしまっているといっても、実際管理人さんがかわりに書いてるのは
for文だけじゃないですか?
質問文から推測するに、だいたい考え方はわかっているようですし、
では、実装してみましょうという流れは不自然じゃないと思いますよ。
ただ、出来ているコードがあるのなら、まずその指摘から入るのが良いという意見は
正しいとは思いますし、
質問者はコードを提示してみてはどうでしょうか?
添削してもらえると思います。
「出力の際に非常に長い列が出力されたり…」
っとは%fで表示した時に小数点以下が沢山表示される事を意味してるんでしょうか?
169ポイント を手に入れた。
|
|
|
|
|
Name: フリオ ..プログラマー(25,941ポイント)
Date: 2008/08/14(木) 19:37
No:20223
|
|
Title: Re:2次関数の最大値・最小値の求め方
|
|
課題の条件や、目的がよくわからないのですが、
与えられている式が
y = 4 * ((x - 3) ^ 2) + 2
と平方完成しているので、わざわざ計算しなくても
最小値は、2 (x == 3 のとき) です。
82ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説のハッカー(691,031ポイント)
Date: 2008/08/14(木) 19:43
No:20224
|
|
Title: Re:2次関数の最大値・最小値の求め方
|
|
>フリオさん
まぁ二次関数の最小値を計算するプログラムを作る課題なのでしょう。
問題としては
y=ax^2+bx+c
のa,b,cを入力させて、頂点を計算させるって仕様の方が適切な気がしますけどね。
もし今回の課題が解けたらこの↑仕様を実現するプログラムも作ってみるといいと思います。
どちらも簡単だと思いますし。
105ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(54,609ポイント)
Date: 2008/08/14(木) 19:54
No:20225
|
|
Title: Re:2次関数の最大値・最小値の求め方
|
|
この課題の真の意図がよくわからないのですが...
一般に、任意の数 a, x0, y0 に対して、二次関数 y = a(x - x0)2 + y0 の最大値・最小値を求めるのであれば、a の符号と極値を求めることになります。
ところで、y = a(x - x0)2 + y0 は、y = ax2 を x 方向に x0、y 方向に y0 だけ並行したものですから、導関数を持ち出すまでもなく、極値の座標は (x0, y0) です。
これを踏まえると、
if (a == 0)
{
min = -INFINITY;
max = +INFINITY;
}
else if (a < 0)
{
min = -INFINITY;
max = y0;
}
else if (a < 0)
{
min = y0;
max = +INFINITY;
}
でよいはずです。
もし、元の二次関数が y = 4(x-3)2+2 固定であれば、min = 2, max = +INFINITY になります。
49ポイント を手に入れた。
|
|
|
|
|
Name: Becky ..ぴよぴよ(715ポイント)
Date: 2008/08/14(木) 20:30
No:20226
|
|
Title: Re:2次関数の最大値・最小値の求め方
|
|
どうもありがとうございます、質問主のBeckyです。
みなさん、いろいろと教えてくださって感謝しております。
まず、最小値を求める際に平方完成しておるので
簡単に求められる…というのは確かにそうなのですが
題意としては
if()
for()
を用いて、最小値を確認しろ、とのことだと思います。
ソースをペーストできればよいのですが、
現状ソース自体が手元にないので、↑の質問のような記述になってしまいました。
困っている点としては
管理人さんが仰ってくださった、定義域(計算が終わらなくなる)?で
私もまずは-100<x<100のように定義して、
実行してみたところ、すべての整数で出力され201行(確認していませんが)の実行結果となってしまいました。
実行結果は
-******************(-100の代入値でしょうか)
-****************
・
・
・
2
2
2
2
2
2
のような出力になったので
どのように記述すればただひとつの値を出力できるのかを
調べたかったのです。
コンパイルの環境がないので今は実行できませんが、
みなさんの親切な回答を踏まえて実行してみようと思います。
みなさんありがとうございました。
また不具合があれば質問させていただきます。
470ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(123,915ポイント)
Date: 2008/08/14(木) 20:53
No:20227
|
|
Title: Re:2次関数の最大値・最小値の求め方
|
|
> 201行(確認していませんが)の実行結果となってしまいました。
x=-100, -99, -98, ..., 0, 1, 2, ..., 99, 100
について、yの値を毎回出力すればそうなりますね。
yの値を求めたら、その時点での最小値と比べて
より小さければ新たな最小値とし、
x=-100〜100のすべてを計算し終わった時点での最小値「だけ」を
出力すればよいです。
124ポイント を手に入れた。
|
|
|
|
|
Name: 組木紙織 ..熟練のプログラマー(59,355ポイント)
Date: 2008/08/14(木) 21:01
No:20228
|
|
Title: Re:2次関数の最大値・最小値の求め方
|
|
レッツさん、管理人さん
あんまり回答と関係ないことを書いて、質問者さんに逃げられることになったら本末転倒となるのが
嫌なんですが、
質問者さんがCの構文を知らないと書いてあるので、アルゴリズムがわかっても、実装出来ないはずなので
どうやって実装をして結果をみたのかが、
一番気になりました。
それで、管理人さんが一部でも実装を書くとそれがヒントになって質問時のソースコードと異なる
可能性があって質問時のソースコードが見れないことを、気にしました。
また、質問内容が不明瞭だったので、先読みして答えにつながることを渡すのは、
質問者の質問の仕方の向上につながらないと思ったのもあります。
(最近質問の仕方のレベルが落ちてきた感じがして、質問の仕方のレベルを上げたいと思ったので)
質問者さんへ
題意がfor()を使えとあるようですが、課題文がない状態では判断できないので、
課題に対して適切でない回答も多々出てきています。
適切な回答が欲しいのなら課題文も上げた方が良かったと思います。
質問の内容に関しては、
ソースコードが分からないので、想像になりますが、
for(;;){
//ここでは表示しない
}
//ここで表示
とすれば解決すると思います。
385ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..入門者(2,603ポイント)
Date: 2008/08/14(木) 22:34
No:20229
|
|
Title: Re:2次関数の最大値・最小値の求め方
|
|
y=ax^2+bx+c
=a(x^2 + (b / a)x + (b^2 / 4(a^2)))-(b^2 / 4a)+c
=a(x + (b / 2a))^2 -(b^2 / 4a)+c
よって
(i)a>0の時
max なし
min -(b^2 / 4a)+c (x = -b/2aの時)
(ii)a=0の時
min なし
max なし
(iii)a<0の時
max -(b^2 / 4a)+c (x = -b/2aの時)
min なし
これを手順化すれば良いです。
181ポイント を手に入れた。
|
|
|
|
|