|
Name: 増田 ..ぴよぴよ(74ポイント)
Date: 2010/09/12(日) 00:56
No:61541
|
|
Title: 先日
|
|
先日、こちらへメールさせていただいた増田と申します。
先日、メールしましたが、管理人様から返信がありませんでしたので、こちらに書き込みさせていただきます。
今、アクションゲームを制作していて、Curse'sSoul(仮名)のプログラムを参考にさせていただきたいので、見せていただけないでしょうか?
宜しくお願いします。
74ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(213,919ポイント)
Date: 2010/09/12(日) 07:14
No:61553
|
|
Title: Re:先日
|
|
管理人さんも社会人ですから、すぐに返信が出来ないこともあります。それを理解せずにこんなスレをたてるのはいかがなものかと思いますよ。
どんなに言葉が丁寧だろうが、こんな自己中心的な内容のスレを作成したり、ソースを丸ごと寄越せってのは非常に失礼だというのは理解していますか?
そもそも、どんなことをしたくて参考にしたいの?というか、何が分からないの?
これをきちんと自分の言葉で具体的に質問できないようであれば、ソースもらっても全くの無駄です。
218ポイント を手に入れた。
|
|
|
|
|
Name: clover ..ぴよぴよ(318ポイント)
Date: 2010/09/12(日) 09:36
No:61569
|
|
Title: Re:先日
|
|
貴方はプログラムの事以前の基本的なことが欠落していると思うのですが。
メールと言うもの自体そもそも直ぐに確認してもらえるものではないのですから。
書き込みを見ていると相当早い段階で催促しているように思えますが…
他人を助けて飯を食っているような人ならまだしも、管理人さんは社会人ですので忙しいでしょう。
そんな中で毎日こまめにメールをチェックしてかつ返信できるとお思いなのでしょうか?
携帯電話のメールとは違うのですから、そこら辺の事を考えた上でのメールのやりとりは必要かと思いますが。
時には1か月以上待つ事もできなければならない事だって仕事の状況によってはあり得るわけですし。
それと、公開されていないソースにはそれなりの事情があってのことだと思います。
ソースコードが見つからなかったり、すでに消失していることだってあり得るでしょうし。
色々な事情があるわけです。
それを欲しいとメールを送り、尚且つ返信がすぐに来ないからと掲示板でトピックまで立てる。
もし私の所でその様な事をされたとしたら、たとえソースを探し出して渡してあげようと思っていたとしても渡す気はなくなるでしょう。
プログラミングの前に色々と一般社会について学ばれてはいかがでしょうか?
318ポイント を手に入れた。
|
|
|
|
|
Name: 増田 ..ぴよぴよ(167ポイント)
Date: 2010/09/12(日) 09:39
No:61570
|
|
Title: Re:先日
|
|
>バグさん cloverさん
ご指摘ありがとうございます。
そして、すみませんでした。
提出があるので焦ってしまい、自分の都合だけでこのスレを立ててしまいました。
一応、書いてあるとおりメールさせていただいてあるので、待ってみたいと思います。
そして、自分のできる限りの範囲は、制作しておきたいと思います。 
93ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..ウィザード(1,273,232ポイント)
Date: 2010/09/12(日) 09:48
No:61571
|
|
Title: Re:先日
|
|
> 増田さん
遅くなってすみません。
10月の頭までに提出の必要があるゲーム制作がある為、早急にソースが必要だという事ですね。
専門学校か何かでしょうか?
アクションゲームでなければならないという決まりはあるのでしょうか?
私はゲーム制作を専門に学んだ人間ではなく、単に好きで作っているだけなので、
アクションゲームについては試しに作った程度でしかありません。
なのでソースコードは参考にされない方が良いように思います;
ゲーム制作って需要があるわりにウェブに参考になる情報が少ないですよね。
しかし、参考になるジャンルもありますし、書籍であればある程度充実しています。
本を買うとか、参考にできるジャンルに変更するなどは不可能でしょうか?
85ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..ウィザード(1,273,586ポイント)
Date: 2010/09/12(日) 10:20
No:61576
|
|
Title: Re:先日
|
|
私もDXライブラリのサンプルプログラムはよく熱心に見ました^^;
Cを学び始めたころ、ワイプなどのプログラムは知らなかったので、非常に参考になった覚えがあります。
ただ、
サンプルとしてのプログラム
↓
大きなゲームのパーツとしてふさわしいプログラム
にするには大きな壁があり、よく戸惑いました。
DXライブラリのサンプルプログラムも一応「動く」ことは動きますが、
必ずしもそのままゲームに使えるプログラムでは無い事が多かったように思います。
(例えばジャンプとか)
参考書のような本も、
サンプルとしてのプログラム
↓
ゲームのパーツとしてのプログラム
はステップアップが大きすぎることが多いですよね。
ということで、「DXライブラリのサンプルを見ただけではゲームが作れない」と悩むことがあったとしたらそれは自然な事だと思います。
サンプルはあくまでサンプルですからね。
一つ一つの事を十分理解しながら、自分のゲームに少しずつ機能を追加していくのが一番だと思います。
323ポイント を手に入れた。
|
|
|
|
Name: メイト ..ぴよぴよ(86ポイント)
Date: 2010/09/12(日) 09:19
No:61563
|
|
Title: iPhoneの様なタッチのエフェクト
|
|
タッチするとタッチした場所がわかる白いエフェクトがでるiPhoneのゲームがあります。
これと同じ機能をWindowsゲームとしてDXライブラリを使って実装したいです。
あのような画像がどこかにないでしょうか?
また処理的には拡大しているだけなのでしょうか?
86ポイント を手に入れた。
|
|
|
Name: shin ..かけだし(1,323ポイント)
Date: 2010/09/11(土) 15:56
No:61501
|
|
Title: ゲームを制作するには? (プログラミング未経験)
|
|
プログラムは全く未経験なのですが、自分でゲームを作ってみたくなり、このサイトにたどり着きました。
そこで質問なのですが、まずはどこから手をつけたら良いのでしょうか?
(トピック名を管理人が変更しました)
50ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) [URL] ..ウィザード(1,273,147ポイント)
Date: 2010/09/11(土) 22:31
No:61530
|
|
Title: Re:初心者です
|
|
> shinさん
こんにちは。
プログラムの経験が無いのにうちのようなサイトに来て下さってありがとうございます^^
ゲームを作ってみたいという事ですね。
私も大学に入った頃(もう7〜8年も前ですが・・)ゲームが作りたくてあれこれ悩みました(当時はC言語は聞いたことがあった程度でした)
RPGツクールのような物はありましたが、やはり1からプログラムを作ってみたいですよね。
私は最初文字でゲームを作りました。
初めて作ったゲームはジャンケンでした。
それも簡単なものです。
「
1〜3の数値を入力してください。
1:グー
2:チョキ
3:パー
」
のように表示され、数値を入力すると勝ったか負けたか表示されます。
私に限らず最初に作ったゲームはジャンケンだったという人は結構いらっしゃるのではないかと思います。
突然グラフィカルな大きなゲーム制作をするのはとても難しいので、まずはC言語の基本を学び、ジャンケンが文字で出来る所を目指してはどうでしょうか。
うちのサイトで紹介しているDXライブラリを使ったゲーム制作はC言語の知識がある程度ある人を対象にしています。
ですので、プログラミング未経験でしたら、まずC言語の勉強をされることお勧めします。
本などはお持ちでしょうか?最近はウェブにデータが充実しているので、いくらでもウェブで勉強できます。
http://www.google.co.jp/search?hl=ja&q=C%E8%A8%80%E8%AA%9E%E3%80%80%E5%85%A5%E9%96%80&lr=lang_ja
・制御文
・演算子
・配列
・関数
・(構造体)
この辺は最低限必要になる知識ですので自分の気に入ったサイトでこの辺を勉強して見て下さい。
また、プログラムは書いただけではただのテキストに過ぎません。
PCで動作させるためには機械語に翻訳する必要があります。これをコンパイルと言います。
コンパイルしてくれるソフトをコンパイラと言います。
詳細はこちらをご覧ください。
http://dixq.net/vcpp.html
こちらを読めばC言語が動かせるようになると思います。
まずは環境を用意し、ジャンケンを作ってみてはどうでしょう?
703ポイント を手に入れた。
|
|
|
|
|
Name: dic ..比類無きプログラマー(96,306ポイント)
Date: 2010/09/12(日) 00:21
No:61533
|
|
Title: Re:初心者です
|
|
開発環境を整える Visual C++ 2010 Express
C言語について勉強する
C言語で自分の思ったとおりの処理ができるようになる
DirectX関係のライブラリがしようできるようになる
自分独自のライブラリを作ったり、すでにあるライブラリを利用させてもらう
既存のゲームを観察して、どのように作られているか考えてみる
開発理論にもとづくと
・要求の定義 まず何をつくるか?(STG,SLG,ADV)
・必要になる機能を上げる (画面の高速な描画、十分な処理速度の確保)
・データの構造を決める
・データの処理の流れを決める
・上から作られた仕様書をもとにプログラムする
・デバックして期待したとおりに動くかテストする
・バグが入ってたらどこで間違っていたか確認する
・修正して、もう一度テストする
・要求(自分が作りたいもの)に近くなったら完成とする
・感想などを聞き、次回作のかてにする
どの程度の初心者なのか、分からないので、一般論です
ポインタがわからない、配列がわからない、どこをどうやればいいのか分からない
コンパイル、ビルドが分からない、開発環境の整え方がわからない
開発ソフトウェアの使い方がわからない
色々あると思いますが、どこまでできて、どこがわからないのかを書いてくれると
アドバイスもより的確になると思います
478ポイント を手に入れた。
|
|
|
|
Name: Ultimate [URL] ..中級者(13,193ポイント)
Date: 2010/09/11(土) 21:26
No:61519
|
|
Title: 弾幕の弾作成
|
|
真ん中の固定された敵から円形に球が100個広がるように作りたいのですが、うまくできません。
なぜうまくいかないのか教えてください。
下にソースを載せます。
まだ使ってない変数などもありますが、これからつかうものなのでそちらは気にしないでください。
#include "DxLib.h"
#include "math.h"
#define PI 3.14159265358979323846
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
//色の設定
int WHITE,BLACK,RED,GREEN,BLUE;
WHITE = GetColor(255,255,255);
BLACK = GetColor(0,0,0);
RED = GetColor(255,0,0);
GREEN = GetColor(0,255,0);
BLUE = GetColor(0,0,255);
//その他設定
SetBackgroundColor(255,255,255);//背景色
//その他変数
int i,j;
char Key[256];
//画像読み込み
int back;//背景
back=LoadGraph("back.png");
int tmain;//敵メイン
tmain=LoadGraph("teki_main.png");
//構造体作成
//メイン敵の弾1
typedef struct{
int x[100]; //X座標
int y[100]; //Y座標
int nagasa; //X座標、Y座標の基準になる長さ
double sinsin[100]; //サイン値
double coscos[100]; //コサイン値
double r[100]; //ラジアン値
int flag; //フラグ
int count; //カウント
}ch_t;
ch_t tmain1;
//初期化
//敵の弾1
tmain1.flag=0;
tmain1.nagasa=0;
for(i=0;i<=99;i++){
tmain1.x[i]=0;
tmain1.y[i]=0;
if(i>0){
tmain1.r[i]=2*PI/(99/i);//100個の弾それぞれのラジアンを求める。
}
else tmain1.r[i]=0;
}
for(i=0;i<=99;i++){
if(i>0){
tmain1.sinsin[i] = sin(2*PI/(99/i));//100個の弾それぞれのサイン値
tmain1.coscos[i] = cos(2*PI/(99/i));//100個の弾それぞれのコサイン値
}
else{
tmain1.sinsin[i] = 1;
tmain1.coscos[i] = 1;
}
}
//メインループ
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定
while(ProcessMessage()==0 && ClearDrawScreen()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0){
//↑メッセージ処理 ↑画面をクリア ↑ESCが押されていない
ClearDrawScreen(); // 裏画面のデータを全て削除
//敵メイン攻撃
//弾の座標
tmain1.nagasa+=2;
for(i=0;i<=99;i++){
tmain1.x[i] = (tmain1.nagasa * tmain1.coscos[i])+320;
tmain1.y[i] = (tmain1.nagasa * tmain1.sinsin[i])+240;
}
//描画
for(i=0;i<=99;i++){
DrawCircle(tmain1.x[i],tmain1.y[i],2,BLACK);
}
//敵メイン表示
DrawGraph(320-13,240-13,tmain,TRUE);
ScreenFlip();
}
WaitKey() ; // 結果を見るためにキー待ち(『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
メインの敵は画像ですみません。
どこが原因で円形に広がらないのか教えてください。
1,670ポイント を手に入れた。
|
|
|
|
Name: Rom ..ぴよぴよ(249ポイント)
Date: 2010/09/11(土) 21:38
No:61523
|
|
Title: Re:弾幕の弾作成
|
|
たぶん小数型であるtmainr[]に代入にしてるところ
tmain1.r[i]=2*PI/(99/i);//100個の弾それぞれのラジアンを求める。
で、2*PIだと(整数型)*(小数)で
整数に直されてるとかそんなん。
tmain1.r[i]=2.0*PI/(99.0/(double)i);
とすればいいかもしれない。
自分もこのまえ同じ間違いしてたから
自信はないけど。
120ポイント を手に入れた。
|
|
|
|
|
Name: Ultimate ..中級者(14,657ポイント)
Date: 2010/09/11(土) 21:44
No:61524
|
|
Title: Re:弾幕の弾作成
|
|
その通りでした。
ありがとうございました。
あと1か所訂正しましたので、訂正後ソースも載せておきます。
#include "DxLib.h"
#include "math.h"
#define PI 3.14159265358979323846
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
//色の設定
int WHITE,BLACK,RED,GREEN,BLUE;
WHITE = GetColor(255,255,255);
BLACK = GetColor(0,0,0);
RED = GetColor(255,0,0);
GREEN = GetColor(0,255,0);
BLUE = GetColor(0,0,255);
//その他設定
SetBackgroundColor(255,255,255);//背景色
//その他変数
int i,j;
char Key[256];
//画像読み込み
int back;//背景
back=LoadGraph("back.png");
int tmain;//敵メイン
tmain=LoadGraph("teki_main.png");
//構造体作成
//メイン敵の弾1
typedef struct{
int x[100]; //X座標
int y[100]; //Y座標
int nagasa; //X座標、Y座標の基準になる長さ
double sinsin[100]; //サイン値
double coscos[100]; //コサイン値
double r[100]; //ラジアン値
int flag; //フラグ
int count; //カウント
}ch_t;
ch_t tmain1;
//初期化
//敵の弾1
tmain1.flag=0;
tmain1.nagasa=0;
for(i=0;i<=99;i++){
tmain1.x[i]=0;
tmain1.y[i]=0;
if(i>0){
tmain1.r[i]=2*PI/(99/i);//100個の弾それぞれのラジアンを求める。
}
else tmain1.r[i]=0;
}
for(i=0;i<=99;i++){
if(i>0){
tmain1.sinsin[i] = sin(2.0*PI/(99.0/(double)i));//100個の弾それぞれのサイン値
tmain1.coscos[i] = cos(2.0*PI/(99.0/(double)i));//100個の弾それぞれのコサイン値
}
else{
tmain1.sinsin[i] = 0;
tmain1.coscos[i] = 0;
}
}
//メインループ
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定
while(ProcessMessage()==0 && ClearDrawScreen()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0){
//↑メッセージ処理 ↑画面をクリア ↑ESCが押されていない
ClearDrawScreen(); // 裏画面のデータを全て削除
//敵メイン攻撃
//弾の座標
tmain1.nagasa+=2;
for(i=0;i<=99;i++){
tmain1.x[i] = (tmain1.nagasa * tmain1.coscos[i])+320;
tmain1.y[i] = (tmain1.nagasa * tmain1.sinsin[i])+240;
}
//描画
for(i=0;i<=99;i++){
DrawCircle(tmain1.x[i],tmain1.y[i],2,BLACK);
}
//敵メイン表示
DrawGraph(320-13,240-13,tmain,TRUE);
ScreenFlip();
}
WaitKey() ; // 結果を見るためにキー待ち(『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
1,430ポイント を手に入れた。
|
|
|
|
Name: どどんぱち ..入門者(2,671ポイント)
Date: 2010/09/11(土) 00:07
No:61468
|
|
Title: NSTimer&UINavigationControllerに関する質問
|
|
いつもお世話になっております。
iPhone / Objective-C で
作成中のアプリに関する質問です。
見せられないものが含まれており
プロジェクトごとアップすることが出来ませんので
UI 構造等を記述させていただきます。
わかりづらくて申し訳ありませんが、よろしくお願いします。
◆UI 構造 ---
@ < 起動時 リスト表示シーン>
RootViewController(UITableViewController)
+ RootNavigationController(UINavigationController)
画面にはナビゲーションバー(上部)とテーブルが表示されています。
テーブルの任意のセルをタップすると、A < 画像描画シーン >に遷移します。
A < 画像描画シーン >
(上記の)RootNavigationController
+ ImgViewController(UIViewController)
+ GLImgView(UIView)
上部にナビゲーションバー(左側に@へ戻るボタンが自動で表示される)が
表示され、メイン画面には画像表示用のビューがあります。
-----
という構造で、Aからナビゲーションバーの@に戻るボタンを押した際、
そのこと(戻るボタンを押したこと)を検知するのに、
GLImgViewのdealloc()を使用し、その中でrelease処理等を行うようにしています。
----- で、ここからが問題 -----
AのGLImgViewで画像をアニメーション表示させる為に、NSTimerを生成〜開始すると
GLImgViewのdealloc()が呼ばれなくなり、ナビゲーションバーの戻るボタンで@に戻っても、
タイマーに設定した関数が呼ばれ続けます。タイマーの停止自体を、このdealloc()の中で
行うつもりでいましたので、処理の流れとして息詰まりました。
@に戻るボタンを押したことを検知し、
そこでタイマーを切る(もしくはタイマーを切るフラグをONにする)ようにしようかと
検索してみたものの、上記構造でナビゲーションバーに自動的に追加される「戻る」為の
ボタンの押下を取得する方法(どこに記述するかも含め)がわかりません。
@の方はxibを持たずに実装しています。
このような状態なのですが、
タイマーをdeallocで停止させる方法(これはOS側参照とかの問題で無理なのでしょうか)
か、ナビゲーションバー上のボタン(戻るボタン)の押下チェックを行う方法を、ご教授頂ければと思います。
よろしくお願いします。
842ポイント を手に入れた。
|
|
|
|
Name: Justy ..伝説なるハッカー(576,231ポイント)
Date: 2010/09/11(土) 00:59
No:61474
|
|
Title: Re:NSTimer&UINavigationControllerに関する質問
|
|
あー、NSTimerはシステムが、GLImgViewは NSTimerが retainしていて
NSTimerをシステムから releaseしないと、GLImgViewの deallocが呼ばれない、ってやつですね。
NSTimerは GLImgViewの viewWillDisappearでinvalidateしておけば
システムから NSTimerが releaseされ、GLImgViewの deallocが呼ばれたはずですよ。
149ポイント を手に入れた。
|
|
|
|
|
Name: どどんぱち ..入門者(2,512ポイント)
Date: 2010/09/11(土) 05:24
No:61487
|
|
Title: NSTimer&UINavigationControllerに関する質問
|
|
Justyさん
いつも、ありがとうございます。
お教え頂いた方法で無事、タイマーを停止できました。
RootNavigationController のviewWillappearの方でも
いけることを確認しました。
また、ナビゲーションコントローラーを使用した場合の
自動で追加される「戻るボタン」の押下を取れる方法
(どこにイベント受け取りの関数を記述すればよいか)
がありましたら、ご教授頂けたら幸いです。
159ポイント を落としてしまった。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(576,471ポイント)
Date: 2010/09/11(土) 13:42
No:61496
|
|
Title: Re:NSTimer&UINavigationControllerに関する質問
|
|
>自動で追加される「戻るボタン」の押下を取れる方法
大抵の場合 viewWillDisappearで事足りると思いますが、ボタンのイベントじゃないと
ダメなのですか?
そこはシステムが持っているんで、ボタン内容とかは変えられても、押下イベントは
とれないんじゃないかとかと思います。
(知らないだけで存在する可能性は大いにありますけど)
今提示できるアイデアとしてシステムのボタンを非表示にして自分で leftBarButtonItemにイベントを
とれるようにしたボタンをセットする、くらいです。
31ポイント を手に入れた。
|
|
|
|
|
Name: どどんぱち ..入門者(3,258ポイント)
Date: 2010/09/11(土) 17:54
No:61515
| 解決!
|
Title: Re:NSTimer&UINavigationControllerに関する質問
|
|
Justyさん
レスありがとうございます。
ナビゲーションコントローラーの方に関して。
すみません。私が知らないだけで、ボタン押下のイベントを取れるのではないかと
思っており、まだ学習中の身なので、学んでおけたらなということで、おうかがいしました。
それぞれのUIの使い方も学習して、ツールを作成する上での設計等も、もっとしっかり出来るように
していきたいと思っております。今後も、何かと質問させていただくと思いますが、よろしくお願いします。
178ポイント を手に入れた。
|
|
|
|
Name: Ultimate ..中級者(10,744ポイント)
Date: 2010/09/11(土) 16:41
No:61505
|
|
Title: 動作停止の理由
|
|
#include "DxLib.h"
#define PI 3.14159265358979323846264338327950288419
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
SetWindowSizeChangeEnableFlag( TRUE ) ;
SetDrawScreen(DX_SCREEN_BACK);
//色の設定
int WHITE,BLACK,RED,GREEN,BLUE;
WHITE = GetColor(255,255,255);
BLACK = GetColor(0,0,0);
RED = GetColor(255,0,0);
GREEN = GetColor(0,255,0);
BLUE = GetColor(0,0,255);
//その他変数
int i,j;
char key[256];
int maintekiimage;
maintekiimage=LoadGraph("back.png");
//構造体作成
//敵の弾1
typedef struct{
int x[100]; //X座標
int y[100]; //Y座標
int r[100]; //ラジアン値
int flag[100]; //フラグ
int count[100]; //ループカウント
}ch_t;
ch_t tt1;
//初期化
//敵の弾1
for(i=0;i<=99;i++){
tt1.x[i]=0;
tt1.y[i]=0;
tt1.r[i]=2*PI/(99/i);
tt1.flag[i]=0;
}
//メイン敵描画
DrawCircle(320,240,5,BLACK);
WaitKey() ; // キーの入力待ち(『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
とりあえず実験的に画面の中央に円を表示させてみようとしているのですが、実行すると動作を停止します。
なぜでしょうか?
メイクは成功するのですが、実行すると失敗します。
607ポイント を手に入れた。
|
|
|
|
Name: へろり ..プログラマー(37,864ポイント)
Date: 2010/09/11(土) 16:49
No:61506
|
|
Title: Re:動作停止の理由
|
|
> tt1.r[i]=2*PI/(99/i);
この部分ですね。
このコードが現れるループは for(i=0;i<=99;i++) となっており、ループカウンタの変数 i は0から始まります。
99/i のコードは 99/0 となり、0で除算を行った場合の動作は未定義です。
こういうのはとりあえず、1行1行トレースしてみると一発ですよ。
ソースレベルデバッガの導入を強くお勧めします。
113ポイント を落としてしまった。
|
|
|
|
|
Name: Tororo ..中級者(10,369ポイント)
Date: 2010/09/11(土) 16:50
No:61507
|
|
Title: Re:動作停止の理由
|
|
cahr Key[256]の 未初期化では?
(検証してません)
追記ーーーーーーーーーーーーーーーーーーーーー
原因違いましたね^^;
失礼しました。
ただ、初期化はしておかれたほうが良いと思います。 
23ポイント を手に入れた。
|
|
|
|
|
Name: Ultimate ..中級者(11,523ポイント)
Date: 2010/09/11(土) 17:28
No:61512
| 解決!
|
Title: Re:動作停止の理由
|
|
無事成功しました。
以下に変更後のソースも載せておきます!
#include "DxLib.h"
#define PI 3.14159265358979323846264338327950288419
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
SetWindowSizeChangeEnableFlag( TRUE ) ;
SetDrawScreen(DX_SCREEN_BACK);
//色の設定
int WHITE,BLACK,RED,GREEN,BLUE;
WHITE = GetColor(255,255,255);
BLACK = GetColor(0,0,0);
RED = GetColor(255,0,0);
GREEN = GetColor(0,255,0);
BLUE = GetColor(0,0,255);
//その他変数
int i,j;
char key[256];
int maintekiimage;
maintekiimage=LoadGraph("back.png");
//構造体作成
//敵の弾1
typedef struct{
int x[100]; //X座標
int y[100]; //Y座標
int r[100]; //ラジアン値
int flag[100]; //フラグ
int count[100]; //ループカウント
}ch_t;
ch_t tt1;
//初期化
//敵の弾1
for(i=0;i<=99;i++){
tt1.x[i]=0;
tt1.y[i]=0;
if(i>0){
tt1.r[i]=2*PI/(99/i);
}else tt1.r[i]=0;
tt1.flag[i]=0;
}
//メイン敵描画
WaitKey() ; // キーの入力待ち(『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
779ポイント を手に入れた。
|
|
|
|
Name: polpol ..入門者(3,796ポイント)
Date: 2010/09/11(土) 12:42
No:61493
|
|
Title: 龍神録の13章で
|
|
以前に質問した者ですが龍神録の13章で14章のばらまきショットを撃ちたいのですが
うまく動作してくれません。
コードはほぼ例と同じなのですが・・・
for(i=0;i<SHOT_MAX;i++){//弾幕データ計算
//フラグが立っていて、設定した種類が間違っていなければ(オーバーフロー対策)
if(enemy[i].bltime==enemy[i].cnt){
enter_shot(i);
}
if(shot[i].flag!=0 && 0<=shot[i].knd && shot[i].knd<SHOT_KND_MAX){
shot_bullet[shot[i].knd](i);//.kndの弾幕計算関数を呼ぶ関数ポインタ
shot_calc(i);//i番目の弾幕を計算
}
if(shot[i].flag>0){//弾幕データがオンなら
for(j=0;j<SHOT_BULLET_MAX;j++){//その弾幕が持つ弾の最大数分ループ
if(shot[i].bullet2[j].flag!=0){//弾データがオンなら
DrawRotaGraphF(
shot[i].bullet2[j].x, shot[i].bullet2[j].y,
1.0, shot[i].bullet2[j].angle+PI/2,
img_bullet[shot[i].bullet2[j].knd][shot[i].bullet2[j].col],TRUE);
}
}}}
//////////↓ヘッダーファイル//////////////
//ショット登録
void enter_shot(int i){
int j;
for(j=0;j<SHOT_MAX;j++){//フラグのたって無いenemyを探す
memset(&shot[j],0,sizeof(shot_t));//初期化して登録
shot[j].flag=1;//フラグをたてる
shot[j].knd=enemy[j].blknd;//弾の種類
shot[j].num=i;//num=どの敵から発射されたものか。
shot[j].cnt=0;
return ;
}
}
//n番目のショットを登録した敵と自機との角度を返す
extern int PlayerX, PlayerY;
double shotatan2(int n);
double shotatan2(int n,int PlayerX,int PlayerY){
return atan2(PlayerY-enemy[shot[n].num].y,PlayerX-enemy[shot[n].num].x);
}
//空いている弾を探す
int shot_search(int n){
int i;
for(i=0;i<SHOT_BULLET_MAX;i++){
if(shot[n].bullet2[i].flag==0){
return i;
}
}
return -1;
}
void shot_calc(int n){
int i,max=0;
if(enemy[shot[n].num].flag!=1)//敵が倒されたら
shot[n].flag=2;//それ以上ショットを登録しないフラグに変える
for(i=0;i<SHOT_BULLET_MAX;i++){//n番目の弾幕データの弾を計算
if(shot[n].bullet2[i].flag>0){//その弾が登録されていたら
shot[n].bullet2[i].x+=cos(shot[n].bullet2[i].angle)*shot[n].bullet2[i].spd;
shot[n].bullet2[i].y+=sin(shot[n].bullet2[i].angle)*shot[n].bullet2[i].spd;
shot[n].bullet2[i].cnt++;
}
}
//現在表示中の弾が一つでもあるかどうか調べる
for(i=0;i<SHOT_BULLET_MAX;i++)
if(shot[n].bullet2[i].flag>0)
return;
if(enemy[shot[n].num].flag!=1){
shot[n].flag=0;//終了
enemy[shot[n].num].flag=0;
}
}
//100カウント中に10発、自機に向かって直線発射(常に自機狙い)
void shot_bullet_H001(int n){
int t=shot[n].cnt;
int k;
if(t>=0 && t<100 && t%10==0){//100カウント中10カウントに1回
if(shot[n].flag!=2 && (k=shot_search(n))!=-1){//敵がいて、弾が登録可能なら
shot[n].bullet2[k].knd =enemy[shot[n].num].blknd2;//弾登録
shot[n].bullet2[k].angle =shotatan2(n,PlayerX,PlayerY);//角度
shot[n].bullet2[k].flag =1;//フラグ
shot[n].bullet2[k].x =enemy[shot[n].num].x;//座標
shot[n].bullet2[k].y =enemy[shot[n].num].y;
shot[n].bullet2[k].col =enemy[shot[n].num].col;//色
shot[n].bullet2[k].cnt =0;//カウンタ
shot[n].bullet2[k].spd =3;//スピード
se_flag[0]=1;
}
}
}
1,388ポイント を手に入れた。
|
|
|
|
Name: polpol ..入門者(3,906ポイント)
Date: 2010/09/11(土) 12:54
No:61495
|
|
Title: Re:龍神録の13章で
|
|
上のようなコードで全弾1000発発射される動作をします
if(shot[i].flag!=0 && 0<=shot[i].knd && shot[i].knd<SHOT_KND_MAX){}の中に
shot[i].cnt++;を書くと1発だけしか発射されなくなります
2倍のポイントを手に入れた! 110ポイント を手に入れた。
|
|
|
|
Name: よし ..ぴよぴよ(120ポイント)
Date: 2010/09/10(金) 20:30
No:61432
|
|
Title: 質問です
|
|
C#.netの環境で、
各フォームで定義しなくてもメソッドは呼び出せるのでしょうか??
例えば、
1:Formが、MainForm、1Form、2Formの3つがある
2:MainFormに1Form、2Formの定義をする
3:2Formで1Formのメソッドを呼び出す時、Mainを経由して呼び出す
こういうのってできますか??
90ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(213,687ポイント)
Date: 2010/09/10(金) 21:52
No:61444
|
|
Title: Re:質問です
|
|
できますよ。
設計的にどうかな?とは思いますけど…
もう少し詳しい関数の仕様が分かれば、答えやすいですけどね。場合によってはイベントを発生させる必要があったり、Invokeを使用する必要があったりしますので…
105ポイント を手に入れた。
|
|
|
|
|
Name: よし ..ぴよぴよ(149ポイント)
Date: 2010/09/11(土) 11:35
No:61492
| 解決!
|
Title: Re:質問です
|
|
ありがとうございます。それがわかっただけで十分です。
29ポイント を手に入れた。
|
|
|
|
Name: taketoshi ..入門者(3,918ポイント)
Date: 2010/09/09(木) 21:23
No:61378
| 解決!
|
Title: クリップボードからビットマップの保存方法について
|
|
こんばんわ、お世話になります。
現在クリップボードにあるビットマップデータを
ビットマップファイルに保存するプログラムをWINAPI32で書いているのですが
どうにもやり方がわからないので質問させて下さい。
試しに以下のようなクリップボードからビットマップのハンドルを取得して
そこからビットマップのヘッダ情報を読み込むようなプログラムを書いてみたのですが
*windowsプログラムだと数値の出力がややこしいのでコンソールで書きました
#include<windows.h>
#include<stdio.h>
int main()
{
HANDLE hBitmap,hMem,hMem2;
HWND std;
LPBITMAPFILEHEADER lpBp;
LPBITMAPINFOHEADER lpBi;
DWORD dwFile;
DWORD dwOffbits,dwFsize;
char szFile[3];
LONG bw,by;
BOOL bRet;
std = FindWindow(NULL,NULL); //コンソールのウインドウハンドル取得
if(std == NULL)
{
printf("ウインドウハンドル取得エラー");
}
OpenClipboard(std);
hBitmap = GetClipboardData(CF_BITMAP); //ビットマップハンドルの取得
if(hBitmap == NULL)
{
printf("ビットマップがクリップボードにありません\n");
return -1;
}
/*ビットマップファイルヘッダーの取得と数値の書き込み*/
hMem = GlobalAlloc(GHND,sizeof(LPBITMAPFILEHEADER));
lpBp = (LPBITMAPFILEHEADER)GlobalLock(hMem);
bRet = ReadFile(hBitmap,lpBp,sizeof(LPBITMAPFILEHEADER),&dwFile,NULL);//ビットマップハンドルからのファイル読み込み ここでエラー発生
if(bRet ==FALSE)
{
printf("ファイル読み込みエラー");
return -1;
}
dwOffbits = lpBp->bfOffBits;
dwFsize = lpBp->bfSize;
szFile[0] = LOBYTE(lpBp->bfType);
szFile[1] = HIBYTE(lpBp->bfType);
szFile[2] = '\0';
printf("offbits=%ld\nFileSize = %ld\nFileType = %s\n",dwOffbits,dwFsize,szFile);
/*ビットマップインフォヘッダーの取得と数値の書き込み*/
hMem2 = GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER));
lpBi = (LPBITMAPINFOHEADER)GlobalLock(hMem2);
ReadFile(hBitmap,lpBi,sizeof(BITMAPINFOHEADER),&dwFile,NULL);
bw = lpBi->biWidth;
by = lpBi->biHeight;
printf("x = %ld\n y = %ld",bw,by);
GlobalUnlock(hMem);
DeleteObject(hBitmap);
CloseClipboard();
return 0;
}
bRet = ReadFile(hBitmap,lpBp,sizeof(LPBITMAPFILEHEADER),&dwFile,NULL);
上記の行で、ファイルが読み込めずエラーが発生してしまいます。
Readfile関数はCreate関数で作成したハンドルしか読めない様子なので行き詰ってしまいました。
根本的なプログラミング方法が間違っている気がします。
クリップボードからBMP保存方法についての考え方をご指導いただけないでしょうか?
よろしくお願いいたします。 
799ポイント を手に入れた。
|
|
|
|
Name: taketoshi ..初心者(6,190ポイント)
Date: 2010/09/11(土) 10:54
No:61491
|
|
Title: Re:クリップボードからビットマップの保存方法について
|
|
シエルさんありがとうございます。
DIBで取得するっていうヒントを頂いてから、ご紹介頂いたホームページや
他のサイトで調べまくって、やっとクリップボードから画像の取得が出来ました。
ビットマップ構造を調べながらプログラミングしていたので、非常に時間がかかりましたが
目的が達成できて非常にうれしいです。
デバッグしながらやってたので、作業ファイル作成とか不必要な部分も含まれてて汚いですが
他の方の参考になればとソースを晒しておきます。ありがとうございました
#include<windows.h>
#include<stdio.h>
int main()
{
HWND std;
HANDLE hBitmap,hFile;
HANDLE hMem;
char *szBuffer;
char szFileName[128];
DWORD dwAccWriteByte,dwAccReadByte,dwBitSize;
LPBITMAPINFOHEADER lpBi;
BITMAPFILEHEADER Bf;
//ウインドウハンドル取得
std = FindWindow(NULL,NULL);
//クリップボードオープン
OpenClipboard(std);
//DIBハンドルの取得
hBitmap = GetClipboardData(CF_DIB);
if(hBitmap == NULL)
{
printf("BITMAPがクリップボードにありません\n");
return -1;
}
//クリップボードクローズ
CloseClipboard();
//DIBハンドルをポインタに変換
szBuffer = (char *)GlobalLock(hBitmap);
//BITMAP FILEHEADER用にINFOHEADER以降のファイルサイズ取得
dwBitSize = GlobalSize(hBitmap);
//作業用ファイルの作成
strcpy(szFileName,"test.bmp");
hFile = CreateFile(szFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
perror("ファイル生成エラー\n");
return -2;
}
WriteFile(hFile,szBuffer,GlobalSize(hBitmap),&dwAccWriteByte,NULL);
CloseHandle(hFile);
//作業ファイルからBITMAP INFOHEADERの読み込み
hMem = GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER));
lpBi = (LPBITMAPINFOHEADER)GlobalLock(hMem);
hFile = CreateFile(szFileName,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
ReadFile(hFile,lpBi,sizeof(BITMAPINFOHEADER),&dwAccReadByte,NULL);
CloseHandle(hFile);
//作業ファイルの削除
remove(szFileName);
////debug
printf("WIDTH = %d\nHEIGHT = %d\nINFO以降のサイズ = %ld\n",lpBi->biWidth,lpBi->biHeight,dwBitSize);
//BITMAP FILEHEADER設定
Bf.bfType = 0x4d42;
Bf.bfSize = dwBitSize + sizeof(BITMAPFILEHEADER);
Bf.bfOffBits = sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER);
//BITMAP FILEHEADERの書き込み
strcpy(szFileName,"Header書き込みあと.bmp");
hFile = CreateFile(szFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(hFile,&Bf,sizeof(BITMAPINFOHEADER),&dwAccWriteByte,NULL);
//進んだBITMAP FILEHEADER書き込み直後に移動
SetFilePointer(hFile,sizeof(BITMAPFILEHEADER),0,FILE_BEGIN);
//BITMAP FILEHEADER以外の書き込み
WriteFile(hFile,szBuffer,dwBitSize,&dwAccWriteByte,NULL);
CloseHandle(hFile);
//メモリの開放
GlobalUnlock(hMem);
GlobalFree(hMem);
GlobalUnlock(hBitmap);
return 0;
}
2倍のポイントを手に入れた! 2,272ポイント を手に入れた。
|
|
|
|
Name: 山崎 ..熟練のプログラマー(49,110ポイント)
Date: 2010/09/10(金) 13:34
No:61411
|
|
Title: wavファイルを作りたい
|
|
いつもお世話になっております、山崎です。
今回は、wavファイルの作り方について伺いに参りました。
先日、お世話になっている方に
「こんなふうに音が鳴るプログラムが作りたい。どうすればいいかわからないか」
と尋ねられ、音声ファイルの中身を全く知らない私は何も力になることができませんでした。
そこで、現在wavファイルの作り方についていろいろ調べております。
とりあえず、wavファイルを学ぶ上での最初の目標として、
「"ラ"の音を1秒間鳴らすwavファイルを作る」
ことにいたしました。
そしてwavファイルの作り方を検索したところ、
フォーマットについて紹介したサイトはいくつか見つけることができたのですが、
どんな方法でそれらのフォーマットをファイルに書き込めばいいのか
具体的な解説が載ったサイトを見つけることができませんでした。
ちなみに、以下のサイトを主な参考としていました。
http://www.kk.iij4u.or.jp/~kondo/wave/#wav
そこで、それらのサイトのフォーマットを見ながら、
C++で闇雲に下記のようなプログラムを書いて実行し、怪しいwavファイルを作って
メディアプレイヤーで読み込んでみましたが、もちろん再生されることはありませんでした。
本当にwavファイルについて何もわかっていないので、かなり馬鹿なことをしていると思います。
コメントに、作成中の私の心の中の疑問などを書きました。
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE* fp=fopen("TestWave.wav","wb"); //サイトには何も書いていなかったが、wavの中身はおそらくバイナリファイルなのだろう。
fputs("RIFF",fp); //"RIFF"という文字列を4バイトで書き込めばいいのだろうか。半角英数字は1文字で1バイトだから、これでいいはず?
fputs("1500",fp); //全体のファイルサイズから8を引いたバイト数を書けばいいらしい。今はわからないから適当に1500バイトと書いて後回し。
fputs("WAVE",fp); //"WAVE"という文字列を4バイトで書き込む。
fputs("fmt ",fp); //"fmt "という文字列を4バイトで書き込む。おっと、スペースを入れるのを忘れちゃいけない。
fputs("0018",fp); //fmtチャンクなるもののバイト数を書くのだらしい。ここもよくわからないから適当に18バイトにしておこう。
fputs("01",fp); //フォーマットIDとは何だろう?よくわからないので、サイトのとおり1にしておこう。
fputs("01",fp); //チャンネル数とはステレオとモノラルのことらしい。まずは簡単そうなモノラルにしてみよう。ということで1。
fputs("4410",fp); //サンプリングレート、1秒間に何バイト分の音声データを持たせるか、かな。勝手にキロのオーダーになるのだろうか。よくわからないので4410に。
fputs("4410",fp); //データ速度?サンプリングレートとどう違うのだろう。よくわからないから同じ4410に。
fputs("04",fp); //ブロックサイズなるものを書くらしい。よくわからないので、サイトのまねをして4に。
fputs("16",fp); //「サンプルあたりのビット数」とは何だろう。そもそも何のサンプルだろう?ここもサイトのまねをして16に。
fputs("00",fp); //拡張部分のサイズを書くらしい。拡張しなくてもいいから0にしておく。
fputs("data",fp); //"data"という文字列を4バイトで書き込む。
fputs("1000",fp); //波形データのバイト数をここに入れるようだ。とりあえず1000バイトとしておく。
//最後に波形データを書き込めばいいようだが、どんな形式で書けばいいのだろう。
//周波数とか振幅とか、どういう形式で書いて何で区切ればいいのだろう。
//とりあえず、何の意味もないノイズでもいいので音を鳴らしてみよう。
//さっき波形データのバイト数を1000にしたから、charが1000個で1000バイトになるはずだ。
for(int i=0;i<1000;i++)
{
char Temp=rand()%256; //とりあえず0から255までのランダムな数値を求める。
fputc(Temp,fp);
}
fclose(fp);
return 0;
}
これではラの音を出すどころか、ノイズさえ出すことができません。
どのようにすれば、wavファイルをC++で生成することができるのでしょうか。
あるいは、フォーマットだけでなく具体的なwavの作り方を解説しているサイトはありますでしょうか。
2倍のポイントを手に入れた! 2,916ポイント を手に入れた。
|
|
|
|
Name: ookami ..熟練のプログラマー(51,755ポイント)
Date: 2010/09/10(金) 14:24
No:61414
|
|
Title: Re:wavファイルを作りたい
|
|
とりあえず、数値のところは、文字列ではなくバイナリデータで書き込むんじゃないかと思います。
例えば、
fputs("1500",fp);
↓
i=1500;
fwrite(&i,4,1,fp);
エンディアンとか、ちょい不安です。
46ポイント を落としてしまった。
|
|
|
|
|
Name: toyo ..熟練のプログラマー(59,585ポイント)
Date: 2010/09/10(金) 15:09
No:61416
|
|
Title: Re:wavファイルを作りたい
|
|
構造体にした方がまとまりますよ
windowsなら
#include <windows.h>
で使えます
WAVEFORMAT wf;
PCMWAVEFORMAT pfm;
pfm.wBitsPerSample = 16;//「サンプルあたりのビット数」。16か8、16ビットサウンドの方が音質がよい。
wf.wFormatTag = 1; //フォーマットID PCMフォーマットなので1。
wf.nChannels = 1; //モノラルで1。
wf.nSamplesPerSec = 44100; //サンプリングレート、よくみかける44.1Kに
wf.nAvgBytesPerSec = wf.nChannels * wf.nSamplesPerSec * pfm.wBitsPerSample / 2;//データ速度。上の2つをかけたやつに16ビットサウンドなら2倍
wf.nBlockAlign = wf.nChannels * pfm.wBitsPerSample / 2;// データブロック1個のバイト数
書き込むときも
fwrite(&pfm, sizeof(pfm), 1, fp);
でまとめ書きできます
200ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..熟練のプログラマー(59,694ポイント)
Date: 2010/09/10(金) 15:12
No:61417
|
|
Title: Re:wavファイルを作りたい
|
|
間違えた
wf.nAvgBytesPerSec = wf.nChannels * wf.nSamplesPerSec * pfm.wBitsPerSample / 8;//データ速度。上の2つをかけたやつに16ビットサウンドなら2倍
wf.nBlockAlign = wf.nChannels * pfm.wBitsPerSample / 8;// データブロック1個のバイト数
/2じゃなくて/8です
追加編集
書き込む前に
pfm.wf = wf;
も必要です

109ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..熟練のプログラマー(60,215ポイント)
Date: 2010/09/10(金) 16:18
No:61418
|
|
Title: Re:wavファイルを作りたい
|
|
ちょっと作ってみました
音データは+-800の矩形波です
#include <stdio.h>
#include <windows.h>
int main()
{
DWORD file_size;
DWORD pfm_size = sizeof(PCMWAVEFORMAT);
DWORD data_size;
PCMWAVEFORMAT pfm;
short* wave_data;
int freqency = 441; // 適当(ラの音に近くてサンプリングレートにきりがいい)
pfm.wBitsPerSample = 16;
pfm.wf.wFormatTag = 1;
pfm.wf.nChannels = 1;
pfm.wf.nSamplesPerSec = 44100;
pfm.wf.nAvgBytesPerSec = pfm.wf.nChannels * pfm.wf.nSamplesPerSec * pfm.wBitsPerSample / 8;
pfm.wf.nBlockAlign = pfm.wf.nChannels * pfm.wBitsPerSample / 8;
data_size = pfm.wf.nAvgBytesPerSec * 10; // 10秒分のデータ
wave_data = (short*)malloc(data_size);
int loop = pfm.wf.nSamplesPerSec / freqency / 2;
int count = 0;
for (int sec = 0; sec < 10; sec++)
{
for (int j = 0; j < freqency; j++)
{
for(int i=0; i < loop; i++)
{
wave_data[count++] = 800; // 音量
}
for(int i=0; i < loop; i++)
{
wave_data[count++] = -800; // -音量
}
}
}
file_size = sizeof(PCMWAVEFORMAT) + data_size + 20; // 下の+の分
FILE* fp=fopen("TestWave.wav","wb");
fputs("RIFF",fp);
fwrite(&file_size, sizeof(DWORD), 1, fp);
fputs("WAVE",fp); // +4
fputs("fmt ",fp); // +4
fwrite(&pfm_size, sizeof(DWORD), 1, fp); // +4
fwrite(&pfm, sizeof(PCMWAVEFORMAT), 1, fp); // +sizeof(PCMWAVEFORMAT)
fputs("data",fp); // +4
fwrite(&data_size, sizeof(DWORD), 1, fp); // +4
fwrite(wave_data, 1, data_size, fp); // +data_size
fclose(fp);
free(wave_data);
return 0;
}
521ポイント を手に入れた。
|
|
|
|
|
Name: 山崎 ..熟練のプログラマー(49,597ポイント)
Date: 2010/09/10(金) 18:32
No:61425
|
|
Title: Re:wavファイルを作りたい
|
|
ookamiさん、toyoさん
ご返信まことにありがとうございます。
toyoさんの提示してくださったコードを実行したところ、
大体"ラ"の音が10秒続くwaveファイルが作成されました。
このプログラムを元に、これからwaveファイル作成に関して精進していこうと思います。
本当にありがとうございます。
提示して頂いたプログラムについて、
いくつか質問があるのですがよろしいでしょうか。
1.
short* wave_data; とありますが、なぜ波形データの部分はshort型で領域を確保するのでしょうか。
2.
fputs("RIFF",fp); と
fwrite(&file_size, sizeof(DWORD), 1, fp); のように、
fputsとfwriteで書き込む2通りがありますが、
fputsだけを使う、あるいはfwriteだけを使う、といった場合は、どのようにすればいいでしょうか。
3.
最後はちょっと意見をお伺いしたいのですが、
提示してくださったプログラムではwindows.hのDWORD構造体やPCMWAVEFORMAT構造体を使っておられますが、
windows.hの構造体を用いずにwaveファイルを生成することについてどうお考えでしょうか。
プログラムが煩雑になりすぎて非現実的ではないとか、
そこまで自力でのwaveファイルの作成にこだわる必要はない、など意見がありましたらどうかお聞かせください。
487ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..熟練のプログラマー(60,716ポイント)
Date: 2010/09/10(金) 19:41
No:61430
|
|
Title: Re:wavファイルを作りたい
|
|
お答えします
1.
今回はサンプリングデータpfm.wBitsPerSampleを16ビットに指定したため同じビット数のshortにしました
16ビットサウンドの場合はサンプルデータの型はsigned shortになります。この場合0が中央値で正と負の値をとります。
これが8ビットサウンドの場合データ型はunsigned charにしないといけません。この場合中央値が128になります。
2.
バイナリデータを扱うのでfputsだけでは無理です。
unsigned int riff = 'FFIR';
fwrite(&riff, 4, 1, fp);
のような方法もありますが自分ではどうかなと思います。
windowsでは
#define MAKEFOURCC(ch0, ch1, ch2, ch3) \
((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \
((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))
のマクロも定義されていてこれを使えば
DWORD riff = MAKEFOURCC('R','I','F','F');
fwrite(&riff, 4, 1, fp);
と書けます。
こちらのほうがお勧めですね。
3.
PCMWAVEFORMATは構造体ではなくばらばらの変数にしてもまったく問題ないと思いますよ。
最初にあげられた参考URLのサンプルプログラムではそうなっているようです。
構造体をファイルで読み書きするにはpaddingの問題がからんできますし。
DWORDは構造体ではなく型のtypedefですのでunsigned longに書き換えればいいだけです。
タイプするのがめんどくさかっただけですので。
501ポイント を手に入れた。
|
|
|
|
|
Name: 山崎 ..熟練のプログラマー(49,852ポイント)
Date: 2010/09/11(土) 09:06
No:61490
| 解決!
|
Title: Re:wavファイルを作りたい
|
|
toyoさん
ご丁寧に回答くださり、誠にありがとうございます。
それとお礼が遅れてしまい申し訳ございません、夏風邪を引いたためか体調を崩しておりました。
wave_dataに使う型や中央値には、決まりがあるのですね。
それを聞かないままでは、危うく不適切な型などを使うところでした。
気をつけて学んでいきたいと思います。
当初、wavファイルの編集に特化したwindows.hの構造体の存在を知らなかったので、
知らないままでもプログラムが作れるのかと疑問に思っていたのです。
どうやら、PCMWAVEFORMAT構造体などを使わなくても可能みたいですね。
慣れてきましたら、チャレンジしたいと思います。
本当に、ご丁寧な解説ありがとうございました。 
255ポイント を手に入れた。
|
|
|
|
Name: どどんぱち ..入門者(3,080ポイント)
Date: 2010/09/11(土) 05:29
No:61488
|
|
Title: テクスチャ描画のシミュレータでの挙動に関して
|
|
お世話になっております。
連続投稿になってしまい申し訳ございません。
iPhone / Objective-C
Xcode バージョン 3.2.3
iPhoneシミュレータ バージョン4.0(最新の4.1でも同じでした)
上記環境にて、OpenGL ESを使用し、
http://iphone.pankaku.com/book/
の書籍を参考にテクスチャ描画を行っています。
< やりたい動作 >
任意の枚数のテクスチャをロード〜指定した1枚のテクスチャを表示させます。
テクスチャの読み込みは書籍とは違い、ネットからDLした
画像データをNSDataの状態で以下の読み込み関数に渡しています。
< 現象 >
実機では確認されず正常な動作なのですが、シミュレータ
で上記< やりたい動作 >を行うと、表示させる為に指定したテクスチャ
だけではなく、ロードしたテクスチャが全部〜複数枚表示されてしまいます。
複数の実機で試しましたが、シミュレータだけの現象のようですので
何が原因か見当がついておりません。
出来れば、シミュレータ上で正常に動作確認を行えるようにしたいので、
改善方法等がありましたらアドバイスをお願いします。
//画像ファイルからテクスチャを作成します
GLuint loadTexture(NSData* data){
GLuint texture;
//画像ファイルを展開しCGImageRefを生成します
CGImageRef image = [UIImage imageWithData:data].CGImage;
if(!image){ //画像ファイルの読み込みに失敗したらfalse(0)を返します
NSLog(@"Error: texture not found");
return 0;
}
//画像の大きさを取得します
size_t width = CGImageGetWidth(image);
size_t height = CGImageGetHeight(image);
//ビットマップデータを用意します
GLubyte* imageData = (GLubyte *) malloc(width * height * 4);
CGContextRef imageContext = CGBitmapContextCreate(imageData,width,height,8,width * 4,CGImageGetColorSpace
(image),kCGImageAlphaPremultipliedLast);
CGContextDrawImage(imageContext, CGRectMake(0, 0, (CGFloat)width, (CGFloat)height), image);
CGContextRelease(imageContext);
//OpenGL用のテクスチャを生成します
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
free(imageData);
return texture;
}
void drawTexture(float x, float y, float width, float height, GLuint texture, float u, float v, float tex_width,float tex_height, int red, int green, int blue, int alpha){
//長方形を構成する四つの頂点の座標を決定します
const GLfloat squareVertices[] = {
-0.5f*width + x, -0.5f*height + y,
0.5f*width + x, -0.5f*height + y,
-0.5f*width + x, 0.5f*height + y,
0.5f*width + x, 0.5f*height + y,
};
//長方形を構成する四つの頂点の色を指定します
//ここではすべての頂点を同じ色にしています
const GLubyte squareColors[] = {
red, green, blue ,alpha,
red, green, blue ,alpha,
red, green, blue ,alpha,
red, green, blue ,alpha,
};
//元画像のどの範囲を描画に使うかを決定します
const GLfloat texCoords[] = {
u, v+tex_height,
u+tex_width, v+tex_height,
u, v,
u+tex_width, v,
};
//テクスチャ機能を有効にし、描画に使用するテクスチャを指定します
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
//頂点座標と色、およびテクスチャの範囲を指定し、描画します
glVertexPointer(2, GL_FLOAT, 0, squareVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors);
glEnableClientState(GL_COLOR_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
}
568ポイント を手に入れた。
|
|
|
Name: dydx ..ぴよぴよ(121ポイント)
Date: 2010/09/11(土) 01:10
No:61475
|
|
Title: 配列の要素番号と構造体のメンバ参照について
|
|
こんにちは。
単発の質問なのですが、
例えば
struct kouzoutai{int x,y;}
struct kouzoutai a;
と構造体を宣言したとして、
それをhairetu[a.y][a.x]のように配列の要素番号に用いることはできませんか?(浮動小数点の不正な利用とエラーがでてしまいます。)
仕方が無いので、ax=a.x;ay=a.y;と通常の変数に代入してから
hairetu[ay][ax]と代入しているのですが、良い方法はありませんか?
121ポイント を手に入れた。
|
|
|
|
Name: fatens ..上級者(18,374ポイント)
Date: 2010/09/11(土) 01:16
No:61476
|
|
Title: Re:配列の要素番号と構造体のメンバ参照について
|
|
>それをhairetu[a.y][a.x]のように配列の要素番号に用いることはできませんか?(浮動小数点の不正な利用とエラーがでてしまいます。)
普通はできます。
試してみたコードと、正確なエラーメッセージを貼ってみてください。
2倍のポイントを手に入れた! 84ポイント を手に入れた。
|
|
|
|
|
Name: dydx ..ぴよぴよ(35ポイント)
Date: 2010/09/11(土) 01:47
No:61478
| 解決!
|
Title: Re:配列の要素番号と構造体のメンバ参照について
|
|
fatensさん>>投稿用に今一度同じ事を新たに試してみたところ解決しました。
上の例で言うx、yがfloat型だったためにエラーが出ていたみたいです。
つまりfloat型だとそれが整数でも配列の要素番号として扱えないのですね。
お手数おかけしました。ありがとうございました。
35ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..熟練のプログラマー(55,438ポイント)
Date: 2010/09/11(土) 00:49
No:61473
| 解決!
|
Title: Re:Dixqさんへ質問です。
|
|
Dixqさんへ
返事をもらったということと、私事に近いスレだったので質問内容を消しました。
このようなことでこんなスレを立ててしまいすいませんでした。
もしこの質問内容を消してはよくないということであればいっていただけるとうれしいです。
丁寧なお返事、どうもありがとうございました。
147ポイント を手に入れた。
|
|
|
|
Name: かなで ..ぴよぴよ(788ポイント)
Date: 2010/09/10(金) 00:44
No:61392
|
|
Title: C言語で配列の重複チェック
|
|
1〜9の整数が入っている配列があります。
値が重複してたらエラー、していなかったらOKといった関数を作りたいです。
自分なりに作ってみたのですがどうもうまくいきません。
よろしければ修正案を頂けないでしょうか?
bool cf = false;
int array[9] = { 1,2,3, 7,5,6, 4,9,8 }; // この時はOKになります。
//int array[9] = { 2,2,3, 7,5,6, 4,9,8 }; // この時は2が重複しているのでエラーにしたいです。
int check = 1;
bool ArrayCheck(void){
check = 1;
do{
for(int i=0; i<9; i++){
if(array[i] == check){
check++;
}
if( i==8 ){
if(check == 10) return true;
else return false;
// break;
}
}
}while(1);
return true;
}
〜略〜
cf = ClearCheck();
DrawFormatString( 100, 100, 0xffffff, "%d", cf );
DrawFormatString( 100, 120, 0xffffff, "%d", check );
70ポイント を手に入れた。
|
|
|
|
Name: うしお ..かけだし(1,763ポイント)
Date: 2010/09/10(金) 00:56
No:61393
|
|
Title: Re:C言語で配列の重複チェック
|
|
array
がソートされていることが分かっているなら、
右隣と比べて同じならアウト、を1週したらどうでしょうか?
52ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..中級者(9,560ポイント)
Date: 2010/09/10(金) 01:06
No:61394
|
|
Title: Re:C言語で配列の重複チェック
|
|
効率がいいかどうかは後で考えることにして、
[0]を[1]〜[8]と比較する。どこかで一致したらfalseを返す。
[1]を[2]〜[8]と比較する。どこかで一致したらfalseを返す。
[2]を[3]〜[8]と比較する。どこかで一致したらfalseを返す。
[3]を[4]〜[8]と比較する。どこかで一致したらfalseを返す。
[4]を[5]〜[8]と比較する。どこかで一致したらfalseを返す。
[5]を[6]〜[8]と比較する。どこかで一致したらfalseを返す。
[6]を[7]〜[8]と比較する。どこかで一致したらfalseを返す。
[7]を[8]と比較する。一致したらfalseを返す。
ここまで来れば、すべての要素が異なることがわかるので、trueを返す。
というような二重ループからなる関数を作ればいいのではないでしょうか。
うしお氏の案は、例題の配列要素がソートされてないので却下。
259ポイント を手に入れた。
|
|
|
|
|
Name: かなで ..ぴよぴよ(958ポイント)
Date: 2010/09/10(金) 01:23
No:61395
|
|
Title: Re:C言語で配列の重複チェック
|
|
お二方ともご回答ありがとうございます。
あれ・・・いとも簡単に出来たかもしれません・・・。
下記のソースでいいのですよね?
bool ClearCheck(void){
for(int i=0; i<9; i++){
for(int j=i+1; j<9; j++){
if(array[i] == array[j]) return false;
}
}
return true;
}
170ポイント を手に入れた。
|
|
|
|
|
Name: かなで ..ぴよぴよ(982ポイント)
Date: 2010/09/11(土) 00:40
No:61472
| 解決!
|
Title: Re:C言語で配列の重複チェック
|
|
そうですよねΣ
修正させて頂きました。
皆様ありがとうございます!!
24ポイント を手に入れた。
|
|
|
|
Name: ookami ..熟練のプログラマー(52,354ポイント)
Date: 2010/09/10(金) 17:04
No:61419
|
|
Title: 【雑談】auユーザー求む・掲示板に現在地を投稿テスト
|
|
※ 自宅でやらないでくださいね!
※ 今のところ au だけ対応
お世話になっております。ookamiです。
ゲーム制作支援サイトを作っている関係上、
掲示板が必要
↓
ケータイでも見れるようにしたい
↓
ケータイからも投稿できるようにしたい
までは順当にやってきたんですが、
ちょっと思いつきでこんなことをしてみました。
ケータイから画像も投稿したい
↓
旅行先なんかで画像を投稿したら、GPSで現在地を付記したくなることもあるだろう
ということで、完全にゲーム制作支援から脱線してるんですが、
phpオモシロスとか言ってたら実現しましたwwww
で、自分のケータイでは動作確認したのですが、
他のケータイではどうなんだ、と。
機種依存とか、けっこう厳しいだろ、と。
ということで、お時間ある方!
ご協力いただけましたら幸いです。
※ 自宅でやらないでくださいね!
【参加条件】
・au ケータイユーザー(自分がauなのでauから対応しました。auでない方はごめんなさい)
・個人宅ではない所にいる(住所とかアレしても責任とれません 汗)
【手順】
ケータイで↓にアクセス
http://oookami.sakura.ne.jp/integ/m.php?a=thread&t=42&o=last10
一番下に入力欄がありますので、
「名前」:何でもいいです(空欄はNG)
「本文」:何でもいいです(空欄はNG)
「画像を添付・現在地を付加」チェックボックス:ON!
↓
「投稿」ボタンをクリック
↓
画像を添付:「ここをクリックしてメールを起動」をクリックするとメール送信画面になりますので、何か画像を添付してメール送信。
↓
現在地を付加:「au」をクリックすると、現在地を送信します。「現在値を記事に追加しました。」と表示されるので、ケータイの「戻る」ボタンで戻って下さい。
↓
「スレッドに戻る」をクリック
↓
スレッドの一番下に、正しく画像と現在地が投稿されていればOKです。
現在地の表示には、googlemapを利用しています。
メールで送った画像は、後から添付されることがあります。
なお、スレッドはPCではこのように見えます。
http://oookami.sakura.ne.jp/integ/?a=thread&t=42
【ご報告お願い事項】
・うまくいったか
・ケータイの機種
ということで、なにげなく参加条件がきびしいかもですが、
「たまにはお前(ookami)の遊びに付き合ってやるよ」という方、
よろしくお願いしますm(_ _)m
599ポイント を手に入れた。
|
|
|
|
Name: ookami ..熟練のプログラマー(52,150ポイント)
Date: 2010/09/11(土) 00:36
No:61470
|
|
Title: Re:【雑談】auユーザー求む・掲示板に現在地を投稿テスト
|
|
ドコモとSoftBank各ユーザーさんからも試していただき、恐縮ですw
手元には実機がないので、確認ができないのですが、
「調べる限りでは、こうかな」、というテストページを作ってみました。
GPSのところだけ抽出した感じです。(掲示板の方は修正していません)
http://oookami.sakura.ne.jp/integ/gpstest.php
位置情報を取得してgooglemapへのリンクを表示しますが、サーバ側で保存したり、別ページへの転載など、一切いたしません。念のため。
Docomo, au, SoftBank, Willcom に対応している...はずです。
お時間よろしい方、引き続き、
ご協力いただけますと幸いです。
174ポイント を落としてしまった。
|
|
|
|
Name: pon ..入門者(3,033ポイント)
Date: 2010/09/06(月) 22:38
No:61147
|
|
Title: gcc/g++の使い方
|
|
g++ -O2 -Wall -Wextra 〜.cpp -o 〜
.cppをcompileする時、自分は毎回こうします。
bash_profileをいじれば良いと言う話を聞いたのですが、どうすればいいのでしょうか。
compilerはcygwinを使っています
102ポイント を手に入れた。
|
|
|
|
Name: さかまき ..かけだし(1,038ポイント)
Date: 2010/09/07(火) 10:09
No:61202
|
|
Title: Re:gcc/g++の使い方
|
|
bash_profileをいじれば
(毎回、「g++ -O2 -Wall -Wextra 〜.cpp -o 〜」をキーインする必要は無くて具合が)
良いと言う話を聞いたの
でしたら、たぶん .bash_profile 等に
function cppWallWextra () { g++ -O2 -Wall -Wextra $@.cpp -o $@ }
などと記述しておけば具合がよいのじゃないかというような話だと思います。
(bash_profileをいじれば良いと言う話を聞いた時に突っ込んで詳細を聞いておけばよかったですね)
140ポイント を手に入れた。
|
|
|
|
|
Name: pon ..入門者(2,987ポイント)
Date: 2010/09/09(木) 18:15
No:61368
|
|
Title: Re:gcc/g++の使い方
|
|
それをコピペしてbash_profileの最後に貼り付けてもうまくいかないんですけどどうすれば良いですか
46ポイント を落としてしまった。
|
|
|
|
|
Name: ぽこ ..プログラマー(29,443ポイント)
Date: 2010/09/09(木) 20:13
No:61375
|
|
Title: Re:gcc/g++の使い方
|
|
> それをコピペしてbash_profileの最後に貼り付けてもうまくいかないんですけどどうすれば良いですか
たかぎさんも尋ねられていますが、何をもって望みの結果となるか、明記していただけませんか?
そして、さかまきさんの提示された方法で、何をもって上手くいかないと判断したか、明記していただけませんか?
73ポイント を手に入れた。
|
|
|
|
|
Name: pon ..入門者(3,155ポイント)
Date: 2010/09/10(金) 21:20
No:61437
|
|
Title: Re:gcc/g++の使い方
|
|
さかまきさんのおっしゃる通り毎回打たなくても良くなると聞きました
で、さかまきさんに教えていただいた1行を追加するだけでは、cygwinを起動するときにunexpected end of lineと出てうまく読み込めなかったみたいです。
2倍のポイントを手に入れた! 168ポイント を手に入れた。
|
|
|
|
|
Name: ぽこ ..プログラマー(29,472ポイント)
Date: 2010/09/10(金) 21:54
No:61445
|
|
Title: Re:gcc/g++の使い方
|
|
関数定義を複数行に渡って記述してください。
function cppWallWextra () {
g++ -O2 -Wall -Wextra $@.cpp -o $@
}
----追記
エラーメッセージがでる理由は、関数定義の閉じカッコがg++のコマンドの一部と解釈されているからです。
ですので、コマンドの終りにセミコロンを入れても通ります。
function cppWallWextra () { g++ -O2 -Wall -Wextra $@.cpp -o $@; }

29ポイント を手に入れた。
|
|
|
|
|
Name: pon ..入門者(3,698ポイント)
Date: 2010/09/10(金) 23:28
No:61465
|
|
Title: Re:gcc/g++の使い方
|
|
Errorが改善されないんですけど、functionの上が問題なんでしょうか。
# base-files version 3.9-3
# To pick up the latest recommended .bash_profile content,
# look in
/etc/defaults/etc/skel/.bash_profile
# Modifying /etc/skel/.bash_profile directly will prevent
# setup from updating it.
# The copy
in your home directory (~/.bash_profile) is yours, please
# feel free to customise it to create a shell
# environment to your liking.
If you feel a change
# would be benifitial to all, please feel free to send
# a patch to the cygwin mailing list.
# ~/.bash_profile:
executed by bash for login shells.
# source the system wide bashrc if it exists
if [ -e /etc/bash.bashrc ] ; then
source
/etc/bash.bashrc
fi
# source the users bashrc if it exists
if [ -e "${HOME}/.bashrc" ] ; then
source "${HOME}/.bashrc"
fi
# Set
PATH so it includes user's private bin if it exists
# if [ -d "${HOME}/bin" ] ; then
# PATH=${HOME}/bin:${PATH}
# fi
# Set
MANPATH so it includes users' private man if it exists
# if [ -d "${HOME}/man" ]; then
#
MANPATH=${HOME}/man:${MANPATH}
# fi
# Set INFOPATH so it includes users' private info if it exists
# if [ -d
"${HOME}/info" ]; then
# INFOPATH=${HOME}/info:${INFOPATH}
#
543ポイント を手に入れた。
|
|
|
|
Name: シエル [URL] ..比類無きプログラマー(72,557ポイント)
Date: 2010/09/10(金) 20:48
No:61433
|
|
Title: 【DirectXプログラミング】インデックスバッファを使った描画について
|
|
いつもお世話になっております。シエルです。
今回はDirectXのインデックスバッファを使った描画について質問があります。
添付の画像のようにインデックスバッファを使って四角形四つを9つの頂点を使って
描画しようとしています。
頂点バッファとインデックスバッファは下記の通りです。
//頂点バッファ
v[0].p = D3DXVECTOR3(-1.0f, 1.0f, 0.0f );
v[1].p = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
v[2].p = D3DXVECTOR3( 1.0f, 1.0f, 0.0f );
v[3].p = D3DXVECTOR3(-1.0f, 0.0f, 0.0f );
v[4].p = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
v[5].p = D3DXVECTOR3( 1.0f, 0.0f, 0.0f );
v[6].p = D3DXVECTOR3(-1.0f, -1.0f, 0.0f );
v[7].p = D3DXVECTOR3( 0.0f, -1.0f, 0.0f );
v[8].p = D3DXVECTOR3( 1.0f, -1.0f, 0.0f );
v[0].t = D3DXVECTOR2(0.0f,0.0f);
v[1].t = D3DXVECTOR2(0.5f,0.0f);
v[2].t = D3DXVECTOR2(1.0f,0.0f);
v[3].t = D3DXVECTOR2(0.0f,0.5f);
v[4].t = D3DXVECTOR2(0.5f,0.5f);
v[5].t = D3DXVECTOR2(1.0f,0.5f);
v[6].t = D3DXVECTOR2(0.0f,1.0f);
v[7].t = D3DXVECTOR2(0.5f,1.0f);
v[8].t = D3DXVECTOR2(1.0f,1.0f);
//インデックスバッファ
id[0] = 0; id[1] = 1; id[2] = 3; id[3] = 4; //四角形1
id[4] = 1;id[5] = 2; id[6] = 4; id[7] = 5; //四角形2
id[8] = 3;id[9] = 4; id[10] = 6; id[11] = 7; //四角形3
id[12] = 4; id[13]=5; id[14]=7; id[15]=8; //四角形4
//ココの第六引数が8だと思うのに16じゃないと思い通りにならない。
pD3DDevice->DrawIndexedPrimitive( D3DPT_TRIANGLESTRIP , 0, 0, 9, 0, 16);
プリミティブタイプをD3DPT_TRIANGLESTRIPで描画しようと思ったので、
4×4=16で16個のインデックスバッファを使って描画しようとしました。
ですが、最後のDrawIndexedPrimitiveの第六引数でプリミティブの数を指定するところで、
イメージでは三角形が8個なので8を指定すればいいのかなと思ったのですが、そうすると
四角形二つ分しか描画されません。
16個にするとやっと四角形四つが描画されるようになります。
どう見ても画像の中には三角形が8個しかないのに、何故16という値を引数に設定しなければならないのか
分かる方、ご教授願います。
よろしくお願い致します。
※ちなみにプリミティブタイプをD3DPT_TRIANGLELISTにして、インデックスバッファを3×8=24個定義して
描画しようとすると、こっちは第六引数は8個で四角形が四つ全て描画されました。
773ポイント を手に入れた。
|
|
|
|
Name: うしお ..かけだし(1,936ポイント)
Date: 2010/09/10(金) 21:33
No:61440
|
|
Title: Re:【DirectXプログラミング】インデックスバッファを使った描画について
|
|
D3DPT_TRIANGLESTRIPの性質が原因だと思われます、性質を確認してみてください
D3DPT_TRIANGLESTRIPは四角形ごとに合わせてくれるわけではないので、
あくまで連なりとして描こうとします。
ということを念頭にいれて、インデックスを紙に書き出してみると、
四角形1から四角形2(同様に2→3)の途中で無駄なポリゴンが生まれていることがわかります
この無駄なポリゴンの数の分だけ引数の数字が足りなくなっているものと思われます。
また、D3DPT_TRIANGLESTRIPでは
インデックスの数 - 2個 の3角形を描けるので、
インデックスが16個ある場合は16-2= 14個のポリゴンが描かれる計算になります
173ポイント を手に入れた。
|
|
|
|
|
Name: シエル [URL] ..比類無きプログラマー(72,708ポイント)
Date: 2010/09/10(金) 22:10
No:61461
| 解決!
|
Title: Re:【DirectXプログラミング】インデックスバッファを使った描画について
|
|
あ〜そういうことですか。
確かに良く考えてみるとSTRIPの性質からして、そうなっちゃいますね。。。
うーん。でもLISTよりインデックスバッファの数は減るから、メモリ的には節約できるかな?
まあ速度は落ちるかもしれないんでどっちがいいかは分かりませんが^^;
まあ、原因がはっきり分かったので、解決にします!
うしおさん!ありがとうございました! 
151ポイント を手に入れた。
|
|
|
|
|
Name: ぽこ ..プログラマー(29,487ポイント)
Date: 2010/09/10(金) 22:06
No:61457
|
|
Title: Re:なぜか昇進状態が・・・
|
|
スペルミスですよ
多分○ Ultimate
多分× Ultiamte
----追記
出遅れた>< 
15ポイント を手に入れた。
|
|
|
|
Name: Ultimate [URL] ..中級者(9,730ポイント)
Date: 2010/09/10(金) 21:16
No:61436
|
|
Title: コンパイル時のエラー
|
|
エラーが起こるので、なぜ起こるのか教えてください。
ソースは
#include "DxLib.h"
#define pi 3.14159265
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
//色の設定
int WHITE;
WHITE=GetColor(255,255,255);
//その他変数
int i,j;
//構造体作成
//敵の弾1
typedef struct{
int x[100]; //X座標
int y[100]; //Y座標
int r[100]; //ラジアン値
int flag[100]; //フラグ
int count[100]; //ループカウント
} tekitama1;
//初期化
//敵の弾1
for(i=0;i<=100;i++){
tekitama1.x[i]=0;
tekitama1.y[i]=0;
tekitama1.r[i]=2pi/(100/i);
tekitama1.flag[i]=0;
}
WaitKey() ; // 結果を見るためにキー待ち(『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
エラーメッセージは
Error E2108 ファイルの場所 32: Improper use of typedef 'tekitama1' in function __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int)
Error E2108 ファイルの場所 33: Improper use of typedef 'tekitama1' in function __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int)
Error E2108 ファイルの場所 34: Improper use of typedef 'tekitama1' in function __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int)
Error E2379 ファイルの場所 34: Statement missing ; in function __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int)
Error E2108 ファイルの場所 35: Improper use of typedef 'tekitama1' in function __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int)
*** 5 errors in Compile ***
** error 1 ** deleting Debug\プロジェクト名.obj
よろしくお願いします。
565ポイント を落としてしまった。
|
|
|
|
Name: Ultimate [URL] ..中級者(10,003ポイント)
Date: 2010/09/10(金) 21:41
No:61441
|
|
Title: Re:コンパイル時のエラー
|
|
原因は構造体がうまくできていないことにあるようですが、解決策がわかりません。
//初期化
//敵の弾1
for(i=0;i<=100;i++){
tekitama1.x[i]=0;
tekitama1.y[i]=0;
tekitama1.r[i]=2pi/(100/i);
tekitama1.flag[i]=0;
}
を削除してコンパイルすると成功します。
構造体で、
//構造体作成
//敵の弾1
typedef struct{
int x[100]; //X座標
int y[100]; //Y座標
int r[100]; //ラジアン値
int flag[100]; //フラグ
int count[100]; //ループカウント
} tekitama1;
にしたら、この構造体の中のx[1]をたとえば指すとすれば
tekitama1.x[1]でいいと思ったのですが、うまくいきません。
for文のどこがエラーの原因でしょうか?
273ポイント を手に入れた。
|
|
|
|
|
Name: うしお ..かけだし(2,122ポイント)
Date: 2010/09/10(金) 21:44
No:61443
|
|
Title: Re:コンパイル時のエラー
|
|
//敵の弾1
typedef struct{
int x[100]; //X座標
int y[100]; //Y座標
int r[100]; //ラジアン値
int flag[100]; //フラグ
int count[100]; //ループカウント
} tekitama1;
typedefの作用によりこれでは変数が宣言されていません
この場合は単純にtypedefを消せばうまくいくはずです
構造体の定義、変数の確保について再度確認してみてください
186ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..中級者(9,698ポイント)
Date: 2010/09/10(金) 21:55
No:61447
|
|
Title: Re:コンパイル時のエラー
|
|
for(i=0;i<=100;i++){
このfor文で、iが100のとき、配列の定義範囲外の領域に
アクセスしてしまいます。
修正が必要です。
2倍のポイントを手に入れた! 114ポイント を手に入れた。
|
|
|
|
Name: 空 ..ぴよぴよ(951ポイント)
Date: 2010/09/10(金) 02:55
No:61398
|
|
Title: 弾幕の管理
|
|
VC++をやり始めて半年で今シューティングゲームを作っています。
弾を敵から出すことに成功したのはいいんですが5wayショットなどをしたら
int shot1〜5と5つ用意して、そのint5つ分のDrawTexture(画像)を用意して
当たり判定を作ろうと思ったときに、5つ作らなきゃいけないことに気がついて困っています。
弾幕の管理はどうすればいいのでしょか?
当たり判定は
if(abs(敵の弾X - 自機X) <弾の画像のサイズ && abs(敵の弾Y - 自機Y) <弾の画像のサイズ )
で、判定してます。
193ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) [URL] ..ウィザード(1,272,364ポイント)
Date: 2010/09/10(金) 19:29
No:61429
|
|
Title: Re:弾幕の管理
|
|
構造体配列を使うと良いと思います。
構造体と配列についてはご存じですか?
構造体とは例えばセットで管理したい変数をセットで管理出来る仕組みです。
typedef struct{
double x,y;
}Pt_t;
こんな感じですね。
配列とは同じものを同時に沢山作ることが出来る仕組みです。
例えば
int a[100];
と書けば
int a1,a2,a3....,a100;
みたいに書いたのと同じようにint型で100個変数が作れます。
個別に変数で宣言するのと違い、ループ処理が可能なので、弾が10000個とかになっても管理が容易です。
83ポイント を手に入れた。
|
|
|
|
Name: あんこ ..ぴよぴよ(66ポイント)
Date: 2010/09/10(金) 02:03
No:61397
|
|
Title: 処理速度
|
|
最近PHPをはじめました。
サーバーをレンタルしたのですが、
パスワードが大小英数字12桁みたいです。
長いから安心できるかな?と思ってるのですが
実際は
000000000000〜ZZZZZZZZZZZZ
までC言語をローカルで動かすと
どのくらい時間が掛かるのでしょうか?
66ポイント を手に入れた。
|
|
|
|
Name: へろり ..プログラマー(36,599ポイント)
Date: 2010/09/10(金) 08:01
No:61404
|
|
Title: Re:処理速度
|
|
>000000000000〜ZZZZZZZZZZZZ
>までC言語をローカルで動かすと
>どのくらい時間が掛かるのでしょうか?
というのが今ひとつ意味が分かりませんが。 パスワードが取りうるすべてのパターンを総当たりで調べたらどれぐらいの時間がかかるか、という事でしょうか。
でしたら、英大26文字+英小26文字+数字10文字=62文字の12桁の取りうるパターンは全部で16533293572437839872パターンですから、1パターン調べるのに0.01秒かかったとして、165332935724378398.72秒で、ざっと5315487902年ほどかかりますね。
189ポイント を落としてしまった。
|
|
|
|
|
Name: へろり ..プログラマー(37,417ポイント)
Date: 2010/09/10(金) 17:22
No:61421
|
|
Title: Re:処理速度
|
|
>英大26文字+英小26文字+数字10文字=62文字の12桁の取りうるパターンは全部で
>16533293572437839872パターンですから
すみません。 計算違いをしていたようです。 一応ざくっとプログラム走らせてみたのですが、符号有り64ビットじゃ表現出来ない数値だったようです。
62の12乗は3226266762397899821056ですね。 年にするとざっくり3989428471230年となりました。
3兆9894億年です。 長生きしないといけませんね。
実際には単純にたかだか12文字の文字列の比較に0.01秒もかかるとは思えませんので、もっと短い時間で済むでしょうが、それでもずいぶんと長生きしなければいけませんね。
ちなみに、1ヶ月30日固定で計算しています。
2倍のポイントを手に入れた! 504ポイント を手に入れた。
|
|
|
|
Name: 初心者 ..熟練のプログラマー(51,687ポイント)
Date: 2010/09/05(日) 18:59
No:61038
|
|
Title: おたすけ〜
|
|
C言語C++プログラム初心者です。質問です。
モノクロのBMP画像をブルートーン画像に変換する
簡単?なプログラムを作ろうと思ってます。
コンパイルは通って実行ファイルはできたのですが、
実行しても何も起こらない場合があります。
画像の読み込みのための配列 out[] のサイズによって、
実行できたりします。
たとえば512×512のBMP画像を扱う場合、
unsigned char out[512*512*3]; //3はRGBの3種の意味
と書いて、実行できてちゃんと画像も出力できたのですが、
unsigned char out[800*800*3];
・・・などとサイズを大きくすると途端に実行できなくなります。
これって配列用のメモリが大きくて使えないってことなのでしょうか?
初心者なのでよくわからないのですが、ご指摘お願いします。
199ポイント を手に入れた。
|
|
|
|
Name: やっくん ..プログラマー(34,961ポイント)
Date: 2010/09/05(日) 19:58
No:61045
|
|
Title: Re:おたすけ〜
|
|
> unsigned char out[800*800*3];
これは画像512×512に対してこの大きさを確保しているのでしょうか?
良ければソースコードを示していただけ無いでしょうか。
50ポイント を手に入れた。
|
|
|
|
|
Name: スレ主 ..ぴよぴよ(344ポイント)
Date: 2010/09/05(日) 22:11
No:61058
|
|
Title: Re:おたすけ〜
|
|
“やっくん”さんレスありがとう。
え〜と、
例えば横512縦512のBMP画像を扱うときは、
unsigned char out[512*512*3];
と書いています。(3はRGBの3です)
ちなみにこの場合はちゃんと実行できて、画像が出力されます。
256*256などのもっと小さな画像でも上手くいきます。
問題は、もっと大きな画像で、例えば横800縦800のBMP画像にした時は
unsigned char out[800*800*3]; とちゃんと書き直していますが、
これだと実行ファイルは作成されますが、実行しても画像が出力されません。
コンパイルもできているので、ソースの文法的には間違ってないはずです。
メモリ不足なのでしょうか?
たぶん使っているPCのメモリスペックが低すぎて、大きな画像にすると
メモリを割り当てられないのではないかと予想してますが、
こういう事ってありえますか?
使っているPCは古いですし、常駐ソフトもあるのでメモリの使用量は酷い状態です。
物理メモリが448MBなのに対し、かなりオーバーしてます。(おそらく仮想メモリ使用)
こういう状態では実行してもメモリが確保できずに実行アプリが終了してしまうのでしょうか?
213ポイント を手に入れた。
|
|
|
|
|
Name: ROM ..入門者(3,555ポイント)
Date: 2010/09/05(日) 23:35
No:61068
|
|
Title: Re:おたすけ〜
|
|
スレ主さん
とりあえず規約を読んでから投稿しましょう。
(名前は何かに統一して下さい)
40ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..熟練のプログラマー(52,563ポイント)
Date: 2010/09/05(日) 23:52
No:61070
|
|
Title: Re:おたすけ〜
|
|
すみません。名前は初心者に固定します。
コンピュータのOSはwindowsXPです。
メモリは448MB(実際は512MBだけど残りはビデオメモリ用?)
メモリは常駐ソフトなどが多いため物理メモリをオーバーしていて、
おそらくハードディスクでの仮想メモリが使われている状態です。
そのため、たまにPCの動作が遅くなります。
C言語、C++の開発ツールですが、
使ってるコンパイラはボーランド?ってやつです。
メモ帳などにソースを書いて"test.cpp"で保存、
コマンドプロンプトでディレクトリを指定して
bcc32 test.cpp などと打ち込むとコンパイルされるやつです。
さっき確認してみましたが、
640×480の画像では実行できたけど、出力画像が変なことに...orz
本当なら青くなるはずが、ノイズみたくなってる・・・orz
なぜか512×512以下のサイズならちゃんと青くなるのです。
↓以下はソースです(//☆☆☆☆☆☆のついてる4箇所のサイズを書き換えてください)
#include<stdio.h>
int main(void)
{
FILE *fp;
unsigned char head[54];
unsigned char out[480*640*3]; //☆☆☆☆☆☆☆☆☆☆
unsigned char name[40];
unsigned char in[20];
int n,i;
printf("ファイル名と拡張子の入力(例 test.bmp):");
scanf("%s",in);
fp=fopen(in,"rb");
if(fp == NULL)
{
printf("ファイル %s が存在しません。",in);
return 1;
}
else
{
fread(head,1,54,fp);
fread(out,1,480*640*3,fp);//☆☆☆☆☆☆☆☆☆☆
}
fclose(fp);
fp=fopen("head.dat","wb");
fwrite(head,1,54,fp);
fclose(fp);
//ここはモノクロからブルートーンへの変換処理
for(n=0;n<=480*640;n++)//☆☆☆☆☆☆☆☆☆☆(ここは*3不要)
{
for(i=0;i<=2;i++)
{
if(i==0)//blue
{
if(out[n*3+i]>=128)
{
out[n*3+i]=255;
}
else
{
out[n*3+i]=out[n*3+i]*2;
}
}
else if(i==1)//green
{
out[n*3+i]=out[n*3+i];
}
else//red
{
if(out[n*3+i]<=127)
{
out[n*3+i]=0;
}
else
{
out[n*3+i]=(out[n*3+i]-128)*2;
}
}
}
}
fp=fopen("head.dat","rb");
fread(head,1,54,fp);
fclose(fp);
sprintf(name,"out_%s",in);
fp=fopen(name,"wb");
fwrite(head,1,54,fp);
fwrite(out,1,480*640*3,fp); //☆☆☆☆☆☆☆☆☆☆
fclose(fp);
return 0;
}
初心者なんでまだ効率が悪く汚い書き方をしてます・・・悪しからず。
876ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..熟練のプログラマー(52,654ポイント)
Date: 2010/09/06(月) 00:08
No:61072
|
|
Title: Re:おたすけ〜
|
|
DecentLoveさん
そうです。初心者、スレ主、両方とも同一人物です。
スレ主と書いた方がわかりやすいと思って変えてしまいました。すみません。
以降、名前を“初心者”に統一します。
91ポイント を手に入れた。
|
|
|
|
|
Name: ROM ..入門者(3,586ポイント)
Date: 2010/09/06(月) 00:10
No:61073
|
|
Title: Re:おたすけ〜
|
|
回答ではなくてすみませんが、規約を読みましょう・・・。
初心者という名前は使わないで下さいと書いてあります。
31ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(573,088ポイント)
Date: 2010/09/06(月) 00:15
No:61074
|
|
Title: Re:おたすけ〜
|
|
何点か。
まず、画像データを格納するバッファ outはローカル変数だとスタックオーバーフローする可能性があります。
staticをつけるなど静的領域にとるか、mallocでアロケートして下さい。
次に for(n=0;n<=480*640;n++) はループ回数が多いかと。
それから書き間違えを防ぐために、ソース内の 640とか 480は
#define IMAGE_SIZE_X 640
#define IMAGE_SIZE_Y 480
のようにマクロ定義し、main関数内ではこのマクロを使用するようにしてみて下さい。
最後に見た感じこのソースだと最初の段階で head変数にヘッダ情報が入っているわけですし
head.datは書き出す必要も読み出す必要も無いような気がします。
292ポイント を手に入れた。
|
|
|
|
|
Name: ピッチャー ..ぴよぴよ(466ポイント)
Date: 2010/09/06(月) 01:10
No:61078
|
|
Title: Re:おたすけ〜
|
|
>>ROMさん
すみません。
規約には初心者のような簡単な名前はダメみたいなので、
たぶんスレ主とかもダメっぽいですね...
一番最初の投稿で初心者と書いてしまいましたし...
投稿名前はピッチャーに統一します。何度も失礼しました。
質問投稿者のピッチャーです。
>>Justyさん
ご指摘ありがとうございます。
え〜と、とりあえずout[]の部分を静的ローカル変数(?)にする、
staticをつけるということでしょうか...
>>次に for(n=0;n<=480*640;n++) はループ回数が多いかと。
回数が多いとおかしなことになるのでしょうか...
もっと大きなサイズの画像を扱う場合はどう書くべきでしょうか...
>>マクロ定義し、main関数内ではこのマクロを使用するようにしてみて下さい。
なるほど。ぜひ試してみます。
>>最後に見た感じこのソースだと最初の段階で head変数にヘッダ情報が入っているわけですし
head.datは書き出す必要も読み出す必要も無いような気がします。
最初はおっしゃる通りにhead.datなしで書いていたんですが、
なぜかヘッダの内容(特にBMPフォーマットを決めるデータ部)が変わって出力されてしまう現象
が起こったため、原因がわからずとりあえず応急処置でこう書いておいたのです。
466ポイント を手に入れた。
|
|
|
|
|
Name: ピッチャー ..かけだし(1,401ポイント)
Date: 2010/09/06(月) 01:38
No:61080
|
|
Title: Re:おたすけ〜
|
|
やはり640×480などの大きな画像になると変になります。
512×512とか512×256とかのサイズだと上手くいきます。
添付は512×512の上手くいった出力画像の圧縮jpgバージョンです。
256階調のモノクロ画像がブルー調画像になっていれば成功です。
↓ソースの更新(マクロ定義とstaticだけ書き変えました)
#include<stdio.h>
#define IMAGE_SIZE_X 640
#define IMAGE_SIZE_Y 480
int main(void)
{
FILE *fp;
unsigned char head[54];
static unsigned char out[IMAGE_SIZE_X * IMAGE_SIZE_Y *3]; //☆☆☆☆☆☆☆☆☆☆
unsigned char name[40];
unsigned char in[20];
int n,i;
printf("ファイル名と拡張子の入力(例 test.bmp):");
scanf("%s",in);
fp=fopen(in,"rb");
if(fp == NULL)
{
printf("ファイル %s が存在しません。",in);
return 1;
}
else
{
fread(head,1,54,fp);
fread(out,1,IMAGE_SIZE_X * IMAGE_SIZE_Y *3,fp);//☆☆☆☆☆☆☆☆☆☆
}
fclose(fp);
fp=fopen("head.dat","wb");
fwrite(head,1,54,fp);
fclose(fp);
//ここはモノクロからブルートーンへの変換処理
for(n=0;n<=IMAGE_SIZE_X * IMAGE_SIZE_Y;n++)//☆☆☆☆☆☆☆☆☆☆ここは*3不要
{
for(i=0;i<=2;i++)
{
if(i==0)//blue
{
if(out[n*3+i]>=128)
{
out[n*3+i]=255;
}
else
{
out[n*3+i]=out[n*3+i]*2;
}
}
else if(i==1)//green
{
out[n*3+i]=out[n*3+i];
}
else//red
{
if(out[n*3+i]<=127)
{
out[n*3+i]=0;
}
else
{
out[n*3+i]=(out[n*3+i]-128)*2;
}
}
}
}
fp=fopen("head.dat","rb");
fread(head,1,54,fp);
fclose(fp);
sprintf(name,"out_%s",in);
fp=fopen(name,"wb");
fwrite(head,1,54,fp);
fwrite(out,1,IMAGE_SIZE_X * IMAGE_SIZE_Y *3,fp); //☆☆☆☆☆☆☆☆☆☆
fclose(fp);
return 0;
}
935ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(573,628ポイント)
Date: 2010/09/06(月) 02:08
No:61081
|
|
Title: Re:おたすけ〜
|
|
>staticをつけるということでしょうか
OKです。
>回数が多いとおかしなことになるのでしょうか
最後のループの nは 640*480で 307200となり、最大 out[307200*3+2 = 921602]に対して
アクセスするわけですが、実際の配列は 640*480*3 = 921600しかありません。
今のプログラムだと配列の領域を越えてメモリにアクセスすることになります。
>なぜかヘッダの内容(特にBMPフォーマットを決めるデータ部)が変わって出力されてしまう現象
多分ですが、その forの回数が多かった為、配列のサイズを超えてメモリに対し書き込みを行った結果
head等がの中身が破壊されたのでしょう。
forの回数を正しく設定し、配列のサイズを超えて書き込みをしないようにして下さい。
>もっと大きなサイズの画像を扱う場合はどう書くべきでしょうか
そうですね、BMPのヘッダを見て画像の縦横サイズを取得し、そのサイズに合わせてメモリを
動的にアロケート(malloc)、処理をするのが普通ではないかと。
これなら環境が許す限り大きなファイルでも開けますので。
>やはり640×480などの大きな画像になると変になります
どう変になりますか?
先に挙げた点を修正すればうまくいくかと思うのですが。
んーと、IMAGE_SIZEの X, Yを 640、480に設定しておきながら実際に読み込んだ画像は
512×512ということはないですか?
或いはその逆とか。

540ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..プログラマー(35,811ポイント)
Date: 2010/09/06(月) 10:52
No:61098
|
|
Title: Re:おたすけ〜
|
|
ざらっと見ただけですが。
ビットマップの場合ピクセルデータは1列あたり4の倍数バイトで整列されてなければならない。 というルールがあります。
このあたりが考慮されてないような気がしますが。
87ポイント を手に入れた。
|
|
|
|
|
Name: ピッチャー ..かけだし(1,411ポイント)
Date: 2010/09/06(月) 12:31
No:61106
|
|
Title: Re:おたすけ〜
|
|
>>Justy...さん
>最後のループの nは 640*480で 307200となり、最大 out[307200*3+2 = 921602]に対して
アクセスするわけですが、実際の配列は 640*480*3 = 921600しかありません。
お〜なるほど!ご指摘ありがとうごうざいます。
ヘッダの不具合もそれが原因でしたか...間抜けでした(笑)
>そうですね、BMPのヘッダを見て画像の縦横サイズを取得し、そのサイズに合わせてメモリを
動的にアロケート(malloc)、処理をするのが普通ではないかと。
なるほど。ヘッダからサイズを取得するのはなんとかできそうです。
malloc関数はまだ使ったことがないんですが、調べてみてできれば試してみます。
>へろり...さん
あ〜!そういえばそんな制約もありました。すっかり忘れてました。
今まで試した画像サイズだと偶然にも行データが4の倍数になっていたので、
ギリギリセーフだったみたいです。
でも横サイズ202とか199みたいな画像だったら今のままでは駄目ですね。
対策としては、横サイズが4の倍数でない画像を例外処理で除外して仕様にするか、
埋め合わせを考慮して作るかのどっちかですね。
みなさんご指摘どうもです。
コードを書き直して動作チェックをしたらまた近々投稿します。
2倍のポイントを手に入れた! 10ポイント を手に入れた。
|
|
|
|
|
Name: ピッチャー ..入門者(2,619ポイント)
Date: 2010/09/08(水) 00:03
No:61243
|
|
Title: Re:おたすけ〜
|
|
Justyさん、へろりさん、皆様方、
おかげさまで上手くできたっぽいです。
マクロ定義で固定せずに、ヘッダから読み取った画像サイズ情報を基に
out配列をmalloc関数で動的にメモリ確保をしてみました。
malloc関数は初めて使ってみましたが、便利そうですね。
最後のfreeの使い方がこれで合ってるのかは気になりますが...
これで対応画像であれば大きなサイズでもたぶん上手くブルー調画像に変換できそうです。
ただし8ビット(256パレット)のグレースケールには対応してないのが痛いですが...
何か他にご指摘があればお伝えください。
添付は成功した640×480の画像です。
↓できあがったソースです。メイン関数だけなので汚いですがご勘弁を!
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
FILE *fp;
unsigned char head[54];
unsigned char *out; //☆☆☆☆☆
int IMAGE_SIZE_X;
int IMAGE_SIZE_Y;
int size;
unsigned char name[40];
unsigned char in[20];
int gazo_type, info , color_type;
int n,i;
printf("ファイル名と拡張子の入力(例 test.bmp):");
scanf("%s",in);
fp=fopen(in,"rb");
if(fp == NULL)
{
printf("ファイル %s が存在しません。",in);
return 1;
}
else
{
fread(head,1,54,fp);
IMAGE_SIZE_X=head[18]+head[19]*16*16;
IMAGE_SIZE_Y=head[22]+head[23]*16*16;
gazo_type=head[0]+head[1]*16*16;
info=head[14];
color_type=head[28];
printf("横サイズ:%d\n\n",IMAGE_SIZE_X);
printf("縦サイズ:%d\n\n",IMAGE_SIZE_Y);
if(gazo_type != 19778)
{
printf("ビットマップ以外の画像には対応しておりません\n\n");
return 1;
}
else if(IMAGE_SIZE_X % 4 != 0)
{
printf("このサイズには対応しておりません...orz\n\n");
printf("横サイズが4の倍数の画像を使用してください\n\n");
return 1;
}
else if(info != 40)
{
printf("このタイプのビットマップ画像には対応しておりません\n\n");
return 1;
}
else if(color_type != 24)
{
printf("24ビットグレースケール画像以外は対応しておりません\n\n");
return 1;
}
size=IMAGE_SIZE_X*IMAGE_SIZE_Y;
out = (unsigned char*)malloc(sizeof(int)*size) ;
fread(out,1,size *3,fp);//☆☆☆☆☆☆☆☆☆☆
}
fclose(fp);
//ここはモノクロからブルートーンへの変換処理
for(n=0;n<=size-1;n++)//☆☆☆☆☆☆☆☆☆☆ここは*3不要
{
for(i=0;i<=2;i++)
{
if(i==0)//blue
{
if(out[n*3+i]>=128)
{
out[n*3+i]=255;
}
else
{
out[n*3+i]=out[n*3+i]*2;
}
}
else if(i==1)//green
{
out[n*3+i]=out[n*3+i];
}
else//red
{
if(out[n*3+i]<=127)
{
out[n*3+i]=0;
}
else
{
out[n*3+i]=(out[n*3+i]-128)*2;
}
}
}
}
sprintf(name,"out_%s",in);
fp=fopen(name,"wb");
fwrite(head,1,54,fp);
fwrite(out,1,size *3,fp); //☆☆☆☆☆☆☆☆☆☆
fclose(fp);
free(out);
return 0;
}
1,208ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(575,345ポイント)
Date: 2010/09/08(水) 00:58
No:61251
|
|
Title: Re:おたすけ〜
|
|
>最後のfreeの使い方がこれで合ってるのかは気になりますが
大丈夫ですよ。合ってます。
>何か他にご指摘があればお伝えください
・ scanf("%s",in);
inは 19文字分しか領域がないので、scanf("%19s",in)としておいた方が無難です。
・ fread(head,1,54,fp);
このファイルは実は20バイトで、54バイトもないかもしれません。
その場合 head配列内の足りない部分はゴミが残り、以後の各種チェックがうまく働かない可能性があります。
ちゃんと 54バイト分読めたかどうか確認しておいた方がいいでしょう。
・ IMAGE_SIZE_X=head[18]+head[19]*16*16
出来れば head[18] | (head[19] << 8) のようにビットシフトで組み立てて欲しいところです。
・ gazo_type != 19778
(char)head[0] != 'B' || (char)head[1] != 'M'とした方が意図は判りやすいかと。
・ fp=fopen(name,"wb");
書き込み時も fopenの戻り値はチェックしましょう。
436ポイント を手に入れた。
|
|
|
|
|
Name: ピッチャー ..入門者(2,764ポイント)
Date: 2010/09/08(水) 01:17
No:61252
|
|
Title: Re:おたすけ〜
|
|
Justy...さん
お早い返答ありがとうございます。
>scanf("%19s",in)
こういう書き方は初めて知りました。
>ちゃんと 54バイト分読めたかどうか確認しておいた方がいいでしょう。
ほほう。そこまで想定できませんでした。プログラムは油断ならぬ、ですね...
>ビットシフトで組み立てて欲しいところです。
>(char)head[0] != 'B' || (char)head[1] != 'M'とした方が
なるほどその手がありましたか。確かに僕のだと何やってるか分かりづらいですね。
ご指摘どうもです。ちゃんと書き直せたらまた近々レスします。
145ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(575,416ポイント)
Date: 2010/09/08(水) 01:23
No:61253
|
|
Title: Re:おたすけ〜
|
|
>最後のfreeの使い方がこれで合ってるのかは気になりますが
> 大丈夫ですよ。合ってます。
あ、1点。
・ out = (unsigned char*)malloc(sizeof(int)*size)
mallocは失敗することがありますので、このチェックも必要ですね。
71ポイント を手に入れた。
|
|
|
|
|
Name: ピッチャー ..入門者(3,333ポイント)
Date: 2010/09/08(水) 18:17
No:61288
|
|
Title: Re:おたすけ〜
|
|
>Justyさん...
改良できました〜。
>ちゃんと 54バイト分読めたかどうか確認しておいた方がいいでしょう。
ここはfeof関数で対応しました。これも初めて使ってみました。
まだまだダメ出しはあると思いますが、
いろいろ勉強になりました。ありがとうございました。
ところで、せっかく画像を扱うこともできたので、C言語でCUIではなく
いわゆるGUIアプリのようなものを作ってみたいのですが、
GUIを扱うのはウィンドウズAPIやウィンドウズOSを知らなければならず、
ウィンドウを表示するだけでもかなりたくさんコードを書く必要があるらしいので、
初心者には難しくめんどくさいらしいのですが、
何かもっと簡単に端折って作成できる方法はありますでしょうか?
楽に作れるということは自由度が下がると思いますが、自由度は下がっても構いません。
でもさすがにペタペタ貼り付けるフレームワーク?みたいなのはできるだけ避けたいのです。
ちゃんとテキスト形式でコードを書いて翻訳するものならC言語以外でも構いません。
何を作るかですが、とりあえず最初は、実行ファイルをクリックすると窓が開き、
画像を表示し、ボタンやキーを押すと画像がスライドして次の画像に変わる
ような画像ビューアーです。
↓ソースです
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
FILE *fp;
unsigned char head[54];
unsigned char *out; //☆☆☆☆☆
int IMAGE_SIZE_X;
int IMAGE_SIZE_Y;
int size;
unsigned char name[40];
unsigned char in[20];
int info , color_type;
int n,i;
printf("ファイル名と拡張子の入力(例 test.bmp):");
scanf("%19s",in);
fp=fopen(in,"rb");
if(fp == NULL)
{
printf("\n\nファイル %s が存在しません\n\n",in);
return 1;
}
else
{
fread(head,1,54,fp); //ヘッダの読み込み
if(feof(fp))
{
printf("画像のヘッダ情報が54バイト分ありません\n\n");
return 1;
}
IMAGE_SIZE_X=head[18] | (head[19] << 8) ;
IMAGE_SIZE_Y=head[22] | (head[23] << 8) ;
info=head[14];
color_type=head[28];
printf("横サイズ:%d\n\n",IMAGE_SIZE_X);
printf("縦サイズ:%d\n\n",IMAGE_SIZE_Y);
if((char)head[0] != 'B' || (char)head[1] != 'M')
{
printf("ビットマップ以外の画像には対応しておりません\n\n");
return 1;
}
else if(IMAGE_SIZE_X % 4 != 0)
{
printf("このサイズには対応しておりません...orz\n\n");
printf("横サイズが4の倍数の画像を使用してください\n\n");
return 1;
}
else if(info != 40)
{
printf("このタイプのビットマップ画像には対応しておりません\n\n");
return 1;
}
else if(color_type != 24)
{
printf("24ビットグレースケール画像以外は対応しておりません\n\n");
return 1;
}
size=IMAGE_SIZE_X*IMAGE_SIZE_Y;
out = (unsigned char*)malloc(sizeof(int)*size) ;
if(out==NULL)
{
printf("メモリの確保に失敗しました\n\n");
return 1;
}
fread(out,1,size *3,fp);//☆☆☆☆☆☆☆☆☆☆
}
fclose(fp);
//ここはモノクロからブルートーンへの変換処理
for(n=0;n<=size-1;n++)//☆☆☆☆☆☆☆☆☆☆ここは*3不要
{
for(i=0;i<=2;i++)
{
if(i==0)//blue
{
if(out[n*3+i]>=128)
{
out[n*3+i]=255;
}
else
{
out[n*3+i]=out[n*3+i]*2;
}
}
else if(i==1)//green
{
out[n*3+i]=out[n*3+i];
}
else//red
{
if(out[n*3+i]<=127)
{
out[n*3+i]=0;
}
else
{
out[n*3+i]=(out[n*3+i]-128)*2;
}
}
}
}
sprintf(name,"out_%s",in);
fp=fopen(name,"wb");
if(fp == NULL)
{
printf("ファイルの作成に失敗しました");
return 1;
}
else{
fwrite(head,1,54,fp);
fwrite(out,1,size *3,fp); //☆☆☆☆☆☆☆☆☆☆
}
fclose(fp);
free(out);
return 0;
}
569ポイント を手に入れた。
|
|
|
|
Name: ヤス ..ぴよぴよ(41ポイント)
Date: 2010/09/10(金) 12:17
No:61409
|
|
Title: 自機に慣性を付けたいのですが・・・
|
|
初めまして、ヤスです
プログラミング初心者です
実は大学のサークル活動で、シューティングゲームを作っているのですが
自機に慣性(だんだん加速するような奴)を付けたいのですが
どうやっていいのかよくわかりません
自分で一から作成するほどのスキルがないので
龍神録のソースを改造(改悪?)して作成しています
使用しているのはVC++2010、DXライブラリです
41ポイント を手に入れた。
|
|
|
|
Name: toyo ..熟練のプログラマー(59,385ポイント)
Date: 2010/09/10(金) 13:42
No:61412
|
|
Title: Re:自機に慣性を付けたいのですが・・・
|
|
物理的に考えれば速度と加速度のパラメーターを持たせればいいですね
龍神録ならキャラクターに関する構造体のch_tに変数 v と a を追加して
最大速度も必要ですかね vmax で
一定フレーム毎にif (ch.v < ch.vmax) {ch.v += ch.a;}すれば物理で習った v = v0 + a*t になります
あとはchar.cppのch_move( )関数でごにょごにょやれば出来そうな気がします
147ポイント を手に入れた。
|
|
|
|
|
Name: ヤス
Date: 2010/09/16(木) 23:21
No:614091284646920
|
|
Title: Re:自機に慣性を付けたいのですが・・・
|
|
どうも、返信遅くなってすみません
別の部活の試合やらで忙しくて遅くなってしまいました
本題なのですが、あれからいろいろやってみた結果
キー入力で移動量を変化させ、移動量によって
毎回キャラクターを移動させればいいのではないか、と思いつきまして
作ってみたのですが、うまくいきませんでした
おそらく、移動量(mx)が毎回0になっているんだと思うのですが
どこをいじればいいのかよくわかりませんでした
#include "../include/GV.h"
void calc_ch(){
ch.cnt++;
ch.img=(ch.cnt%24)/6;
}
void ch_move(){//キャラクタの移動制御
int i,sayu_flag=0,joge_flag=0,anglex=0,angley=0;
double x,y,mx=0,my=0,naname=1,mv=2;
//mx=移動量,my=移動量,mv=加速度
int inputpad[4];
inputpad[0]=CheckStatePad(configpad.left); inputpad[1]=CheckStatePad(configpad.right);
inputpad[2]=CheckStatePad(configpad.down); inputpad[3]=CheckStatePad(configpad.up);
if(CheckStatePad(configpad.left)>0)//左キーが押されていたら
ch.img+=4*2;//画像を左向きに
else if(CheckStatePad(configpad.right)>0)//右キーが押されていたら
ch.img+=4*1;//画像を右向きに
for(i=0;i<2;i++)//左右分
if(inputpad[i]>0)//左右どちらかの入力があれば
sayu_flag=1;//左右入力フラグを立てる
for(i=2;i<4;i++)//上下分
if(inputpad[i]>0)//上下どちらかの入力があれば
joge_flag=1;//上下入力フラグを立てる
if(sayu_flag==1 && joge_flag==1)//左右、上下両方の入力があれば斜めだと言う事
naname=sqrt(2.0);//移動スピードを1/ルート2に
if(CheckStatePad(configpad.left)>0)//左キーが押されていたら
anglex=-1;//アングルを左向きに
else if(CheckStatePad(configpad.right)>0)//右キーが押されていたら
anglex=1;//アングルを右向きに
if(CheckStatePad(configpad.up)>0)//下キーが押されていたら
angley=-1;//アングルを下向きに
else if(CheckStatePad(configpad.down)>0)//上キーが押されていたら
angley=1;//アングルを上向きに
for(int i=0;i<4;i++){//4方向分ループ
if(inputpad[i]>0){//i方向のキーボード、パッドどちらかの入力があれば
x=ch.x , y=ch.y;//今の座標をとりあえずx,yに格納
mx+=mv*anglex,my+=mv*angley;
}
x+=mx/naname, y+=my/naname;//今の座標と移動分を足す
if(!(x<10 || x>FIELD_MAX_X-10 || y<5 || y>FIELD_MAX_Y-5)){//計算結果移動可能範囲内なら
ch.x=x , ch.y=y;//実際に移動させる
}
}
}
|
|
|
|
|
Name: ヤス
Date: 2010/09/16(木) 23:32
No:614091284647552
| 解決!
|
Title: Re:自機に慣性を付けたいのですが・・・
|
|
過去ログに入ってしまったみたいなので
新規にスレ立て直したいと思います
返答ありがとうございました
|
|
|
|
Name: パコネコ ..熟練のプログラマー(41,032ポイント)
Date: 2010/09/08(水) 10:21
No:61259
|
|
Title: 「雑談可」質問の募集
|
|
今作成中のゲームで最初にプレイヤーにいくつか質問して、職業もしくは性格(「未決定」)を決めて
レベルアップ時のパラメーターアップに使おうと思って質問を考えているのですが…
二択の問題でYESかNOで答えられる問題を考えています。
ですが、答えのない問題を使おうとするとあまり思いつきませんでした。
例えば、
「あなたの友達と恋人が病気で苦しんでいます」
「ですが時間がたてば自然に治ります。」
「あなたは痛み止めの薬を一人分だけ持ってます。」
「恋人を助けますか?Y/N」
みたいな問題です。(ちょっとだけ変えました。)
この質問の場合、「愛」と「友情」を試してどちらかにポイントを振ります。
そのほか「勇気」「孤独」「優しさ」「冷静」などを用意しようと思っています。
「勇気」などはほかにどんなものがあると思いますか?
またどのような質問があるでしょうか?
思いついた方がいましたら教えてほしいです。
プログラムには関係ない質問ですが、よろしくお願いします。
==========追伸======
答えのない問題にこだわってます。(本でよくある心理ゲームみたいな?)
絶対こっちが正しいとかは、あまり…使いたくないです。
できれば何と何にポイントを振るかもお願いします。
勇気と冷静とか以外でも、自分で用意した性格でも… 
437ポイント を手に入れた。
|
|
|
|
Name: パコネコ ..熟練のプログラマー(41,219ポイント)
Date: 2010/09/09(木) 19:22
No:61371
|
|
Title: Re:「雑談可」質問の募集
|
|
>>ookamiさん
わざわざ張っていただいてありがとうございます。
心理テストで調べてみるのもいいかもしれませんね。
性格?は、
「勇気」「友情」「愛情」「冷静」「孤独」「優しさ」
の6個で決定しました。(増えるかもだけど…)
103ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(213,582ポイント)
Date: 2010/09/09(木) 19:42
No:61372
|
|
Title: Re:「雑談可」質問の募集
|
|
こんな感じかな?
出産の最中、妻の容体が急変。子供を諦めれば妻は助かるが、妻は苦しみながらも、自分はどうでもいいら子供を助けてと懇願してくる。
1:妻が助かれば、また子供を授かる事もあるだろう。
2:妻の意見を尊重して子供と生きて行こう。
2倍のポイントを手に入れた! 2ポイント を手に入れた。
|
|
|
|
|
Name: パコネコ ..熟練のプログラマー(41,267ポイント)
Date: 2010/09/09(木) 19:48
No:61373
|
|
Title: Re:「雑談可」質問の募集
|
|
>>バグ「さん」
おぉ。
そんな感じです。
子供か…そっちを考えてませんでした。
参考にして使わせていただきます。
==========
すいません、
「さん」をつけ忘れてました…。 
48ポイント を手に入れた。
|
|
|
|
|
Name: dic ..比類無きプログラマー(95,828ポイント)
Date: 2010/09/09(木) 21:36
No:61380
|
|
Title: Re:「雑談可」質問の募集
|
|
某RPGを借りて
「姫を助ける為には虹の靴が必要だ
しかし虹の靴は世界を支配する
ドラゴンを倒さないと手に入らない
ドラゴンに戦いを挑みますか?」
48ポイント を手に入れた。
|
|
|
|
|
Name: パコネコ ..熟練のプログラマー(41,362ポイント)
Date: 2010/09/09(木) 23:03
No:61389
|
|
Title: Re:「雑談可」質問の募集
|
|
編集キー入れ忘れた…
>>dicさん・続き
その場合、「勇気」と「冷静」ですかね。
「愛情」も近い気がしますけど…
こんな質問も作ってみました。
「あなたの友達がモンスターに襲われています。」
「あなたたちでは勝てません」
「助けに行きますかY/N」
Y/なら友情
N/なら冷静
にポイントが入ります。
友達に見せたら突っ込まれました…
(「勝てません」の部分に)
80ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..上級者(16,721ポイント)
Date: 2010/09/10(金) 04:08
No:61400
|
|
Title: Re:「雑談可」質問の募集
|
|
ラングリッサー系のゲームがこんな感じですよね。
某動画配信サイトなどで実況を見られてはいかがでしょうか?
30ポイント を手に入れた。
|
|
|
|
Name: blue ..入門者(3,432ポイント)
Date: 2010/09/08(水) 15:39
No:61275
|
|
Title: 複雑な計算の関数化
|
|
発展課題 10..1
年r %の複利でy 円を借り,n 年後に一括返済する場合の返 済額を計算するプログラムを作成せよ.ただし,r %の複利でn 年 借りた場合の利率を計算する部分を関数として作成すること.下記ヒント参照.
% ./interest
利率(r): 7.5
金額(y): 1000000
期間(n): 2
返済金額は 1155625 円です
%
ヒント: 返済額は円である.r%の複利でn年 間の利率を計算する関数 float interest(float r, int n) を作る.そしてmain()からinterest()を呼び出し,返された値に yを掛けて返済額を求める.
という問題で、コンパイルして実行してみるとなぜか返済金額がマイナスになり、正しい答えがでません。どう直せばよいでしょうか?
私が書いたソースコード↓
#include<stdio.h>
# define BUFFER_SIZE (256)
int get_int(void)
{
char buf[BUFFER_SIZE];
fgets(buf, BUFFER_SIZE, stdin);
return atoi(buf);
}
double atof(char []);
double
get_float(void)
{
char buf[BUFFER_SIZE];
double number;
fgets(buf, BUFFER_SIZE, stdin);
return number = (double )atof(buf);
}
float interest(float r, int n){
int i;
float risi;
for(i=0 ; i<n ; i++){
risi = risi * (1 + r/100);
}
return risi;
}
int main (void){
int money,period;
float a,result;
printf("利率(r): ");
a = get_int();
printf("金額(y): ");
money = get_int();
printf("期間(n): ");
period = get_int();
x = interest( a , period );
result = money * x;
printf("返済金額は %d 円です。",result);
return 0;
}
700ポイント を手に入れた。
|
|
|
|
Name: 急所 ..ぴよぴよ(7ポイント)
Date: 2010/09/08(水) 15:48
No:61276
|
|
Title: Re:複雑な計算の関数化
|
|
宿題は人にやらせるものではない
自分で解くものだ
7ポイント を手に入れた。
|
|
|
|
|
Name: パコネコ ..熟練のプログラマー(41,108ポイント)
Date: 2010/09/08(水) 15:54
No:61277
|
|
Title: Re:複雑な計算の関数化
|
|
エラー出てますけど…関数の型が一致してないようで…
double atof(char []);
return atoi(buf);
これは一体…どっちか間違ってませんか?
========
さっきから探しているけど見つからない…
atofは宣言しかないのですが…
atoiとはなんでしょうか?
atofの間違いもしくは逆でしょうか?

76ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(213,222ポイント)
Date: 2010/09/08(水) 16:00
No:61278
|
|
Title: Re:複雑な計算の関数化
|
|
printf関数などを様々な箇所において、どこで計算がおかしくなっているかを調べてみましょう。
blueさんは「問題の解き方」よりも「デバッグのやりかた」を教わった方が良いと思いますよ。
それだけのソースを書けるのですから、printfトラップを仕掛けるのは全然難しくないでしょうしね。
※例
int get_int(void)
{
char buf[BUFFER_SIZE];
int ret = 0;
fgets(buf, BUFFER_SIZE, stdin);
ret = atoi(buf);
printf("get_int = %d\n", ret);
return atoi(buf);
}
170ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..プログラマー(36,574ポイント)
Date: 2010/09/08(水) 16:04
No:61279
|
|
Title: Re:複雑な計算の関数化
|
|
ざらっと見ただけですが、とりあず interest() 関数内で変数 risi が初期化されていません。
未初期化の変数の読み出しを行った結果は未定義です。
それと、変数xが宣言されてないようです。
ついでに、a = get_int(); は利率を取得しているようですが、get_int() 関数は整数値の入力を取得する関数ですね。 これでは不都合ではありませんか。
さらに言うと、複利計算について根本的な勘違いをしている気がします。
130ポイント を手に入れた。
|
|
|
|
|
Name: blue ..入門者(3,509ポイント)
Date: 2010/09/08(水) 23:07
No:61319
| 解決!
|
Title: Re:複雑な計算の関数化
|
|
なんとかうまくいきました。みなさんありがとうございます。ところで、へろりさんに質問なんですが「複利計算について根本的な勘違いをしている気がします」とありましたが、具体的におしえてくれませんか?
58ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..プログラマー(36,718ポイント)
Date: 2010/09/09(木) 07:57
No:61331
|
|
Title: Re:複雑な計算の関数化
|
|
>「複利計算について根本的な勘違いをしている気がします」とありましたが、具体的におしえてくれませんか?
途中まで書いてて気が付きました。 勘違いしていたのは私の方だったようです。 失礼いたしました。
87ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..熟練のプログラマー(59,030ポイント)
Date: 2010/09/09(木) 09:49
No:61337
|
|
Title: Re:複雑な計算の関数化
|
|
パコネコさん
さっきから探しているけど見つからない…
atofは宣言しかないのですが…
atoiとはなんでしょうか?
atofの間違いもしくは逆でしょうか?
atoi,atofの実体は標準ライブラリにあるので宣言だけで使えます
atoiはintを返す関数なので宣言自体も必要ないです(Cの場合)
でも宣言はあった方がいいですね
普通は
#include <stdlib.h>
でatoiやatofを宣言します
186ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(213,580ポイント)
Date: 2010/09/09(木) 11:50
No:61344
|
|
Title: Re:複雑な計算の関数化
|
|
>>blueさん
うまくいった結果のソースをアップしておいた方が良いと思いますよ。
今後、似たような質問があった場合に参考にする人が出てくるかもしれませんので。
20ポイント を手に入れた。
|
|
|
|
|
Name: blue ..初心者(5,289ポイント)
Date: 2010/09/09(木) 22:12
No:61386
| 解決!
|
Title: Reうまくいったソース
|
|
#include<stdio.h>
# define BUFFER_SIZE (256)
int get_int(void)
{
char buf[BUFFER_SIZE];
fgets(buf, BUFFER_SIZE, stdin);
return atoi(buf);
}
double atof(char []);
double
get_float(void)
{
char buf[BUFFER_SIZE];
double number;
fgets(buf, BUFFER_SIZE, stdin);
return number = (double )atof(buf);
}
float interest(float r, int n){
int i;
float risi;
risi = 1;
for(i=0 ; i<n ; i++){
risi = risi * (1 + r/100);
}
return risi;
}
int main (void){
int money,result,period;
float a,x;
printf("利率(r): ");
a = get_float();
printf("金額(y): ");
money = get_int();
printf("期間(n): ");
period = get_int();
x = interest( a , period );
result = money * x;
printf("返済金額は %d 円です。",result);
return 0;
}
483ポイント を手に入れた。
|
|
|
|
Name: blue ..入門者(4,783ポイント)
Date: 2010/09/09(木) 11:12
No:61342
|
|
Title: 無題
|
|
前期に大学でやった問題を復習しています。ただしくソースを書いたつもりなのになぜかエラーや警告文がたくさん出ます。どこを直せばよいかわかる方おしえてください。
上のフロッピーの画像を押せば実行するのに必要なフォルダがダウンロードができます。
やり方は、作ったC言語のソースファイルをritspen/workspaceに入れる。
コンパイルは gcc -o (実行ファイル名)(作ったC言語のファイル名) RitsPen.o と入力する。
新しく端末を開いて
cd ritspen
./canvas.sh
と入力してcanvasを立ち上げる。
実行ファイルを実行させる。
重要: RitsPenへの命令を解釈するインタプリタ
重要課題 13..1
以下のような構造体instructionを考える。この構造体は、指定された長さ, 幅, 角度, 色, 速度で線を引くための RisPen への命令を表している。
#define MAX_NAME (64)
struct instruction {
int length;
int width;
int angle;
char color[MAX_NAME];
int speed;
};
この構造体を引数として与えられたときに、RitsPenを使って指定された仕様の線 を引く関数
interpret_program(PEN, struct instruction)
を作れ。 CreatePEN()の引数は interpreter とする。
作成した関数interprete_program()に以下のように設定された構造体instructionを引数に与える main()関数を作成し、開始点から垂直上向きに太さ 20、長さ 200の青色線がもっとも速い速度で描線されていることを確かめよ。
長さ 200
回転角 -90
幅 20
色 ''blue''
速度 1
ヒント: 関数interpret_program()は以下のような手続きに従う。
void
interpret_program(PEN pen, struct instruction instruction)
{
ChangeWidth()で幅を設定
ChangeSpeed()で速度を設定
ChangeColor()もしくはChangeColor2()で色を設定
UsePEN()で長さと回転角を指定して描線
return;
}
ヒント: 色の指定には、構造体と RitsPen で指定方法が異なっているので、 注意が必要である。構造体のメンバでは色名が文字列で指定されているが、 RitsPenのChangeColor()では色番号で、RitsPenのChangeColor2()ではRGBのそれ ぞれの強度で色が指定される。RGBのそれぞれの強度で指定される。構造体内のメ ンバ color と色名を指定した文字列を、教科書 p.252, p.266 で説明されている str_comp()か、ライブラリ関数 strcmp() を用いて比較し、構造体内のメンバ colorが何色を指定しているかを判断した上で色の設定を行う。具体的には、ライ ブラリ関数 strcmp() を用いると、以下のようなプログラムとなる。
#define BLACK (0)
#define RED (1)
.......
#define GRAY (7)
if(strcmp(構造体内のメンバ color, "black") == 0) {
ChangeColor(pen, BLACK);
} else if(strcmp(構造体内のメンバ color, "red") == 0) {
ChangeColor(pen, RED);
} else if(
.......
} else if(strcmp(instruction.color, "violet") == 0) {
ChangeColor2(pen, 90, 90, 150);
} else if(strcmp(instruction.color, "brown") == 0) {
ChangeColor2(pen, 0, 90, 30);
} else {
// その他の色はとりあえずグレー
ChangeColor(pen, GRAY);
}
文字列の比較には教科書 p.253 に説明さているように
if( 構造体内のメンバ color == "black") {
ChangeColor(pen, BLACK);
}
と書いてはいけない。教科書を読んで、理由をよく理解しておくこと。
自分が書いたソースコード
#include <stdio.h>
#include <string.h>
#include "RitsPen.h"
#define MAX_NAME 64
#define Black 0
#define RED 1
#define BLUE 2
#define GREEN 3
#define ORANGE 4
#define PINK 5
#define YELLOW 6
#define GRAY 7
//プロトタイプ宣言
struct instruction{
int length;
int width;
int angele;
char color[MAX_NAME];
int speed;
};
void interpret_program(PEN pen, struct instruction instruction){
ChangeWidth(pen,instruction.width);
ChangeSpeed(pen,instruction.speed);
if(strcmp(instruction.color, "black") == 0){
ChangeColor(pen, BLACK);
}
else if(strcmp(instruction.color, "red") == 0){
ChangeColor(pen, RED);
}
else if(strcmp(instruction.color, "blue") == 0){
ChangeColor(pen, BLUE);
}
else if(strcmp(instruction.color, "green") == 0){
ChangeColor(pen, GREEN);
}
else if(strcmp(instruction.color, "orange") == 0){
ChangeColor(pen, ORANGE);
}
else if(strcmp(instruction.color, "pink") == 0){
ChangeColor(pen, PINK);
}
else if(strcmp(instruction.color, "yellow") == 0){
ChangeColor(pen, YELLOW);
}
else{
ChangeColor(pen, GRAY);
}
UsePEN(pen, instruction.length, instruction.angle);/*線の描画*/
}
int main(void){
//設定
PEN pen;
struct instruction = {200,-90,20,"blue",1};
pen = CreatePEN("interpreter");
interpret_program(pen,a);
ClosePEN(pen);
return 0;
}
1,274ポイント を手に入れた。
|
|
|
|
Name: fatens ..上級者(18,290ポイント)
Date: 2010/09/09(木) 11:51
No:61345
|
|
Title: Re:無題
|
|
#define Black 0 → #define BLACK 0
int angele; → int angle;
struct instruction = {200,-90,20,"blue",1}; → struct instruction a = {200,20,-90,"blue",1};
これでどうでしょうか。
122ポイント を手に入れた。
|
|
|
|
Name: ユメ ..ぴよぴよ(144ポイント)
Date: 2010/09/09(木) 03:29
No:61326
|
|
Title: 数独の著作権について
|
|
今まで数独はみんなの物と思っていたのですがある会社が著作権を持っているようです。
数独の著作権は二コリという会社が持ってると知りました。
携帯用でオープンアプリプレイヤー対応のを開発したいです。 無料(一部有料)
勝手に出すのは違法なのでしょうか?
また個人的にパズルゲームが好きなのですが
数独以外にご存じの物を紹介して頂けないでしょうか?
魔方陣なども暇を潰せるので好きです。
144ポイント を手に入れた。
|
|
|
|
Name: toyo ..熟練のプログラマー(58,879ポイント)
Date: 2010/09/09(木) 06:36
No:61327
|
|
Title: Re:数独の著作権について
|
|
著作権は著作物に与えられます
作成された数独の問題には著作権があると考えます
数独という名前はニコリの登録商標なので勝手には使えません
一般にはナンバープレースという名前が使われているようですのでナンバープレースとして作るか新たにオリジナルのゲーム名で独自の問題を発表する分には問題ないでしょう
他人の問題を使うと著作権侵害になると思います
ナンバープレースのアイデア自体は18世紀にはあったようでラテン方格の応用になります
パズルのアイデア自体には特許や実用新案は当てはまらなかったと思います
238ポイント を手に入れた。
|
|
|
|
|
Name: dic ..比類無きプログラマー(95,826ポイント)
Date: 2010/09/09(木) 08:44
No:61334
|
|
Title: Re:数独の著作権について
|
|
違法というと何の法律にひっかかるのでしょう?
//------------------------
携帯アプリはウィルス対策ソフトがそもそもないので
怖くて使ってないです
著作権は数独の場合は、数独のプログラムに著作権が発生しますので
このプログラムを勝手に使用すると著作権違反になります
しかし、独自に数独に似たプログラムを開発した場合、この似たプログラムの著作権は
その開発者(会社)にあるので著作権侵害になりません
似たようなゲームが市場に出回っているのもそのためです

21ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(213,449ポイント)
Date: 2010/09/09(木) 08:52
No:61335
|
|
Title: Re:数独の著作権について
|
|
>>toyoさん
>>他人の問題を使うと著作権侵害になると思います
これについてですが、最近は問題を自動生成するのも少なくない状況だと思います。
「結果的に同じ問題になってしまった」場合というのはどういう扱いになるのでしょうか?
70ポイント を手に入れた。
|
|
|
|
|
Name: ユメ ..ぴよぴよ(220ポイント)
Date: 2010/09/09(木) 10:02
No:61339
|
|
Title: Re:数独の著作権について
|
|
皆様、色々とありがとうございます。
流石と言いますか皆様は何でも知っているのですね。
勉強になりました。
数独という名前を使わなければいいのですか・・・。
私以外に質問をしている方がおりますので
解決マークはまだつけないでおきます。
76ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..熟練のプログラマー(59,213ポイント)
Date: 2010/09/09(木) 10:44
No:61340
|
|
Title: Re:数独の著作権について
|
|
>バグさん
これについてですが、最近は問題を自動生成するのも少なくない状況だと思います。
「結果的に同じ問題になってしまった」場合というのはどういう扱いになるのでしょうか?
扱いは裁判官次第だと思いますが自動生成された問題は著作物ではないという判断もあるかもしれません
過去の全問題を調べるとか不可能ですし実情として数独の問題で著作権を気にする必要は無いとは思います
183ポイント を手に入れた。
|
|
|
|
|
Name: YuO ..熟練のプログラマー(46,904ポイント)
Date: 2010/09/09(木) 10:59
No:61341
|
|
Title: Re:数独の著作権について
|
|
著作権一般の話として,独立して生成された著作物は別個の著作物となります。
問題の自動生成を行った場合,著作権の発生の余地はともかく,元の問題に対して独立して生成されている (=元の問題を知らずに生成している) ため,
元の問題の著作者による著作権の行使を行う余地はありません。
単純に他者による既存の問題を出すだけの場合,複製権 (著作権法第二十一条) の侵害になるでしょう。
数値を入れ替えたりすると翻案権 (同法第二十七条) も問題になるかもしれません。
150ポイント を落としてしまった。
|
|
|
|
|
Name: バグ ..ハッカー(213,560ポイント)
Date: 2010/09/09(木) 11:48
No:61343
| 解決!
|
Title: Re:数独の著作権について
|
|
>>toyoさん
>>Yuoさん
なるほど、いわゆる偶然の産物が結果的に既存の物と同じになってしまった場合は問題にならないという事ですね。ありがとうございました。
スレ主さんにかわり、解決マークを押しておきます。
111ポイント を手に入れた。
|
|
|
|
Name: gdu ..ぴよぴよ(962ポイント)
Date: 2010/09/07(火) 22:53
No:61237
|
|
Title: 三角関数のテーブル化
|
|
龍神録を元に色々弾幕等を増やしていくと
どうしても弾が多くなると処理落ちが発生してプレイしにくくなってしまいます。
そこで三角関数のテーブル化をしてみようとおもいましたが、
数学が基本的に苦手でして特に図形の角度や面積を求める問題等がかなり苦手なので
テーブル化についてググリましたが仕組みがよくわかりません。
どのように勉強、理解したらよいでしょうか?
あとよくテーブル化すれば速度が上がるという話を聞くのですがそれ以外で
具体的にシーティングにおいてどのようなメリット、デメリットがあるのでしょうか?
237ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) [URL] ..ウィザード(1,269,982ポイント)
Date: 2010/09/07(火) 23:04
No:61240
|
|
Title: Re:三角関数のテーブル化
|
|
PSP等で弾幕を計算するような特殊な場合でない限りテーブル化はあまり必要ではないと思いますよ。
ボトルネックはCPUではなくグラフィック部分である可能性が大きいので、描画まわりを工夫した方が良いと思います。
無駄な描画をしないとか、演算に時間のかかる減算合成はしないとか、広い範囲でアルファブレンドしないとか。
龍神録ではどの関数にどれ位時間がかかっているか表示できるようになっているので、
ボトルネックをそこから絞ってみるといいと思います。
勉強の為にという事であれば、ボトルネック云々関係なく一通り実装してみてもいいかもしれませんね。
int型のみで計算できる部分はintだけで計算する仕組みも考えると良いでしょう。
例えば座標って640やその辺ですから、42億まで数えられるintの範囲は全部使いません。
ですから、小数点の部分を上にシフトしてやって、実数をintで計算するように出来ると思います。
例えば
123.456
という値は x100 してやれば
123456
という値になりますね。計算し終わった時に、 /100 してやれば
123.456
に戻ります。
で、変数の値は何も実数で保持する必要はありません。シフトしたままで保持していてもいいわけです。
表示するときだけ実数にしてやればいいということですね。
計算に必要な変数を全てintで用意することで、計算中はintだけで計算するので早いということです。
(実数を計算する機構のあるPCなどでは恩恵はあまりないでしょうが)
シフトするときは、intの場合16ビットシフトしてやると高速に計算できるでしょう。
383ポイント を手に入れた。
|
|
|
|
|
Name: gdu ..かけだし(1,098ポイント)
Date: 2010/09/08(水) 00:13
No:61248
|
|
Title: Re:三角関数のテーブル化
|
|
回答ありがとうございます。
テーブル化は携帯ゲーム機類でしかほとんど効果はないんですね、
よく分かりました。
グラフィック部分の処理を見直してみたところ縮小表示しているところや
二重に表示しているところなどが多数ありました。
それを修正、削除した結果完全とはいきませんが許容範囲のfpsが出ました。
ありがとうございました。
三平方の定理・・・習いましたがもう何がなんだか分からなかった覚えが・・w
一度どこから分からなくなったのか復習してみます。w
136ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..ウィザード(1,271,559ポイント)
Date: 2010/09/09(木) 21:20
No:61377
|
|
Title: Re:三角関数のテーブル化
|
|
> 数学が基本的に苦手でして特に図形の角度や面積を求める問題等がかなり苦手なので
> テーブル化についてググリましたが仕組みがよくわかりません。
ということでしたので、一応テーブルが作れるプログラムを作ってみました。
といってもループして表示しているだけです。
NUMの数を変えれば好きな要素数のテーブルが出来ます。
#include <stdio.h>
#include <math.h>
#define PI 3.1415926535
#define NUM 100
int main(){
int i;
{//サイン
printf("float TableSin[ %d ] = {\n\t", NUM);
for( i=0; i<NUM; i++ ){
printf("%10.7f", sin(PI*2/NUM*i));
if( i != NUM-1 ){
printf(",");
}
if( i%10 == 9 ){
printf("\n\t");
}
}
printf("\n};\n");
}
{//コサイン
printf("float TableCos[ %d ] = {\n\t", NUM);
for( i=0; i<NUM; i++ ){
printf("%10.7f", cos(PI*2/NUM*i));
if( i != NUM-1 ){
printf(",");
}
if( i%10 == 9 ){
printf("\n\t");
}
}
printf("\n};\n");
}
{//タンジェント
printf("float TableTan[ %d ] = {\n\t", NUM);
for( i=0; i<NUM; i++ ){
printf("%10.7f", tan(PI*2/NUM*i));
if( i != NUM-1 ){
printf(",");
}
if( i%10 == 9 ){
printf("\n\t");
}
}
printf("\n};\n");
}
return 0;
}
出力結果
float TableSin[ 100 ] = {
0.0000000, 0.0627905, 0.1253332, 0.1873813, 0.2486899, 0.3090170, 0.3681246, 0.4257793, 0.4817537, 0.5358268,
0.5877853, 0.6374240, 0.6845471, 0.7289686, 0.7705132, 0.8090170, 0.8443279, 0.8763067, 0.9048271, 0.9297765,
0.9510565, 0.9685832, 0.9822873, 0.9921147, 0.9980267, 1.0000000, 0.9980267, 0.9921147, 0.9822873, 0.9685832,
0.9510565, 0.9297765, 0.9048271, 0.8763067, 0.8443279, 0.8090170, 0.7705132, 0.7289686, 0.6845471, 0.6374240,
0.5877853, 0.5358268, 0.4817537, 0.4257793, 0.3681246, 0.3090170, 0.2486899, 0.1873813, 0.1253332, 0.0627905,
0.0000000,-0.0627905,-0.1253332,-0.1873813,-0.2486899,-0.3090170,-0.3681246,-0.4257793,-0.4817537,-0.5358268,
-0.5877853,-0.6374240,-0.6845471,-0.7289686,-0.7705132,-0.8090170,-0.8443279,-0.8763067,-0.9048271,-0.9297765,
-0.9510565,-0.9685832,-0.9822873,-0.9921147,-0.9980267,-1.0000000,-0.9980267,-0.9921147,-0.9822873,-0.9685832,
-0.9510565,-0.9297765,-0.9048271,-0.8763067,-0.8443279,-0.8090170,-0.7705132,-0.7289686,-0.6845471,-0.6374240,
-0.5877853,-0.5358268,-0.4817537,-0.4257793,-0.3681246,-0.3090170,-0.2486899,-0.1873813,-0.1253332,-0.0627905
};
float TableCos[ 100 ] = {
1.0000000, 0.9980267, 0.9921147, 0.9822873, 0.9685832, 0.9510565, 0.9297765, 0.9048271, 0.8763067, 0.8443279,
0.8090170, 0.7705132, 0.7289686, 0.6845471, 0.6374240, 0.5877853, 0.5358268, 0.4817537, 0.4257793, 0.3681246,
0.3090170, 0.2486899, 0.1873813, 0.1253332, 0.0627905, 0.0000000,-0.0627905,-0.1253332,-0.1873813,-0.2486899,
-0.3090170,-0.3681246,-0.4257793,-0.4817537,-0.5358268,-0.5877853,-0.6374240,-0.6845471,-0.7289686,-0.7705132,
-0.8090170,-0.8443279,-0.8763067,-0.9048271,-0.9297765,-0.9510565,-0.9685832,-0.9822873,-0.9921147,-0.9980267,
-1.0000000,-0.9980267,-0.9921147,-0.9822873,-0.9685832,-0.9510565,-0.9297765,-0.9048271,-0.8763067,-0.8443279,
・・・・
ただ、図形の角度や面積の求め方が解らないということなので、
テーブル化よりも先に基本的な数学についておさらいした方が良い気がします。
特に角度に関する知識が無いとSTG制作は少し厳しいです。
また、三平方の定理(ピタゴラスの定理)は良く使いますし、
こればベジェ曲線や物理の力学の方程式なども使うでしょう。
テーブル化をしようと思っていらっしゃるのであればsinやcosの理屈はOKですか?
例えば「2.0ラジアンの方向に速度10で飛んでいる弾のX移動成分はいくつですか」と聞かれたら解りますか?
もし解らないけど、作りたいという事であれば関数をブラックボックス化して考えて作るということも可能ですが、応用が厳しくなってくると思います。
1,363ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..ウィザード(1,272,186ポイント)
Date: 2010/09/09(木) 21:42
No:61381
|
|
Title: Re:三角関数のテーブル化
|
|
あ、失礼しました。
テーブルの作り方が解らないのではなく、テーブル化の仕組みが解らないということですね。
まず、sin、cosなどの関数を使うときは、角度をラジアンで与えて計算結果を取得します。
ラジアンは
0.1でも0.01でも0.001でも0.0001でも0.000001でも有効範囲の中ならいくつでも計算出来ます。
しかし、これを計算する処理には結構時間がかかります。
と言ってもPCであれば百万回位ならすぐ計算出来ます。
for( i=0; i<1000000; i++ ){
b+=sin(3.141592654/1000000*i);
}
この計算結果は私のPCでは0.02秒でした。
PCには浮動小数点を計算する機構があるので、int型ほどは早くないものの、かなり高速に計算出来ます。
しかし組み込みなど、浮動小数点を計算する機構が含まれないものであれば極端に遅くなります。
そこで、math.h関数は極力呼ばない、浮動小数点は極力使わないなどの方法が必要になってくるわけです。
ここで、先ほど
>0.1でも0.01でも0.001でも0.0001でも0.000001でも計算出来ます
と言いましたが、そこまで必要ない場合があります。
計算誤差が0.1度位まで許されるのであれば、あらかじめ0.1度単位で計算したデータを持っておけばいいじゃないかと考えられるわけです。
そこで、上で紹介したようなデータを予め保持しておくのです。
角度を計算したい時は、その角度にもっとも近いデータをテーブルから探してあてはめるわけです。
例えば
float TableSin[360]
で360個、1度刻みのデータがあるのであれば、20度のsinは
TableSin[20]
を出してくればいいことが解ります。
このように関数を呼ばずに値を取り出す仕組みがテーブル化です。
しかし、どうも組み込みや携帯ゲームではないようですし、龍神録のプログラムのようですから、
処理落ちするのであれば、(既にお気づきのようですが)これがボトルネックになっているのではないと思います。
ただ勉強の為にいろんなプログラムを書いてみるのは大事なことですね。
627ポイント を手に入れた。
|
|
|
|
Name: TKOZ ..比類無きプログラマー(78,461ポイント)
Date: 2010/09/08(水) 21:37
No:61304
|
|
Title: [雑談]ファミコンのオセロゲーム作ってみました。
|
|
こんばんは。TKOZです。ファミコンソフトの自作オセロゲームを作ってみました。
開発環境は、cc65で、WindowsXPです。
えーと、すみませんが、Easyモードしか遊べません。
敵のAIは弱いです。
あとは、ファミコンサウンドを楽しんでください。
すみません、また今度改めてアップロードします。
期待してたみなさん、すいませんでした。 
168ポイント を手に入れた。
|
|
|
|
Name: naohiro19 ..かけだし(1,353ポイント)
Date: 2010/09/09(木) 08:24
No:61333
|
|
Title: Re:[雑談]ファミコンのオセロゲーム作ってみました。
|
|
FCE Ultraおよび FCEUXでは動きませんでした。
キー入力の反応がありませんでした
VirtuaNESでは画面が乱れる現象がありました。
2倍のポイントを手に入れた! 108ポイント を手に入れた。
|
|
|
|
|
Name: TKOZ ..比類無きプログラマー(78,599ポイント)
Date: 2010/09/09(木) 16:14
No:61360
|
|
Title: Re:[雑談]ファミコンのオセロゲーム作ってみました。
|
|
>naohiro19さんへ
マッパーは0をつかっています。ですから再現度の高いエミュレータなら動くはずです。
また、画面が乱れるのは仕様です。というか、どうすれば画面が乱れないように画面を更新するのか
分らないのです。
ファミコンは画面(BG)をいじると、スクロールレジスタの値まで変ってしまう特殊な仕様です。
どうすれば、画面(BG)をいじりながら、画面がスクロールしないか知りたいです。
108ポイント を手に入れた。
|
|
|
|
|
Name: TKOZ ..比類無きプログラマー(78,680ポイント)
Date: 2010/09/09(木) 16:48
No:61361
|
|
Title: Re:[雑談]ファミコンのオセロゲーム作ってみました。
|
|
どうやら、"BLACK WIN"と表示されるのが珍しいようです。
もう少しデバッグしてから配布すべきでした。
明らかに勝ちだと見てもDRAWにされてしまう場合があります。
勝ちか負けか判断されるosero.cのJudge()関数が怪しいです。
あと、ネットカフェから書き込んでいます。すみません。管理人さんへ
追記です。これは、家のパソコンから書き込んでいます。
あの…オセロってリバーシの方が名前が良かったでしょうか?
気がつきませんでした。ごめんなさい。みなさん。
削除させてもらいます。 
81ポイント を手に入れた。
|
|
|
|
|
Name: TKOZ ..比類無きプログラマー(78,778ポイント)
Date: 2010/09/09(木) 20:07
No:61374
|
|
Title: Re:[雑談]ファミコンのオセロゲーム作ってみました。
|
|
削除したのは、誰からの意見も聞かずに勝手に決めた事ですが、
良かったのでしょうか?
あと、問題点をデバッグして直してから、再度アップロードしたいのですが、
何かアドバイスがあればよろしくお願いします。
参考のためにreverse.cをアップロードします。
98ポイント を手に入れた。
|
|
|
|
Name: ガム ..ぴよぴよ(361ポイント)
Date: 2010/09/09(木) 12:29
No:61346
|
|
Title: 無題
|
|
第10章の「敵を出現させてみよう」についてなんですが、ゲームの初期化で少し困っています
memset(&ch,0,sizeof(ch_t));
とありますが、
memset()は、指定されたメモリ領域に、指定した値を格納
sizeof()は、sizeofに渡された型や変数のメモリサイズを調べる
だから「$chに0をsizeof(ch_t)のメモリサイズ分だけ格納する」みたいな解釈で
よろしいのでしょうか?
分かりやすい解釈の仕方があれば教えてください。
よろしくお願いします
212ポイント を手に入れた。
|
|
|
|
Name: うしお ..かけだし(1,657ポイント)
Date: 2010/09/09(木) 14:47
No:61354
|
|
Title: Re:無題
|
|
memsetは第一引数のポインタの位置から、
第二引数の数値で、
第三引数の大きさ分を問答無用で埋めます
Cではあまり問題がありませんでしたが、
なので、C++ではあまり推奨されていない関数です。
なぜなら、
仮想関数を使っているクラスや
内部で動的にメモリを確保するクラスなどで、
memsetを使うと思わぬバグの温床となりうるからです。
また、sizeofに動的に確保したメモリのポインタなどを渡してしまうと、
問答無用で4が返ってきてしまったりという落とし穴もあります。
上記のことを理解しつつ、
データだけの構造体を0で埋めよう、などの限られた用途であれば利用してみるといいでしょう
29ポイント を手に入れた。
|
|
|
|
|
Name: ガム ..ぴよぴよ(577ポイント)
Date: 2010/09/09(木) 15:28
No:61357
|
|
Title: Re:無題
|
|
>うしおさん
typedef struct{
int flag; //フラグ
int cnt; //カウンタ
int power; //パワー
int point; //ポイント
int score; //スコア
int num; //残機数
int mutekicnt; //無敵状態とカウント
int shot_mode; //ショットモード
int img;
int slow; //スローかどうか
double x,y; //座標
}ch_t;
構造体の中身はこのようになっています。
仮にch.x=10 ch.y=10となっている時に
memset(&ch,0,sizeof(ch_t));
をすると初期化されてch.x=0 ch.y=0になると考えてよろしいでしょうか?
216ポイント を手に入れた。
|
|
|
|
|
Name: うしお ..かけだし(1,711ポイント)
Date: 2010/09/09(木) 15:51
No:61358
|
|
Title: Re:無題
|
|
なります。
また、自分で出力されてみて値をチェックするのが安定かと思います。
思わぬ別な要因で値がずれ込む可能性もなくはないと思いますので
54ポイント を手に入れた。
|
|
|
|
|
Name: ガム ..ぴよぴよ(627ポイント)
Date: 2010/09/09(木) 17:57
No:61366
| 解決!
|
Title: Re:無題
|
|
>うしおさん
>フリオさん
初期化について理解することができました。
教えてくださってありがとうございました。
50ポイント を手に入れた。
|
|
|
|
Name: ヨーグルト ..ぴよぴよ(130ポイント)
Date: 2010/09/09(木) 13:06
No:61348
|
|
Title: 無題
|
|
C言語の#includeについて
今、ある親フォルダ porject の中に xxx.h と 子フォルダ test の2つが入っています。
さらに子フォルダ test の中に test.cpp が保存されています。
test.cpp において xxx.h をincludしたい時、
どのように書けばいいのでしょうか?教えてください。
#include "〜" の中のパス指定がわかりません。
130ポイント を手に入れた。
|
|
|
|
Name: へろり ..プログラマー(36,788ポイント)
Date: 2010/09/09(木) 13:13
No:61349
|
|
Title: Re:無題
|
|
普通に相対パスで指定すればいいです。 今回の場合は
project\\test\\test.cpp から、1つ上の階層にある project\\xxx.h を見る訳ですから
#include "..\\xxx.h"
となります。
70ポイント を手に入れた。
|
|
|
|
|
Name: ヨーグルト ..ぴよぴよ(183ポイント)
Date: 2010/09/09(木) 14:13
No:61352
|
|
Title: Re:無題
|
|
すみません、ご指摘のように
>へろり...さん #include "..\\xxx.h"
>シエル...さん #include "../xxx.h"
それぞれ試しましたが、なぜかできません。
使っているコンパイラはボーランドのbcc32です。
53ポイント を手に入れた。
|
|
|
|
|
Name: うしお ..かけだし(1,628ポイント)
Date: 2010/09/09(木) 14:36
No:61353
|
|
Title: Re:無題
|
|
インクルードパスに、
porjectフォルダのあるディレクトリを追加してみてください
うまくいくかもしれません
2倍のポイントを手に入れた! 82ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(157,250ポイント)
Date: 2010/09/09(木) 16:51
No:61362
|
|
Title: Re:無題
|
|
> project\\test\\test.cpp から、1つ上の階層にある project\\xxx.h を見る訳ですから
2つ上の階層ではないんですか?
(追記)
すみません。間違えました。
>質問者さん
どんな風にできなかったのか、エラーメッセージを
貼り付けるなどの方法で示してください。 
19ポイント を手に入れた。
|
|
|
|
|
Name: ヨーグルト
Date: 2010/09/19(日) 19:54
No:613481284893645
| 解決!
|
|
|
Name: きつね ..かけだし(1,999ポイント)
Date: 2010/09/08(水) 12:40
No:61265
|
|
Title: 画像の移動
|
|
はじめまして、学校の課題で行き詰ったので投稿させていただきます。
課題の内容は「出発座標から目的座標まで画像を移動させる」というものです。
そこで以下のようなプログラムを作りました。
#include "DxLib.h"
#include <math.h>
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
SetGraphMode(1366,768,32) ;
if(DxLib_Init()==-1) return -1 ;
SetDrawScreen(DX_SCREEN_BACK) ; //裏画面に描画
float sb,sbx,sby,bx,by,sx,sy; //初期座標と目的地の座標
float Ex,Ey,Esx,Esy; //移動時の座標
int agent; //人のグラフィック
int Cr; //線の色
double sokudo; //速度
double SB; //移動距離
float rad; //ラジアン
bx=600; //出発点x座標
by=300; //出発点y座標
sx=800; //目的地x座標
sy=600; //目的地y座標
sokudo=10; //人の移動速度
sbx=sx-bx; //それぞれのx座標の差
sby=by-sy; //それぞれのy座標の差
sb=sqrt(sbx*sbx+sby*sby); //出発点と目的地の距離
Esx=sbx/sb*sokudo; //x方向の移動速度
Esy=sby/sb*sokudo; //y方向の移動速度
agent=LoadGraph("char1.png"); //画像をメモリに読み込み
Cr=GetColor(255,255,255); //白の取得
SB=0; //初期値
Ex=0; //初期値
Ey=0; //初期値
rad=atan2(sbx,sby); //ラジアン
while(sb>SB) //SBがsbになるまで繰り返す
{
ClearDrawScreen(); //画面の初期化
Ex+=Esx; //EsxをExに代入
Ey+=Esy; //EsyをEyに代入
SB=sqrt(Ex*Ex+(Ey)*(Ey)); //移動距離の計算
DrawRotaGraph(bx+Ex,by-Ey,0.3f,rad,agent,TRUE); //画像の描画
DrawLine(bx,by,sx,sy,Cr); //線の描画
ScreenFlip(); //表画面へ描画
}
WaitKey() ; // キー入力待ち
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
一応移動はするのですが、目的座標にぴったりと到着しません。while(sb>SB)のあたりの計算式に問題があるはずなのですがどうしたらよいのかわかりません。
それと、目的座標に着いたら違う目的座標に再度移動するというプログラムも入れたいのですがどういう方法があるのでしょうか?自分は上記のプログラムを使ってif文等を使えば動くと思うのですが、どのようなプログラムの書き方をすればよいのかわかりません。
以上が質問になります。助言を頂けると嬉しいです、よろしくおねがいします。
[1] わからないこと
(1)目的座標にぴったりと到着するにはどうしたらよいか
(2)目的座標に着いたら再度違う目的座標に移動する
[2] 環境
[2.1] OS : WindowsXP
[2.2] コンパイラ名 : VC++
[3] その他
・C言語を初めてまだ2週間程度です
・DXライブラリを使用
1,227ポイント を手に入れた。
|
|
|
|
Name: さかまき ..かけだし(1,149ポイント)
Date: 2010/09/08(水) 16:13
No:61280
|
|
Title: Re:画像の移動
|
|
ループの中での sb,SB の値を調べるとわかりますが
sb = 360.555115 に対して、SB=10,20,30.... であり
ループを抜ける時には
sb=360.555115 SB=359.999860 (sb>SB)
sb=360.555115 SB=369.999851 (sb<SB)
となっており、一回ループが多いですね
歩幅が大きいから通り越しちゃってます。
111ポイント を手に入れた。
|
|
|
|
|
Name: さかまき ..かけだし(1,216ポイント)
Date: 2010/09/08(水) 16:41
No:61283
|
|
Title: Re:画像の移動
|
|
ループの中のSBの計算のあとで通り越したかを判断して(if (sb<SB))
最後の一歩の調整を行う必要があります。ループは無限ループ(while(1))
にして、通り越したらループを抜ける様にしたほうがよいかも
67ポイント を手に入れた。
|
|
|
|
|
Name: きつね ..かけだし(2,267ポイント)
Date: 2010/09/08(水) 19:40
No:61295
|
|
Title: Re:画像の移動
|
|
ご回答ありがとうございます。
ループを無限ループにし、最後の一歩の処理を(sb<SB)になった時に目的座標に画像を描画するようにしてみました。
while(1)
{
ClearDrawScreen(); //画面の初期化
Ex+=Esx; //EsxをExに代入
Ey+=Esy; //EsyをEyに代入
SB=sqrt(Ex*Ex+(Ey)*(Ey)); //移動距離の計算
if(sb<SB)
{
DrawRotaGraph(sx,sy,0.3f,rad,agent,TRUE); //最後の一歩分の処理
ScreenFlip();
break;
}
DrawRotaGraph(bx+Ex,by-Ey,0.3f,rad,agent,TRUE); //画像の描画
DrawRotaGraph(sx,sy,0.3f,rad,agent,TRUE);
ScreenFlip(); //表画面へ描画
こんな感じでいいでしょうか?なにか改良点などがあればお願いします。
268ポイント を手に入れた。
|
|
|
|
|
Name: さかまき ..かけだし(1,376ポイント)
Date: 2010/09/09(木) 09:53
No:61338
|
|
Title: Re:画像の移動
|
|
DrawLineがなくなったりしたのは関知しない事にして
>(1)目的座標にぴったりと到着するにはどうしたらよいか
は解決したのですよね?あとは
>(2)目的座標に着いたら再度違う目的座標に移動する
ですが、いまの動かす部分を引数(bx,by,sx,sy,sokudo)のサブルーチンUgokeにしてしまえば
Ugoke(600.0 , 300.0 , 800.0 , 600.0 ,10.0);
Ugoke(800.0 , 600.0 〜);
でずんずん進めます。
ところで、sqrtやatan2 の引数および返り値の型はfloatでOKですか?
160ポイント を手に入れた。
|
|
|
|
|
Name: きつね ..かけだし(1,706ポイント)
Date: 2010/09/09(木) 14:01
No:61351
|
|
Title: Re:画像の移動
|
|
ご回答ありがとうございます。DrawLineは特に意味がないので消してしまいました。
自分はC言語初心者なのでサブルーチンについて調べていました。
サブルーチンがどのようなものかは理解できましたが、どうやってプログラムを記述してよいのかいまいちわかりません。
*************************************************************************************
[1]
(bx,by,sx,sy,sokudo)の形で引数のリストを作る
[2]
sbx=sx-bx; //それぞれのx座標の差
sby=by-sy; //それぞれのy座標の差
sb=sqrt(sbx*sbx+sby*sby); //出発点と目的地の距離
Esx=sbx/sb*sokudo; //x方向の移動速度
Esy=sby/sb*sokudo; //y方向の移動速度
rad=atan2(sbx,sby); //ラジアン
引数によって変化する値の部分の計算をする
[3]
while(1)
{
ClearDrawScreen(); //画面の初期化
Ex+=Esx; //EsxをExに代入
Ey+=Esy; //EsyをEyに代入
SB=sqrt(Ex*Ex+(Ey)*(Ey)); //移動距離の計算
if(sb<SB)
{
DrawRotaGraph(sx,sy,0.3f,rad,agent,TRUE); //最後の一歩分の処理
ScreenFlip();
break;
}
DrawRotaGraph(bx+Ex,by-Ey,0.3f,rad,agent,TRUE); //画像の描画
ScreenFlip(); //表画面へ描画
画像を移動させる計算をする。
************************************************************************************************
「目的座標に着いたら再度違う目的座標に移動する」
の手順はこのような感じでループさせればよいと思うのですが、どのようにプログラムを記述していけばよいのかわかりません・・・。
>ところで、sqrtやatan2 の引数および返り値の型はfloatでOKですか?
型の方もfloat、doubleは「小数点が付く値で使う」程度にしか理解しておらずの、どちらが適しているのかもわかりません・・・。
561ポイント を落としてしまった。
|
|
|
|
|
Name: さかまき ..かけだし(1,629ポイント)
Date: 2010/09/09(木) 15:13
No:61356
|
|
Title: Re:画像の移動
|
|
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance。。。。
の上に
void Ugoke(float bx,float by,float sx,float sy,double sokudo)
{
// この中に始点から終点まで動く処理を記述
// bx,by,sx,sy,sokudo の型宣言は引数のなかで行っているので不要
}
を記述しておけば、メインのなかで
Ugoke(600.0 , 300.0 , 800.0 , 600.0 ,10.0);
Ugoke(800.0 , 600.0 ,違う目的座標X,違う目的座標Y,速度);
を記述していけばよいです。
253ポイント を手に入れた。
|
|
|
|
|
Name: きつね ..かけだし(2,313ポイント)
Date: 2010/09/09(木) 15:56
No:61359
|
|
Title: Re:画像の移動
|
|
ご回答ありがとうございます。完成しました!
こんな感じになりました
#include "DxLib.h"
#include <math.h>
void Ugoke(float bx,float by,float sx,float sy,double sokudo)
{
float sb,sbx,sby; //初期座標と目的地の座標
float Ex,Ey,Esx,Esy; //移動時の座標
int agent; //人のグラフィック
double SB; //移動距離
float rad; //ラジアン
sbx=sx-bx; //それぞれのx座標の差
sby=by-sy; //それぞれのy座標の差
sb=sqrt(sbx*sbx+sby*sby); //出発点と目的地の距離
Esx=sbx/sb*sokudo; //x方向の移動速度
Esy=sby/sb*sokudo; //y方向の移動速度
agent=LoadGraph("char1.png"); //画像をメモリに読み込み
SB=0; //初期値
Ex=0; //初期値
Ey=0; //初期値
rad=atan2(sbx,sby); //ラジアン
while(1)
{
ClearDrawScreen(); //画面の初期化
Ex+=Esx; //EsxをExに代入
Ey+=Esy; //EsyをEyに代入
SB=sqrt(Ex*Ex+(Ey)*(Ey)); //移動距離の計算
if(sb<SB)
{
DrawRotaGraph(sx,sy,0.3f,rad,agent,TRUE); //最後の一歩分の処理
ScreenFlip();
break;
}
DrawRotaGraph(bx+Ex,by-Ey,0.3f,rad,agent,TRUE); //画像の描画
ScreenFlip(); //表画面へ描画
}
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
SetGraphMode(1366,768,32) ; //画面の大きさ
if(DxLib_Init()==-1) return -1 ;
SetDrawScreen(DX_SCREEN_BACK) ; //裏画面に描画
Ugoke(600.0 , 300.0 , 800.0 , 600.0 ,3.0); //座標速度設定
Ugoke(800.0 , 600.0 , 300.0 , 200.0 ,3.0);
Ugoke(300.0 , 200.0 , 500.0 , 600.0 ,3.0);
Ugoke(500.0 , 600.0 , 300.0 , 200.0 ,3.0);
Ugoke(300.0 , 200.0 , 100.0 , 100.0 ,3.0);
WaitKey() ; // キー入力待ち
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
まだまだ沢山わからないこともあるのでさらに勉強したいと思います。
本当にお世話になりました。ありがとうございました。
607ポイント を手に入れた。
|
|
|
|
Name: みけCAT ..初心者(5,587ポイント)
Date: 2010/09/08(水) 21:11
No:61298
|
|
Title: [雑談]Hello,World
|
|
みなさん、こんばんは。みけCATです。
高度なゲーム制作もいいですが、たまには基本に帰ってHello,Worldでもやりましょう。
というわけで、皆さんの好きな方法でHello,Worldと表示するプログラムを書いてみましょう。
言語はC言語かC++ですが、プラットフォームは問いません。
コンソールアプリケーションに限定もしません。
ちなみに自分は
#include <stdio.h>
int main(void) {
printf("Hello,World\n");
return 0;
}
です。
244ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(213,379ポイント)
Date: 2010/09/08(水) 21:33
No:61300
|
|
Title: Re:[雑談]Hello,World
|
|
んでは、捻らずにC++で…
#include <iostream>
int main(void)
{
std::cout << "Hello,World" << std::endl;
return 0;
}
おまけにC#でもw
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("Hello,World");
}
}
157ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..ウィザード(1,270,237ポイント)
Date: 2010/09/08(水) 21:35
No:61301
|
|
Title: Re:[雑談]Hello,World
|
|
> みけCATさん
こんばんは。面白そうですね。
いきなりhello worldじゃなくて申し訳ないのですが、私は「unix」と表示させる最も難解なコードとして有名な
void main(void) {printf(&unix["\021%six\012\0"], (unix)["have"]+"fun"-0x60);}
が結構好きです。
(Unix環境意外で動かす場合は最初に #define unix 1 が必要です)
パッと見、何が出力されるのか全然わかんないですよね^^;
トピの趣旨とずれてたらすみません。
このトピでは何かテクニカルな方法で hello world を表示させる方法について書かれています?
221ポイント を手に入れた。
|
|
|
|
|
Name: めるぽん ..上級者(19,221ポイント)
Date: 2010/09/08(水) 21:36
No:61302
|
|
Title: Re:[雑談]Hello,World
|
|
Hello, world.
プログラミング言語プリプロセッサです!
cpp.exe -E -P とか cl.exe /EP とかすれば無事 Hello, world. と出力されたファイルが出てきます!とか。
70ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..熟練のプログラマー(58,641ポイント)
Date: 2010/09/08(水) 21:44
No:61306
|
|
Title: Re:[雑談]Hello,World
|
|
メッセージボックスで
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
MessageBox(NULL, TEXT("Hello World"), TEXT(""), MB_OK);
return 0;
}
79ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(226,764ポイント)
Date: 2010/09/08(水) 22:03
No:61308
|
|
Title: Re:[雑談]Hello,World
|
|
ちょっとひねりましょうか?
#include <iostream>
template <char C, class Next>
struct c
{
static char const value = C;
typedef Next type;
};
typedef c<'H',c<'e', c<'l', c<'l', c<'o', c<',', c<'W', c<'o', c<'r', c<'l', c<'d', void> > > > > > > > > > > hello;
template <class String>
void write()
{
std::cout << String::value;
write<typename String::type>();
}
template <>
void write<void>()
{
std::cout << std::endl;
}
int main()
{
write<hello>();
}
191ポイント を手に入れた。
|
|
|
|
|
Name: シエル [URL] ..比類無きプログラマー(70,982ポイント)
Date: 2010/09/08(水) 22:33
No:61313
|
|
Title: Re:[雑談]Hello,World
|
|
適当。
#include <stdio.h>
int main(void)
{
char tmp[]={0x48,0x65,0x6c,0x6c,0x6f,0x2c,0x57,0x6f,0x72,0x6c,0x64};
int size=sizeof(tmp)/sizeof(tmp[0]);
for(int i=0;i<size;++i){
printf("%c",tmp[i]);
}
printf("\n");
getchar();
return 0;
}
140ポイント を手に入れた。
|
|
|
|
|
Name: MNS ..熟練のプログラマー(40,320ポイント)
Date: 2010/09/08(水) 23:19
No:61321
|
|
Title: Re:[雑談]Hello,World
|
|
やっつけです。
#include <stdio.h>
int main(void)
{
for(double i = 0;
i < 6;
++i)
{
putchar(-2.0167*i*i*i*i*i+23.167*i*i*i*i-87.583*i*i*i+114.33*i*i-11.9*i+72.5);
putchar(5.0167*i*i*i*i*i-66.958*i*i*i*i+310*i*i*i-572.04*i*i+330.98*i+101.5);
}
return 0;
}
93ポイント を手に入れた。
|
|
|
|
|
Name: ideyan ..中級者(10,481ポイント)
Date: 2010/09/09(木) 01:25
No:61323
|
|
Title: Re:[雑談]Hello,World
|
|
うーむ、なんか微妙。。。
#include <stdio.h>
int main(void)
{
int i,j;
char *w[]={" "," $","\n"};
unsigned n[]={1744499325U,2799358541U,2816135807U,2782581325U,2130018301U,3681512887U};
for(i=0;i<5;++i){
for(j=0;j<32;++j,n[i]>>=1){
printf(w[n[i]&1]+((n[5]>>j)&1));
}
printf(w[2]);
}
return 0;
}
136ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..プログラマー(36,631ポイント)
Date: 2010/09/09(木) 07:46
No:61330
|
|
Title: Re:[雑談]Hello,World
|
|
すべての環境でという訳にはいきませんが、有名なコードを一つ。
char main[] = "`j X$@P[PYPPPPX4.4 PZUX, P^XH,=)F(P_X3F()8)8@)8@@)8)8@PYX@@@@CQBaGHello, world!\n";
57ポイント を手に入れた。
|
|
|
|
|
Name: dic ..比類無きプログラマー(95,893ポイント)
Date: 2010/09/09(木) 09:38
No:61336
|
|
Title: Re:[雑談]Hello,World
|
|
ネットワークの伝送方法で
1h,11d,3l,7w,4l,2e,6,,10l,9r,5o,8o
と伝送順番と文字コードを一緒にして表示
67ポイント を手に入れた。
|
|
|
|
Name: iPhoneアプリ開発 CSVの読み込み ..ぴよぴよ(451ポイント)
Date: 2010/09/02(木) 21:54
No:60873
|
|
Title: 健史
|
|
iPhoneで動くアプリを開発しております。
CSVからデータを読み込みテーブルビューに表示するといった簡単なプログラムを作りたいです。
画面下のタブビューを切り替えるとテーブルビューに表示されているものがソートされるようにしたいです。
例)キー2タブが押されたら2項目目を中心にソート
CSVは何とか読み込めたのですが表示しようとすると問題が発生してしまいます。
if( indexPath.row == 0 ) cell.textLabel.text = @"aaa";//[[items objectAtIndex:0] objectAtIndex:0] ;
コメントのほうを使うとスクロール時に強制終了してしまいます。
また、タブバーが2つ表示されてしまっており困っております。
タブを押した時にどこにソートするといったイベントを書けばよいのかもわかりません。
C言語は1年程度いじってきたのですが新しい環境での開発のためあまりなれておりません。
こちらはゲームを作るための掲示板とは思いますが
どなたかお分かりになる方はいらっしゃらないでしょうか?
またこのアプリは販売する予定などはありません。
完全に自分用に作っております。
451ポイント を手に入れた。
|
|
|
|
Name: Justy ..伝説なるハッカー(571,728ポイント)
Date: 2010/09/03(金) 01:38
No:60881
|
|
Title: Re:健史
|
|
>スクロール時に強制終了してしまいます
んー、RootViewControllerの
items = [NSMutableArray array];
を
items = [[NSMutableArray alloc] init];
にしたらどうなりますか?
>また、タブバーが2つ表示されてしまっており困っております
2つというのは上下に、ということですか?
それならそうです。
self.tabBarController.viewControllers = [NSArray arrayWithObjects:tab1,tab2,tab3,nil];
この行でやっていることはタブの中のボタンを設定しているのではなく、
それぞれのタブを押したときに表示されるそれぞれのタブに対応した ViewControllerを指定しています。
このコードですと対応したタブを押す毎に tab1などが表示されるというわけです……おかしいですよね。
この NSArrayには RootViewControllerなどの ViewControllerを入れるのが正しい挙動では
ないかと思います。
タブのボタン名はそれぞれで表示される ViewControllerの initメンバ関数の中で self.tabBarItemに対して
オブジェクトを割り当てて指定して下さい。
>タブを押した時にどこにソートするといった
どこで、ということなら testAppDelegateクラスに UITabBarControllerDelegateプロトコルを追加、
didSelectViewController関数を書けばタブを押したときに呼ばれるようになります。
597ポイント を手に入れた。
|
|
|
|
|
Name: 健史 ..ぴよぴよ(244ポイント)
Date: 2010/09/03(金) 02:56
No:60883
|
|
Title: Re:健史
|
|
すみません。タイトルと質問が逆になっておりました。
不快になった方がおりましたら申し訳ございません。
お分かりになる方がいましたか!!
ありがとうございます。
1つ目の問題は修正できました。
初期化が原因だったのですね・・・。
objective-cは厄介ですね。
2つ目の問題について
ビューを3つ用意しなければいけないということなのでしょうか?
これからの為にもIBを出来れば使いたくないのですが手書きでの実装は難しいのでしょうか?
3つ目の問題について
自分なりに追加してみたのですが添付したソースであっておりますでしょうか?
また別のソースで定義しているitemsをソートしたいのですがextern的なことは出来ないのでしょうか?
244ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(572,550ポイント)
Date: 2010/09/04(土) 00:07
No:60933
|
|
Title: Re:健史
|
|
>ビューを3つ用意しなければいけないということなのでしょうか?
だと思いますよ。
同じ ViewControllerを指定してもうまくはいかないと思いますし。
タブでうまくやるには下の階層にRootViewControllerをおいてリストを表示し、
その上にタブをおき、そのタブは3つの空のビューコントローラーをセットしておきます。
後はタブの切り替わりを検知したらリストを持つRootViewControllerにソートの指示を出せばいいのでは
ないでしょうか。
或いはタブをすっぱり諦めて別の手にするのもいいのかもしれません。
・ タブでの実装を止めて、画面に下にツールバーをおいて、その上に幾つかボタンを作成します。
そのボタンが押されたら、ソートを切り替える
・ 1つだけボタンをおいて、順繰りにソート方式を切り替える
・ 頻繁にソートしないのであれば、アクションシートを出して選ばせる
とか。
>これからの為にもIBを出来れば使いたくないのですが手書きでの実装は難しいのでしょうか
難しいというより面倒なだけです。
まぁIBに慣れてしまうといろいろ弊害もあるでしょうから、両方使えるようにしておくのがベストかと。
>自分なりに追加してみたのですが添付したソースであっておりますでしょうか?
合ってるかどうか訊く前に試しましたか?
tabBarController.delegateが接続されていないので、タブがセレクトされても呼び出されないと思います。
>また別のソースで定義しているitemsをソートしたいのですがextern的なことは出来ないのでしょうか?
itemsがグローバル変数ならできますよ、externで。
メンバであるなら、そのメンバを返すようなプロパティなりメンバ関数なりを作って渡せばいいかと。
今のファイル構成で考えるなら、設計的には itemsを(csvから読み込んで)生成するクラスを新規で作って
それを testAppDelegateのメンバとしてオブジェクトを作った後、RootViewControllerに引き渡せばいいかと。
599ポイント を手に入れた。
|
|
|
|
|
Name: 健史 ..ぴよぴよ(296ポイント)
Date: 2010/09/06(月) 16:25
No:61119
|
|
Title: 無題
|
|
返信が遅れてしまいすみません。
頂いたアドバイスを元に修正してみます。
多分、また質問をしてしまうかと思いますが何卒よろしくお願いいたします。
52ポイント を手に入れた。
|
|
|
|
|
Name: 健史 ..ぴよぴよ(617ポイント)
Date: 2010/09/06(月) 17:05
No:61121
|
|
Title: Re:無題
|
|
自分なりにCSV読み込み用のクラスを作ってみたのですが
戻り値をのNSMutableArray型にしてしまうとエラーになってしまう為実装できません。
////.h
#import <UIKit/UIKit.h>
@interface csvLoad : NSObject {
}
-(void)Load:(NSString*)path;
@end
/////.m
#import "csvLoad.h"
@implementation csvLoad
-(void)Load:(NSString*)path{
NSError* error = nil;
int enc = NSUTF8StringEncoding;
NSString* text = [NSString stringWithContentsOfFile:path encoding:enc error:&error];
// ファイルの分割
NSArray* lines = [text componentsSeparatedByString:@"\n"];
NSMutableArray* items;
items = [[NSMutableArray alloc] init];
for(int i=0; i<[lines count]; i++){
[items addObject:[[lines objectAtIndex:i] componentsSeparatedByString:@","]];
}
}
@end
質問ばかりで申し訳ないです・・・。
321ポイント を手に入れた。
|
|
|
|
|
Name: 健史 ..ぴよぴよ(83ポイント)
Date: 2010/09/07(火) 00:25
No:61170
|
|
Title: Re:無題
|
|
-(void)Load:(NSString*)path;
を
-(NSMutableArray)Load:(NSString*)path;
と書いてしまうと
キャンノットパーマネントとでてしまいます。
書き方が悪いのでしょうか?
83ポイント を手に入れた。
|
|
|
|
|
Name: 健史 ..ぴよぴよ(935ポイント)
Date: 2010/09/08(水) 03:50
No:61255
|
|
Title: Re:無題
|
|
回答ありがとうございます。
そのように変更したら問題なく動きました・・・。
ありがとうございます。
>>今のファイル構成で考えるなら、設計的には itemsを(csvから読み込んで)生成するクラスを新規で作って
それを testAppDelegateのメンバとしてオブジェクトを作った後、RootViewControllerに引き渡せばいいかと。
アドバイスを頂いた上記のように作ってみようと思っております。
何とかRootViewControllerに値を渡す専用の関数を作ってみました。
testAppDelegateを編集したいのですが
・どのようにオブジェクトを作るのか
・Rootへの引き渡し方
がわかりません。
何度も質問ばかりで申し訳ないです。
クラスを理解しろと言われそうな質問で申し訳ないです。
クラスについては簡単なゲーム関連なら実装できる程度しか理解しておりません。
318ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(575,896ポイント)
Date: 2010/09/09(木) 01:50
No:61324
|
|
Title: Re:無題
|
|
結局、タブ周りの設計はどうしたんでしょう?
>何とかRootViewControllerに値を渡す専用の関数を作ってみました。
csvLoadの Loadメソッドで allocした itemsはどこで解放していますか?
RootViewController側の itemSetも問題があります。
今のコードですと itemsが既にセットされていた場合、下記のように itemsを解放しておかないと
リークします。
-(void)itemSet:(NSMutableArray*)srcItems
{
if(items == srcItems)
return;
[items release];
items = [srcItems copy]
}
>どのようにオブジェクトを作るのか
??
普通は alloc / initを呼んで作ります。
例えば今の csvLoadなら
csvLoad *csv = [[csvLoad alloc] init];
とか
rootViewController = [[[RootViewController alloc] init];
とか。
他にもクラスメソッドによる autorelease付きの生成方法もあったりしますので、そのあたりは
解説本などを参考にして下さい。
>Rootへの引き渡し方
その為に itemSetを作ったんですよね?
[rootViewController itemSet: xxxx];
です。
480ポイント を手に入れた。
|
|
|
|
|
Name: 健史
Date: 2010/09/13(月) 11:34
No:608731284345254
| 解決!
|
Title: Re:無題
|
|
過去ログに入ってしまった為、別スレにて質問させて下さい。
Justy様、たかぎ様ありがとうございました。
|
|
|
|
Name: どどんぱち ..かけだし(1,869ポイント)
Date: 2010/09/08(水) 00:10
No:61244
|
|
Title: NSURLConnectionに関する質問
|
|
お世話になっております。
Objective-C / iPhone
NSURLConnectionの通信に関して質問です。
http://www.saturn.dti.ne.jp/~npaka/iphone/HttpEx/index.html
こちらのサンプルを参考に、NSDataとして画像等のバイナリデータ
をDLする動作実装を行ったのですが、
ファイルが存在しない場合でも、Not Foundのhtmlページの内容を
取得してしまう為、「データ受信失敗時に呼ばれる」関数が呼ばれず、
エラーチェックが、うまくいきません。
このような場合、ファイルの存在確認は別の方法で行うのでしょうか?。
//GETによるHTTP通信
- (void)http2data:(NSString*)url delegate:(id)delegate {
NSURLRequest* request=[NSURLRequest
requestWithURL:[NSURL URLWithString:url]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:30.0];
[NSURLConnection connectionWithRequest:request
delegate:delegate];
//インジケーターのアニメーションの開始
[_indicator startAnimating];
}
//データ受信開始時に呼ばれる
- (void)connection:(NSURLConnection*)connection
didReceiveResponse:(NSURLResponse*)response {
if (_data!=nil) [_data release];
_data=[[NSMutableData data] retain];
}
//データ受信時に呼ばれる
- (void)connection:(NSURLConnection*)connection
didReceiveData:(NSData*)data {
[_data appendData:data];
}
//データ受信失敗時に呼ばれる
- (void)connection:(NSURLConnection*)connection
didFailWithError:(NSError*)error {
}
2倍のポイントを手に入れた! 864ポイント を手に入れた。
|
|
|
|
Name: どどんぱち ..かけだし(1,829ポイント)
Date: 2010/09/09(木) 00:27
No:61322
| 解決!
|
Title: NSURLConnectionに関する質問
|
|
Justyさん。
いつもありがとうございます。
ご紹介頂いたWEBページを参考に、問題なく実装できました。
今後ともよろしくお願い致します。
40ポイント を落としてしまった。
|
|
|
|
Name: Yperia ..かけだし(1,870ポイント)
Date: 2010/09/07(火) 22:56
No:61238
|
|
Title: C++ std::string のメモリリーク?
|
|
こんにちは。
お世話になります。
特定の条件下で、std::string型の変数に長い文字列を突っ込むと、メモリリークしてしまうようです。
特定の条件下というのが自分でも分からず、何が原因なのかも分かりません。
ソースを添付しますので、どうか見てくださいませんでしょうか。
ShootingTitle.cppのGame::Shooting::CTitle::CMainクラスのstd::string型の変数が病原体です。(のように見えます。)
以下、出力された内容です。
(中略)
'thSTG.exe': 'C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.6002.18005_none_5cb72f96088b0de0\comctl32.dll' を読み込みました
Detected memory leaks!
Dumping objects ->
{60} normal block at 0x01CC3EC0, 48 bytes long.
Data: <aaaaaaaaaaaaaaaa> 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
Object dump complete.
プログラム '[6348] thSTG.exe: ネイティブ' はコード 0 (0x0) で終了しました。
(中略)
よろしくお願いします。
250ポイント を手に入れた。
|
|
|
|
Name: Yperia ..かけだし(1,886ポイント)
Date: 2010/09/08(水) 22:54
No:61318
| 解決!
|
Title: Re:C++ std::string のメモリリーク?
|
|
あぁ……確かに……っ!
もやもやがすっきりしました。
ありがとうございます!
16ポイント を手に入れた。
|
|
|
|
Name: blue ..かけだし(1,668ポイント)
Date: 2010/09/05(日) 21:07
No:61047
|
|
Title: 無題
|
|
立命館の前期の課題を復習してみるとわからなかったのでおしえてください。
重要課題 11..2
3色の縦長長方形がならんでできた国旗は世界に多くある。配列を使って、これらを RitsPenで描こう。CreatePEN()関数の引数はflagとする。
以下のように国番号を決める。
0:ギニア 1:コートジボワール 2:チャド 3:ナイジェリア 4:マリ
5:アイルランド 6:イタリア 7:フランス 8:ベルギー 9:ルーマニア
同じ順序で、それぞれの国旗を図11.1に示す。
図 11.1: 国旗
10行3列のint型2次元配列 flagsを考える。 各行は3つのint型の要素をもつので、それらで国旗の3色を表現する。 これを上記の番号にしたがって10行ならべたものが、 国旗のリストを示す配列である。まずは、flagsを設定する関数を作れ。 色を表す番号は RitsPenのChangeColor()関数での定義と同じとする。
ただし、このChangeColor()関数では白は定義されていないので、 今回は灰色で代用してもよい。
指定された色で縦長の長方形を描画する関数を作る。 ペンを上下に動かせば指定された色で長方形を塗りつぶせる。 国旗の高さを50とすると、
幅1のペンで下向きに50だけ、描線する。
幅1だけ、右に動かす。
幅1のペンで上向きに50だけ、描線する。
幅1だけ、右に動かす。
この動作を12回程度繰り返すと、長方形が描ける。RitsPenでは、 ペンの動作がわかりやすいように、意図的にペンの動きをゆっくりにしている。 これを高速化するには関数 ChangeSpeed()を第2引数を1にして呼べばよい。
もし白色を使うのであれば、ペンを透明にし、上記と同じことをすると RitsPenのキャンバスが白色だから白色を塗った場合と同じ効果が期待で きる。
2次元配列 flags の1つの行が与えられたときに、 その行に指定された3つの色にしたがって、国旗を描画する関数を作る。 指定された色で縦長の長方形を描画する関数を3回呼べばよい。
main関数では、まず、ユーザから国の番号を指定してもらう。 指定された番号に相当する2次元配列 flags の行を引数にして、 国旗を描画する関数をよぶ。
% ./flag
0から9までの整数で国を指定して下さい: 6
イタリア 緑,白,赤
% ./flag
0から9までの整数で国を指定して下さい: 10
間違った国番号です。
%
という問題で、下が自分が作ったソースです。
#include<stdio.h>
#include "RitsPen.h"
# define BUFFER_SIZE (256)
int get_int(void)
{
char buf[BUFFER_SIZE];
fgets(buf, BUFFER_SIZE, stdin);
return atoi(buf);
}
int flags(PEN pen,int color);
int main(void){
PEN pen;
int number;
pen=CreatePEN("flags");
ChangeSpeed(pen,1);
printf("0から9までの整数で国を指定してください");
number = get_int();
switch(number)
{
case 0:
printf(" ギニア 赤、黄、緑");
flags(pen,1);
flags(pen,6);
flags(pen,3);
case 1:
printf("コートジボワール オレンジ、白、緑 ");
flags(pen,4);
flags(pen,7);
flags(pen,3);
case 2:
printf("チャド 青、黄、赤 ");
flags(pen,2);
flags(pen,6);
flags(pen,1);
case 3:
printf("ナイジェリア 緑、白、緑 ");
flags(pen,3);
flags(pen,7);
flags(pen,3);
case 4:
printf("マリ 緑、黄、赤 ");
flags(pen,3);
flags(pen,6);
flags(pen,1);
case 5:
printf("アイルランド 緑、白、オレンジ ");
flags(pen,3);
flags(pen,7);
flags(pen,4);
case 6:
printf("イタリア 緑、白、赤 ");
flags(pen,3);
flags(pen,7);
flags(pen,1);
case 7:
printf("フランス 青、白、赤 ");
flags(pen,2);
flags(pen,7);
flags(pen,1);
case 8:
printf("ベルギー 黒、黄、赤 ");
flags(pen,0);
flags(pen,6);
flags(pen,1);
case 9:
printf("ルーマニア 青、黄、赤 ");
flags(pen,2);
flags(pen,6);
flags(pen,1);
ClosePEN pen;
return 0;
}
int flags(PEN pen,int color){
int i;
ChangeColor(pen,one);
for(i=0;i<12;i++){
UsePEN(pen,50,90);
UsePEN(pen,1,-90);
UsePEN(pen,50,-90);
ChangeWidth(pen,0);
UsePEN(pen,1,-90);
}
return color;
}
19行目がエラーになるのですが何が間違っているのかわかりません
わかる方おしえてください。
1,668ポイント を手に入れた。
|
|
|
|
Name: たいちう ..ハッカー(103,214ポイント)
Date: 2010/09/05(日) 23:14
No:61066
|
|
Title: Re:無題
|
|
19行目は、これですか?
> ChangeSpeed(pen,1);
行番号やエラーメッセージを教えてくれないと行の特定すらままなりません。
さらに、"RitsPen.h"というのは、多分授業で用意されているヘッダーファイルでしょう。
ここにChangeSpeedの定義があるのでしょうから、授業を知らない人には、
どんなエラーか分かりません。
ヘッダーファイルを添付することで、回答できる人が増えるかもしれません。
その他、switch文にbreakがなかったり、{}(括弧)が対応していなかったりと、
色々ミスが多そうです。
207ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..中級者(9,259ポイント)
Date: 2010/09/05(日) 23:21
No:61067
|
|
Title: Re:無題
|
|
>10行3列のint型2次元配列 flagsを考える。
この定義はどこにあるんですか?
36ポイント を手に入れた。
|
|
|
|
|
Name: a ..初心者(6,574ポイント)
Date: 2010/09/07(火) 23:02
No:61239
|
|
Title: Re:
|
|
上のフロッピーみないなのを押すとファイルがダウンロードできませんか?
31ポイント を手に入れた。
|
|
|
|
|
Name: a ..初心者(6,878ポイント)
Date: 2010/09/08(水) 11:24
No:61261
|
|
Title: Re:
|
|
上のフロッピーの画像を押せば実行するのに必要なフォルダがダウンロードができます。
やり方は、作ったC言語のソースファイルをritspen/workspaceに入れる。
コンパイルは gcc -o (実行ファイル名)(作ったC言語のファイル名) RitsPen.o と入力する。
新しく端末を開いて
cd ritspen
./canvas.sh
と入力してcanvasを立ち上げる。
実行ファイルを実行させる。
何かわかりましたら教えてください。お願いします
2倍のポイントを手に入れた! 304ポイント を手に入れた。
|
|
|
|
|
Name: fatens ..上級者(18,140ポイント)
Date: 2010/09/08(水) 12:03
No:61262
|
|
Title: Re:
|
|
ClosePEN pen; → ClosePEN(pen);
ChangeColor(pen,one); → ChangeColor(pen,color);
for(i=0;i<12;i++){
UsePEN(pen,50,90);
UsePEN(pen,1,-90);
UsePEN(pen,50,-90);
ChangeWidth(pen,0); → 不要
UsePEN(pen,1,-90); → UsePEN(pen,1,90);
}
あとはbreakを入れて、{}の対応を正しくすることで、動くと思います。
ただ、初級者さんも指摘されているように、このままでは題意を満たしていないので
さらに修正していく必要があるかと思います。

165ポイント を手に入れた。
|
|
|
|
|
Name: blue ..入門者(2,699ポイント)
Date: 2010/09/08(水) 13:15
No:61269
|
|
Title: Re:
|
|
書き換えました。
コンパイルすると50行目に警告がでて戻り型がvoidの関数で、'return'に値があります
と表示されます。どう直せばよいでしょうか?
#include<stdio.h>
#include "RitsPen.h"
# define BUFFER_SIZE (256)
int get_int(void)
{
char buf[BUFFER_SIZE];
fgets(buf, BUFFER_SIZE, stdin);
return atoi(buf);
}
void flags(int a[]){
PEN pen;
pen = CreatePEN("flags");
int x,y,z;
for(x=0;x<12;x++){
ChangeColor(pen,a[0] );
UsePEN(pen,50,90);
UsePEN(pen,1,-90);
UsePEN(pen,50,-90);
ChangeWidth(pen,0);
UsePEN(pen,1,-90);
}
for(y=0;y<12;y++){
ChangeColor(pen,a[1] );
UsePEN(pen,50,90);
UsePEN(pen,1,-90);
UsePEN(pen,50,-90);
UsePEN(pen,1,90);
}
for(z=0;z<12;z++){
ChangeColor(pen,a[2] );
UsePEN(pen,50,90);
UsePEN(pen,1,-90);
UsePEN(pen,50,-90);
ChangeWidth(pen,0);
UsePEN(pen,1,-90);
}
ClosePEN(pen);
return a;
}
int main(void){
PEN pen;
int number;
printf("0から9までの整数で国を指定してください");
number = get_int();
int a[10][3]={
{1,6,3},
{6,7,3},
{2,6,1},
{3,7,3},
{3,6,1},
{3,7,6},
{3,7,1},
{2,7,1},
{0,6,1},
{2,6,1},
};
switch(number)
{
case 0:
printf(" ギニア 赤、黄、緑\n");
/* flags(pen,1);
flags(pen,6);
flags(pen,3);*/
break;
case 1:
printf("コートジボワール オレンジ、白、緑 \n");
/*flags(pen,4);
flags(pen,7);
flags(pen,3);*/
break;
case 2:
printf("チャド 青、黄、赤 \n");
/*flags(pen,2);
flags(pen,6);
flags(pen,1);*/
break;
case 3:
printf("ナイジェリア 緑、白、緑\n ");
/*flags(pen,3);
flags(pen,7);
flags(pen,3);*/
break;
case 4:
printf("マリ 緑、黄、赤\n ");
/*flags(pen,3);
flags(pen,6);
flags(pen,1);*/
break;
case 5:
printf("アイルランド 緑、白、オレンジ\n ");
/*flags(pen,3);
flags(pen,7);
flags(pen,4);*/
break;
case 6:
printf("イタリア 緑、白、赤 \n");
/* flags(pen,3);
flags(pen,7);
flags(pen,1);*/
break;
case 7:
printf("フランス 青、白、赤 \n");
/* flags(pen,2);
flags(pen,7);
flags(pen,1);*/
break;
case 8:
printf("ベルギー 黒、黄、赤 \n");
/*flags(pen,0);
flags(pen,6);
flags(pen,1);*/
break;
case 9:
printf("ルーマニア 青、黄、赤 \n");
/*flags(pen,2);
flags(pen,6);
flags(pen,1);*/
break;
default:
printf("間違った入力");
break;
}
flags( a[number]);
return 0;
}
1,005ポイント を手に入れた。
|
|
|
|
|
Name: blue ..入門者(2,732ポイント)
Date: 2010/09/08(水) 13:44
No:61271
|
|
Title: Re:
|
|
できましたが、10以上の数字を入力すると描写はやめてほしいのに国旗が描写されてしまいます。
どこを直せばよいと思いますか?
33ポイント を手に入れた。
|
|
|
|
Name: シエル [URL] ..比類無きプログラマー(70,660ポイント)
Date: 2010/09/08(水) 18:32
No:61290
|
|
Title: 【DirectXプログラミング】ステンシルバッファについて
|
|
いつもお世話になっております。シエルです。
今回はDirectXのステンシルバッファについて、質問があります。
質問@
ステンシル値の比較関数(D3DCMP_LESSなど)を使って、ステンシルバッファ値とステンシル参照値を比較しますが
その場合どちら値が左辺になるのでしょうか。
質問A
ステンシルバッファに書き込まれるステンシルバッファ値の形についてなのですが、
これはポリゴンの形でしか書き込めないのでしょうか?
例えばある複雑な画像の背景色を透過させた画像を用意し、その画像をステンシルバッファに
描画して、そのまま複雑な画像の形のマスクをつくることはできないのでしょうか?
一度試してみましたが、そのポリゴンの形でしかマスクされませんでした。
もし、出来ないのであれば何か他の方法はありますでしょうか?
質問B
z座標をゼロにした頂点変換済み座標を使って背景を描画し、ステンシルバッファを使って
マスキングすると、その形にうまくマスクされるのですが、背景を自分が作った
3Dスクロール背景にすると、背景の画像にノイズが入ってしまったようになります。
原因としては何が考えられるでしょうか?
こいつは一応画像貼っておきます。
以上になります。ご教授のほど、よろしくお願い致します。
557ポイント を手に入れた。
|
|
|
|
Name: シエル [URL] ..比類無きプログラマー(70,842ポイント)
Date: 2010/09/08(水) 22:14
No:61310
|
|
Title: Re:【DirectXプログラミング】ステンシルバッファについて
|
|
すいません。質問Aの件については、画像の通りうまくいきました。
質問Bの件についても、アルファテストを使ったらなぜか、ノイズっぽい描画に
ならずにすみました。
質問@についてのみ、回答お願いします。
(もしかするとこれも解決するかもしれませんが^^;)
120ポイント を手に入れた。
|
|
|
|
Name: ynhrt ..ぴよぴよ(58ポイント)
Date: 2010/09/08(水) 17:24
No:61285
|
|
Title: アイコンの変更方法について
|
|
MicrosoftのVisual C++ 2010 Express Edition を使っています。
早速アイコンの変更方法について聞きたいのですが、DXライブラリのHPにも載ってたのですが、2008用のが載っていなくてやり方がわかりません。
そのことについてわかる方お願いします。
58ポイント を手に入れた。
|
|
|
Name: ゼノブレードクリア目前 ..ぴよぴよ(195ポイント)
Date: 2010/09/04(土) 11:30
No:60935
|
|
Title: メンバ変数の保護(隠ぺい)について
|
|
以下のようなクラスを設計し、
ヘッダと.cppをコンパイルしたオブジェクトファイルを
提供するとします。
---- XXX.h ----
class XXX
{
public:
void SetValue( int value );
int GetValue( void );
prvate:
int m_Value;
}
---- XXX.cpp ----
void XXX::SetValue( int value )
{
if ( value > 0) m_Value = value;
}
int XXX::GetValue( void )
{
return m_Value;
}
m_Value をprivateにしているのは
必ずメンバ関数を使ってほしいからです。
しかし、悪意をもったユーザーであれば
XXX.h の private を public に書き換えて
m_Value を直接扱うことができてしまうようです。
m_Valueの直接編集を防ぐ良い方法はないでしょうか?
(XXX.h は公開情報、XXX.cpp は非公開情報)
195ポイント を手に入れた。
|
|
|
|
Name: たかぎ [URL] ..ハッカー(222,998ポイント)
Date: 2010/09/04(土) 12:17
No:60936
|
|
Title: Re:メンバ変数の保護(隠ぺい)について
|
|
> 悪意をもったユーザーであれば
このユーザーというのはプログラマのことですね?
だとすると、確実に直接編集を防ぐ方法は、ハード的にメモリアクセスを抑制するしかありません。
--- XXX.h ---
struct XXX;
void SetValue(XXX*, int);
int GetValue(const XXX*);
XXX* Create();
void Destroy(XXX*);
--- XXX.cpp ---
struct XXX
{
int value;
};
void SetValue(XXX* p, int value)
{
p->value = value;
}
int GetValue(const XXX* p)
{
return p->value;
}
XXX* Create()
{
return new XXX();
}
void Destroy(XXX* p)
{
delete p;
}
上のようにすれば多少はましですが、
XXX* p = &xxx;
*reinterpret_cast<int*>(p);
のようにすれば、悪意を持ったプログラマなら簡単に中身にアクセスできてしまいます。
あるいは、
--- XXX.cpp ---
#include <map>
struct XXX {};
namespace {
std::map<XXX, int> m;
}
XXX* Create()
{
XXX* p = new XXX;
m[p] = 0;
return p;
}
void SetValue(XXX* p, int value)
{
m[p] = value;
}
// 以下、省略
のようにすれば、直接編集はかなり困難になりますが、悪意と根性をもったプログラマならセクセスできてしまうでしょう。
320ポイント を手に入れた。
|
|
|
|
|
Name: ゼノブレードクリア目前 ..ぴよぴよ(423ポイント)
Date: 2010/09/05(日) 19:32
No:61041
|
|
Title: Re:メンバ変数の保護(隠ぺい)について
|
|
ご回答ありがとうございます。
>このユーザーというのはプログラマのことですね?
はい。
他人に提供するコードなので、
new などの動的メモリ確保はできれば避けたいです。
ヘッダを書き換えると動かなくなると一番良かったのですが・・
2倍のポイントを手に入れた! 228ポイント を手に入れた。
|
|
|
|
|
Name: うしお ..ぴよぴよ(420ポイント)
Date: 2010/09/06(月) 04:51
No:61083
|
|
Title: Re:メンバ変数の保護(隠ぺい)について
|
|
はじめまして、
privateメンバの隠蔽には
1、PImpl イディオム(pointer to implementation idiom)と呼ばれる方法や、
2、インターフェースを用いる方法があります
前者1、は
//XXX_Impl.h
class XXX_Impl
{
public:
void SetValue( int value );
int GetValue( void );
prvate:
int m_Value;
}
//XXX_Impl.cpp
void XXX_Impl::SetValue( int value )
{
if ( value > 0) m_Value = value;
}
int XXX_Impl::GetValue( void )
{
return m_Value;
}
これのほかにもうひとつクラスを用意します
//XXX.h
class XXX_Impl;//宣言のみ
class XXX
{
public:
XXX();
~XXX();
void SetValue( int value );
int GetValue( void );
prvate:
XXX_Impl* pImpl;
}
//XXX.cpp
#include "XXX_Impl.h"
XXX::XXX(){
pImpl = new XXX_Impl();
}
XXX::~XXX(){
delete pImpl;
pImpl = 0;
}
XXX::SetValue( int value ){
pImpl->SetValue(value);//呼び出すだけ
}
int XXX::GetValue( void ){
return pImpl->GetValue();
}
こうしておけば、使い側は、XXXのヘッダのみを見てクラスを使うことが可能となり、
より実装を隠蔽できます
たとえば、
#include "XXX.h"
int main(){
XXX TextX;
TextX.SetValue(30);
TextX.GetValue();
return 0;
}
この場合、XXX_Implのint m_Value;は影も形もありません
省略してしまいましたが、
XXX(const XXX&);とoperator=(const XXX&);
をprivateにしてコピーコンストラクタを禁止にするなどして、
動的に確保したメモリのアクセス違反などを避ける工夫が必要となる場合も
あるので少し注意が必要です。
また、XXX_Implのメソッドをすべてinlineにすればオーバーヘッドを軽減することもできます
2は分けて投稿します
420ポイント を手に入れた。
|
|
|
|
|
Name: うしお ..ぴよぴよ(576ポイント)
Date: 2010/09/06(月) 05:24
No:61084
|
|
Title: Re:メンバ変数の保護(隠ぺい)について
|
|
2、インターフェースを用いる方法
こちらは継承を利用する方法です
最初に抽象インターフェースを用意します
//XXX.h
class XXX{
public:
virtual ~XXX(){}//deleteのときのnewとの整合性を保つ
static XXX* Create();//裏でnewするメソッド
virtual void SetValue( int value ) = 0;//純仮想関数
virtual int GetValue( void ) = 0;
};
次にXXXを派生させてそれぞれのメソッドを実装します
//XXX_Derived.h
#include "XXX.h"
class XXX_Derived : public XXX
{
public:
XXX_Derived():m_Value(0){
}
~XXX_Derived(){}
void SetValue( int value ){
if ( value > 0) m_Value = value;
}
int GetValue( void ){
return Value;
}
private:
int m_Value;
}
Createスタティックメソッドを実装します
//XXX.cpp
#include "XXX_Derived.h"
XXX* XXX::Create(){
return new XXX_Derived();
}
このようにすることで、
XXXを使う側はXXX.hを見るだけで使えるのでprivateメンバを隠蔽できます
たとえば、
#include "XXX.h"
int main(){
XXX* p = XXX::Create();
p->SetValue(30);//実行時ポリモーフィズムという機能で実態に応じた処理がなされる
p->GetValue();
delete p;//忘れないように注意
p = 0;
return 0;
}
こちらの方法でもm_Valueはどこにも見当たらないにもかかわらず、クラスを使うことができます
こちらも実装方法がいくつもあるので状況&好みで使い分けると良いでしょう。
2つの方法どちらでも、
・privateメンバを隠蔽する
・使うときに余計な情報を知らなくてすむ
・コンパイル依存性を減らせる
等メリットが得られます
しかし、
・メソッドのインターフェース修正に弱い(修正箇所が多いため)
・ファイルが増える
・若干めんどくさい
・若干のオーバーヘッドがある
などのデメリットもあるために、
1、独立した機能を持つクラスである
2、メソッドに変更はあまりない
というクラスにのみ適用すべきであることがわかります
ライブラリなどには比較的親和性がいいと思います
適材適所だと思います
どれも当てはめればいいというわけではなく、単にprivateのほうが柔軟に対応できる場合も
多いと思うので、乱用には注意すると良いと思います。
蛇足ですが、
deleteを忘れないために、
shared_ptrやunique_ptrなどのスマートポインタテンプレートクラスを利用すると
メモリリークのリスクを減らすことが可能です
※ザックリ書いたので、ソースに;がなかったり足りない部分もあるので、
あくまでも考え方として読んでいただければと思います
156ポイント を手に入れた。
|
|
|
|
|
Name: ゼノブレードクリア目前で飽き気味 ..ぴよぴよ(198ポイント)
Date: 2010/09/08(水) 22:16
No:61311
| 解決!
|
Title: Re:メンバ変数の保護(隠ぺい)について
|
|
皆さんアドバイスありがとうございました。
私が携わっている組み込み系ハード用OSの文化として
ライブラリが動的メモリ確保を行うことはあまり
好まれない傾向にあります。
そのため教えていただいた方法は
採用できませんでしたが一般論としてとても勉強になりました。
今回は、メンバ変数が悪意をもって任意に書き換えられるのは
防げないものとして、そのメンバ変数を扱うメンバ関数において
使用前に不正チェックを行うことにしました。ダサいですけど・・
ありがとうございました。
198ポイント を手に入れた。
|
|
|
|
Name: 疲れた ..ぴよぴよ(122ポイント)
Date: 2010/09/08(水) 20:24
No:61296
|
|
Title: 龍神録のexeファイルを・・・
|
|
exeファイルをMicrosoft Visual C++で作成したいのですがどうやればいいのですか?
教えて下さい!
34ポイント を手に入れた。
|
|
|
Name: 南瓜 ..上級者(18,921ポイント)
Date: 2010/09/08(水) 13:07
No:61267
|
|
Title: DXライブラリの設定で
|
|
いつもお世話になってます。南瓜です
一通り、ゲームプログラミング館の内容が終わり、後回しにしていた
DXライブラリの設定をしてたんですが、順に設定して最後の
#include "DxLib.h"
// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1 ; // エラーが起きたら直ちに終了
}
DrawPixel( 320 , 240 , 0xffff ) ; // 点を打つ
WaitKey() ; // キー入力待ち
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
のプログラムを実行しようとした所
fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりした。
'#include "stdafx.h"' をソースに追加しましたか?
と表示され、実行できません。
他にもソース、ヘッダーやリソースファイルが勝手に作成されていて
ヘッダーファイルのところにstdfx.hがあるのに上記の説明がでます。
設定しないままのときは、ゲームプログラミング館の説明通りにうまくいったのですが
DXライブラリの設定する際、どこか間違っていたのでしょうか?
352ポイント を手に入れた。
|
|
|
|
Name: 南瓜 ..上級者(18,995ポイント)
Date: 2010/09/08(水) 19:15
No:61294
|
|
Title: Re:DXライブラリの設定で
|
|
なんという初歩的なミスorz
ありがとうございます
あと画像を表示する際、640 × 480以上の画像なら
640 × 480の大きさにリサイズしてLoadGraphScreenで読み込ませるか
まだ試していないのですがDrawExtendGraph(でいいのかな?)を使って
調節すればいいのでしょうか?
74ポイント を手に入れた。
|
|
|
|
Name: 疲れた ..ぴよぴよ(73ポイント)
Date: 2010/09/08(水) 18:31
No:61289
|
|
Title: DxLib_d.libが開くことができません
|
|
エラーにDxLib_d.libが開けませんと出てしまって何もできなくなってしまったのですがどうすればいいでしょうか?
53ポイント を手に入れた。
|
|
|
|
Name: 疲れた ..ぴよぴよ(88ポイント)
Date: 2010/09/08(水) 18:59
No:61293
| 解決!
|
Title: Re:DxLib_d.libが開くことができません
|
|
サイトを見たらちゃんとビルドに成功しました!
ありがとうございます!
15ポイント を手に入れた。
|
|
|
|
Name: 化猫 ..かけだし(1,204ポイント)
Date: 2010/09/08(水) 15:28
No:61274
|
|
Title: ミシャグジさま弾幕をボスも使えるようにしたい
|
|
初めまして
龍神録プログラミングの館の16章「ミシャグジさま弾幕を作ってみよう」で作った弾幕を
ボスも扱えるようにしようと、boss_shotH.cppに同じ内容を書き、そこから変数(?)などを書き換えて、
void boss_shot_bulletH039()
{
int t=boss_shot.cnt;
int k=1;
if(t<1000 && t%200==0){
double angle=rang(PI);
for(int j=0;j<2;j++){//途中から2分裂する分
for(int i=0;i<60;i++){//一度に60個
if(boss_shot.bullet[k].flag!=2 && (k=search_boss_shot())!=-1){
boss_shot.bullet[k].knd =8;//8番の弾
boss_shot.bullet[k].angle =angle+PI2/60*i;//円形60個
boss_shot.bullet[k].flag =1;
boss_shot.bullet[k].x =boss.x;
boss_shot.bullet[k].y =boss.y;
boss_shot.bullet[k].col =4;//4番の色
boss_shot.bullet[k].cnt =0;
boss_shot.bullet[k].state =j;//ステータス。0か1かで回転がかわる
boss_shot.bullet[k].spd =2;
if(j==1){
boss_shot.bullet[k].col =0;//見やすくするため
}
}
}
}
se_flag[0]=1;//発射音鳴らす
}
for(int i=0;i<SHOT_BULLET_MAX;i++){//全弾分
if(boss_shot.bullet[k].flag>0){//登録されている弾があれば
int state=boss_shot.bullet[i].state;
int cnt=boss_shot.bullet[i].cnt;
if(30<cnt && cnt<120){//30〜120カウントなら
boss_shot.bullet[i].spd-=1.2/90.0;//90カウントかけて1.2減らす
boss_shot.bullet[i].angle+=(PI/2)/90.0*(state?-1:1);//90カウントかけて90°傾ける
}
}
}
}
見やすくするために色を変えていたり、多少違います
これで実行してみると、後から発射された弾が、先に発射された弾を追い越してしまいます。
その弾は
・角度が変わるまで時間が掛かる。(追い越した後に角度が変わりだす)
・スピードが速い(追い越した後、角度が変わると共にスピードが落ちだす)
・このように動きが違う弾はランダムに飛んでくる。(10回中2回の時もあれば、1回の時もありました)
ここから考えて、恐らく
if(30<cnt && cnt<120){
ここに当てはまらないため、しばらくの間、スピードも落ちなければ、角度も変わらないのだと思いました。
今したいことは、追い越すような事をなくしたいということです。
どのように書き換えればいいのでしょうか?
分かりにくい場所がありましたら、指摘お願いします。
Cの知識は、初心者レベルです。
ご教授宜しくお願いします。 
1,204ポイント を手に入れた。
|
|
|
|
Name: Tatu ..熟練のプログラマー(43,874ポイント)
Date: 2010/09/08(水) 16:33
No:61282
|
|
Title: Re:ミシャグジさま弾幕をボスも使えるようにしたい
|
|
if(boss_shot.bullet[k].flag>0){//登録されている弾があれば
で添え字がiではなく、kとなっているのが原因だと思います。
44ポイント を手に入れた。
|
|
|
|
|
Name: 化猫 ..かけだし(1,223ポイント)
Date: 2010/09/08(水) 17:43
No:61287
| 解決!
|
Title: Re:ミシャグジさま弾幕をボスも使えるようにしたい
|
|
直したところ、無事思ったように動作しました。
ありがとうございました。
19ポイント を手に入れた。
|
|
|
|
Name: ガム ..ぴよぴよ(125ポイント)
Date: 2010/09/08(水) 14:32
No:61272
|
|
Title: 宣言の仕方
|
|
第5章の「宣言の仕方を工夫しよう」をやっていたのですが、「main.cppから呼ばれた時は
宣言しないといけないからexternを付けたくありません」の一文を見て疑問に思ったのですが
なぜmain.cppではextern付けたくないのかイマイチ分かりません。
宜しければどなたか教えてください。 よろしくお願いします
125ポイント を手に入れた。
|
|
|
|
Name: toyo ..熟練のプログラマー(58,562ポイント)
Date: 2010/09/08(水) 14:48
No:61273
|
|
Title: Re:宣言の仕方
|
|
複数のファイルで同じ大域変数を使う場合どこか1ヶ所のみexternなしの宣言が必要で他のすべてのファイルでexternが必要になります
externなしを宣言するのはmain.cppじゃなくて他のファイルでもいいのですがエントリポイント(WinMain関数)のあるmain.cppでexternなしをまとめて宣言するのがわかりやすいと言うことでしょう
2倍のポイントを手に入れた! 168ポイント を手に入れた。
|
|
|
|
|
Name: ガム ..ぴよぴよ(149ポイント)
Date: 2010/09/08(水) 16:31
No:61281
| 解決!
|
Title: Re:宣言の仕方
|
|
なるほど、よく分かりました。
ありがとうございました
24ポイント を手に入れた。
|
|
|
|
Name: ダック ..ぴよぴよ(919ポイント)
Date: 2010/09/07(火) 15:00
No:61213
|
|
Title: 偏微分方程式の差分解法・周期境界条件について
|
|
初めまして。大学の課題で行き詰まったので、投稿させていただきました。
課題の内容は、∂u/∂t = ∂^2u/∂x^2 + u(1-u)(u-a)
という偏微分方程式を差分法で解くというものです。
初期条件は u(x,0) = 0.1
周期境界条件は u(0,t) = u(l,t),(∂u/∂x)(0,t) = (∂u/∂x)(l,t) (0≦x≦l)
0≦a≦1.0
となっています。
場合分けをしたりして考えているのですが、結果は全ての位置で値が同じ状態になったりしてうまくいきません。
正解?というか正しくできた場合は時間が経つにつれて波が発生するようなグラフができあがるらしいです。
以下にソースを載せます。本来はgnuplotに出力もしているのですが、その部分は省略しました。
#include <stdio.h>
#include <stdlib.h>
#define N 100
#define M 100
#define a 0.5
#define t 0
#define DT 0.00001 /* delta t*/
#define DX 0.01 /* delta x*/
int main( void )
{
/* θu/θt = θ^2u/θx^2+u(1-u) */
int i,j;
double u[M+1][N+1]; /* u(x,t) */
double x[M];
/* 初期条件 */
for(i=0; i<=M; i++)
u[i][0] = 0.1;
/* integ. */
for(j=0; j<=N-1; j++){
i=0;
u[i][j+1]=(u[M][j])+(DT/(DX*DX))*(u[i+1][j]-2*u[M][j]+u[M-1][j])+DT*(u[M][j])*(1-u[M][j])*(u[M][j]-a);
for(i=1; i<=M-2; i++){
u[i][j+1]=(u[i][j])+(DT/(DX*DX))*(u[i+1][j]-2*u[i][j]+u[i-1][j])+DT*(u[i][j])*(1-u[i][j])*(u[i][j]-a);
}
i=M-1;
u[i][j+1]=(u[i][j])+(DT/(DX*DX))*(u[0][j]-2*u[i][j]+u[i-1][j])+DT*(u[i][j])*(1-u[i][j])*(u[i][j]-a);
u[M][j+1]=u[0][j+1];
}
}
コンパイルなどは問題なく行えているので、純粋に式の組み立て方だと思うのですが…
Cも差分法もほぼ初心者レベルなので、基本的な見落としがあるかもしれません。
どなたかわかる方がいらっしゃれば、教えていただければ幸いです。
質問内容に不備等ありましたら、ご指摘お願いします。
919ポイント を手に入れた。
|
|
|
|
Name: ookami ..熟練のプログラマー(51,403ポイント)
Date: 2010/09/07(火) 16:17
No:61219
|
|
Title: Re:偏微分方程式の差分解法・周期境界条件について
|
|
差分法といってもいろいろありますが、オイラー法ですよね?
例えば簡単な例で、dy/dx=yを解けと言われたら、
dy/dx=y
↓
Δy/Δx=y
↓
Δy=yΔx
↓
y(i+1)-y(i)=y(i)*Δx
↓
y(i+1)=y(i)+y(i)*Δx
という風に変形すると思いますが、
問題の∂u/∂t = ∂^2u/∂x^2 + u(1-u)(u-a) は、
どのように変形しましたか?
87ポイント を手に入れた。
|
|
|
|
|
Name: ダック ..かけだし(1,104ポイント)
Date: 2010/09/07(火) 17:13
No:61221
|
|
Title: Re:偏微分方程式の差分解法・周期境界条件について
|
|
返信ありがとうございます。
∂u/∂tは前進差分近似を用いて {u(i,j+1)-u(i,j)}/Δt
∂^2u/∂x^2は中心差分近似を用いて {u(i+1,j)-2u(i,j)+u(i-1,j)}/Δx^2
として、
∂u/∂t = ∂^2u/∂x^2 + u(1-u)(u-a)
↓
{u(i,j+1)-u(i,j)}/Δt = {u(i+1,j)-2u(i,j)+u(i-1,j)}/Δx^2+u(i,j){1-u(i,j)}{u(i,j)-a}
↓
u(i,j+1) = u(i,j)+(Δt/Δx^2){u(i+1,j)-2u(i,j)+u(i-1,j)}+u(i,j){1-u(i,j)}{u(i,j)-a}
と変形しました。
185ポイント を手に入れた。
|
|
|
|
|
Name: ookami ..熟練のプログラマー(51,579ポイント)
Date: 2010/09/07(火) 18:13
No:61224
|
|
Title: Re:偏微分方程式の差分解法・周期境界条件について
|
|
なるほど、
取り急ぎ、気づいた点から指摘させていただきます。
常に、初期値か前回値の四則演算で式を作らないといけないので、
/* integ. */
for(j=0; j<=N-1; j++){
の中の、最初の
u[i][j+1]=(u[M][j])+(DT/(DX*DX))*(u[i+1][j]-2*u[M][j]+u[M-1][j])+DT*(u[M][j])*(1-u[M][j])*(u[M][j]-a);
で、
u[i][j+1]を求めるのに、初期値でも前回値でもない u[i+1][j] などを
使っているところはまずいかと思います。
-- 追記
すいません、
正確には「初期値か前回値か前々回値か前々々回値か...」ですねw 
176ポイント を手に入れた。
|
|
|
|
|
Name: ダック ..ぴよぴよ(986ポイント)
Date: 2010/09/07(火) 18:42
No:61225
|
|
Title: Re:偏微分方程式の差分解法・周期境界条件について
|
|
返信ありがとうございます。
>u[i][j+1]を求めるのに、初期値でも前回値でもない u[i+1][j] などを
>使っているところはまずいかと思います。
納得しました。確かにまずいですね…。
その箇所の式を再度検討してみたいと思います。
ご指摘ありがとうございました。
118ポイント を落としてしまった。
|
|
|
|
|
Name: ookami ..熟練のプログラマー(51,475ポイント)
Date: 2010/09/07(火) 19:50
No:61233
|
|
Title: Re:偏微分方程式の差分解法・周期境界条件について
|
|
あれ…?
u=0.1=const. (at t=0)
∴∂^2u/∂x^2=0 (at t=0)
それぞれ元の式に代入すると
∂u/∂t = ∂^2u/∂x^2 + u(1-u)(u-a)
=0+u(1-u)(u-a)
=const. (at t=0)
すると、次のtでもu=const.になっちゃいませんか…?
すると、最初に戻って、それぞれのtでu(x)=const.に…。
問題的にそんなことはないと思うんですが…。
さっきの私の回答もなんか変な気がしてきました(°□°;) ごめんなさい。
-- 追記
イャァァァァァー
> u[i][j+1]を求めるのに、初期値でも前回値でもない u[i+1][j] などを
> 使っているところはまずいかと思います。
よっく考えたら…前回値ですね…。
すいません、余計な混乱を招いてしまいましたm(_ _)m 
104ポイント を落としてしまった。
|
|
|
|
|
Name: ダック ..かけだし(1,137ポイント)
Date: 2010/09/08(水) 00:12
No:61246
|
|
Title: Re:偏微分方程式の差分解法・周期境界条件について
|
|
返信ありがとうございます。
>すいません、余計な混乱を招いてしまいましたm(_ _)m
いやいや、自分でも気付かなかったのでお気になさらず。目を通していただいただけでも十分ありがたいくらいですので、恐縮です。
周期境界条件の実装の仕方が自信が無いので、その辺りからまた見直してみたいと思います。
151ポイント を手に入れた。
|
|
|
|
|
Name: ookami ..熟練のプログラマー(51,552ポイント)
Date: 2010/09/08(水) 07:32
No:61256
|
|
Title: Re:偏微分方程式の差分解法・周期境界条件について
|
|
どうも失礼いたしましたm(_ _)m
ところで、上の
> 次のtでもu=const.になっちゃいませんか…?
のところは、問題そのものに対する疑問なんですが、
本当に「全ての位置で値が同じ状態」になりそうな…
また私の勘違いならよいのですが…。
77ポイント を手に入れた。
|
|
|
|
|
Name: ダック ..かけだし(1,357ポイント)
Date: 2010/09/08(水) 10:58
No:61260
|
|
Title: Re:偏微分方程式の差分解法・周期境界条件について
|
|
返信ありがとうございます。
> 次のtでもu=const.になっちゃいませんか…?
仰るとおり、何度見直しても結果が「全ての位置で値が同じ状態」になるので、勘違いでない可能性は十分あると思います…。
課題として出された式そのものは間違いなく∂u/∂t = ∂^2u/∂x^2 + u(1-u)(u-a)なので、教授が出す式を間違えたといったオチだとどうしようもないですね…。もちろん見落としがあるのかもしれませんが。
今日教授に会ってくるので、その際にでも質問を含めて聞いてみたいと思います。
追記
式はそのままでいいとのことでした。初期値が0.1から0.2に、aの値が0.5から0.2に変更があった程度です。 
2倍のポイントを手に入れた! 220ポイント を手に入れた。
|
|
|
|
|