C言語何でも質問掲示板

Total hit  今日  昨日  



必ずお読み下さい → 規約と注意事項  アンケートはこちら  エラーで投稿できない方はこちら  過去ログ検索はこちら

 
   インストールについて ....   
     ・[37900] pooka 
     ・[37903] tejya 
     ・[37904] tejya 
   s2. サウンドノベル風 ....   
     ・[37901] sizuma 
     ・[37902] kamiya 
   問題の一部がわかりま ....   
     ・[37889] sizuma 
     ・[37891] misodo 
     ・[37893] sizuma 
     ・[37895] box 
     ・[37896] Hermit 
     ・[37897] misodo 
   動画の裏写り?   
     ・[37805] sizuma 
     ・[37822] asd 
     ・[37827] lbfuvab 
     ・[37828] YuO 
     ・[37829] YuO 
     ・[37836] lbfuvab 
     ・[37894] roo 
   木構造における逆ポー ....   
     ・[37892] box 
   キーボード入力につい ....   
     ・[37875] non 
     ・[37876] TKOZ 
     ・[37877] もちもち 
     ・[37878] もちもち 
     ・[37879] non 
     ・[37880] もちもち 
   STGについてその@(ス ....   
     ・[37844] 華穂 
     ・[37845] array 
     ・[37854] 華穂 
     ・[37870] ねこ 
     ・[378421251120826] 華穂 
   配列による文字列の辞 ....   
     ・[37868] non 
     ・[37869] R 
   位置によってスコアの ....   
     ・[37864] あ〜る 
   DrawBoxをグラデーショ ....   
     ・[37839] 夢夢 
     ・[37846] @ 
     ・[37850] Justy 
     ・[37853] @ 
   DrawModiGraph()関数に ....   
     ・[37851] tatelis 
     ・[37852] Justy 
   ラスボス弾発射につい ....   
     ・[37819] ねこ 
     ・[37820] 華穂 
     ・[37821] ねこ 
     ・[37831] 夢夢 
     ・[37834] 華穂 
     ・[37843] Justy 
   空間ベクトルをのばす   
     ・[37783] lbfuvab 
     ・[37786] lbfuvab 
     ・[37796] Justy 
     ・[37804] lbfuvab 
     ・[37806] sizuma 
     ・[37837] はね 
   龍神録46・47章が ....   
     ・[37832] ねこ 
     ・[37835] ラグ 
   ボスと自機の当たり判 ....   
     ・[37824] yu 
     ・[37826] kai 
   Invalidate   
     ・[37777] バグ 
     ・[37784] 研修生 
     ・[37790] バグ 
     ・[37807] 研修生 
     ・[37809] バグ 
     ・[37810] 研修生 
     ・[37811] バグ 
     ・[37812] バグ 
     ・[37814] 研修生 
     ・[37815] バグ 
     ・[37816] バグ 
     ・[37818] 研修生 
   数値計算(コンパイル ....   
     ・[37713] MNS 
     ・[37715] Eda 
     ・[37723] MNS 
     ・[37813] Eda 
   ファイル作成   
     ・[37797] sizuma 
     ・[37798] 恐 
     ・[37799] sizuma 
     ・[37800] 恐 
     ・[37801] 恐 
     ・[37802] sizuma 
     ・[37808] non 
   龍神録34章について ....   
     ・[37761] pooka 
     ・[37767] ラグ 
   シングルトンパターン ....   
     ・[37667] array 
     ・[37669] kazuoni 
     ・[37671] たかぎ 
     ・[37680] dic 
     ・[37701] YuO 
     ・[37702] Justy 
     ・[37707] dic 
     ・[37708] dic 
     ・[37718] YuO 
     ・[37764] dic 
   ルンゲ・クッタ法   
     ・[37524] box 
     ・[37526] C初心者 
     ・[37527] box 
     ・[37534] C初心者 
     ・[37535] asd 
     ・[37536] non 
     ・[37537] ねこ 
     ・[37539] non 
     ・[37544] ねこ 
     ・[37763] asd 
   ロード画面について   
     ・[37591] Justy 
     ・[37620] 素人 
     ・[37642] 素人 
     ・[37645] ねこ 
     ・[37650] Justy 
     ・[37651] 素人 
     ・[37664] 素人 
     ・[37665] Justy 
     ・[37668] 素人 
     ・[37700] Justy 
     ・[37711] 素人 
     ・[37735] Justy 
     ・[37737] Justy 
     ・[37745] 素人 
     ・[37747] ねこ 
     ・[37756] 素人 
     ・[37757] sizuma 
     ・[37759] ねこ 
     ・[37760] 素人 
   龍神録2章のKeyについ ....   
     ・[37750] ねこ 
     ・[37752] r 
   関数の扱い方に関する ....   
     ・[37740] sizuma 
     ・[37741] sizuma 
     ・[37743] toyo 
     ・[37746] sizuma 
   メンバの間接参照につ ....   
     ・[37693] box 
     ・[37721] チルチル 
     ・[37724] ねこ 
     ・[37726] チルチル 
     ・[37728] バグ 
     ・[37729] チルチル 
     ・[37730] 初級者 
     ・[37731] チルチル 
     ・[37732] チルチル 
     ・[37742] チルチル 
   メモリに関する質問   
     ・[37687] ねこ 
     ・[37689] 寺 
     ・[37717] 夢夢 
     ・[37739] 寺 
   ボス弾幕について   
     ・[37600] エル 
     ・[37601] nayo 
     ・[37604] TRUTH 
     ・[37643] yrao 
     ・[37644] nayo 
     ・[37688] yrao 
     ・[37704] Tatu 
     ・[37734] yrao 
   DrawGraphで描いた絵を ....   
     ・[37696] あ〜る 
     ・[37697] kazuoni 
     ・[37716] 夢夢 
     ・[37733] つつじ 
   STGの絵やら音楽を ....   
     ・[37605] Dixq (管理人) 
     ・[37606] yu 
     ・[37609] 御津凪 
     ・[37618] Tororo 
     ・[37628] situmon 
     ・[37662] DVDM 
     ・[37727] 藍霧OO 
   画像の指定した座標の ....   
     ・[37722] Dixq (管理人) 
     ・[37725] tatelis 
   自機特殊弾   
     ・[37710] array 
     ・[37714] 夢夢 
     ・[37719] 華穂 
   減速弾   
     ・[37694] array 
     ・[37698] 名無しa 
     ・[37709] array 
   ボスショット   
     ・[37703] 夢夢 
     ・[37705] 華穂 
   マップの作り方   
     ・[37699] kazuoni 
   色と色を掛け合わせて ....   
     ・[37648] ねこ 
     ・[37652] チルチル 
     ・[37653] はね 
     ・[37654] Justy 
     ・[37655] チルチル 
     ・[37656] 御津凪 
     ・[37657] Justy 
     ・[37659] Dixq (管理人) 
     ・[37660] はね 
     ・[37670] はね 
     ・[37674] ねこ 
     ・[37679] はね 
     ・[37686] Justy 
   敵の増加について   
     ・[37639] 華穂 
     ・[37677] 夢夢 
     ・[37685] 華穂 
   無題   
     ・[37649] ねこ 
     ・[37658] さとり 
     ・[37663] 蒼 
     ・[37683] pooka 
   プログラムの内容   
     ・[37634] non 
     ・[37635] アパッチ 
     ・[37637] non 
     ・[37640] アパッチ 
     ・[37641] non 
     ・[37661] アパッチ 
     ・[37681] sizuma 
   キーの初期化について   
     ・[37675] ねこ 
     ・[37676] kai 
     ・[37678] kai 
   Cの後に。。。   
     ・[37623] たかぎ 
     ・[37626] ねこ 
     ・[37627] kazuoni 
     ・[37631] dic 
     ・[37632] MNS 
     ・[37672] 夢夢 
   デストラクタについて ....   
     ・[37624] たかぎ 
     ・[37625] ねこ 
     ・[37629] dic 
     ・[37636] YuO 
   ちょっとレベルの高い ....   
     ・[37422] ねこ 
     ・[37470] kai 
     ・[37573] kai 
     ・[37579] チルチル 
     ・[37580] array 
     ・[37630] kai 

Name: tejya  ..ぴよぴよ(84ポイント)   Date: 2009/08/08(土) 01:48   No:37898       
Title: インストールについて…    
 この掲示板を見てゲームを作ろうと思いました。
しかしダウンロードしてみて途中でつまづいてしまったのですが…

ゲームプログラミングの館の入門編0番の
「DxLib_VC2008_and_2005用.sln」を開きます → でつまづいてます。VC++が起動しません…。

なんだか初心者なミスの香りもするのですが…どうすればよいのでしょうか?

環境  
 [2.1] OS : Windows Vista
 [2.2] コンパイラ名 : Visual C++ 2008 Express Edition
    DXライブラリ : DxLib_VC2_25b.exe → 解凍して DxLib_VC → DxLib_VC2008_and_2005用.sln はある。

恥ずかしながら、よろしくお願いします。


84ポイント を手に入れた。


Name: pooka [URL]  ..中級者(12,191ポイント)   Date: 2009/08/08(土) 02:13   No:37900     
Title: Re:インストールについて…    
一度スタートメニューからVC++を起動して、
そのあとでDxLib_VC2008_and_2005用.slnを開いてみてください。


38ポイント を手に入れた。

Name: tejya  ..ぴよぴよ(195ポイント)   Date: 2009/08/08(土) 03:10   No:37903     
Title: Re:インストールについて…    
うーん…反応無しです…。

基本的にダブルクリックで無反応、
右クリックからのプログラムから開くでも推奨されたプログラムが出て…Microsoft Visual Studio Version Selector となっています。他のプログラム欄は空欄です…。


111ポイント を手に入れた。

Name: tejya  ..ぴよぴよ(316ポイント)   Date: 2009/08/08(土) 05:10   No:37904 解決!     
Title: Re:インストールについて…    
投稿時間が遅すぎましたね…
この時間まで粘って自己解決しました…。

Vistaが管理者うんぬん…結局よくわからなかったけど…。

まだまだ若いつもりなので知らない事にも時間で戦っていきます…はい。
とはいえまた利用するやもしれないのでその時はどうか皆さんよろしくお願いします。

夜遅くに反応してヒントを下さった pooka さん、ありがとうございました。


121ポイント を手に入れた。



Name: kamiya  ..ぴよぴよ(283ポイント)   Date: 2009/08/08(土) 02:05   No:37899       
Title: s2. サウンドノベル風文字列表示法1    
ゲームプログラミングの館のs2. サウンドノベル風文字列表示法1の


for(j=0;j<256;j++){
if(oldKey[j]==0 && Key[j]==1)
Key[j]=2;
oldKey[j]=Key[j];
}



の部分の処理がよく分かりません。
このfor文は一体何のための処理なんでしょうか?
抽象的過ぎる質問だとは思うのですがさっぱりなので…



242ポイント を手に入れた。


Name: sizuma [URL]  ..中級者(12,465ポイント)   Date: 2009/08/08(土) 02:32   No:37901     
Title: Re:s2. サウンドノベル風文字列表示法1    

for(j=0;j<256;j++){
if(oldKey[j]==0 && Key[j]==1)Key[j]=2;
oldKey[j]=Key[j];
}

こうしないと確かにインデントが見にくいですね。
ソースのコメントにあるように

//前回押されてなくて、今回押されていたら
コレを判断します。

oldKeyは1フレーム前のキーの状態
Keyは現在のフレームのキーの状態です。
前回押されてなくて、今回押されてる時には値を2に変えています。
そして現在のフレームの状態を次のフレームで使うためにoldKeyに格納しています。


128ポイント を手に入れた。

Name: kamiya  ..ぴよぴよ(300ポイント)   Date: 2009/08/08(土) 02:40   No:37902 解決!     
Title: Re:s2. サウンドノベル風文字列表示法1    
早速のご回答ありがとうございました。
とてもわかりやすかったです。


17ポイント を手に入れた。



Name: misodo  ..ぴよぴよ(72ポイント)   Date: 2009/08/07(金) 23:44   No:37888       
Title: 問題の一部がわかりません;    
初歩的な質問ですみません。

<問題>

1から100までの数値を画面に表示するプログラムを書け。
そのうち数値が3の倍数であった場合、「この数値は3の倍数です」5の倍数であった場合、「この数値は5の倍数です」と表示されるようにしろ。
また、数値が3と5両方の倍数であった場合、「この数値は3と5両方の倍数です」と表示されるようにしろ。

うろ覚えなので問題がわかりずらく申し訳ありません;

自分てやってみたところ、1から100まで数字を表示し、3と5の倍数の数字だけ表示を変えられたのですが、3と5両方の倍数の数字の表示を変えることができません;

どうしたらいいのでしょうか?


72ポイント を手に入れた。


Name: sizuma [URL]  ..中級者(12,531ポイント)   Date: 2009/08/07(金) 23:51   No:37889     
Title: Re:問題の一部がわかりません;    
どのようなアルゴリズムを使っているのかわからないので、的確なアドバイスが出来ませんが。
僕がぱっと思いついたのを書くなら剰余算を使って、

if(3で割って余りが0){
   if(5で割って余りが0){
      この数値は3と5両方の倍数です
   }else{
      この数値は3の倍数です
   }
}else if(5で割って余りが0){
   この数値は5の倍数です
}else{
   普通に表示
}

っていう処理にするかな。
なんか見づらいな。

追記
って思ったらミスってたんで一部訂正しました
全角でインデントしたんで、まだなんかミスってるかも・・・


130ポイント を手に入れた。

Name: misodo  ..ぴよぴよ(241ポイント)   Date: 2009/08/08(土) 00:24   No:37891     
Title: Re:問題の一部がわかりません;    
ありがとうございます。

自分が書いたものです。

#include <stdio.h>

int main()
{
int i;

for(i=1; i<=100; i++){

if(i % 3 == 0){

printf("この数値3の倍数です\n");

}else if(i % 5 == 0){

printf("この数値は5の倍数です\n");

}else if(i % 3 == 0 && i % 5 == 0){

printf("この数値は3と5の倍数です\n");

}else{

printf("%d\n", i);

}

}

3と5両方の倍数の部分以外はちゃんと表示されます。

わかりづらくてすみません;


169ポイント を手に入れた。

Name: sizuma [URL]  ..中級者(12,337ポイント)   Date: 2009/08/08(土) 00:33   No:37893     
Title: Re:問題の一部がわかりません;    
ソースコードはpreタグで囲ってくださいね。上に規約がありますhttp://dixq.net/board/board.html

判定の順番を変えましょう

100までの数

  ↓ 3の倍数を抜く

100までの数(3の倍数なし)

  ↓ 5の倍数を抜く

100までの数(3の倍数と5の倍数がない。つまりこの時点で3の倍数かつ5の倍数は1つもない)

  ↓ 3の倍数かつ、5の倍数を抜く(どうせない)


というわけです。
最初に3の倍数かつ5の倍数か、の判定式を持ってきましょう


194ポイント を落としてしまった。

Name: box  ..ハッカー(142,469ポイント)   Date: 2009/08/08(土) 00:37   No:37895     
Title: Re:問題の一部がわかりません;    
> 自分が書いたものです。

>1から100までの数値を画面に表示する

この仕様が抜けています。

> }else if(i % 3 == 0 && i % 5 == 0){

このif文に到達するのは、
iが3で割り切れず、かつ、5でも割り切れないときです。
したがって、このif文の条件を満たすことはありません。

sizumaさんのアドバイスにしたがって、
ソースを書き換えてみてはいかがでしょうか。


129ポイント を手に入れた。

Name: Hermit  ..プログラマー(25,346ポイント)   Date: 2009/08/08(土) 00:39   No:37896     
Title: Re:問題の一部がわかりません;    
もう答えが書かれていたので削除(^^;

43ポイント を手に入れた。

Name: misodo  ..ぴよぴよ(210ポイント)   Date: 2009/08/08(土) 00:51   No:37897     
Title: Re:問題の一部がわかりません;    
たくさんのお答えありがとうございます。

規約はまったく読んでいませんでした;すみません;

よく考えて書き換えてみようと思います。

ありがとうございました!


31ポイント を落としてしまった。



Name: lbfuvab  ..上級者(21,604ポイント)   Date: 2009/08/06(木) 05:45   No:37803       
Title: 動画の裏写り?    
さっき謎の現象が起こったのですが、原因が判る方がいらっしゃったら教えてください。
説明も難しいのですが、再生している動画が写り込む?と言う風な物です。

再現方法は

VLC media playerで動画を再生し、一時停止してVLCのウィンドウに重なる様にペイントを開く。

そして(R,G,B)=(0,0,1)でペイントのキャンバスを塗りつぶすとVLCで再生していた動画が写り込む。

・・・といった具合です。


116ポイント を手に入れた。


Name: sizuma [URL]  ..中級者(12,134ポイント)   Date: 2009/08/06(木) 05:53   No:37805     
Title: Re:動画の裏写り?    
原因の分からない人ですが。

OSのプロセス管理上でのバグなんじゃないでしょうか?
分かる人いるんですかね??


30ポイント を手に入れた。

Name: asd  ..上級者(17,343ポイント)   Date: 2009/08/06(木) 13:18   No:37822     
Title: Re:動画の裏写り?    
VLC media playerを使用しているわけではないので未検証ですが、同様の動作を経験したことがありますので投稿してみます。

おそらくオーバーレイが有効になっているがためにその現象が起きていると思います。
VLC media playerの設定でオーバーレイを無効にしてみてはいかがでしょうか?

VLC media playerのどの設定なのかは少し調べないと分かりませんが参考になれば^^;


148ポイント を手に入れた。

Name: lbfuvab  ..上級者(21,710ポイント)   Date: 2009/08/06(木) 14:44   No:37827     
Title: Re:動画の裏写り?    
>>asd様

オーバーレイを無効にしたところ裏写りしなくなりました(^0^)/

一体どういう原理なんでしょう?


56ポイント を手に入れた。

Name: YuO  ..プログラマー(32,635ポイント)   Date: 2009/08/06(木) 15:41   No:37828     
Title: Re:動画の裏写り?    
> オーバーレイを無効にしたところ裏写りしなくなりました(^0^)/
> 一体どういう原理なんでしょう?

私はDirectXまわりは詳しくないので,間違っていたらごめんなさい&指摘をお願いします。


MSDN: DirectX 用語集
http://msdn.microsoft.com/ja-jp/library/cc351166.aspx#%23overlay%20surface
MSDN: IDirectDrawVideo::UseOverlayStretch
http://msdn.microsoft.com/ja-jp/library/cc355950.aspx
MSDN: Overlay Surface Overview
http://msdn.microsoft.com/en-us/library/aa916217.aspx

MSDNからざっと拾ってみました。
# 最後のはMobile/CE用ですが。

オーバーレイサーフェイスはプライマリーサーフェイスよりも手前に描画されます。
そのため,従来のGDI/GDI+等にオーバーレイサーフェイスが上書きされたのでしょう。
PrintScreenもプライマリーサーフェイスには何も描かれていないため,0,つまり黒くなったのだと思います。

Site: WDDM, DWM: pros and cons - NyaRuRuの日記
http://d.hatena.ne.jp/NyaRuRu/20061202/p2
でNyaruruさんがオーバーレイAPIとDWMが両立できないと書かれていますし,
Windows Vista以降のOS (Aero有効) であれば,起きないのではないかと思います。


249ポイント を手に入れた。

Name: YuO  ..プログラマー(32,708ポイント)   Date: 2009/08/06(木) 17:32   No:37829     
Title: Re:動画の裏写り?    
調べている間に読んだ別のサイトの話と混線していました。


誤) PrintScreenもプライマリーサーフェイスには何も描かれていないため,0,つまり黒くなったのだと思います。
正) (削除)


73ポイント を手に入れた。

Name: lbfuvab  ..上級者(21,695ポイント)   Date: 2009/08/06(木) 21:13   No:37836     
Title: Re:動画の裏写り?    
>>YuO様
今試した所確かにPrintScreenは何も写りませんでした。

後、やっぱり純粋な黒ではダメみたいです。


15ポイント を落としてしまった。

Name: roo  ..ぴよぴよ(8ポイント)   Date: 2009/08/08(土) 00:36   No:37894     
Title: Re:動画の裏写り?    
こんばんはー

自分もWin32APIでMCIデバイスを用いて簡易メディアプレーヤーを作ろうとした際
同じような現象が起きましたー

不思議ですよねー


8ポイント を手に入れた。



Name: かりむ  ..かけだし(1,700ポイント)   Date: 2009/08/08(土) 00:09   No:37890       
Title: 木構造における逆ポーランド記法について    
下のプログラムは入力された計算式を逆ポーランド記法で表示し、その後木構造で表示するプログラムです。


---------------------------------------------------------------------


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 256

struct Node {
char str[N];
struct Node* left;
struct Node* right;
};

void delete_space(char *str);/* スペースを削除する */
int delete_bracket(char *str);/* 式の外側部分の括弧を削除する.異常があれば-
1を返す.*/
int getRootOperator(char *str);/* 一番低い優先順位の演算子の配列番号を返す.
*/
int insert(struct Node* node);/* 式を二分木に挿入する.異常があれば-1を返す
*/
void reverse_polish_notation(struct Node* node);/* 二分木を逆ポーランド記法
で出力する */
void Tree(struct Node* node, int h); /* 木の表示 */

int main (int argc, const char * argv[]){

struct Node *root ;

root = (struct Node *)malloc(sizeof(struct Node));

printf("式を入力してください: ");
scanf("%[^\n]", root->str);

delete_space(root->str);/* スペースを削除 */

if (insert(root) < 0) {/* 木にデータを挿入 */
fprintf(stderr, "syntax error\n");
return -1;
}

printf("逆ポーランド記法: ");
reverse_polish_notation(root);
printf("\n");

printf("木構造の表示\n");
Tree(root,0);

return(0);

}

void delete_space(char *str){
int i=0,j=0 ;
char *cmpstr ;

cmpstr = str ;

while (cmpstr[i] != '\0') {
if (cmpstr[i] == ' ')
i++;
else{
str[j] = cmpstr[i];
i++;
j++;
}
}

str[j] = '\0';
}

int delete_bracket(char *str){
int i;
int length = strlen(str);
int set = 1;

if (str[0] != '(' || str[length - 1] != ')')
return 0;

for (i = 1; i < length - 1; i++) {/* 括弧の数が正しいか調べる */
if (str[i] == '(')
set++;
else if (str[i] == ')')
set--;

if (set == 0)
return 0;
}

if (set != 1) {/* 正しく無い場合は-1を返す */
return -1;
}

for (i = 0; i < length - 2; i++) {/* 括弧を外側から消してゆく */
str[i] = str[i + 1];
}
str[i] = '\0';

if (str[0] == '(')
delete_bracket(str);

return 0; /* OSに対する戻り値 */
}

int getRootOperator(char *str){
int i;
int rootOperator = -1;
int set = 0;
int pri;/* 優先順位 */
int lowpri = 4;

if (!str)
return -1;

for (i = 0; str[i]; i++) {
switch (str[i]) {
case '=': pri = 1; break;
case '+': pri = 2; break;
case '-': pri = 2; break;
case '*': pri = 3; break;
case '/': pri = 3; break;
case '(': set++; continue;
case ')': set--; continue;
default: continue;
}

if (set == 0 && pri <= lowpri) {/* 優先順位が低い配列番号を保存 */
lowpri = pri;
rootOperator = i;
}
}

return rootOperator;
}

int insert(struct Node* node){/* 再帰される関数 */

int rootOperator;
int len_str;

if (!node)
return -1;

rootOperator = getRootOperator(node->str);

if (rootOperator == (int)-1) {
node->left = NULL;
node->right = NULL;

return 0;
}

len_str = strlen(node->str);

/* 左側の処理 */
/* 問題箇所->始まり */

node->left = (struct Node *)malloc(sizeof(struct Node));/* メモリ確保 */

if (node->left==NULL) {/* 一応無くても動く */
return -1;
}

strncpy(node->left->str, node->str, rootOperator);/* 最低優先順位演算子の
左側部分を左の子にコピー */
/* 問題箇所->終わり */

node->left->str[rootOperator]='\0'; /* 文字列の最後にNULLをつける */

if (delete_bracket(node->left->str) < 0)/* 外側の括弧を削除する */
return -1;

if (insert(node->left) < 0)/* 再帰 */
return -1;

/* 右側の処理 */
/* 問題箇所->始まり */
node->right = (struct Node *)malloc(sizeof(struct Node));/* メモリ確保 */

if (node->right==NULL) {/* 一応無くても動く */
return -1;
}

strncpy(node->right->str, node->str + rootOperator + 1, len_str - rootOpe
rator);/* 最低優先順位演算子の右側部分を右の子にコピー */
/* 問題箇所->終わり */


if (delete_bracket(node->right->str) < 0)/* 外側の括弧を削除する */
return -1;

if (insert(node->right) < 0)/* 再帰 */
return -1;

/* 親ノードの処理 */
node->str[0] = node->str[rootOperator];
node->str[1] = '\0';

return 0;
}

void reverse_polish_notation(struct Node* node)
{
if (!node)
return;

if (node->left)
reverse_polish_notation(node->left);
if (node->right)
reverse_polish_notation(node->right);

printf("%s ",node->str);
}

/* 木を表示する */
/* hは木の深さを表す */
void Tree(struct Node* node, int h){

int i;

if(node != NULL){
Tree( node->right, h+1 );/* node->rightを表示する */
for( i=0; i<h; i++ )
printf(" ");/* 木を表現するために3空白字下げをする */
printf("%s\n", node->str );/* node->strを出力 */
Tree( node->left, h+1 );/* node->leftを表示する */
}
}



--------------------------------------------------------------------------




1,700ポイント を手に入れた。


Name: box  ..ハッカー(142,340ポイント)   Date: 2009/08/08(土) 00:32   No:37892     
Title: Re:木構造における逆ポーランド記法について    
> 下のプログラムは入力された計算式を逆ポーランド記法で表示し、その後木構造で表示するプログラムです。

お聞きになりたいことは何ですか?

ソース投稿時は、ソース全体を
<pre>と</pre> (<と>は、半角)
ではさんでください。


30ポイント を手に入れた。



Name: もちもち  ..ぴよぴよ(22ポイント)   Date: 2009/08/07(金) 19:55   No:37874       
Title: キーボード入力について    
電卓を作ろうとしているのですが、キーボード入力で

1+2

としたら2の後ろになにか文字みたいなものがあるのでしょうか?

文字列なら一番最後にNULLが存在するので疑問に思ったのでどうか教えてください。
お願いします。


22ポイント を手に入れた。


Name: non  ..熟練のプログラマー(59,678ポイント)   Date: 2009/08/07(金) 20:14   No:37875     
Title: Re:キーボード入力について    
getsで入力した場合は、自動的に'\0'が追加されます。




18ポイント を手に入れた。

Name: TKOZ  ..プログラマー(28,998ポイント)   Date: 2009/08/07(金) 20:24   No:37876     
Title: Re:キーボード入力について    
文字列は分かりませんが、
多分一番簡単な電卓プログラムを作ってみました。
参考にしてください。


#include<stdio.h>

int main()
{
int num1,num2;
char enzan;
int resultA;
double resultB;
printf("%%d%%c%%dの順で入力してください。\n");

while(1)
{
scanf("%d%c%d",&num1,&enzan,&num2);

switch(enzan)
{
case '+':
resultA=num1+num2;
break;
case '-':
resultA=num1-num2;
break;
case '*':
resultA=num1*num2;
break;
case '/':
if(num2==0)
{
printf("0除算エラーです。\n");
return -1;
}
resultB=(double)num1/num2;
break;
}

if(enzan!='/')
{
printf("=%d\n",resultA);
}else{
printf("=%1.2f\n",resultB);
}

}
return 0;
}


510ポイント を手に入れた。

Name: もちもち  ..ぴよぴよ(96ポイント)   Date: 2009/08/07(金) 20:25   No:37877     
Title: Re:キーボード入力について    
nonさんありがとうございます。

それとすいません。入力形式は


int c;

c=getchar();

です。この場合ではどうなるのでしょうか?
お願いします。


74ポイント を手に入れた。

Name: もちもち  ..かけだし(1,178ポイント)   Date: 2009/08/07(金) 20:35   No:37878     
Title: Re:キーボード入力について    

TKOZさんありがとうございます。今自分が作っているプログラムはLR構文解析表をつかって作ろうとしているのですが、どこで計算が終わるかの条件として

1+2

の後ろに何かないか疑問に思ったのですが、すいませんあいまいな質問をしてしまって。

下記に自分が作ったLR構文解析表を記しました。別にこれがどうこうということではないのですが、
一応こういうプログラムを作るということで、貼っておきます。

何度もすいませんが、1+2を

int c;

c=getchar();

でキーボード入力したら、2の後ろになにか文字みたいなものがつくのでしょうか?




#include<stdio.h>
#include<ctype.h>

int gettoken(int *);

int c;

int main(void)
{
struct sr{
char s;
int n;
};

struct sr pta[12][6]={

/* i + * ( ) $ */

{{'s',5},{'e',0},{'e',0},{'s',4},{'e',0},{'e',0}}, //0
{{'s',0},{'s',6},{'e',0},{'e',0},{'e',0},{'a',0}}, //1
{{'e',0},{'r',2},{'s',7},{'e',0},{'r',2},{'r',2}}, //2
{{'e',0},{'r',4},{'r',4},{'e',0},{'r',4},{'r',4}}, //3
{{'s',5},{'e',0},{'e',0},{'s',4},{'e',0},{'e',0}}, //4
{{'e',0},{'r',6},{'r',6},{'e',0},{'r',6},{'r',6}}, //5
{{'s',5},{'e',0},{'e',0},{'s',4},{'e',0},{'e',0}}, //6
{{'s',5},{'e',0},{'e',0},{'s',4},{'e',0},{'e',0}}, //7
{{'e',0},{'s',6},{'e',0},{'e',0},{'s',11},{'e',0}},//8
{{'e',0},{'r',1},{'s',7},{'e',0},{'r',1},{'r',1}},//9
{{'e',0},{'r',3},{'r',3},{'e',0},{'r',3},{'r',3}},//10
{{'e',0},{'r',5},{'r',5},{'e',0},{'r',5},{'r',5}} //11
};

int ptg[12][3]={
{1,2,3},
{0,0,0},
{0,0,0},
{0,0,0},
{8,2,3},
{0,0,0},
{0,9,3},
{0,0,10},
{0,0,0},
{0,0,0},
{0,0,0},
{0,0,0}
};




この後ろに、トークンの切り取りと、生成規則の条件があります。


1,082ポイント を手に入れた。

Name: non  ..熟練のプログラマー(59,803ポイント)   Date: 2009/08/07(金) 21:12   No:37879     
Title: Re:キーボード入力について    
1+2
の後に普通は改行を入力すると思います。
そうでないと式が終わったかどうかわかりませんからね。
したがって、getcharを使うなら、'\n'を式の終わりと
判断するのが一般的でしょう。
また、改行を入力しないと、バッファから取り込まれないし。

そういう回答でいいでしょうか?


125ポイント を手に入れた。

Name: もちもち  ..かけだし(1,242ポイント)   Date: 2009/08/07(金) 21:20   No:37880 解決!     
Title: Re:キーボード入力について    
nonさんありがとうございました。

手伝ってくれた皆様も本当にありがとうございました。

無事完成することができました。


2倍のポイントを手に入れた! 64ポイント を手に入れた。



Name: 華穂  ..中級者(11,022ポイント)   Date: 2009/08/06(木) 23:13   No:37842       
Title: STGについてその@(ステージ編)    
やっぱり駄目でした。
どうにもさっぱり分からなくなってしまい、書き込みさせていただきます。

題名の『STG(シューティングゲーム)についてその@』というのは、これからもうしばらく先は
課題のSTGの分からないところを書いていこうと思い、このような題名をとらせていただきました。

では、まずソースを。(非常に長いです)


<pre>
//ステージ全部の雑魚敵総数
#define TZ_ALL 132
//グローバル
int Stage = 0;

struct E_Zako
{
//変数設定
//波・特攻それぞれ配列を設定
double EZakoX, EZakoY;
int BotuEZako, EZBreak;
int EZakoW, EZakoH;
int EZSpeed;
int EZCounter;
int EZLife;
int TEZ_Set;
int EZakoFlag;
int EZakoType;
int EZCome;
float EZT,EZH,EZY;
//自機から見た角度
double Target_angle;
//自機
int Ziki[2], ZikiX, ZikiY;
//ステージ
int Stage;
};

class C_EZako
{
//全ステージ5・雑魚敵の総数50機
E_Zako EZ[TZ_ALL];
EZ_C ez_c[5];

☆自機と弾の変数をこちらに設置

public:

C_EZako();
void EZ_move();
void EZ_Atari();
void EZ_HP(int i, int damage);
void TokAngSet(int i,double ang);
void EZ_TASet(int i);

//リターンの値を設定
int EZ_X(int i){return EZ[i].EZakoX;} //x座標を返す
int EZ_Y(int i){return EZ[i].EZakoY;}
int EZ_AS(int i){return EZ[i].TEZ_Set;}
int EZ_Type(int i){return EZ[i].EZakoType;}
};

///初期化
C_EZako::C_EZako()
{

EZako = LoadGraph("EZako.bmp");
TEZako = LoadGraph("EZako.bmp");
for(int i = 0; i < 5; ++i){
ez_c[i].nami = 0;
ez_c[i].tokkou = 0;
}

//初期化
for(int i = 0; i < TZ_ALL; ++i)
{

for(;;){
int a = rand()%2;

int br = 0;

if(i < 8){
EZ[i].Stage = 0;
//敵のライフ
EZ[i].EZLife = 1;

if(a == 0){//波
if(ez_c[0].nami < 5){
EZ[i].EZakoType = 0;
ez_c[0].nami += 1;
}
else{
br = 1;//breakのことです
}
}
else if(a == 1){//特攻
if(ez_c[0].tokkou < 3){
EZ[i].EZakoType = 1;
ez_c[0].tokkou += 1;
//br = 0;
}
else{
br = 1;
}
}

}
else if(i < 8 + 14){
EZ[i].Stage = 1;
//敵のライフ
EZ[i].EZLife = 2;

if(a == 0){//波
if(ez_c[1].nami < 10){
EZ[i].EZakoType = 0;
ez_c[1].nami += 1;
}
else{
br = 1;
}
}

else if(a == 1){//特攻
if(ez_c[1].tokkou < 4){
EZ[i].EZakoType = 1;
ez_c[1].tokkou += 1;
//br = 0;
}
else{
br = 1;
}
}
}
else if(i < 8 + 14 + 20){
EZ[i].Stage = 2;
//敵のライフ
EZ[i].EZLife = 3;




以下次のところに書きます。


875ポイント を手に入れた。


Name: 華穂  ..中級者(12,777ポイント)   Date: 2009/08/06(木) 23:17   No:37844     
Title: Re:STGについてその@(ステージ編)    

if(a == 0){//波
if(ez_c[2].nami < 15){
EZ[i].EZakoType = 0;
ez_c[2].nami += 1;
}
else{
br = 1;
}
}
else if(a == 1){//特攻
if(ez_c[2].tokkou < 5){
EZ[i].EZakoType = 1;
ez_c[2].tokkou += 1;
//br = 0;
}
else{
br = 1;
}
}

}
else if(i < 8 + 14 + 20 + 40){
EZ[i].Stage = 3;
//敵のライフ
EZ[i].EZLife = 3;

if(a == 0){//波
if(ez_c[3].nami < 30){
EZ[i].EZakoType = 0;
ez_c[3].nami += 1;
}
else{
br = 1;
}
}
else if(a == 1){//特攻
if(ez_c[3].tokkou < 10){
EZ[i].EZakoType = 1;
ez_c[3].tokkou += 1;
//br = 0;
}
else{
br = 1;
}
}

}
else if(i < 8 + 14 + 20 + 40 + 50){
EZ[i].Stage = 4;
//敵のライフ
EZ[i].EZLife = 3;

if(a == 0){//波
if(ez_c[4].nami < 35){
EZ[i].EZakoType = 0;
ez_c[4].nami += 1;
}
else{
br = 1;
}
}
else if(a == 1){//特攻
if(ez_c[4].tokkou < 15){
EZ[i].EZakoType = 1;
ez_c[4].tokkou += 1;
//br = 0;
}
else{
br = 1;
}
}

}

if(br == 0)break;

}
ここから先は波と特攻の動きを表すソースのため
略します。(長すぎて入りきれませんでした
知りたいという方がいらっしゃったらおっしゃってください
ひとつ下に記します。また、適当に区切ったために
『}』が足りなかったり多かったりしますが今は無視して
くださってください。)
}
}



以上、長くなりましたが、これが雑魚敵のクラスです。
前にも何度か漏らしたことがあるとはおもいますが、ソースコードの中の


//初期化
for(int i = 0; i < TZ_ALL; ++i)
{

for(;;){



から始まるそれぞれの敵とステージの振り分け・・お分かりでしょうか?
実は、今これに大変困っております。

というのもこれのシューティングゲーム、ステージごとに最初に敵が現れる
数を決めなければならないからです。

ステージ1なら、4体。これ以降、4体・5体・5体・6体

とこれらの数だけ敵が最初に出てきます。
こいつらを1体やっつけることで、敵が1体増えるという処理を、
ここでステージごとにかかなければならないのですが・・。
これに困っているのです。

というもの・・これ、お分かりでしょうが、2パターンともひとつずつの
関数?から出しています。
つまり、これおそらく書いたらめちゃくちゃになると思うんですよね。

それを避けたいんですが、考えが浮かびません。

先輩から上部につくったグローバル関数(Stage)を利用しうんたら〜と
われたのですが、ピンとこず。

ごめんなさい。
こればっかりはどうやって作ればいいのかわかりません。(涙目)
書き変えて変になったら怖いし・・。
最初は乱数で特攻・波敵を合計で4体出そうと思いましたが、無理でした。
なので、ほどよい数字・・たとえば、最初に波2・特攻2を出すなど乱数を使わない、
まだ簡単なソースでもいいので、今の状況の上記の示したソースの場所をどうやったらうまく
変えて、困っている問題を解決することができるか教えてください。

今の状況(ソース)だと、別のところでとあるキーを押すとステージを、敵を倒さずとばすようにしています。(倒す前に敵が右端からどんどん流れてくる状況です)
それもはずしてうまくしなければなりませんが、ここで詰まりに詰まっているため、ぜひともこればっかりは、実際のソースコードなどを書いて教えてほしいです。

難問な問題を押しつけて申し訳ありません。
ですが、ぜひとも今回はソースを書いて簡単な説明をください。。

どうぞ、よろしくお願いします。





というかすみません。
上レスで途中区切ったために<pre>の相方がこちらの方で書きこまれて、
上記がみにくくなってしまいました。

きれいなやつが見たいという人はぜひおっしゃってください。
もう一度記します。


1,755ポイント を手に入れた。

Name: array [URL]  ..熟練のプログラマー(55,030ポイント)   Date: 2009/08/07(金) 00:32   No:37845     
Title: Re:STGについてその@(ステージ編)    
前回の投稿でも注意されていましたが、利用規約に書いてある事は守ったほうがいいと思います。
規約と注意事項

間違わないコツとしては投稿を押す前にプレビューにチェックを入れてから投稿すると、すぐに投稿されず一旦どの様な形で表示されるのか確認することが出来るので活用すると間違いがなくなると思います。

111ポイント を手に入れた。

Name: 華穂  ..中級者(12,897ポイント)   Date: 2009/08/07(金) 05:46   No:37854     
Title: Re:STGについてその@(ステージ編)    




なるほど・・プレビューの活用方法がありましたか。
確かに、気づいたときには既に遅く・・とあり、
申しわけなかったでし。

次回からはもっと細心の注意を払っていきたいと思います。
array様、ご指定ありがとうございました。


120ポイント を手に入れた。

Name: ねこ  ..プログラマー(36,869ポイント)   Date: 2009/08/07(金) 16:21   No:37870     
Title: Re:STGについてその@(ステージ編)    
質問内容の前に敵データの管理設計から考え直した方が良いんじゃない?
二次元配列やステージ単位の敵数情報構造体なりを用意した方がループ処理も出来るし楽だと思うよ。
全部一次元配列に格納しているから頭がごっちゃになっているんじゃないかな。

それから質問内容は敵の初期データ設定だけでメインループや敵倒した時の処理も全く無いから
ソース込みでの返信は誰も出来ないと思う。

<Pre
前も書いただけど修正でも良いんだから、ってもしかして修正方法が分からないのかな。
投稿ボタンの右の削除キーというところにパスワードを入れておくと、記事の右上の「編集」から記事内容を修正する事が出来るよ。
Preタグ抜けも修正出来るのでちゃんと削除キーを指定して投稿する事推奨。


275ポイント を手に入れた。

Name: 華穂   Date: 2009/08/24(月) 22:33   No:378421251120826 解決!     
Title: Re:STGについてその@(ステージ編)    



返信が遅くなってしまって申し訳ありませんっ!!

確かに、二次元配列を使ったほうが楽かもしれませんね。
少し頭を整理して書き直してみたいと思います!


ねこ様、的確なアドバイス、ありがとうございました!




Name: R  ..入門者(3,568ポイント)   Date: 2009/08/07(金) 13:28   No:37867       
Title: 配列による文字列の辞書順クイックソート    
グローバル変数である二次元配列に格納した文字列データをクイックソートを使って辞書順にソートするプログラムを作成しています。ピボットを左端や右端にした場合は正常に動作しているようなのですが中央値((左端+右端)/2)をピボットにとると正常にソートできません。原因が分からないので指摘していただけないでしょうか。

void quicksort(int left, int right)
{
int i, j; char *x;

//if (left>=right) return;
x=words[(left+right)/2];
for(i=left,j=right;;i++,j--){
while(compare(words[i],x)<0){
//printf("cmp1:%scmp2:%s%d\n",words[i],x,compare(words[i],x));
i++;}
while(compare(words[j],x)>0)j--;
if(i>=j)
break;
swap(words[i],words[j]);
}
if(left<i-1)
quicksort(left,i-1);
if(j+1<right)
quicksort(j+1,right);
}
void swap(char x[],char y[]){
char temp[WORD_LIMIT];
int i;
for(i=0;x[i]!=0;i++)
temp[i]=x[i];
temp[i]='\0';
for(i=0;y[i]!=0;i++)
x[i]=y[i];
x[i]='\0';
for(i=0;temp[i]!=0;i++)
y[i]=temp[i];
y
[i]='\0';
}
int compare(char w1[],char w2[]){
int flg=0;
int i=0;
while(w1[i]==w2[i]&&w1[i]!=0&&w2[i]!=0)
i++;
if(w1[i]>w2[i])
flg=1;
else if(w1[i]==w2[i])
flg=0;
else flg=-1;
if(flg==0){
if(w1[i]==0&&w2[i]!=0)
flg=-1;
else if(w1[i]!=0&&w2[i]==0)
flg=1;}
return flg;
}


75ポイント を手に入れた。


Name: non  ..熟練のプログラマー(59,660ポイント)   Date: 2009/08/07(金) 14:22   No:37868     
Title: Re:配列による文字列の辞書順クイックソート    
>char *x;
>x=words[(left+right)/2];

基準値をポインタで覚えておくと、交換したときに、基準値が変わってしまいます。
char x[WORD_LIMIT];
strcpy(x,words[(left+right)/2]);
にしてください。



82ポイント を手に入れた。

Name: R  ..入門者(3,614ポイント)   Date: 2009/08/07(金) 15:51   No:37869 解決!     
Title: Re:配列による文字列の辞書順クイックソート    
nonさん、回答ありがとうございます。
VC++の自動変数機能でご指摘の現象を確認できましたので教えていただいた方法を試したところ正常に動いたようです。


46ポイント を手に入れた。



Name: kai  ..入門者(3,915ポイント)   Date: 2009/08/07(金) 09:28   No:37859       
Title: 位置によってスコアの点数が変わるやり方    
再び改造龍神録についてですが、
東方はスコアアイテムを取る位置によって点数が変わります。
取る位置が高ければ高いほど高得点かつ、アイテム収集ライン以上ならば最高得点
みたいな感じで実装してみたいのですが、これってif文でy座標を
一つ一つ設定して実装する方法以外で何かないでしょうか?
もっと簡単で、細かく設定したいのですが、
もしもあればアドバイスお願いします。


127ポイント を手に入れた。


Name: あ〜る  ..中級者(11,295ポイント)   Date: 2009/08/07(金) 10:25   No:37864     
Title: Re:位置によってスコアの点数が変わるやり方    
考え方としては
・ある一定の座標以上なら最高得点
・それより下なら自機のY座標*Xを得点にする
といった感じです
ただ、自機のY座標*Xだと下に行けば行く程得点が高くなってしまうので、最高得点−(自機のY座標*X)という風にすればいいと思います


41ポイント を手に入れた。



Name: @  ..ぴよぴよ(174ポイント)   Date: 2009/08/06(木) 22:10   No:37838       
Title: DrawBoxをグラデーションする方法    
タイトルどおりなんですが
DXライブラリで
SetDrawBlendMode( DX_BLENDMODE_ALPHA , 150 ) ;
DrawBox( FX , FY , FX+FMX , FY+FMY , GetColor( 0,0,0 ) , TRUE ) ;
SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ;
全体を薄くしたうえから
さらに左から右にかけて段々薄くしながらグラデーションさせていく方法とかってないでしょうか?
ありましたら是非アドバイスお願いします・・


116ポイント を手に入れた。


Name: 夢夢  ..かけだし(2,241ポイント)   Date: 2009/08/06(木) 22:16   No:37839     
Title: Re:DrawBoxをグラデーションする方法    
DrawLineで色を徐々に変化させる方法ならあります。

17ポイント を手に入れた。

Name:  ..ぴよぴよ(211ポイント)   Date: 2009/08/07(金) 01:19   No:37846     
Title: Re:DrawBoxをグラデーションする方法    
DrawBoxでは不可能なんでしょうか?

13ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(400,587ポイント)   Date: 2009/08/07(金) 01:54   No:37850     
Title: Re:DrawBoxをグラデーションする方法    

>DrawBoxでは不可能なんでしょうか?

 DwawLineと同じ方法で出来なくはないですが、効率は悪そうな感じがします。

 そもそもそういうテクスチャを用意して DrawGraph()などで表示する、ではだめなのでしょうか?


71ポイント を手に入れた。

Name: @  ..ぴよぴよ(213ポイント)   Date: 2009/08/07(金) 03:40   No:37853 解決!     
Title: Re:DrawBoxをグラデーションする方法    
言われてみれば確かにそちらの方が手っ取り早いですね。
そうしてみます。


39ポイント を手に入れた。



Name: tatelis  ..ぴよぴよ(112ポイント)   Date: 2009/08/06(木) 20:09   No:37833       
Title: DrawModiGraph()関数について    
DrawModiGraph() 関数について質問です。

対角線を描いた長方形の画像があるとします。
この画像を DrawModiGraph() 関数で台形に変形すると、
元の画像では直線だった対角線が曲線になってしまいます。(X→乂)
「直線を直線に」移すように変形するためにはどうすればよいのでしょうか?


87ポイント を手に入れた。


Name: tatelis  ..ぴよぴよ(414ポイント)   Date: 2009/08/07(金) 02:48   No:37851     
Title: Re:DrawModiGraph()関数について    
一応・・・ですが下記手順で自己解決しました。

1.2 のべき乗サイズのソフトウエアイメージハンドル H を新しく作成する。
2.元の画像 G(プログラムの仕様上サイズ固定、しかもかなり大きい)をメモリに読み込む。
3.H の各座標に対応する G の色を比の計算で求めて 1 ドットずつ塗っていく。
4.H を元にグラフィックハンドル G2 を作成する。
5.G2 を 3D ポリゴン 2 枚にし、奥行き Z を正しく設定することで台形に表示する。

元の画像が 1024*1024 をはるかに越えるほど大きく、また 2 のべき乗サイズでないため
このように面倒なことになってます^^;
もっとスマートな方法があればいいんですが・・・


302ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(400,666ポイント)   Date: 2009/08/07(金) 03:07   No:37852     
Title: Re:DrawModiGraph()関数について    
どちらが高速かは分かりませんが、2のn乗の空テクスチャを作って
それにGを縮小レンダリングすれば 4のG2を作るのに面倒な計算を
しなくても済むのではないでしょうか。


79ポイント を手に入れた。



Name: 華穂  ..中級者(9,905ポイント)   Date: 2009/08/06(木) 11:08   No:37817       
Title: ラスボス弾発射について    




今日までにBGMやSE以外のプログラムをすべて終えたくて
ここ2,3日徹夜の日々をすごしていました。

すみません、今日はまた、しばらくわからないところ・どうしていいかわからないところを
何度も書き込ませていただくかもしれません。


今詰まっているのはラスボスの弾の発射についてです。
まずはソースを。




//砲台
struct CANON
{
int C_HP;//体力は1つ16
double CanonX;
double CanonY;
//自身が生きているか
int CanonFlag;
//弾が生きているか
int TamaFlag;
int CKankaku;
int TamaX, TamaY;
};

//ボスクラス
class Boss
{
CANON Canon[5];
〜〜〜〜
};

void Boss::boss3
{
//体力がゼロより低ければ、消滅
if(Canon[i].C_HP <= 0) Canon[i].CanonFlag = 0;

if( BT3_Set == 1)
{
//敵の座標
double X,Y;
X = sin(B3Target_angle) * BSpeed;
Y = cos(B3Target_angle) * BSpeed;
Boss3X -= X;
Boss3Y -= Y;

//砲台を制御するためのs
int sX = 0,sY = 0;
if(Boss3X < 0){
Boss3X = 0;
sX = 1;
}
if(Boss3X > 640-160){
Boss3X = 640-160;
sX = 1;
}
if(Boss3Y < 0){
Boss3Y = 0;
sY = 1;
}
if(Boss3Y > 352-160){
Boss3Y = 352-160;
sY = 1;
}

for(int i = 0; i < 5; ++i){
if(sX == 0)Canon[i].CanonX -= X;
if(sY == 0)Canon[i].CanonY -= Y;
}


}

//X軸が320以上なら、左向き画像・逆なら逆画像
if(Boss3X > 320)
{
DrawGraph( (int)Boss3X, (int)Boss3Y, Boss3[0], TRUE);

}
else
{
DrawGraph( (int)Boss3X, (int)Boss3Y, Boss3[1], TRUE);
}

//砲台の数だけループしつつ、砲台を描画
for(int i = 0; i < 5; ++i)
{
if(Canon[i].CanonFlag == 1){
int a = 0;
//隙間的な意味
int p = 0;
if(Boss3X > 320){}
else{
a = 1;
p = 140+2;
}
DrawGraph((int)Canon[i].CanonX+p, (int)Canon[i].CanonY, BCanon[a],TRUE);
}
}

//攻撃
for(int i = 0; i < 5; ++i)
{
if(Canon[i].CanonFlag == 1 && Canon[i].CKankaku == 0)
{
int a = 0;
int p = 0;
if(Boss3X > 320){}
else{
a = 1;
p = 140+2;
}

Canon[i].TamaX = Boss3X+3;
Canon[i].TamaY = Boss3Y+3;
if( Boss3X > 320)
{
CMuki = 1;
}
else
{
CMuki = 0;
}
Canon[i].CKankaku = 1;
Canon[i].TamaFlag = 0;
}
if(Canon[i].CanonFlag == 1 && Canon[i].CKankaku == 1 && Canon[i].TamaFlag == 1)
{
if( CMuki = 1 )
{
Canon[i].TamaX -= BTSpeed;
}
if( CMuki = 0 )
{
Canon[i].TamaX += BTSpeed;
}

Canon[i].TamaFlag = 0;
}

//弾のフラグで持っていた場合に発射するようにしようか迷ってます。
/*if(Canon[i].TamaFlag == 1)
{
if( CMuki = 1 )
{
Canon[i].TamaX -= BTSpeed;
}
if( CMuki = 0 )
{
Canon[i].TamaX += BTSpeed;
}

Canon[i].TamaFlag = 0;

}*/
//弾が画面外に出た場合は、存在状態を保持している変数を代入する。
if(Canon[i].TamaX >= 640 || Canon[i].TamaX <= -16)
{
Canon[i].CKankaku++;
if(Canon[i].CKankaku >= KANKAKU)
{
Canon[i].TamaFlag = 0;
}
}
DrawGraph( Canon[i].TamaX, Canon[i].TamaY, BTama, TRUE);
}
}




クラスの定義の前に、構造体を作っています。
ラスボスのクラスの中に、3つのボスを書いており、関数ごとに分けております。
今は、そのラスボスを書いており、ラスボスには5つの砲台が(16掛16)そなえ
られおり、ひとつに16体力を持っています。
つまり、このラスボスは5つの砲台をすべて倒せば消滅というもので、ボス自体の動きは
ホーミング、つまり自機を追っています。
こちらには書いていませんが、角度を取る関数もまた別のところで記しています。


現在では、ボスに砲台を取り付けることに成功しました。
ボスは自分の身長ぐらい(ボス大きさ160掛160)のたてを構えており、そのたてに上下
レーザの筒と、砲台縦5つを設置しています。

レーザはまだ、書いておりません。

砲台から弾が飛び出て、間をおいて飛び出してくるように書いているのですが・・なにやらデバッカの警告
が出てきてしまって・・上記のソースになにやら書いては危ないことを書き込んでいるのですが、
それがわかりません。

また、最初に砲台があることと、弾の発射の間隔を0として弾などを設定しています。

どこか飛び出すかは・・微調整が必要なため、まだ適当な数字しか入れておりません。




ご指摘・アドバイスがほしいところは、そのデバッカの原因であるソースの一文を教えてほしいことと、
弾のフラグから発射について書きたいのだが、現段階のソースをどのように変えればいいのでしょうか?





どうぞ、よろしくお願いします。


2,065ポイント を手に入れた。


Name: ねこ  ..プログラマー(36,060ポイント)   Date: 2009/08/06(木) 11:18   No:37819     
Title: Re:ラスボス弾発射について    
とりあえず回答の前に・・・

1.ソースにはPreタグを付けて下さい
短いソースなら良いんですが、長いと読み辛いです。

2.エラー・警告について聞きたい場合はその内容を「明確」に記述して下さい
その文章じゃ何が起こってるのかさっぱり分かりません。

3.適度に寝て下さい
頭をスッキリさせないと簡単なミスを見落とします。


115ポイント を手に入れた。

Name: 華穂  ..中級者(9,971ポイント)   Date: 2009/08/06(木) 11:29   No:37820     
Title: Re:ラスボス弾発射について    




長いソースにはpreダグをつけるのですが・・・。
先ほど久しぶりに一読のところを読みました。

次からは気をつけます。



エラーですが、
デバッカの画面が開かれ、
『STG.exe[252]でハンドルされていないwin32の例外が発生しました』

と書かれた小ウインドウが開かれます。



えと、3番目に関してですが、徹夜とはいいましたが、実は先ほどまで眠さに耐え切れず寝てまして・・。
1時間前ほどに起きましたので、ある程度頭はすっきりしております。

ご迷惑をおかけして申し訳ありません。


66ポイント を手に入れた。

Name: ねこ  ..プログラマー(36,357ポイント)   Date: 2009/08/06(木) 11:57   No:37821     
Title: Re:ラスボス弾発射について    
記事の修正あるいは再投稿でPre使うだけでも良いです。

エラーについては実行中のエラーのため正確な情報が出ていない状態です。
アプローチとしては「どのタイミングで」そのエラーが落ちるかを調べます。
「起動直後」「最初に弾が撃たれた瞬間」「敵を倒した瞬間」「弾が画面外に消えた瞬間」などなど
落ちるにしてもある程度「同じタイミング」で落ちるはずです。
落ちる箇所が絞り込めればソースのどの部分を検証すればいいのか分かってきます。
こちらでは実行出来ないのでそのあたりの情報を頂ければ解決しやすくなります。

<3番
まぁ2,3日徹夜で〜とか書かれてるとつい「ただの見落としなんじゃない?」と思われるので書いただけです。


297ポイント を手に入れた。

Name: 夢夢  ..かけだし(2,224ポイント)   Date: 2009/08/06(木) 19:38   No:37831     
Title: Re:ラスボス弾発射について    

//砲台
struct CANON
{
int C_HP;//体力は1つ16
double CanonX;
double CanonY;
//自身が生きているか
int CanonFlag;
//弾が生きているか
int TamaFlag;
int CKankaku;
int TamaX, TamaY;
};

//ボスクラス
class Boss
{
CANON Canon[5];
〜〜〜〜
};

void Boss::boss3
{
//体力がゼロより低ければ、消滅
if(Canon[i].C_HP <= 0) Canon[i].CanonFlag = 0;

if( BT3_Set == 1)
{
//敵の座標
double X,Y;
X = sin(B3Target_angle) * BSpeed;
Y = cos(B3Target_angle) * BSpeed;
Boss3X -= X;
Boss3Y -= Y;

//砲台を制御するためのs
int sX = 0,sY = 0;
if(Boss3X < 0){
Boss3X = 0;
sX = 1;
}
if(Boss3X > 640-160){
Boss3X = 640-160;
sX = 1;
}
if(Boss3Y < 0){
Boss3Y = 0;
sY = 1;
}
if(Boss3Y > 352-160){
Boss3Y = 352-160;
sY = 1;
}

for(int i = 0; i < 5; ++i){
if(sX == 0)Canon[i].CanonX -= X;
if(sY == 0)Canon[i].CanonY -= Y;
}

}

//X軸が320以上なら、左向き画像・逆なら逆画像
if(Boss3X > 320)
{
DrawGraph( (int)Boss3X, (int)Boss3Y, Boss3[0], TRUE);
}
else
{
DrawGraph( (int)Boss3X, (int)Boss3Y, Boss3[1], TRUE);
}

//砲台の数だけループしつつ、砲台を描画
for(int i = 0; i < 5; ++i)
{
if(Canon[i].CanonFlag == 1){
int a = 0;
//隙間的な意味
int p = 0;
if(Boss3X > 320){}
else{
a = 1;
p = 140+2;
}
DrawGraph((int)Canon[i].CanonX+p, (int)Canon[i].CanonY, BCanon[a],TRUE);
}
}

//攻撃
for(int i = 0; i < 5; ++i)
{
if(Canon[i].CanonFlag == 1 && Canon[i].CKankaku == 0)
{
int a = 0;
int p = 0;
if(Boss3X > 320){}
else{
a = 1;
p = 140+2;
}

Canon[i].TamaX = Boss3X+3;
Canon[i].TamaY = Boss3Y+3;
if( Boss3X > 320)
{
CMuki = 1;
}
else
{
CMuki = 0;
}
Canon[i].CKankaku = 1;
Canon[i].TamaFlag = 0;
}
if(Canon[i].CanonFlag == 1 && Canon[i].CKankaku == 1 && Canon[i].TamaFlag == 1)
{
if( CMuki = 1 )
{
Canon[i].TamaX -= BTSpeed;
}
if( CMuki = 0 )
{
Canon[i].TamaX += BTSpeed;
}

Canon[i].TamaFlag = 0;
}

//弾のフラグで持っていた場合に発射するようにしようか迷ってます。
/*if(Canon[i].TamaFlag == 1)
{
if( CMuki = 1 )
{
Canon[i].TamaX -= BTSpeed;
}
if( CMuki = 0 )
{
Canon[i].TamaX += BTSpeed;
}

Canon[i].TamaFlag = 0;

}*/
//弾が画面外に出た場合は、存在状態を保持している変数を代入する。
if(Canon[i].TamaX >= 640 || Canon[i].TamaX <= -16)
{
Canon[i].CKankaku++;
if(Canon[i].CKankaku >= KANKAKU)
{
Canon[i].TamaFlag = 0;
}
}
DrawGraph( Canon[i].TamaX, Canon[i].TamaY, BTama, TRUE);
}
}



757ポイント を手に入れた。

Name: 華穂  ..中級者(10,147ポイント)   Date: 2009/08/06(木) 20:49   No:37834 解決!     
Title: Re:ラスボス弾発射について    



なるほど・・・そのようにして、使うのですね。
ねこ様、ありがとうございます。
それらの情報をこれから調べてみたいと思います。


また、実は今はまだ完ぺきにひとつだけ分からないところがあるのですが・・
そこは今から調整をかけて、なんとかできたらいいなぁと思っていますが、もしかしたら
こちらでまた書き込みさせていただくかもしれません。
その時はどうぞよろしくお願いします。



えと・・夢夢様はどうしたのでしょうか?
私の眼が間違っているのか・・同じプログラムに見えるのですが・・。







176ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(400,259ポイント)   Date: 2009/08/06(木) 23:16   No:37843     
Title: Re:ラスボス弾発射について    

>私の眼が間違っているのか・・同じプログラムに見えるのですが・

 きっと見やすくなるよう整形してくれたのだと思います。


69ポイント を手に入れた。



Name: はね  ..中級者(12,323ポイント)   Date: 2009/08/05(水) 22:06   No:37782       
Title: 空間ベクトルをのばす    
いつもお世話になっております。
基礎的なことだとは思いますが、詰まってしまって質問させてください。


三次元ベクトルABがあります。

ベクトルABをdだけ伸ばした先の点Cを求めるにはどうしたらいいのでしょうか?
ABCは直線上にあります。

図(?)を書くと以下のようになり、点Cを求めたいです。
A→B→→C 

d

どうか教えて頂きたいです。
よろしくお願いします。


203ポイント を手に入れた。


Name: lbfuvab  ..上級者(21,439ポイント)   Date: 2009/08/05(水) 22:18   No:37783     
Title: Re:空間ベクトルをのばす    
vec(AB)をAからBまでのベクトルとします。
vec(OC) = vec(OA) + 3*vec(AB)

vec(AB) = vec(OB) - vec(OA)

です。
後は頑張って下さい。


76ポイント を手に入れた。

Name: lbfuvab  ..上級者(21,488ポイント)   Date: 2009/08/05(水) 22:26   No:37786     
Title: Re:空間ベクトルをのばす    
すいません。
d進んだ点でしたね。

vec(OC) = vec(OB) + d/abs(vec(AB))*vec(AB)

ですね。


49ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(400,190ポイント)   Date: 2009/08/06(木) 02:37   No:37796     
Title: Re:空間ベクトルをのばす    

>点Cを求めたいです

 ベクトル ABの単位ベクトルを求めて、d倍し、点Bにそれを足せばいいんじゃないでしょうか。


69ポイント を手に入れた。

Name: lbfuvab  ..上級者(21,654ポイント)   Date: 2009/08/06(木) 05:48   No:37804     
Title: Re:空間ベクトルをのばす    
う〜ん我ながら計算順序が見づらい・・・
分かりやすく書くと、
vec(OC) = vec(OB) + ( d * abs(vec(AB)) ) * vec(AB)

ちなみにベクトルの絶対値はベクトルの長さです。


50ポイント を手に入れた。

Name: sizuma [URL]  ..中級者(12,068ポイント)   Date: 2009/08/06(木) 05:57   No:37806     
Title: Re:空間ベクトルをのばす    
>vec(OC) = vec(OB) + ( d * abs(vec(AB)) ) * vec(AB)

えっと、こうじゃないですか??
d * (vec(AB) / abs(vec(AB))
つまりはJustyさんの

>ベクトル ABの単位ベクトルを求めて、d倍し、点Bにそれを足せばいいんじゃないでしょうか。

ってことですよね


66ポイント を落としてしまった。

Name: はね  ..中級者(12,463ポイント)   Date: 2009/08/06(木) 21:57   No:37837 解決!     
Title: Re:空間ベクトルをのばす    
lbfuvab様
Justy様
sizuma様
返事が遅くなり申し訳ありません。

早速実装してみました。
きちんとラインが引けていました。
(遅れましたが、計測ソフトのライン表示に使用するつもりでした。)

vecBCのノルム=dにもなっておりました。

ありがとうございました。
またよろしくお願い致します。


140ポイント を手に入れた。



Name: ラグ  ..入門者(3,682ポイント)   Date: 2009/08/06(木) 19:33   No:37830       
Title: 龍神録46・47章がビルド出来ない件について    
いつも助けてもらってばかりのラグです。
お世話になっております。

龍神録の46章および47章がコンパイルエラーで通りません。
エラーログは以下のとおりです。


1>graph.obj : error LNK2019: 未解決の外部シンボル "int __cdecl DrawRotaGraphFdF(float,float,double,double,int,int,int)" (?DrawRotaGraphFdF@@YAHMMNNHHH@Z) が関数 "void __cdecl boss_assist_img(void)" (?boss_assist_img@@YAXXZ) で参照されました。
1>C:\Documents and Settings\USER1\デスクトップ\STG\MyProject\47章\Debug\RyuJin.exe : fatal error LNK1120: 外部参照 1 が未解決です。



46章および47章以外で50章までのものは全て通るようです。
ググってみたりもしましたが、どうも原因がわかりません。
どなたかこれを解決する方法を教えて頂けないでしょうか。
よろしくお願いします。


360ポイント を手に入れた。


Name: ねこ  ..プログラマー(36,594ポイント)   Date: 2009/08/06(木) 19:45   No:37832     
Title: Re:龍神録46・47章がビルド出来ない件について    
原因を追究されてるようなので、こういう場合の対処法等を書いてみます。
「未解決の外部シンボル」とエラー分にある場合、
「その先の処理名(関数名等)がありませんよ」と言われています。
この場合「DrawRotaGraphFdF」関数が無いといわれている状態です。

また関数でこのエラーが出る場合、原因は2通りあります。
1.関数が定義されていない
2.関数を呼び出す際の引数の個数、または型が異なる

上記の内容からVisualStudioであれば、検索機能を用いて関数名を検索し、見つかった場合は引数の確認を。
見つからない場合は参考にしているページで処理の有無を確認しましょう。

恐らくそれで解決すると思います。


237ポイント を手に入れた。

Name: ラグ  ..入門者(4,175ポイント)   Date: 2009/08/06(木) 21:03   No:37835 解決!     
Title: Re:龍神録46・47章がビルド出来ない件について    
>ねこさん
色々調べましたところ、Dxlib.h内の「DrawRotaGraphF」が「DrawRotaGraphFdF」に置き換わっていて、これを元に戻すとコンパイルが通りました。
龍神録プログラムの館第46章(http://dixq.net/rp/46.html)の指示通りに進めてきたのですが、このページの中ほどにある記述


ここは「置換」という機能を使いましょう。

graph.cpp内にある

+FX
+FY
+dn.x
+dn.y

これらを全て消してください。

置換ウィンドウを出して、検索文字列に上記を書き、置換する部分に何も書かなければよいです。

次に同様にgraph.cpp内の以下を

DrawRotaGraphF → DrawRotaGraphFdF

DrawModiGraphF → DrawModiGraphFdF

このように置換します。



ここで、どうやらソリューション全てのDrawRotaGraphFおよびDrawModiGraphFを置換してしまったため、Dxlib.h内の関数にも悪影響を及ぼし、エラーが発生していたようです。
記述をちゃんと読まなかった私のうっかりミスでした。お恥ずかしい限りです…。

今回はちゃんと原因をつきとめることが出来ました。次からはちゃんと本文読みます。
ご指導誠にありがとうございました。


493ポイント を手に入れた。



Name: kai  ..入門者(3,727ポイント)   Date: 2009/08/06(木) 13:51   No:37823       
Title: ボスと自機の当たり判定にて発生したバグ    
改造龍神録でボスと自機が接触したときの当たり判定をつけました。
ただ、ボスの最初の弾幕は当たり判定は存在し、大丈夫なのですが
次の弾幕以降は当たり判定が消えてしまい、
接触しても自機が死にません。
どうしたら当たり判定が消えないようになるのか
ソースを一部公開するので、どこを直したらいいかアドバイスお願いします。

out.cpp

//自機とボスが当たったかどうかを判定する
int out_judge_boss(){
//int j;
if(boss.cnt>0){//敵の軌道が1度でも計算されていたら
double x=boss.x-ch.x;//敵と自機ショットとの距離
double y=boss.y-ch.y;

//敵の当たり判定と自機ショットの当たり判定の合計範囲
double r=boss_info[boss.knd].range+CRANGE;
}
}




921ポイント を手に入れた。


Name: yu  ..プログラマー(37,515ポイント)   Date: 2009/08/06(木) 14:05   No:37824     
Title: Re:ボスと自機の当たり判定にて発生したバグ    
double r=boss_info[boss.knd].range+CRANGE;

ここで、最初は boss.knd は 0 ですが
弾幕を一つ終わらせると boss.knd はカウントアップされて 1 になりますので
boss_info[1] の値が使われているのが原因だと思います

double r=boss_info[0].range+CRANGE;
で良いかもしれません


100ポイント を落としてしまった。

Name: kai  ..入門者(3,788ポイント)   Date: 2009/08/06(木) 14:25   No:37826 解決!     
Title: Re:ボスと自機の当たり判定にて発生したバグ    
boss.kndが原因でしたか・・
解説付きのアドバイスありがとうございます!おかげで直りました!
yuさんありがとうございます!


61ポイント を手に入れた。



Name: 研修生  ..中級者(11,123ポイント)   Date: 2009/08/05(水) 19:33   No:37774       
Title: Invalidate    
MFCのVC++6.0で開発しています。
ダイアログ内をリサイズしてコントロールなど再配置するというプログラムを作っています。
コントロールを移動させInvalidateで再描画する。

普段ならこれでいいのですがダイアログ内の一部コントロールにおいて再描画したくないものもあるので
全体を再描画するのはまずいです。部分的に排除した画面全体を再描画する方法か
1つのコントロールだけにおいて再描画する方法を教えて下さい。


107ポイント を手に入れた。


Name: バグ  ..ハッカー(164,088ポイント)   Date: 2009/08/05(水) 20:35   No:37777     
Title: Re:Invalidate    
逆に質問で申し訳ないのですが、やりたい事は『再描画したくない』のですか?『表示したくない』のですか?
質問を読んでも、いまいち、やりたい事が伝わってこないものでして…ピンとこないんですよね。


96ポイント を手に入れた。

Name: 研修生  ..中級者(11,323ポイント)   Date: 2009/08/05(水) 22:18   No:37784     
Title: Re:Invalidate    
ダイアログ上にリストビュー1個とボタン2個があってサイズに合わせてコントロール配置するのですが
画面全体を再描画してしまうとリストビューのところがちかちかするんですよね。
必要なのはボタン2個の再描画なんです。ダイアログ内のリストビュー以外の箇所の再描画か
もしくはボタンの移動した箇所の再描画がしたいです。

質問の答えとしてはリストビューの所の再描画をしたくない でしょうか


2倍のポイントを手に入れた! 200ポイント を手に入れた。

Name: バグ  ..ハッカー(164,135ポイント)   Date: 2009/08/05(水) 23:11   No:37790     
Title: Re:Invalidate    
そういうことでしたか。
それでしたら、InvalidateRect関数を使って、再描画したいエリアだけを指定して再描画してやればいいと思います。


47ポイント を手に入れた。

Name: 研修生  ..中級者(11,216ポイント)   Date: 2009/08/06(木) 09:24   No:37807     
Title: Re:Invalidate    
それもやったんですが私の考え方がおかしいのかもしれません。例えばOKボタンのメンバ変数をm_OKとします。
OnSize関数内で
SetWindowPosで移動させ
CRect rect;
m_OK.GetClientRect(&rect);//領域確保
InvalidateRect(&rect, TRUE);

としても全く変化がなくリサイズするとコマ送りようにOKボタンの残像が・・
どこがおかしいのでしょうか


107ポイント を落としてしまった。

Name: バグ  ..ハッカー(164,270ポイント)   Date: 2009/08/06(木) 10:08   No:37809     
Title: Re:Invalidate    
それでは…

CRect rect;
m_OK.GetClientRect(&rect);

/* この位置でrectの中身を書き換えて座標を移動させる*/

m_OK.MoveWindow(&rect, TRUE);


これではどうでしょうか?
CButtonクラスのMoveWindow関数を使用して移動させ、第2引数をTRUEにする事で、m_OKを再描画させています。


135ポイント を手に入れた。

Name: 研修生  ..中級者(11,259ポイント)   Date: 2009/08/06(木) 10:15   No:37810     
Title: Re:Invalidate    
書き忘れてしまいました・・
MoveWindowは使わないように言われています。
MoveWindowでのやり方はできているんですが用意している関数の方を使うよういわれています


43ポイント を手に入れた。

Name: バグ  ..ハッカー(164,770ポイント)   Date: 2009/08/06(木) 10:29   No:37811     
Title: Re:Invalidate    
あ、それから追記ですが…

残像が残るのは移動させた後の領域を再描画しているからでしょう。
「移動させる前」と「移動させた後」の領域で重なっていない部分が再描画されずに残っているのが原因です。
ですから、研修生さんの方法でやりたいのならば、「移動させる前」と「移動させた後」の両方の領域を再描画させる必要があります。


>>m_OK.GetClientRect(&rect);//領域確保
>>InvalidateRect(&rect, TRUE);

それから、この書き方では、m_OKのクライアント領域を取得しているのに、そのまま親オブジェクト(今回の場合はダイアログクラスでしょうか?)のInvalidateRect関数の引数へ使用しています。これはマズイのではないでしょうか?

この方法でやりたいのならば…


CRect rect;
m_OK.GetClientRect(&rect); // OKボタンのクライアント座標を取得
m_OK.ClientToScreen(&rect); // クライアント座標をスクリーン座標に変換
this->ScreenToClient(&rect); // OKボタンのスクリーン座標をダイアログのクライアント座標へ変換
this->InvalidateRect(&rect); // 指定領域を再描画


こんな感じでしょうか?


500ポイント を手に入れた。

Name: バグ  ..ハッカー(164,818ポイント)   Date: 2009/08/06(木) 10:31   No:37812     
Title: Re:Invalidate    
>>MoveWindowでのやり方はできているんですが用意している関数の方を使うよういわれています

用意している関数というのは、何のことでしょうか?


48ポイント を手に入れた。

Name: 研修生  ..中級者(11,349ポイント)   Date: 2009/08/06(木) 10:40   No:37814     
Title: Re:Invalidate    
社員みんなで1つの製品を作ってますがその中で社員が使いやすいようにと独自に用意した
関数です。その関数内にSetWindowPosがありました。


2倍のポイントを手に入れた! 90ポイント を手に入れた。

Name: バグ  ..ハッカー(164,847ポイント)   Date: 2009/08/06(木) 10:42   No:37815     
Title: Re:Invalidate    
これまでの話を総括すると、その関数は単純に座標を移動させるだけで再描画はしてくれないという解釈でよろしいですか?

29ポイント を手に入れた。

Name: バグ  ..ハッカー(165,156ポイント)   Date: 2009/08/06(木) 10:53   No:37816     
Title: Re:Invalidate    
MoveWindowが使えれば楽なんですが、事情があるなら仕方ないですね。
ちょっと、汚いソースになってしまいましたが…こんな感じかな?
同じ様な処理をいている個所を関数化すればスッキリするかもしれませんね。

// 移動前の座標を保持する
CRect rect1;
m_OK.GetWindowRect(&rect1); // OKボタンのスクリーン座標を取得
this->ScreenToClient(&rect1); // OKボタンのスクリーン座標をダイアログのクライアント座標へ変換

// 移動後の座標を保持する
CRect rect2;

/* ここで移動処理を行う */

m_OK.GetWindowRect(&rect2); // OKボタンのスクリーン座標を取得
this->ScreenToClient(&rect2); // OKボタンのスクリーン座標をダイアログのクライアント座標へ変換

// 再描画を行う
this->InvalidateRect(&rect1); // 移動前の領域を再描画する
this->InvalidateRect(&rect2); // 移動後の領域を再描画する


309ポイント を手に入れた。

Name: 研修生  ..中級者(11,392ポイント)   Date: 2009/08/06(木) 11:15   No:37818 解決!     
Title: Re:Invalidate    
なるほど、原因はわかりました。まだ曖昧な理解ですがここからは自分で考える所だと思いますので
頑張ってみます。ありがとうございました。


43ポイント を手に入れた。



Name: Eda  ..ぴよぴよ(474ポイント)   Date: 2009/08/04(火) 10:44   No:37712       
Title: 数値計算(コンパイルエラー)    
数値計算によってある移動距離を計算します。
以下はそのプログラムソースの一部です

#include <stdio.h>
#include <math.h>
#define B=3600
#define Q=10
double main(void)
{
int C0,LA,LB,i,PN,TH,IT,Irep,Tmax,SRTM,DT,SRT,M1,JP,PB,PN1,IK0,JJ,start,IK
double N[B],GZ[B],VJV[B],X[B],X0[B],GZ0[B]
double MV[B],DCAL[B],X0[B],JVINT[B],VJVT[B],XT[B],VFLUX[B]
double U0,H,K,KD0[Q],KD1[Q],KD2[Q],KD3[Q],KD4[Q],KV0[Q],KV1[Q],KV2[Q]
double R0[Q],R01[Q],R2[Q],R3[Q],R4[Q],R5[Q],NL[Q],NLC[Q],NH[Q],NHC[Q],H[Q],JPN[Q]


生じたエラーは以下のとおりです
Error E2141 ****.c 8: Declaration syntax error in function main
Warning W8070 ****.c 174: Function should return a value in function main
この8行目で生じるエラーを解決する方法を教えて頂けませんか?
使用したコンパイラはbccです。

なお、それぞれの行末に;がついてませんが、これを付けると
Error E2188 ****.c 10: Expression syntax in function main
Error E2290 ****.c 174: Array bounds missing ] in function main
というエラーが新しく付け加わるため;は付けていません。


474ポイント を手に入れた。


Name: MNS  ..中級者(13,605ポイント)   Date: 2009/08/04(火) 10:55   No:37713     
Title: Re:数値計算(コンパイルエラー)    
確実ではありませんが、
Declaration syntax error in function main
→mainの返り値をintにする
Function should return a value in function main
→これは値を返していないから

あと、定数がおかしいです
#define B=3600
#define Q=10
これは、
#define B 3600
#define Q 10
こうすべきです。

そうすれば、行末に;をつけても大丈夫なはずです。


161ポイント を落としてしまった。

Name: Eda  ..ぴよぴよ(532ポイント)   Date: 2009/08/04(火) 12:08   No:37715 解決!     
Title: Re:数値計算(コンパイルエラー)    
MNSさん、返信ありがとうございます。

=をつけなければ行末に;を付けなくても良いとは知りませんでした。

ありがとうございました。


58ポイント を手に入れた。

Name: MNS  ..中級者(13,714ポイント)   Date: 2009/08/04(火) 19:12   No:37723     
Title: Re:数値計算(コンパイルエラー)    
いえ、行末に;は付けなければいけません。
そもそも、#defineは
#define 定数名 値
となるので、=を付けるとおかしなことになります。
ですから、mainの戻り値をintにし、#defineの=を除いて、
行末にセミコロンをつければ、コンパイルエラーは出ないはずです。


109ポイント を手に入れた。

Name: Eda  ..ぴよぴよ(593ポイント)   Date: 2009/08/06(木) 10:37   No:37813 解決!     
Title: Re:数値計算(コンパイルエラー)    
重ね重ねありがとうございます。

プログラムは大学で少し習っただけなので
このように親切に教えていただくと勉強がはかどります。


61ポイント を手に入れた。



Name:  ..ぴよぴよ(98ポイント)   Date: 2009/08/06(木) 01:01   No:37793       
Title: ファイル作成    
ファイルを作成するプログラムを作っています。

ユーザーにファイル名を入力していただき、
そのファイル名でファイルを作成したいのですが、

char a

の中にファイル名を入力したとき

どのようにすれば
入力されたファイル名でファイルが作成されるのでしょう?


98ポイント を手に入れた。


Name: sizuma [URL]  ..中級者(11,896ポイント)   Date: 2009/08/06(木) 02:56   No:37797     
Title: Re:ファイル作成    

>どのようにすれば
>入力されたファイル名でファイルが作成されるのでしょう?

C言語、コンソールでいいのでしょうか?
書き込みモードでオープンすれば勝手に作られます。
ちなみにchar型の中には一文字しか入りませんが・・・・
文法は大丈夫でしょうか?


74ポイント を手に入れた。

Name:  ..ぴよぴよ(78ポイント)   Date: 2009/08/06(木) 03:25   No:37798     
Title: Re:ファイル作成    
fp = fopen("*a","w")
ということでしょうか?


20ポイント を落としてしまった。

Name: sizuma [URL]  ..中級者(12,049ポイント)   Date: 2009/08/06(木) 03:56   No:37799     
Title: Re:ファイル作成    
fopen(char *,"モード")です。

fp = fopen("*a","w") だと
*aというファイルを作ります。(*というファイル名は使えないと思いますが・・・)

もう一度言いますが、char型だと一文字しか格納できないですよ?
ユーザーに一文字だけ入力してもらうんですか?
どうしてもaに格納されてる一文字が使いたいなら

char str[] = {'\0','\0',} ;
str[0] = a;
fp = fopen(str,"w");

でしょうか?動作は確認してませんが;
というか今更ながらtxtの書き込みでファイルを作ってよかったのでしょうか?


153ポイント を手に入れた。

Name:  ..ぴよぴよ(134ポイント)   Date: 2009/08/06(木) 04:28   No:37800     
Title: Re:ファイル作成    
いや一文字ではないです。
すみません。

その場合は
char a[100];

scanf("%s",&a)
でいいんですよね?


56ポイント を手に入れた。

Name:  ..ぴよぴよ(296ポイント)   Date: 2009/08/06(木) 04:47   No:37801     
Title: Re:ファイル作成    
こんな感じでいいんですかね?


#include <stdio.h>
#include <conio.h>

int main()
{
int i = 0;
int x = 0;
int y = 0;
char a[100];
char str[] = {'\0','\0',};
FILE *fp;

printf("ファイル作成\n");
printf("ファイル名を入力してください。\n\n");
printf("ファイル名:");
scanf("%s",&a);

i = strlen(a);

while(y < i)
{
str[x] = a[y];

y++;
x++;
}

fp = fopen(str,"w");
fputs("テスト",fp);
fclose(fp);

getch();
}


162ポイント を手に入れた。

Name: sizuma [URL]  ..中級者(12,104ポイント)   Date: 2009/08/06(木) 05:43   No:37802     
Title: Re:ファイル作成    
実行環境はないのでしょうか?
実行してみて、エラーからデバッグしてみては?

>その場合は
>char a[100];
>scanf("%s",&a)
>でいいんですよね?

違います。急ぎの課題などでないのであれば、ポインタ、文字列、scanfの仕様等じっくり復習したほうがいいと思いますよ



55ポイント を手に入れた。

Name: non  ..熟練のプログラマー(59,578ポイント)   Date: 2009/08/06(木) 09:37   No:37808     
Title: Re:ファイル作成    
>char str[] = {'\0','\0',};
strは何をしたいのでしょうか?



23ポイント を手に入れた。



Name: ラグ  ..入門者(2,934ポイント)   Date: 2009/08/05(水) 01:42   No:37736       
Title: 龍神録34章について 他    
いつもお世話になっております。

引き続き34章まで進めたのですが、ここでひどく躓きました。
色々と不具合があり、落としたプロジェクトを見ながら修正してきましたが、どうしてもわからない部分があったので質問させてください。


1.レーザーの当たり判定
34章のレーザーが始まり、当たり判定が発生し始める瞬間に、自機がどこにいても必ず被弾します。
ボムを使って出始めだけ凌げば、あとは設計通りの挙動を示すようです。
この当たり判定を、落としたプロジェクトの34章と同じように正しく動かしたいのですが、どのようにすればいいのか検討がつきません。
関係ありそうなout_lazer.cppやshot.cppもくまなくチェックしたつもりですが、どうしても直りません。
過去ログにも同じような質問がありましたが、具体的な回答は記載されていませんでした。
もし宜しければ、ご教授願えないでしょうか。

2.自作エフェクトが表示されない
敵雑魚が死ぬときに衝撃波を出すエフェクトを自作しました。
しかし、34章レーザーの作業を進めていくうちに、この衝撃波エフェクトが表示されていないことに気づきました。
いつから表示されていないのか正確には覚えていませんが、ボスを実装する前までは確実に表示されていました。
初期化、画像のロード、エフェクトの登録・計算・描画全てチェックしましたが、原因が見つかりません。
これについても、もしわかることがあれば教えてください。

3・ステージカウンタが少しだけ多く加算される
34章レーザーに取り掛かるまでは、決められたステージカウンタ丁度にボスが出現していました。
しかし、34章以降になると、例えばステージカウント600でボスが出るところを、何故か602で出現するようになりました。
大した影響はなさそうではありますが、気になります。


質問は以上の3つになります。
ちなみに、自分で追加した要素として
・メニュー、自機・武装選択(機体2種、武装各2種の計4種類で、それぞれ少しずつ設定やショット、ボムなどを変えてあります)
・先述の衝撃波エフェクト他、オリジナルのボム2種類
・サンプルプログラムにあった、川のきらめきを再現する背景
・スクロール速度を通常のカウントよりも遅くできる関数
などがあります(思い出せないだけで他にもあるかもしれません)。
それぞれシステムにあまり干渉しないように心がけてきたつもりではありますが、何か変なことになっているのかもしれません。

自分で改造したプロジェクトは以下UPLにうpしました。
http://www.dotup.org/uploda/www.dotup.org6134.lzh.html
pass:ryujin
環境はXPでVC++2008EEです。

とにかく何か思い当たることなどありましたら、是非教えてください。
よろしくお願い致します。


748ポイント を手に入れた。


Name: pooka [URL]  ..中級者(12,153ポイント)   Date: 2009/08/05(水) 14:06   No:37761     
Title: Re:龍神録34章について 他    
>1.レーザーの当たり判定
>34章のレーザーが始まり、当たり判定が発生し始める瞬間に、自機がどこにいても必ず被弾します。
これは私もなりました。
当時いろいろ調べてみたんですが原因がわかりませんでした。
今調べてみると、当たり判定が発生し始めた時、shot.cppにあるlazer_calc関数の「あたり範囲を設定」のところで
lazer[i].haba*lazer[i].hantei

lazer[i].length*lazer[i].hantei
の計算が0になって、全体の計算結果がx,yそれぞれ同じ値になっているようです。

lazer[i].haba、lazer[i].hantei、lazer[i].lengthの値はそれぞれ
30.000000000000000、0.50000000000000000、240.00000000000000
となっていたので0にはならないと思うんですが…

一応out_lazer.cppのhitjudge_square_and_circle関数内の「長方形の中に物体が入り込んでいるかどうかを判定」のところで
if(0<=theta && theta<=PI/2 && 0<=theta2 && theta2<=PI/2)

if(0<theta && theta<=PI/2 && 0<theta2 && theta2<=PI/2)
とすれば、被弾しないようになると思います。


>2.自作エフェクトが表示されない
out.cppでenter_shockwave関数を呼んでいないからではないでしょうか。
enemy_death_judge関数のenter_del_effect(s);の上か下あたりでenter_shockwave(s);とすれば表示されると思います。


>3・ステージカウンタが少しだけ多く加算される
boss_shot.cppのboss_shot_main関数で
>if(stage_count==boss.appear_count[0]+2 && boss.flag==0){//開始時間なら
となっているので赤字を取り除けば600でボスが出てくると思います。


462ポイント を手に入れた。

Name: ラグ  ..入門者(3,091ポイント)   Date: 2009/08/05(水) 18:12   No:37767 解決!     
Title: Re:龍神録34章について 他    
>pookaさん
ご指摘頂いた箇所を直すと、確かにちゃんと動くようになりました。

1.は不思議ではありますが、とりあえずこれで先に進みたいと思います。
34章は直さなくてもちゃんと動くのに…

2.はうっかりミスですね。
以後は登録にも気をつけたいと思います。

3.も原因がわかってすっきりしました。
ただ、34章もよく見るとカウントが+2されてますね…意図がわかりませんが、とりあえず置いておこうと思います。

的確なご指導、本当にありがとうございました。
これからも精進致します。


157ポイント を手に入れた。



Name: dic  ..プログラマー(29,609ポイント)   Date: 2009/08/03(月) 04:03   No:37666       
Title: シングルトンパターンの破棄    
デザインパターンの一種 シングルトンパターンについて質問です

クラスA にコンストラクタ、デストラクタを定義し、クラスAにシングルトンパターンを適用すると
デストラクタが呼ばれなかったので、メソッドRelease() を追加し、その中で明示的にdelete したら
うまくデストラクタが動作しました

このように、シングルトンパターンでは明示的に _instance を delete しないとデストラクタは
呼ばれないのでしょうか?

私の考えでは、return 0; のところで クラスAのデストラクタが呼ばれると予想していたのですが
どうも違ったようでした


#include <stdio.h>

class A
{
static A* _instance;
public:
A();
~A();
static A* Instance();
void Show();
void Release();
};

A* A::_instance = 0;
A* A::Instance() {
if( _instance == 0 ) {
_instance = new A;
}
return _instance;
}
A::A() {
printf( "A construct.\n" );
}
A::~A() {
FILE *file = fopen( "destruct.txt", "wt" );
fputs( "destruct called.\n", file );
fclose( file );
printf( "A destruct.\n" );
}
void A::Show() {
printf( "A::Show call.\n" );
}
void A::Release() {
FILE *file = fopen( "release.txt", "wt" );
fputs( "release called.\n", file );
fclose( file );

// 明示的にdeleteする
delete _instance;
_instance = 0;
}

int main()
{
A::Instance()->Show();
A::Instance()->Release();

return 0;
}



71ポイント を手に入れた。


Name: array [URL]  ..熟練のプログラマー(54,182ポイント)   Date: 2009/08/03(月) 06:57   No:37667     
Title: Re:シングルトンパターンの破棄    
質問されている内容からずれてしまいますが、気になったので・・・
シングルトンパターンは、プログラム全体でただ1つしか存在しないことを保証するというものらしいですので、コンストラクタ、コピーコンストラクタなどのアクセスは「private」にして禁止しておくべきだと思います。


備考URL:http://www.geocities.jp/ky_webid/design_pattern/009.html


166ポイント を手に入れた。

Name: kazuoni [URL]  ..比類無きプログラマー(96,590ポイント)   Date: 2009/08/03(月) 08:49   No:37669     
Title: Re:シングルトンパターンの破棄    
恐らく動的確保しているからではないでしょうか?
(間違っていたらすみません)
環境によっては、プログラム終了時に動的確保した変数を解放することもあるかと思いますが・・・。

やはり、ユーザーが解放しなければならないかと。

>私の考えでは、return 0; のところで クラスAのデストラクタが呼ばれると予想していたのですが
確か、スコープを抜けるときだったと思うので、
voidの時もデストラクタは呼ばれます。(もしかしたら環境によろのかな・・・?)
#include<iostream>

using namespace std;

class A{
public:
A(){cout << "A construter" << endl;}
~A(){cout << "A destructer" << endl;}
};
void func()
{
A a;
}

int main()
{
func();
return 0;
}


>コンストラクタ、コピーコンストラクタなどのアクセスは「private」にして禁止しておくべきだと思います。
自分も同感です。
っというか、普通に生成できちゃったら、シングルトンパターンの意味がないですからね^^;


388ポイント を手に入れた。

Name: たかぎ [URL]  ..ハッカー(110,227ポイント)   Date: 2009/08/03(月) 09:27   No:37671     
Title: Re:シングルトンパターンの破棄    
シングルトンにするなら、普通はこんなかんじでしょう。

class A
{
private:
A();
~A();

A(const A&);
A& operator=(const A&);
public:
static A* Instance()
{
static A a;
return &a;
}
void Show();
};


ただし、マルチスレッド対応を考える場合はこれではすみません。


131ポイント を手に入れた。

Name: dic  ..プログラマー(29,813ポイント)   Date: 2009/08/03(月) 17:18   No:37680 解決!     
Title: Re:シングルトンパターンの破棄    
arrayさん kazuoniさん たかぎさん
回答ありがとうございます

そういう使い方もあるんですね
私の持っている参考書が古いのかもしれません
ちなみに これですが
http://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%86%8D%E5%88%A9%E7%94%A8%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF-%E3%82%AC%E3%83%B3%E3%83%9E/dp/4797311126/ref=sr_1_2?ie=UTF8&s=books&qid=1249287214&sr=8-2
発売日が1999年ですね

もっと深く追求すると色々でてくるかもしれないですね

今回の場合は特に制約などないので明示的にRelease()を作って呼び出すことにします


204ポイント を手に入れた。

Name: YuO  ..プログラマー(32,293ポイント)   Date: 2009/08/04(火) 00:38   No:37701     
Title: Re:シングルトンパターンの破棄    
GoF本はパターンのカタログであって,実装方法のカタログではないですからね。

Modern C++ Designなんかでは,C++におけるSingletonの実装についての話があります。
http://www.amazon.co.jp/dp/4894714353/
たかぎさんの書かれた,マルチスレッドの考慮の話や,破棄後にアクセスがあったらどうするか,などの話も載っています。


2倍のポイントを手に入れた! 228ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(400,566ポイント)   Date: 2009/08/04(火) 00:39   No:37702     
Title: Re:シングルトンパターンの破棄    

>このように、シングルトンパターンでは明示的に _instance を delete しないとデストラクタは
>呼ばれないのでしょうか

 この質問は前回のスレで解決していたものと思いましたが、
内部的に newで生成しているシングルトンクラスは、deleteを行う Release関数を
作成しておき、newした段階で std::atexitを使ってそれを呼び出すように作っておけば、
明示的に Release()を呼ばなくてもプログラム終了時に解放してくれます。


163ポイント を手に入れた。

Name: dic  ..プログラマー(29,930ポイント)   Date: 2009/08/04(火) 06:25   No:37707     
Title: Re:シングルトンパターンの破棄    
>Justyさん
前回の回答ありがとうございました
しかしながら私の理解不足により、飛ばしていました
具体的に言うと std::atexit 関数が プログラムがアンロードされるのに
何によって管理されているのか、どのように動作するのかがが理解できてませんでした

return 0; よりも後に実行されるのか?kernel.dllが管理してるのか?
Windowsのイベントドリブン処理方式ならなのかなど具体的なイメージが沸きませんでしたので
もうしわけありませんでした


117ポイント を手に入れた。

Name: dic  ..プログラマー(29,975ポイント)   Date: 2009/08/04(火) 06:31   No:37708     
Title: Re:シングルトンパターンの破棄    
>YuOさん
参考書を教えていただきありがとうございます

ようしゃなく英語ですね
ただいま高校からの英語をやり直ししている最中であります

日本語改訳版がでるといいですが、ジェネリックプログラムもまだ、手がおいつかないので
ブックマークにいれておきます


45ポイント を手に入れた。

Name: YuO  ..プログラマー(32,386ポイント)   Date: 2009/08/04(火) 12:39   No:37718     
Title: Re:シングルトンパターンの破棄    
> 具体的に言うと std::atexit 関数が プログラムがアンロードされるのに
> 何によって管理されているのか、どのように動作するのかがが理解できてませんでした

std::atexitはmainから戻った or std::exitが呼ばれた後に呼び出される,標準C++関数です。
処理系によっては,staticなオブジェクトのデストラクタを呼び出すために使われています。


> ようしゃなく英語ですね

Modern C++ Designは翻訳された本ですよ (Amazonのなか見検索参照)。


93ポイント を手に入れた。

Name: dic  ..プログラマー(30,015ポイント)   Date: 2009/08/05(水) 16:26   No:37764     
Title: Re:シングルトンパターンの破棄    
> std::atexitはmainから戻った or std::exitが呼ばれた後に呼び出される,標準C++関数です。
> 処理系によっては,staticなオブジェクトのデストラクタを呼び出すために使われています。
なるほどそういうことなんですね
色々試してみます

> Modern C++ Designは翻訳された本ですよ (Amazonのなか見検索参照)。
おお、日本語だった
しかし、私にはちょっと難しいかもしれません


40ポイント を手に入れた。



Name: C初心者  ..かけだし(1,113ポイント)   Date: 2009/07/30(木) 18:15   No:37519       
Title: ルンゲ・クッタ法    
始めまして。
大学にてC言語にてプログラミングの勉強しています。
明日までの課題なのですが、自力で解くことができないのでアドバイス頂けますと助かります。

ルンゲ・クッタ法にて、dy/dx=3y/1+Xを解きます。
初期値X0、Y0=1として、刻み幅h=0.1 0.05 0.025・・・・と1/2ずつ減じていきます。

ルンゲ・クッタ法の計算方法、プログラムは分かるのですが、「刻み幅を1/2ずつ減じていく」が分かりません。

ルンゲ・クッタ法のプログラムの中にfor文でループさせ、hを1/2ずつさせていけばいけばいいことは分かるのですが・・・・。

申し訳ありませんが、アドバイスを頂けますと助かります!
よろしくお願いします!





200ポイント を手に入れた。


Name: box  ..ハッカー(142,183ポイント)   Date: 2009/07/30(木) 20:11   No:37524     
Title: Re:ルンゲ・クッタ法    
刻み幅 h = 0.1 の場合のソースコードを提示してください。

20ポイント を落としてしまった。

Name: C初心者  ..かけだし(1,589ポイント)   Date: 2009/07/30(木) 20:31   No:37526     
Title: Re:ルンゲ・クッタ法    
わかってる範囲のソースコードを記載します。

#include<stdio.h>
#include<math.h>

#define EPS .00000001

double func_c(double,double);

int main(int argc,char **argv)

    double x=1.0, y=1.0;
double h=0.1,dx=1.0,xmax=10.0;
double ddx=0.0,k1,k2,k3,k4;

printf("/tX/tY/n");
do{
         if(x>=ddx+=dx;
printf("%8.41lf %8.4lf/n",x,y);


k1=func_f(x ,y);
k2=func_f(x+h/2.0,y+h*k1*h*k1*h/2.0);
k3=func_f(x+h/2.0,y+h*k1*h*k1*h/2.0);
k4=func_f(x+h ,y+k3*h);


y+=(h/6.0)*(k1+2.0*k2+2.0*k3+k4);
x+=h;

}while(x<=xmax);
return 0;


       
        double func_f(double x,double y)
{ 
            return 3y/1+x*x


よろしくお願いします!



        





<small>


476ポイント を手に入れた。

Name: box  ..ハッカー(142,246ポイント)   Date: 2009/07/30(木) 21:01   No:37527     
Title: Re:ルンゲ・クッタ法    
全角空白を使って「見かけだけ」インデントしている
ソースはチェックしたくないです。

投稿時、インデントのために全角空白を使った時点で、
お手元のオリジナルのソースとこちらが見るソースとが
食い違ってしまいます。
その結果、質問者さんとこちらとが、
同じ土俵に立って話ができなくなります。

「規約と注意事項」をよくごらんになってから、
再投稿してください。


63ポイント を手に入れた。

Name: C初心者  ..かけだし(1,828ポイント)   Date: 2009/07/31(金) 12:46   No:37534     
Title: Re:ルンゲ・クッタ法    
書き直させて頂きました。
申し訳ありませんでした。 チェックよろしくお願いします。

#include<stdio.h>
#include<math.h>

#define EPS .00000001

double func_f(double,double);

int main(int argc,char **argv)
{
double x=1.0,y=1.0;
double h=0.1,dx=1.0,xmax=10.0;
double ddx=0.0,k1,k2,k3,k4;

printf("/tX/tY/n");

do{
if(x>=ddx-EPS)
{
ddx+=dx;

printf("%8.4lf%8.4lf\n",x,y);
}


k1=func_f(x ,y);
k2=func_f(x+h/2.0,y+h*k1*h/2.0);
k3=func_f(x+h/2.0,y+h*k2*h/2.0);
k4=func_f(x+h ,y+k3*h);

y+=(h/6.0)*(k1+2.0*k2+2.0*k3+k4);
x+=h;

}while(x<=xmax);

return 0;
}

double func_f(double x,double y)
{
return 3y/1+x*x
}



239ポイント を手に入れた。

Name: asd  ..上級者(16,984ポイント)   Date: 2009/07/31(金) 13:20   No:37535     
Title: Re:ルンゲ・クッタ法    
>C初心者さん

えーと、規約と注意事項をちゃんと読んでから再投稿してくださいと言われているのに
なぜちゃんと読まないのでしょうか?

ページを開いてすぐにでかでかと「ソースコードはpreタグで囲んでください」と書いているのに
見落としてしまったのでしょうか?


109ポイント を手に入れた。

Name: non  ..熟練のプログラマー(58,989ポイント)   Date: 2009/07/31(金) 13:23   No:37536     
Title: Re:ルンゲ・クッタ法    
>ルンゲ・クッタ法にて、dy/dx=3y/1+Xを解きます。

なぜ、3y/1+xなんだろう?
dx/dy=3y+x で良さそうなのに。

プログラムでも
>return 3y/1+x*x
って?最後のxはhを掛けるのでは、ないのでしょうか?
だとしたら
3*y/(1+x)でないと変ですよ。

試してないけど、添付されたプログラムって動かないのでは?


2倍のポイントを手に入れた! 200ポイント を手に入れた。

Name: ねこ  ..プログラマー(34,084ポイント)   Date: 2009/07/31(金) 13:50   No:37537     
Title: Re:ルンゲ・クッタ法    
とりあえずそれっぽく動くものをペタペタ。
ルンゲ・クッタ法については知らないので結果値が正常でないなら提示したソースに問題があると思います、多分。

#define EPS .00000001
double func_f(double,double);
int main(int argc,char **argv){
double x = 1.0, y = 1.0;
double h = 0.1, dx = 1.0, xmax = 10.0;
double ddx = 0.0, k1, k2, k3, k4;
int i = 0;

printf("\tX\tY\n");

for( i = 0 ; i < 10; i++ ){
printf( "\n%2d回目(h=%.10lf)\n", i + 1, h );
x = 1.0; y = 1.0; ddx = 0.0;
do{
if( x >= ddx - EPS ){
ddx += dx;
printf( "%8.4lf %8.4lf\n", x, y );
}

k1=func_f(x,y);
k2=func_f(x+h/2.0,y+h*k1*h/2.0);
k3=func_f(x+h/2.0,y+h*k2*h/2.0);
k4=func_f(x+h ,y+k3*h);

y+=(h/6.0)*(k1+2.0*k2+2.0*k3+k4);
x+=h;

}while( x <= xmax );
h /= 2.0;
}
return 0;
}

double func_f( double x, double y ) {
return ( 3 * y ) / ( 1 + x );
}

なんかおかしいところは適当に直しました。

※確かに見辛いけどPre使って無い投稿は他にも一杯あるのに何でここだけ突っ込まれてるんだろう(汗)


386ポイント を手に入れた。

Name: non  ..熟練のプログラマー(59,068ポイント)   Date: 2009/07/31(金) 14:15   No:37539     
Title: Re:ルンゲ・クッタ法    
>※確かに見辛いけどPre使って無い投稿は他にも一杯あるのに何でここだけ突っ込まれてるんだろう(汗)
それは、たぶん
>ルンゲ・クッタ法の計算方法、プログラムは分かるのですが、
プログラムがわかるというのに、他人が作ったプログラムを、どっからか持ってきて
貼り付けているからと誰でも思うからではないでしょうか。


79ポイント を手に入れた。

Name: ねこ  ..プログラマー(33,986ポイント)   Date: 2009/07/31(金) 14:52   No:37544     
Title: Re:ルンゲ・クッタ法    
>>※確かに見辛いけどPre使って無い投稿は他にも一杯あるのに何でここだけ突っ込まれてるんだろう(汗)
>それは、たぶん
>>ルンゲ・クッタ法の計算方法、プログラムは分かるのですが、
>プログラムがわかるというのに、他人が作ったプログラムを、どっからか持ってきて
>貼り付けているからと誰でも思うからではないでしょうか。

なるほど・・検索して参考ソースを持ってくるのも努力の内だと思ってるのであまり気になりませんでした。
基礎基本は分かりますと言いつつ基本的な事の質問だったりすると気になったりしますが・・・
まぁ人それぞれですよね。
ちゃんと答え書けてるかも分からないのでこっそりしておきます。


175ポイント を落としてしまった。

Name: asd  ..上級者(17,195ポイント)   Date: 2009/08/05(水) 15:06   No:37763     
Title: Re:ルンゲ・クッタ法    
本題から反れている投稿で申し訳ないです。

> なるほど・・検索して参考ソースを持ってくるのも努力の内だと思ってるのであまり気になりませんでした。

検索して参考ソースを拾ってくるのもスキルの内だと思ってますのでそれはよいとしても、
検索できた=プログラムを理解したにはならないと思うのです。

アルゴリズムは分からないけど検索したらあったと言われると何を勉強してるのだろう?と疑問に思います。
それに加えて指摘されている文を読んでいないようなので確認の意味で「アドバイス読んでいますか?」と投稿した次第です。

#質問者さんが戻ってこないのは課題の期限が過ぎたからでしょうね(汗


211ポイント を手に入れた。



Name: 素人  ..中級者(12,229ポイント)   Date: 2009/08/01(土) 23:53   No:37576       
Title: ロード画面について    
今度は改造龍神録のロード画面を作ってるんですけど
↓これをうまく使いたいのですが
全ての画像や音楽データをLoadingFileに
置き換える方法が分からなくて困ってます。例えば

img_board[10] = LoadGraph("../dat/img/board/10.png");
img_board[11] = LoadGraph("../dat/img/board/11.png");
img_board[12] = LoadGraph("../dat/img/board/12.png");
を、下記の
GrHandle[LoadingFile] = LoadGraph( "Test1.bmp" );
に置き換える方法など。
うまく龍神録に実装出来る方法のアドバイスをお願いします。




#include "DxLib.h"

// 読み込むファイルの総数
#define FILENUM 1000

// ゲージの幅
#define GAUGEWIDTH 200

// 画像ハンドル
int GrHandle[FILENUM];

// 読み込んでいる画像の番号
int LoadingFile;

// 読み込み画面描画関数
void DrawLoadingScreen( void )
{
// 「読み込み中」の表示
DrawString( 0, 0, "Now Loading ...", GetColor( 255,255,255 ) );

// ゲージの全体を灰色で描画
DrawBox( 0, 32, GAUGEWIDTH, 56, GetColor( 128,128,128 ), TRUE );

// 現時点で読み込み終わっている分を白色で描画
DrawBox( 0, 32, LoadingFile * GAUGEWIDTH / FILENUM, 56, GetColor( 255,255,255 ), TRUE );
}

// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// ウインドウモードで起動
ChangeWindowMode( TRUE );

// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;

// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK );

// 読み込む画像の数だけ繰り返し
for( LoadingFile = 0; LoadingFile < FILENUM; LoadingFile ++ )
{
// 画像の読み込み
GrHandle[LoadingFile] = LoadGraph( "Test1.bmp" );

// 20個読み込み終わる毎に読み込み中画面を一回更新する
if( LoadingFile % 20 == 0 )
{
// 画面の初期化
ClearDrawScreen();

// 読み込み中画面を描画
DrawLoadingScreen();

// 裏画面の内容を表画面に反映
ScreenFlip();

// メッセージ処理
if( ProcessMessage() != 0 ) break;
}
}

// DXライブラリの後始末
DxLib_End();

// ソフトの終了
return 0;
}



729ポイント を手に入れた。


Name: Justy  ..伝説なるハッカー(397,992ポイント)   Date: 2009/08/02(日) 01:30   No:37591     
Title: Re:ロード画面について    

>全ての画像や音楽データをLoadingFileに置き換える方法が分からなくて困ってます

 テーブルを使えば楽にできそうです。

    static const char * const ImageFileList[] =
    {
        "../dat/img/board/10.png",
        "../dat/img/board/11.png",
        "../dat/img/bullet/b0.png",
        "../dat/img/enemy/hp.png",
    };


 こんなかんじのテーブルを用意して、

    GrHandle[LoadingFile] = LoadGraph(ImageFileList[LoadingFile]);


 とすればできるはずです。


 画像だけで且つ読み込むファイル全てが "../dat/img/"にあるのなら

     static const char * const ImageFileList[] =
     {
        "board/10.png",
        "board/11.png",
        "bullet/b0.png",
        "enemy/hp.png",
     };

    char filePath[MAX_PATH];
    sprintf(filePath, "../dat/img/%s", imageFileList[LoadingFile]);
    GrHandle[LoadingFile] = LoadGraph(filePath);

としてもいいですね。


686ポイント を手に入れた。

Name: 素人  ..中級者(12,251ポイント)   Date: 2009/08/02(日) 16:59   No:37620     
Title: Re:ロード画面について    
なるほど、テーブルを使う考えは思いつかなかったです
Justyさん、非常に助かりました。
ありがとうございます!


22ポイント を手に入れた。

Name: 素人  ..中級者(14,671ポイント)   Date: 2009/08/02(日) 20:34   No:37642     
Title: Re:ロード画面について    
すみません。よく分からなかった部分があったのですが
読み込むファイルの総数が74個あるんですが
なぜか
#define FILENUM 89 //読み込むファイルの総数
まで読み込み可能でした。
ちなみに
#define FILENUM 90 //読み込むファイルの総数
ではエラーが返ってきました。
これはどういう計算で89まで読み込めることになってるのでしょうか?
あと、下記にプログラムを書いておきましたが
これでちゃんとロードが出来ているのか不安なんですが
これでロードプログラムとして合ってるのでしょうか?
何か間違ってる部分があれば指摘お願いします。




load.cpp内

#include "../include/GV.h"

#define FILENUM 89 //読み込むファイルの総数
#define GAUGEWIDTH 200 //ゲージの幅
int GrHandle[FILENUM]; //画像ハンドル
int LoadingFile; //読み込んでいる画像の番号

void DrawLoadingScreen(){ //読み込み画面描画関数
img_back[1] = LoadGraph("../dat/img/back/3/loading.png"); //ロード画面
DrawGraph(0,0,img_back[1],TRUE ); //ロード画面
DrawString( 0, 0, "Now Loading ...", GetColor( 255,255,255 ) ); //「読み込み中」の表示
DrawBox( 0, 32, GAUGEWIDTH, 56, GetColor( 128,128,128 ), TRUE ); //ゲージの全体を灰色で描画
//現時点で読み込み終わっている分を白色で描画
DrawBox( 0, 32, LoadingFile * GAUGEWIDTH / FILENUM, 56, GetColor( 255,255,255 ), TRUE );
}


void load(){
int t;
SetCreateSoundDataType( DX_SOUNDDATATYPE_MEMPRESS ) ;
t=GetNowCount();


static const char * const ImageFileList[] =
{
"../dat/img/board/10.png",//1
"../dat/img/board/11.png",//2
"../dat/img/board/12.png",
"../dat/img/board/20.png",
"../dat/img/board/subject0.png",//5
"../dat/img/char/atari.png",



"../dat/se/graze.wav",//74
};


for( LoadingFile = 0; LoadingFile < FILENUM; LoadingFile ++ ){ //読み込む画像の数だけ繰り返し
GrHandle[LoadingFile] = LoadGraph(ImageFileList[LoadingFile]); //読み込み
if( LoadingFile % 2 == 0 ){ //2個読み込み終わる毎に読み込み中画面を一回更新する
ClearDrawScreen(); //画面の初期化
DrawLoadingScreen(); //読み込み中画面を描画
ScreenFlip(); //裏画面の内容を表画面に反映
}
}


img_board[10] = LoadGraph("../dat/img/board/10.png");
img_board[11] = LoadGraph("../dat/img/board/11.png");
img_board[12] = LoadGraph("../dat/img/board/12.png");
img_board[20] = LoadGraph("../dat/img/board/20.png");
img_board[30] = LoadGraph("../dat/img/board/subject0.png");
img_chetc[0] = LoadGraph( "../dat/img/char/atari.png" );

以下略



2倍のポイントを手に入れた! 2,420ポイント を手に入れた。

Name: ねこ  ..プログラマー(34,366ポイント)   Date: 2009/08/02(日) 22:18   No:37645     
Title: Re:ロード画面について    
エラーはコンパイルエラーなのか、強制終了なのか分かりませんが。
なんかwavファイル混じってませんか・・・?LoadGraphしてもダメな気が・・・


2倍のポイントを手に入れた! 94ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(399,690ポイント)   Date: 2009/08/02(日) 22:47   No:37650     
Title: Re:ロード画面について    

>これはどういう計算で89まで読み込めることになってるのでしょうか?

 89まで読めたのは偶然でしょう。

 そもそも ImageFileListが 74しかないのに、FILENUMが 89もあると、
ImageFileList[LoadingFile] のところで配列の領域をオーバーしてアクセスしていますので
75個目以降はいつ異常な動作を起こしても不思議ではありません。

 つまり、

    efor( LoadingFile = 0; LoadingFile < FILENUM; LoadingFile ++ ){

の部分は

    const int MAX_IMAGE_FILE_LIST = sizeof(imageFileList) / sizeof(imageFileList[0]);
    for( LoadingFile = 0; LoadingFile < MAX_IMAGE_FILE_LIST; LoadingFile ++ {

とか、配列のサイズに応じてループを回すようにした方がいいでしょう。

 ところで、その 89というのはどこから出てきたのですか?


 あとねこさんもおっしゃっていますが、音声データに対して LoadGraphはまずいので、
画像とか音声とかの種類毎にテーブルを分けて処理するとか、

    struct LoadFileInfo
    {
        enum Type { TypeImage, TypeSound };
        Type        type;
        const char *fileName;
    };
    static const LoadFileInfo imageFileList[] =
    {
        { LoadFileInfo::TypeImage, "../dat/img/board/10.png" },
        { LoadFileInfo::TypeImage, "../dat/img/board/11.png" },
        { LoadFileInfo::TypeImage, "../dat/img/board/12.png" },
        { LoadFileInfo::TypeImage, "../dat/img/char/atari.png" },
        { LoadFileInfo::TypeSound, "../dat/se/graze.wav" },
    };


のような情報を読み込むファイルの情報を入れる構造体に作って、
その typeに応じて処理を分けるなどしてください。




>何か間違ってる部分があれば指摘お願いします

 DrawLoadingScreen()が呼ばれる度に "loading.png"が LoadGraphされていますが、
これはいつ解放されるのでしょうか?


1,100ポイント を手に入れた。

Name: 素人  ..中級者(14,843ポイント)   Date: 2009/08/02(日) 22:48   No:37651     
Title: Re:ロード画面について    
強制終了です。
確かに、wavファイルが混じってました。
"../dat/se/enemy_shot.wav",//60
"../dat/se/enemy_death.wav",
"../dat/se/cshot.wav",
etc
これって一緒に入れたらまずかったのでしょうか?
ロードだからこれも一気にロードしようと思ったのですが・・

すると、このwavファイルをロードする方法ってないんでしょうか?
それとも最初にロードする必要はない?

もう一つ、このwavファイル全部(15個)をコメントアウトすると
読み込むファイルの総数は59個になるはずのですが
#define FILENUM 75 //読み込むファイルの総数
以上で強制終了
#define FILENUM 74 //読み込むファイルの総数
以下で読み込み可能でした。
これっていったいどういうことなのでしょうか?


172ポイント を手に入れた。

Name: 素人  ..上級者(15,847ポイント)   Date: 2009/08/03(月) 00:46   No:37664     
Title: Re:ロード画面について    
>>Justyさん
89まで読めたのは偶然って・・
プログラムで偶然って存在したんですか・・知らなかったです・・

89というのは、
まず、
"../dat/img/board/10.png",//1
"../dat/img/board/11.png",//2
"../dat/img/board/12.png",
"../dat/img/board/20.png",
"../dat/img/board/subject0.png",//5
5個読み込んだらどうなるか試してみたら
#define FILENUM 5で正常に起動して
#define FILENUM 6以上でエラー、
とくにプログラムどおりだったので特に問題はなかったのですが

74個読み込んだところ
#define FILENUM 74で正常に起動したので
75でエラーかな?と思って念のため調べてみたら
エラーが返ってこなかったので、おかしいと思って、
76、77と増やしていって調べてみたら90でエラーが返ってきたんです。
この原因が不明なため質問させていただきました。

とりあえず、この原因は偶然ということが分かり、
音声データと配列のサイズに応じてのループ処理が出来たので
とても助かりました、ありがとうございます。

loading.pngの解放についてですが、解放してません。
やはりまずいでしょうか?どこで解放するべきでしょうか?



2倍のポイントを手に入れた! 1,004ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(399,709ポイント)   Date: 2009/08/03(月) 01:34   No:37665     
Title: Re:ロード画面について    

>loading.pngの解放についてですが、解放してません。
やはりまずいでしょうか?どこで解放するべきでしょうか?

 まずいですね。
 LoadGraphを行うということは行った分だけ画像データ+管理領域分のメモリを消費するわけですが
この場合 LoadingFileが2つ進むと1回ロードする仕組みになっているので
LoadingFileのカウントが増えれば増えるほど、多くのメモリを消費することになります。

 しかも同じテクスチャを毎回ファイルからロードしているのでそれなりの処理負荷がかかりますし、
img_back[1]を上書きしているので1つ前のロードした img_back[1]のテクスチャを
解放することすらできません。

 とりあえず load()の先頭あたりで1回だけLoadGraphを呼んで "loading.png"を読み込み、
load()を抜けるところで DeleteGraph()してはどうでしょうか。


389ポイント を落としてしまった。

Name: 素人  ..上級者(16,359ポイント)   Date: 2009/08/03(月) 08:08   No:37668     
Title: Re:ロード画面について    
loading.pngの解放についてはJustyさんの指示どおりしたら、
凄くスムーズにロードが進むようになりました。
ロードが遅い感じはしてたのですが、これが原因だったのですね。
ありがとうございます。
ただ、この後あれこれ試してみたんですが、
No:37650の記事の内容がうまく行かないです。
まず、

const int MAX_IMAGE_FILE_LIST = sizeof(imageFileList) / sizeof(imageFileList[0]);
for( LoadingFile = 0; LoadingFile < MAX_IMAGE_FILE_LIST; LoadingFile ++ {
についてですが、
error C2065: 'imageFileList' : 定義されていない識別子です。
error C2070: ''unknown-type'': sizeof オペランドが正しくありません。
とポインタエラーが返ってきました。特にC2070が初めてみるエラーなので
どう対処したらいいか分からなくて困ってます。
あと、
struct LoadFileInfo
{
enum Type { TypeImage, TypeSound };
Type type;
const char *fileName;
};
static const LoadFileInfo imageFileList[] =
{
{ LoadFileInfo::TypeImage, "../dat/img/board/10.png" },
{ LoadFileInfo::TypeImage, "../dat/img/board/11.png" },
{ LoadFileInfo::TypeImage, "../dat/img/board/12.png" },
{ LoadFileInfo::TypeImage, "../dat/img/char/atari.png" },
{ LoadFileInfo::TypeSound, "../dat/se/graze.wav" },
};
についてですが、typedef structとはちょっと違う感じで
うまく分けられないです。
タイプ別に分けるとは
具体的にどのようにすれば画像と音声データを綺麗に分けることが出来るのでしょうか?
また、分けてしまういうことは
//現時点で読み込み終わっている分を白色で描画
DrawBox( 0, 32, LoadingFile * GAUGEWIDTH / FILENUM, 56, GetColor( 255,255,255 ), TRUE );
を二つに分けるやり方になってしまうような感じがするのですが、一つで出来ないのでしょうか?
ここの部分を特に具体的に教えていただけたら幸いです。よろしくお願いします。


512ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(400,403ポイント)   Date: 2009/08/04(火) 00:28   No:37700     
Title: Re:ロード画面について    

>特にC2070が初めてみるエラーなのでどう対処したらいいか分からなくて困ってます

 まんまなのですが、imageFileListの定義がない、ということです。
 imageFileList -> ImageFileListに変えてください。



>typedef structとはちょっと違う感じで

 厳密にはいろいろ違うのですが、ここで使う分には使い方は変わらないはずです。



>タイプ別に分けるとは
>具体的にどのようにすれば画像と音声データを綺麗に分けることが出来るのでしょうか?

 メンバに typeがあるので、それを利用します。

    for( LoadingFile = 0; LoadingFile < MAX_IMAGE_FILE_LIST; LoadingFile ++ )
    {
        const LoadFileInfo *loadInfo = &imageFileList[LoadingFile];
        if(loadInfo->type == LoadFileInfo::TypeImage)
            ...;       // グラフィックスの処理を書く
        else
        if(loadInfo->type == LoadFileInfo::TypeSound)
            ...;       // サウンドの処理を書く

 typeを見て ifで分岐して処理を変えていきます。



>二つに分けるやり方になってしまうような感じがするのですが、一つで出来ないのでしょうか?

 ?
 どちらの方式でやってもならないと思いますけど……。

 リストを2つに分けたのなら、FILENUMが2つのリストの総数を、LoadingFileが2つのリストの進行カウンタの合計に
なっていれば1つで処理できるはずですし、上の構造体方式で1つにリストをまとめたのなら
従来通りの方法でOKです。


578ポイント を手に入れた。

Name: 素人  ..上級者(17,682ポイント)   Date: 2009/08/04(火) 10:38   No:37711     
Title: Re:ロード画面について    
仰るとおりにしてみると再び同じエラーが出て、どうやってもエラーがとれなく困っているんですが、
どこのプログラムが原因でどこを直したらロードが出来るようになるでしょうか?
エラーは
error C2065: 'ImageFileList' : 定義されていない識別子です。×4
error C2070: ''unknown-type'': sizeof オペランドが正しくありません。
というエラーです。
ソースも公開しておきます。

#define FILENUM 60 //読み込むファイルの総数
#define GAUGEWIDTH 640 //ゲージの幅(横)
int GrHandle[FILENUM]; //画像ハンドル
int LoadingFile; //読み込んでいる画像の番号

void DrawLoadingScreen(){ //読み込み画面描画関数
//現時点で読み込み終わっている分を黄色(横)で描画
DrawBox( 0, 340, LoadingFile * GAUGEWIDTH / FILENUM, 420, GetColor( 255,255,0 ), TRUE );//横
DrawGraph(0,0,img_back[1],TRUE ); //ロード画面
}

void load(){
int t;
SetCreateSoundDataType( DX_SOUNDDATATYPE_MEMPRESS ) ;
t=GetNowCount();

img_back[1] = LoadGraph("../dat/img/back/3/loading.png"); //ロード画面

struct LoadFileInfo
{
enum Type { TypeImage, TypeSound };
Type type;
const char *fileName;
};

const int MAX_IMAGE_FILE_LIST = sizeof(ImageFileList) / sizeof(ImageFileList[0]); ←error C2065×2、error C2070

for( LoadingFile = 0; LoadingFile < MAX_IMAGE_FILE_LIST; LoadingFile ++ )
{
const LoadFileInfo *loadInfo = &ImageFileList[LoadingFile]; ←error C2065
if(loadInfo->type == LoadFileInfo::TypeImage){
//static const char * const ImageFileList[] =
static const LoadFileInfo ImageFileList[] =
{
{ LoadFileInfo::TypeImage, "../dat/img/board/10.png" },//1
{ LoadFileInfo::TypeImage, "../dat/img/board/11.png" },
{ LoadFileInfo::TypeImage, "../dat/img/board/12.png" },
{ LoadFileInfo::TypeImage, "../dat/img/board/20.png" },



{ LoadFileInfo::TypeImage, "../dat/img/back/10/kotei0.png" },
{ LoadFileInfo::TypeImage, "../dat/img/back/10/scroll0.png" },//60
};
}
else
if(loadInfo->type == LoadFileInfo::TypeSound){
static const LoadFileInfo ImageFileList[] =
{
{ LoadFileInfo::TypeSound, "../dat/se/enemy_shot.wav" },
{ LoadFileInfo::TypeSound, "../dat/se/enemy_death.wav" },



{ LoadFileInfo::TypeSound, "../dat/se/lazer.wav" },
{ LoadFileInfo::TypeSound, "../dat/se/item_get.wav" },
};
}
}


// for( LoadingFile = 0; LoadingFile < FILENUM; LoadingFile ++ ){ //読み込む画像の数だけ繰り返し
for( LoadingFile = 0; LoadingFile < MAX_IMAGE_FILE_LIST; LoadingFile ++ ){
GrHandle[LoadingFile] = LoadGraph(ImageFileList[LoadingFile]); //読み込み ←error C2065
if( LoadingFile % 2 == 0 ){ //2個読み込み終わる毎に読み込み中画面を一回更新する
ClearDrawScreen(); //画面の初期化
DrawLoadingScreen(); //読み込み中画面を描画
ScreenFlip(); //裏画面の内容を表画面に反映
}
}


img_board[10] = LoadGraph("../dat/img/board/10.png");
img_board[11] = LoadGraph("../dat/img/board/11.png");
img_board[12] = LoadGraph("../dat/img/board/12.png");
img_board[20] = LoadGraph("../dat/img/board/20.png");
img_board[30] = LoadGraph("../dat/img/board/subject0.png");
img_chetc[0] = LoadGraph( "../dat/img/char/atari.png" );
img_eff_bom[0] = LoadGraph( "../dat/img/effect/bom0.png" );

省略

DeleteGraph(img_back[1]);//画像解放
}


1,323ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(397,803ポイント)   Date: 2009/08/05(水) 01:41   No:37735     
Title: Re:ロード画面について    

>原因でどこを直したらロードが出来るようになるでしょうか

 テーブルを1つにまとめるために構造体を使ったわけで、
2つに分けるのであればこの構造体は不要なのですが……。

 なんかもうプログラムがひっちゃかめっちゃかになってますよ……。



>error C2065: 'ImageFileList'

 ImageFileListの定義がないからです。
 ImageFileListを定義刷る前にImageFileListを使っています。
 sizeofでエラーが出てるのも ImageFileListが見つからないからでしょう。
 

 とりあえず、全面的に書き直してみました。
 デバッガで追いながら、じっくり解析して、その上で自分のコードを
どう直していけばいいのかを検討してみてください。

// 読み込むファイル情報構造体 
struct LoadFileInfo 

    enum Type { TypeImage, TypeSound }; 
    Type type; 
    const char* fileName; 
}; 

// 読み込むファイル情報 
static const LoadFileInfo    LoadFileList[] = 

    { LoadFileInfo::TypeImage, "../dat/img/board/10.png" }, 
    { LoadFileInfo::TypeImage, "../dat/img/board/11.png" }, 
    { LoadFileInfo::TypeImage, "../dat/img/board/12.png" }, 
    { LoadFileInfo::TypeImage, "../dat/img/board/20.png" }, 
    { LoadFileInfo::TypeImage, "../dat/img/back/10/kotei0.png" }, 
    { LoadFileInfo::TypeImage, "../dat/img/back/10/scroll0.png" }, 
    { LoadFileInfo::TypeSound, "../dat/se/enemy_shot.wav" }, 
    { LoadFileInfo::TypeSound, "../dat/se/enemy_death.wav" }, 
    { LoadFileInfo::TypeSound, "../dat/se/lazer.wav" }, 
    { LoadFileInfo::TypeSound, "../dat/se/item_get.wav" }, 
}; 

// ファイル数 
static int const LoadFileNum = sizeof(LoadFileInfo) / sizeof(LoadFileList[0]); 

static int Handle[LoadFileNum]; 

// 背景の表示 
static void DrawLoadingScreen(int progress, int backImage) 

    const int GAUGEWIDTH = 640; 
    DrawBox(0, 340, progress * GAUGEWIDTH / LoadFileNum, 420, GetColor(255, 255, 0), TRUE); 
    DrawGraph(0, 0, backImage, TRUE); 



void load() 

    int backImage = LoadGraph("../dat/img/back/3/loading.png"); 
    SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMPRESS); 
    
    // メインループ 
    int index = 0; 
    const int maxLoadTimes = 3;     // 1度にロードするファイル数
    while(ProcessMessage() == 0 && index < LoadFileNum) 
    { 
        ClearDrawScreen(); 
        
        // maxLoadTimes分ファイルをロード
        for(int n=0; n<maxLoadTimes && index < LoadFileNum; ++n, ++index) 
        { 
            const LoadFileInfo *loadInfo = &LoadFileList[index]; 
            if(loadInfo->type == LoadFileInfo::TypeImage) 
                Handle[n] = LoadGraph(loadInfo->fileName); 
            else 
            if(loadInfo->type == LoadFileInfo::TypeSound) 
                Handle[n] = LoadSoundMem(loadInfo->fileName); 
        } 

        DrawLoadingScreen(index, backImage); 
        ScreenFlip(); 
    } 
    
    DeleteGraph(backImage); 



2,763ポイント を落としてしまった。

Name: Justy  ..伝説なるハッカー(399,753ポイント)   Date: 2009/08/05(水) 01:47   No:37737     
Title: Re:ロード画面について    
 ついでなので少し長いですが、テーブルを普通に複数用意するタイプも作ってみました
(あんましテストしてないですが)。

 こちらはハンドルも複数に分かれてます。
 複数のファイルリストをまとめるために1つ別の構造体を使って居ます。
 参考までに。

// イメージ
static const char * const LoadImageFileList[] =
{
    "../dat/img/board/10.png",
    "../dat/img/board/11.png",
    "../dat/img/board/12.png",
    "../dat/img/board/20.png",
    "../dat/img/back/10/kotei0.png",
    "../dat/img/back/10/scroll0.png",
};
static int const ImageFileNum = sizeof(LoadImageFileList) / sizeof(LoadImageFileList[0]);
static int GrHandle[ImageFileNum];

// サウンド
static const char * const LoadSoundFileList[] =
{
    "../dat/se/enemy_shot.wav",
    "../dat/se/enemy_death.wav",
    "../dat/se/lazer.wav",
    "../dat/se/item_get.wav",
};
static int const SoundFileNum = sizeof(LoadSoundFileList) / sizeof(LoadSoundFileList[0]);
static int SdHandle[SoundFileNum];

// 各ファイルリストをまとめる
struct FileListInfo
{
    enum Type { TypeImage, TypeSound };
    Type type;
    const char * const * data;
    int        dataSize;
};
static const FileListInfo LoadGroupFileList[] =
{
    { FileListInfo::TypeImage, LoadImageFileList, ImageFileNum },
    { FileListInfo::TypeSound, LoadSoundFileList, SoundFileNum },
};
const int GroupListSize = sizeof(LoadGroupFileList) / sizeof(LoadGroupFileList[0]);

// 読み込むファイル総数を求める
static int GetTotalLoadFiles()
{
    int totalFileNum = 0;
    for(int n=0; n<GroupListSize; ++n)
        totalFileNum += LoadGroupFileList[n].dataSize;
    return totalFileNum;
}

// 背景表示
static void DrawLoadingScreen(int progress, int totalFileNum, int backImage)
{
    const int GAUGEWIDTH = 640;
    DrawBox(0, 340, progress * GAUGEWIDTH / totalFileNum, 420, GetColor(255, 255, 0), TRUE);
    DrawGraph(0, 0, backImage, TRUE);
}

void load()
{
    int backImage = LoadGraph("../dat/img/back/3/loading.png");
    SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMPRESS);
    
    // 読み込むファイル総数を求める
    const int totalFileNum = GetTotalLoadFiles();
    
    // メインループ
    const int maxLoadTimes = 2;                        // 1度にロードするファイル数
    int groupIndex = 0, index = 0, loadedCount = 0;    
    while(ProcessMessage() == 0 && groupIndex < GroupListSize)
    {
        ClearDrawScreen();
        
        // maxLoadTimes数分ファイルをロード
        const FileListInfo *listInfo = &LoadGroupFileList[groupIndex];
        for(int n=0; n<maxLoadTimes && index < listInfo->dataSize; ++n, ++index)
        {
            if(listInfo->type == FileListInfo::TypeImage)
                GrHandle[index] = LoadGraph(listInfo->data[n]);
            else
            if(listInfo->type == FileListInfo::TypeSound)
                SdHandle[index] = LoadSoundMem(listInfo->data[n]);
            ++loadedCount;
        }
        
        // 1つのファイルリストが尽きたら次のリストへ
        if(index >= listInfo->dataSize)
        {
            ++groupIndex;
            index = 0;
        }

        // 背景表示
        DrawLoadingScreen(loadedCount, totalFileNum, backImage);
        ScreenFlip();
    }

    DeleteGraph(backImage);
}



1,950ポイント を手に入れた。

Name: 素人  ..上級者(17,896ポイント)   Date: 2009/08/05(水) 10:54   No:37745     
Title: Re:ロード画面について    
JustyさんのNo:37735をまったく同じように参考にさせていただき、
おかげさまで無事、エラーを取り除くことが出来たのですが、
前みたいに2個読み込み終わる毎に読み込み中画面を一回更新する処理が出来なくなっているのですが
どんな処理をどこに加えたらできるようになるでしょうか?
それと、
static void DrawLoadingScreen(int progress, int backImage)
のprogressがあまり意味ないような感じがするのですが
これは何の役割をしているのでしょうか?
よく分からなかったのでよろしければ教えてください。


214ポイント を手に入れた。

Name: ねこ  ..プログラマー(35,097ポイント)   Date: 2009/08/05(水) 11:15   No:37747     
Title: Re:ロード画面について    
<2個毎に・・・
とりあえずJustyさんの「No:37737」をよく読んであげてください。

<progress
現在の読み込み数を指定しています。

DrawBox関数の
DrawBox(0, 340, progress * GAUGEWIDTH / LoadFileNum, 420, GetColor(255, 255, 0), TRUE);
第三引数を
( progress / LoadFileNum ) * GAUGEWIDTH
こうすると意味が分かりやすいかも。
要は読み込んだ数と総読み込み数の割合に640(ウィンドウ横幅)をかけてます。


188ポイント を手に入れた。

Name: 素人  ..上級者(17,775ポイント)   Date: 2009/08/05(水) 13:21   No:37756 解決!     
Title: Re:ロード画面について    
ロードが無事出来ました!
ねこさんアドバイスありがとうございます。ただ
( progress / LoadFileNum ) * GAUGEWIDTHは意味が分かりやすくはなりますが
実際に実装してみると、一気に描画されてしまったので
progress * GAUGEWIDTH / LoadFileNumのほうがいいかもしれません。

そして、まだまだ未熟な自分に最後まで付き合い、アドバイスをくれたJustyさん。
本当に感謝の気持ちでいっぱいです。
ありがとうございました!


121ポイント を落としてしまった。

Name: sizuma [URL]  ..中級者(11,822ポイント)   Date: 2009/08/05(水) 13:26   No:37757     
Title: Re:ロード画面について    
>( progress / LoadFileNum ) * GAUGEWIDTHは意味が分かりやすくはなりますが
>実際に実装してみると、一気に描画されてしまったので
>progress * GAUGEWIDTH / LoadFileNumのほうがいいかもしれません。

どちらの計算も同じですよね??


53ポイント を手に入れた。

Name: ねこ  ..プログラマー(35,945ポイント)   Date: 2009/08/05(水) 13:38   No:37759     
Title: Re:ロード画面について    
>実際に実装してみると、一気に描画されてしまったので
もしかしてこうかも
(double)( progress / LoadFileNum ) * (double)GAUGEWIDTH;
GAUGEWIDTHがlong型なので括弧内の結果がlongで一度キャストされ、
それによって0or1の状態になってるかもしれません。

まぁ分かりやすいための書き方だったため、動けばどちらでも良いと思います^^


165ポイント を手に入れた。

Name: 素人  ..上級者(17,945ポイント)   Date: 2009/08/05(水) 13:38   No:37760     
Title: Re:ロード画面について    
すみません。間違えてました。No:37737を参考に今度はプログラムを組んでみたので
progress * GAUGEWIDTH / LoadFileNumではなく、
progress * GAUGEWIDTH / totalFileNumでした。
つまり、
progress * GAUGEWIDTH / totalFileNum
ならmaxLoadTimesぶんだけゆっくり描画されますが
( progress / totalFileNum ) * GAUGEWIDTH
は一気に描画されます
ということです。
これも計算は一緒ですが、なぜそうなるのかは
自分はちょっと分からないです・・


170ポイント を手に入れた。



Name:  ..かけだし(1,010ポイント)   Date: 2009/08/05(水) 11:47   No:37749       
Title: 龍神録2章のKeyについて    
はじめまして、2章のプログラムのKeyの所がよくわからなかったので質問しました。

//GetHitKeyStateAll_2という自作関数を作成
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
    char GetHitKeyStateAll_Key[256];   //char型のGetHitKeyStateAll_Key配列を作成
    GetHitKeyStateAll( GetHitKeyStateAll_Key );   //GetHitStateAll関数にGetHitKeyStateAll_Key配列を渡すことにより、
                                   //GetHitKeyStateAll_Key配列[]の中にはKEY_INPUT_ESCAPE等
                                  //全てのキーの入力状態(0か1)が入っている

    for(int i=0;i<256;i++){    //↓押されているキーがある場合は引数GetHitKeyStateAll_InputKey[]に1足す
        if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
        else                  GetHitKeyStateAll_InputKey[i]=0; //何も押されてなければ引数は0になる
    }
    return 0;
}

↑ここはコメントに書いているような理解で正しいですか?
また、

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
       //↑メッセージ処理        ↑画面をクリア       ↑入力状態を保存       ↑ESCが押されていない

というコードで、コメントに入力状態を保存と書いてありますが、どういうことなのでしょうか・・・?
自分なりに理解しようとしたところ、例えばキーが4つ押されていればGetHitKeyStateAll_2(Key)の
引数Keyに4という数字が入るのでwhile文は実行されないということだと思いました。

また、このような処理は何のために行うのでしょうか?実行したときに何かキーが押されていた場合実行できないようにするためなのでしょうか?もしそうなのであれば、なぜその処理を行う必要があるのでしょうか?・・・

まだプログラミングを始めたばかりなので、初歩的な質問ですが教えていただけるとうれしいです。


1,010ポイント を手に入れた。


Name: ねこ  ..プログラマー(35,346ポイント)   Date: 2009/08/05(水) 12:03   No:37750     
Title: Re:龍神録2章のKeyについて    
<↑ここはコメントに書いているような理解で正しいですか?
その理解で大丈夫です。

<引数Keyに4という数字が入るのでwhile文は実行されないということだと思いました。
これは間違いです。「GetHitKeyStateAll_2」関数は「常に0を返す」のでそこの判定は常に「正」になります。
本来はwhileの判定に有る必要性はありません。
ただESCAPEキーが押された場合にwhileに入らないようにする必要があるため、ESCAPEキーが押されているかを事前に取得するため、判定式に記述されています。
なので、下記のように記述しても同様の処理となります。

while(ProcessMessage()==0){
ClearDrawScreen();
GetHitKeyStateAll_2(Key);
if( Key[KEY_INPUT_ESCAPE] == 1)
break;
}


249ポイント を手に入れた。

Name:  ..かけだし(1,139ポイント)   Date: 2009/08/05(水) 12:14   No:37752 解決!     
Title: Re:龍神録2章のKeyについて    
>>ESCAPEキーが押された場合にwhileに入らないようにする必要があるため、ESCAPEキーが押されているかを事前に取得するため、判定式に記述されています。
そういうことだったのですね。
ねこさんとてもわかりやすく説明して下さりありがとうございました!


129ポイント を手に入れた。



Name: mint  ..ぴよぴよ(133ポイント)   Date: 2009/08/05(水) 02:34   No:37738       
Title: 関数の扱い方に関する質問です    
Aという関数を作って、メイン関数内の時刻t(0から100)において10おきにplanという変数を変えるプログラムをつくっています。
しかし、メイン関数内の、if(plan == 2){printf("実行\n");}の部分が無視されてしまいます。(関数A内で使ったplanという変数はメイン関数では使えないのですか??)planが2の時に実行と表示させたいのですが、良い方法はありませんでしょうか?どうかよろしくお願いします。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>

int A(int ,int);

int main()
{
int t=0,plan;
for(t=0;t<100;t++){
A(t,plan);

if(plan == 2){printf("実行\n");}
}
return 0;

}

int A(int t,int plan)
{
if(t % 20 < 10)
plan = 1;
else
plan = 2;


}


133ポイント を手に入れた。


Name: sizuma [URL]  ..中級者(11,799ポイント)   Date: 2009/08/05(水) 03:21   No:37740     
Title: Re:関数の扱い方に関する質問です    
>関数A内で使ったplanという変数はメイン関数では使えないのですか??

使えないです。
mintさんが作った関数はint型を返す関数なのに何もreturnしてないですよね。
これは明らかにおかしいです。
とりあえずおかしいところを。


#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>

int A(int ,int);

int main()
{
int t=0,plan;
for(t=0;t<100;t++){
A(t,plan); //初期化してないplanを関数に渡してる

if(plan == 2){printf("実行\n");}
}
return 0;

}

int A(int t,int plan)
{
if(t % 20 < 10)   //スコープがかかれてない。コレ→{ }
plan = 1;      //1行なんで動くけど、行を変えるなら囲まないと見づらい。
else
plan = 2;


}

関数Aの仮引数をplanにすると分かりにくくなりますね。

int A(int t,int piyo);

int main()
{
int t=0,plan = 0;
for(t=0;t<100;t++){
plan = A(t,plan); //関数からの戻り値をplanに代入してチェックすればOK
if(plan == 2){printf("実行\n");}
}
return 0;

}

int A(int t,int piyo) //変数名を変えた。piyoはmainからは使えない
{
if(t%20 < 10){
piyo = 1;
}else{
piyo = 2;
}
}




ちょっとだけ修正してみました。Aが何を返すのかは考えてみてください。




106ポイント を手に入れた。

Name: sizuma [URL]  ..中級者(11,559ポイント)   Date: 2009/08/05(水) 03:59   No:37741     
Title: Re:関数の扱い方に関する質問です    
>Aという関数を作って、メイン関数内の時刻t(0から100)において10おきにplanという変数を変えるプログラム
こういう課題でしょうか?
この文章を見て作ろうと思うと、planのポインタを渡してAの関数で変える方がいいと思いますが。


#include<stdio.h>

void A(int t,int *p_plan);

int main()
{
int t;
int plan = 0;
int *p_plan;
p_plan = &plan;
for(t=0;t<100;t++){
A(t,p_plan);
if(plan == 2)printf("t=%d plan=%d 実行\n",t,plan);
}
return 0;

}

void A(int t,int *p_plan)
{
if(t%20 < 10){
*p_plan = 2;
}else{
*p_plan = 0;
}

}



mainはこう書いた方がすっきりするかな

int main()
{
int t;
int plan = 0;
for(t=0;t<100;t++){
A(t,&plan);
if(plan == 2)printf("t=%d plan=%d 実行\n",t,plan);
}
return 0;

}




240ポイント を落としてしまった。

Name: toyo  ..熟練のプログラマー(40,091ポイント)   Date: 2009/08/05(水) 08:10   No:37743     
Title: Re:関数の扱い方に関する質問です    
別の掲示板で解決したようです
せっかくの回答が無駄になるのでマルチポストはやめて欲しいですね


51ポイント を手に入れた。

Name: sizuma [URL]  ..中級者(11,769ポイント)   Date: 2009/08/05(水) 11:00   No:37746     
Title: Re:関数の扱い方に関する質問です    
>toyoさん
教えてくださってありがとうございます。

確かに回答して反応がないのは寂しいですが、回答のために問題を考えるのは間違わないようにしなくてはいけないしすごいいい勉強になります。まだまだ僕が初心者なので。

>マルチポスト
勉強するためじゃなくて課題を終わらせたいだけなら、そう書いてくれればこっちも返信しないのに・・・
明らかに基礎が出来てないから、回答にも気を使ったんですけどね。
がんばって勉強中だけど分からないのか、勉強する気がないのかの判断はしにくいですからどうしたものか。

っと、脱線失礼しました


210ポイント を手に入れた。



Name: チルチル  ..プログラマー(36,582ポイント)   Date: 2009/08/03(月) 23:12   No:37691       
Title: メンバの間接参照について    
malloc関数で確保した構造体に対して

p->x+cos(p->Angle+PI)*(p->Length/2)+cos(p->Angle+PI/2)*(p->Width/2);

のような処理を行うと強制終了してしまいます

float x1=cos(p->Angle+PI)*(p->Length/2);
float x2=cos(p->Angle+PI/2)*(p->Width/2);
p->x+x1+x2;

のように分けたりすると大丈夫なのですが・・

何か思い当たる事はないでしょうか?

C++ DXライブラリを使用しています


142ポイント を手に入れた。


Name: box  ..ハッカー(142,310ポイント)   Date: 2009/08/03(月) 23:37   No:37693     
Title: Re:メンバの間接参照について    
> p->x+cos(p->Angle+PI)*(p->Length/2)+cos(p->Angle+PI/2)*(p->Width/2);
>
> のような処理を行うと強制終了してしまいます

強制終了してしまうプログラムのソースコードすべてを載せていただけますか?

ところで、

> p->x+cos(p->Angle+PI)*(p->Length/2)+cos(p->Angle+PI/2)*(p->Width/2);

も、分割した

> p->x+x1+x2;

これも、演算結果をどこにも代入していません。それでよいのでしょうか?
本題と直接関係はありませんが、気になります。


64ポイント を手に入れた。

Name: チルチル  ..プログラマー(36,669ポイント)   Date: 2009/08/04(火) 18:22   No:37721     
Title: Re:メンバの間接参照について    
ソースコードは約1万行あるので全部乗せるのは無理でしょうね・・
肝心な部分だけ抜き出してみましょうかね・・

代入を行っていないのは、代入するから強制終了するのか、式に問題があるのかを判断するためです
どうも式に問題があるようですね・・


87ポイント を手に入れた。

Name: ねこ  ..プログラマー(34,909ポイント)   Date: 2009/08/04(火) 19:25   No:37724     
Title: Re:メンバの間接参照について    
落ちる時の各値チェックしたら良いんじゃないの?
malloc部分も構造体も書かないんじゃ分からないよ。


35ポイント を手に入れた。

Name: チルチル  ..プログラマー(36,698ポイント)   Date: 2009/08/04(火) 19:47   No:37726     
Title: Re:メンバの間接参照について    
各値チェックですか・・
DrawFormatString関数とWaitKey関数でやってみます
少々お待ちください


29ポイント を手に入れた。

Name: バグ  ..ハッカー(163,992ポイント)   Date: 2009/08/04(火) 21:30   No:37728     
Title: Re:メンバの間接参照について    
そんな手の込んだ事しなくても、問題のありそうなところにブレイクポイントを置いて、値を確認すればいいだけかと…

31ポイント を手に入れた。

Name: チルチル  ..プログラマー(36,566ポイント)   Date: 2009/08/04(火) 21:57   No:37729     
Title: Re:メンバの間接参照について    
ん?ブレイクポイントとは何でしょうか?

値を確認する前に怪しい所をコメントアウトしてみたら
なぜかmalloc関数で確保したVERTEX構造体配列
Vertex[i*6+3]とVertex[i*6+1]の一部のメンバに値を代入すると強制終了しました
他は大丈夫みたいなんですけど・・


132ポイント を落としてしまった。

Name: 初級者  ..初心者(6,502ポイント)   Date: 2009/08/04(火) 22:09   No:37730     
Title: Re:メンバの間接参照について    
ブレークポイント
ブレイクポイント

あたりのキーワードでググってみましょう。


22ポイント を手に入れた。

Name: チルチル  ..プログラマー(36,772ポイント)   Date: 2009/08/04(火) 22:26   No:37731     
Title: Re:メンバの間接参照について    
調べてみるとBorlandの場合は別にソフトが必要のようですね
私の場合は先輩の環境をコピーしたのでBorlandが展開されている場所もわからないし
以前によくわからないまま同じような事をやった時に開発環境が異常を起こした事があったので
パッと導入するのは無理ですね・・

あと何でか分からないんですが
malloc宣言部
VERTEX *Vertex=(VERTEX*)malloc(sizeof(VERTEX)*(6*(abs(P->DrawType)==1)?Unit:Sum));を
VERTEX *Vertex=(VERTEX*)malloc(sizeof(VERTEX)*1000);に変更すると見た感じうまく行きました
もしかしたら領域確保に失敗してるのかもしれません
なぜかVERTEX Vertex[1000];ではうまく行きませんでしたが・・


206ポイント を手に入れた。

Name: チルチル  ..プログラマー(36,878ポイント)   Date: 2009/08/04(火) 22:40   No:37732     
Title: Re:メンバの間接参照について    
さらに試行錯誤すると
VERTEX *Vertex=(VERTEX*)malloc(sizeof(VERTEX)*(6*(abs(P->DrawType)==1)?Unit:Sum));を
VERTEX *Vertex=(VERTEX*)malloc(sizeof(VERTEX)*(6*((abs(P->DrawType)==1)?Unit:Sum)));に変えると
うまく動きました
条件演算子の優先度が原因だったのでしょうか・・
見たところ問題解決したようなので
もう少し試行錯誤して強制終了しないか調べてみます


106ポイント を手に入れた。

Name: チルチル  ..プログラマー(36,930ポイント)   Date: 2009/08/05(水) 07:46   No:37742 解決!     
Title: Re:メンバの間接参照について    
調べた結果、やはり条件演算子の優先度が原因でした
お騒がせしてすみません
どうもありがとうございます


52ポイント を手に入れた。



Name:  ..かけだし(1,349ポイント)   Date: 2009/08/03(月) 20:51   No:37684       
Title: メモリに関する質問    
久しぶりの投稿です。よろしくお願いします。

メモリに関する質問をいたしたいのですが、例えばDxLibで定義されている関数LoadGraphやLoadDivGraphといった関数でメモリに画像を読み込むということは、画像に関してnewやdelete演算子を気にしなくてもよく、定義されている関数がメモリ確保、解放をやってくれるということですよね。

クラスでパラメータをいじっていた際によくnew等を使ってクラスオブジェクトのメモリを確保しているサンプルを目にしたんで頭の中がごっちゃになりました。

また、メモリにリソースファイルを読み込んだ以降、それらのファイルの描写、再生といった関数は何に対し負荷を与えているのでしょうか?



190ポイント を手に入れた。


Name: ねこ  ..プログラマー(34,874ポイント)   Date: 2009/08/03(月) 21:16   No:37687     
Title: Re:メモリに関する質問    
<メモリに関する質問をいたしたいのですが、
<例えばDxLibで定義されている関数LoadGraphやLoadDivGraphといった関数で
<メモリに画像を読み込むということは、画像に関してnewやdelete演算子を気にしなくてもよく、
<定義されている関数がメモリ確保、解放をやってくれるということですよね
違います。DeleteGraph関数が用意されているように解放は自分で行う必要があります。

<また、メモリにリソースファイルを読み込んだ以降、
<それらのファイルの描写、再生といった関数は何に対し負荷を与えているのでしょうか?
この場合の「負荷」とは何を指すのでしょうか?処理速度?描画実行速度?メモリ?
ちょっと定義が曖昧で答えようがないです。


227ポイント を手に入れた。

Name:  ..かけだし(1,497ポイント)   Date: 2009/08/03(月) 22:29   No:37689     
Title: Re:メモリに関する質問    
ごめんなさい。質問があいまいでした。


まず上の質問ではメモリ解放の関数の例あげていなく誤解を生みました。メモリ解放の関数も含めたDxLibにて提供される関数を使用した場合、特にnewやdeleteは必要なのか否かを質問しました。


二つ目の質問はわかりずらかったのでいいかたを変えます。あらかじめメモリに読み込んでおいた場合描写、再生といった関数はメモリを食うのでしょうか?メモリを食わないのでしょうか?


148ポイント を手に入れた。

Name: 夢夢  ..かけだし(1,467ポイント)   Date: 2009/08/04(火) 12:17   No:37717     
Title: Re:メモリに関する質問    
DXライブラリを使用して画像を読み込んだ場合、
メモリから削除(開放)するのも専用の関数を使用してください。
(DeleteGraph)

>あらかじめメモリに読み込んでおいた場合描写、
再生といった関数はメモリを食うのでしょうか?
メモリを食わないのでしょうか?

メモリを食うという表現が当てはまるかわかりませんが、
あらかじめメモリに読み込んでおいた場合はメモリを食います。(メモリに格納しているので)
ただ、読み込んでおいた方が描画、再生時に処理が軽くなるので何度も描画させるものの場合は
先に読み込んで置いたほうが処理速度は上がります。
質問の意図に添えましたでしょうか?


167ポイント を手に入れた。

Name:  ..かけだし(1,608ポイント)   Date: 2009/08/05(水) 03:00   No:37739 解決!     
Title: Re:メモリに関する質問    
タスクシステムを勉強している際に気になったもので、ご質問したのですが
非常に質問がわかりづらく申し訳ありませんでした。


質問の意図とは多少誤差がありますが、解決できたのでご報告いたします。


どうも、ありがとうございました。


111ポイント を手に入れた。



Name: yrao  ..入門者(3,328ポイント)   Date: 2009/08/02(日) 09:20   No:37598       
Title: ボス弾幕について    
おはようございます。
プログラミングの館のプロジェクトを使ってゲーム作りを勉強しています。

作りたいボス段幕が二つあるのですが、実装方法が分かりません。
どなたかアドバイス頂ければ幸いです。

〜一つ目〜

@自機の場所に沿うように弾を配置する。
弾は配置されたまま消えない。(東方だと、地霊殿2面のパルスィの「グリーンアイドモンスター」のような感じです。)
※いきなり自機の場所に弾が置かれるとまずいので、画面左上又は右上から配置を始たいと思っています。
A一定時間配置したら、配置されている弾を自機の方へ向かわせる。


@Aを繰り返す。



〜二つ目〜

発射された弾(弾A)が画面外に出たら、
ゲーム画面とゲームボードの境界 と 弾Aの軌道 との交点から弾(弾B)を発射する。
(説明下手ですね;
弾が画面外に出た地点から弾を吹き出させる
ということです。)
※弾Bが画面外に出ても、弾Bは発射されない。

弾Aをどのように発射するかは具体的には決めていないのですが、とりあえず自機狙い(1way)で実装してみようと思っています。
弾Bは、ボスに向かうように発射で、発射角度、発射速度に一定のばらつきがあるものです。




よろしくお願いします。


411ポイント を手に入れた。


Name: エル  ..ぴよぴよ(20ポイント)   Date: 2009/08/02(日) 10:43   No:37600     
Title: Re:ボス弾幕について    
自分も初心者なんですが、弾Aの処理に画面に消えたに弾Bの処理が行われる用にしたらダメなんですかね?
弾Bの座標を弾Aと一緒にしてあげたら可能だと思うのですが。
余計な事でしたらすみません。


20ポイント を手に入れた。

Name: nayo  ..中級者(12,196ポイント)   Date: 2009/08/02(日) 11:19   No:37601     
Title: Re:ボス弾幕について    
一つ目はたしか龍神録のボスにはアシストが用意されていたので
ボスのアシストを利用して毎フレーム自機方向を計算し、移動させてあげて
何フレームかに一回アシスト座標からx,y座標それぞれ±乱数値の位置に弾を配置し、
アシストのカウントが一定カウントになったら全弾と自機の角度を求め、速度を与えて移動させれば良いと思います
無かったらすみません

二つ目については新しく弾Bを発射するのではなく弾Aが画面外に来たらボスへの方向を求めて
その方向±乱数角度方向、最低速度+乱数速度を与えて、もし違う弾にしたいのならば画像も変え、
一度画面外に出たというフラグを用意するか、画像が変わっていたならば画面外に出てもこの処理を行わない、
とすればできそうな気がします

…分かり辛いですね


296ポイント を手に入れた。

Name: TRUTH  ..中級者(12,571ポイント)   Date: 2009/08/02(日) 11:53   No:37604     
Title: Re:ボス弾幕について    
こんにちはー。

1つ目はnayo様と同じアイデアです。


2つ目は新しい弾を登録する方です。
弾Aが消えそうになった瞬間(画面から出た時)、弾AのXY座標とangleを取得し
それを元に弾Bを作ります。初期座標はXY座標、angleを微調整して放ちます。
最後に弾Aのフラグを消してしまえば、実装できるのではないかと思います。
弾Aと弾Bの区別は状態ので区別できると思います。


158ポイント を手に入れた。

Name: yrao  ..入門者(3,451ポイント)   Date: 2009/08/02(日) 20:56   No:37643     
Title: Re:ボス弾幕について    
アドバイスして下さった方々、ありがとうございます。



一つ目の方から作り始めているのですが、
・アシストに毎フレーム自機の座標を所得させる処理
・一定時間経った後、弾にスピードを与え自機に向かって飛ばす処理

が上手く出来ずに悩んでいます。
どのような処理を書けばよいのでしょうか。


123ポイント を手に入れた。

Name: nayo  ..中級者(12,423ポイント)   Date: 2009/08/02(日) 21:49   No:37644     
Title: Re:ボス弾幕について    
・アシストに毎フレーム自機の座標を取得させるにてついて
自機狙いの弾は作ったことがありますか?
atan2関数を使って弾の座標と自機の座標から角度を求めていたはずです
それを応用して毎フレーム利用するだけです

・一定時間経った後、弾にスピードを与え自機に向かって飛ばす処理について
弾幕を処理している関数内で
if( アシストのカウントがある値なら ){

for( 弾の総数分ループ ){
if( もし弾が出現しているなら ){
弾の速度を与える、自機方向への角度を求める、その他必要な処理
}
}
}



上記のような感じできないでしょうか


227ポイント を手に入れた。

Name: yrao  ..入門者(4,094ポイント)   Date: 2009/08/03(月) 21:39   No:37688     
Title: Re:ボス弾幕について    
おかげさまでアシストに自機を追いかけさせる事ができました。
ありがとうございます。
 
現在、以下のようにプログラムを書いているのですが、
一定時間経った後に、全弾自機に向かって飛んでくるというのがうまくできず、弾が動かない状態です。
どこが問題なのでしょうか。
 
(弾幕発射とアシストの制御は、龍神録プログラミングの支館様にかかれていたものを参考にしています。)


void boss_shot_bulletH014(){
int i, t = boss_shot.cnt;


if( t%700 == 0 ){//アシスト作成.700カウントで1セット
assist_way(boss.x, boss.y, 1, PI/2, 0, 5, 0, 0, 0, 0);
} //↑真下にアシストを放出

if(t%700 == 500)//500カウントでアシストを消す
delete_boss_assist(1); //sate=1のアシストがあれば削除

for(i=0;i<BOSS_ASSIST_MAX;i++){
if(boss_shot.assist[i].flag>0){
int sate = boss_shot.assist[i].state;
double x = boss_shot.assist[i].x;
double y = boss_shot.assist[i].y;

switch(sate){
case 0:
if( t%700 >= 20 && t%700 < 80 ){//20カウント〜80カウントはアシストを止める
boss_shot.assist[i].spd = 0;
boss_shot.assist[i].state = 1;
}
break;
case 1:
if( t%700 >= 80 && t%700 <= 500 && t%3 == 0 )//80カウント〜500カウントまで
boss_shot.assist[i].spd = 1.4; //アシストは自機追尾する
boss_shot.assist[i].angle = bossatan4(i,ch.x,ch.y);
bullet_way(x+rang(40), y+rang(40), 1, 0, 0, 0.0, 10, 3+rang(3), 0, 0);//アシストの軌跡に弾配置
break;
case 2 ://(この部分がうまくいきません)
if( t%700 > 550 )//550カウントしたら全弾を自機に飛ばす
boss_shot.bullet[i].spd = 5.0;
boss_shot.bullet[i].angle = atan2(boss_shot.bullet[i].y-ch.y,boss_shot.bullet[i].x-ch.x);


default :
break;
}
}
}
}


643ポイント を手に入れた。

Name: Tatu  ..初心者(5,624ポイント)   Date: 2009/08/04(火) 02:49   No:37704     
Title: Re:ボス弾幕について    
書いてあるコードのうまくいっていない部分は
まず、if(t%700 > 550)ではboss_shot.bullet[i].angleが
1フレームごとに更新されてしまうのでif(t%700==550)に変更する。

boss_shot.bullet[i].angle=atan2(boss_shot.bullet[i].y-ch.y,boss_shot.bullet[i].x-ch.x)
atan2(y,x)はx軸正の方向とベクトル(x,y)の方向がなす角度を返すので、
これでは角度が自機から弾への方向になってしまい、弾が自機から遠ざかるように動いてしまう。
そのため、引数をch.y-boss_shot.bullet[i].y,ch.x-boss_shot.bullet[i].xに変更すればよい。
boss_shot.bullet[i].angle=bossatan3(i,ch.x,ch.y);とかいてもよい。



あと、弾幕のコードを書いてみました。
一つ目はアシストに自機を追尾させながら弾を置き、
配置された弾は置かれて一定時間後に自機の方向に飛んでくる弾幕で、
二つ目はパルシィの「丑の刻参り」のような弾幕です。


//弾発射用関数
void boss_bullet_on(int way,int knd,int col,double x,double y,double b_angle,double d_angle,double spd,int state,int till,int eff=0,int sflag=1){
int i,k;
for(i=0;i<way;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].knd = knd;//弾の種類
if(knd==7) boss_shot.bullet[k].kaiten=1;
else boss_shot.bullet[k].kaiten=0;
boss_shot.bullet[k].col = col;//弾の色
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].x = x;//座標
boss_shot.bullet[k].y = y;
boss_shot.bullet[k].angle = b_angle+d_angle*(i - way/2);//角度:bが基準、dが間隔
boss_shot.bullet[k].spd = spd;//スピード
boss_shot.bullet[k].state = state;//弾の状態
boss_shot.bullet[k].till = till;//弾が画面外に出ても消えない時間
boss_shot.bullet[k].eff = eff;
if(sflag==1)se_flag[0]=1;
}
}
}

void boss_shot_bulletT062(){
int i,t=boss_shot.cnt;
//アシストを出す
if(t==0){
boss_shot.assist[0].flag = 1;
boss_shot.assist[0].cnt = 0;
boss_shot.assist[0].knd = 0;
boss_shot.assist[0].col = 0;
boss_shot.assist[0].x = 0;
boss_shot.assist[0].y = 0;
boss_shot.assist[0].angle = 0;
boss_shot.assist[0].spd = 2.5;
boss_shot.assist[0].state = 0;
boss_shot.assist[0].till = 0;
boss_shot.assist[0].eff = 0;
se_flag[0]=1;
}
//アシストは常に自機を追いながら弾を配置する
boss_shot.assist[0].angle=atan2(ch.y-boss_shot.assist[0].y,ch.x-boss_shot.assist[0].x);
if(t%5==0){
boss_bullet_on(1,1,1,boss_shot.assist[0].x+rang(64),boss_shot.assist[0].y+rang(64),0,0,0,1,0);
boss_bullet_on(1,7,0,boss_shot.assist[0].x+rang(64),boss_shot.assist[0].y+rang(64),0,0,0,1,0);
}
for(i=0;i<BOSS_BULLET_MAX;i++){
//配置された弾は一定時間後に自機の方向に動き出す
if(boss_shot.bullet[i].flag==1 && boss_shot.bullet[i].state==1){
if(boss_shot.bullet[i].cnt==300){
boss_shot.bullet[i].angle=bossatan3(i,ch.x,ch.y);
}
if(boss_shot.bullet[i].cnt>=300 && boss_shot.bullet[i].cnt<360){
boss_shot.bullet[i].spd+=0.05;
}
if(boss_shot.bullet[i].cnt==360) boss_shot.bullet[i].state=0;
}
}
}

void boss_shot_bulletT063(){
int i,t=boss_shot.cnt%150;
if(boss_shot.cnt==0) input_phy_pos(FMX/2,FMY/2,30);
//角度を記憶させる
if(t==30) boss_shot.base_angle[0]=bossatan2();
if(t>=30 && t<150 && t%8==0){
for(i=0;i<6;i++){
boss_bullet_on(1,8,4,boss.x,boss.y,boss_shot.base_angle[0]+i*PI2/6+rang(PI/24),0,2,1,0);
}
}
for(i=0;i<BOSS_BULLET_MAX;i++){
if(boss_shot.bullet[i].flag>0 && boss_shot.bullet[i].state==1){
boss_shot.bullet[i].spd+=0.02;
//画面枠についたら新しく弾を発射し、消去する
if(boss_shot.bullet[i].x<0 || boss_shot.bullet[i].x>FMX || boss_shot.bullet[i].y<0 || boss_shot.bullet[i].y>FMY){
boss_bullet_on(1,1,2,boss_shot.bullet[i].x,boss_shot.bullet[i].y,bossatan3(i,boss.x,boss.y)+rang(PI/4),0,1,0,0,1,0);
boss_shot.bullet[i].flag=0;
}
}
}
}


1,680ポイント を手に入れた。

Name: yrao  ..入門者(4,177ポイント)   Date: 2009/08/04(火) 23:44   No:37734 解決!     
Title: Re:ボス弾幕について    
Tatuさんありがとうございます。
作っていただいたソースコードを参考にして、もう一度作り直してみたところ、無事実装することができました。
二つ目の弾幕のほうもありがとうございます。助かります。
 
 
アドバイスをしていただいた方々、本当にありがとうございましたm(_ _)m
 




83ポイント を手に入れた。



Name: つつじ  ..ぴよぴよ(14ポイント)   Date: 2009/08/03(月) 23:56   No:37695       
Title: DrawGraphで描いた絵を消したい    
はじめまして。
DrawGraphで描いた絵を消したいのですが、絵を消す関数みたいなものはあるのでしょうか?
ClearDrawScreenで画面に描かれたものを消去する効果があるみたいですが、
これだと、全部消えてしまうんですよね?
自分の消したい絵だけを消す方法はないですか?
よろしくおねがいします。


14ポイント を手に入れた。


Name: あ〜る  ..中級者(11,254ポイント)   Date: 2009/08/04(火) 00:03   No:37696     
Title: Re:DrawGraphで描いた絵を消したい    
どういう感じなのかよくわかんないんで、出来るかわかんないんですが、if文で絵を描くフラグがONになってる時は描画するようにして、消したい時はフラグをOFFにして描画しなければ、実質的には消えたのと同じ結果になるんじゃないでしょうか?


121ポイント を手に入れた。

Name: kazuoni [URL]  ..比類無きプログラマー(96,668ポイント)   Date: 2009/08/04(火) 00:14   No:37697     
Title: Re:DrawGraphで描いた絵を消したい    
手段としては上書きしかないかと。

どのように画像を描写しているか分かりませんが、
毎ループ描写しているなら、表示したくないときは、
その文を評価しない(その描写の行を実行しない)とすれば、
消えた(実際には描写していない)ように見えます。





78ポイント を手に入れた。

Name: 夢夢  ..かけだし(1,300ポイント)   Date: 2009/08/04(火) 12:10   No:37716     
Title: Re:DrawGraphで描いた絵を消したい    
ただ、指定した絵を消したいのであれば、
消したい絵のDrawGraphを使用しないようにすればよいかと。

DrawGraph関数を使用しているから描画されるので、
その処理をif文などで通らないようにすれば
出来ると思いますよ。


67ポイント を手に入れた。

Name: つつじ  ..ぴよぴよ(36ポイント)   Date: 2009/08/04(火) 23:34   No:37733 解決!     
Title: Re:DrawGraphで描いた絵を消したい    
みなさん、ありがとうございます。
いろいろ試してみます。


22ポイント を手に入れた。



Name: 藍霧OO  ..ぴよぴよ(326ポイント)   Date: 2009/08/02(日) 11:39   No:37603       
Title: STGの絵やら音楽を作るのに    
おはようございます、こんにちは、こんばんは。はじめまして。


ほんの1週間くらい前に龍神録を見つけた者です。


今はボチボチ章を進めているのですが、ある程度終わったら自分でもSTGを作ろうと思ってます。


……思ってますのですが。
肝心な問題が出てきました。


キャラクター(自機)や弾の絵の描き方、音楽の作り方がまったくわからないのです。



そこで質問なんですが、
「皆さんはゲームの絵やら音楽を作るとき、どんなソフトを使っているのでしょうか?」



東方のZUNさんはフォトショップを使ってると言ってますが、そうだとしても『書き方』がチンプンなのです(ペンタブでも使うのでしょうか?


音楽は、…………もうまったく知らないのですが、『MIDI(?)』というものを使う、って言うの聞いた事があります。


既出っぽいですしC言語とも関係ないのですが、どうか回答をお願いします。


326ポイント を手に入れた。


Name: Dixq (管理人) [URL]  ..ウィザード(1,047,616ポイント)   Date: 2009/08/02(日) 12:16   No:37605     
Title: Re:STGの絵やら音楽を作るのに    
>藍霧OOさん

こんにちは。龍神録を見つけてくださりありがとうございます☆
私もフォトショップを使っていますが、GIMPも使っています。
本格的に始めたいならフォトショを買うのもいいと思いますし、
フリーで使いたいならGIMPを使うのもいいと思います。
GIMPはフリーでありながらかなりの高機能で、フォトショに見劣りしないほどです。
私も最近フォトショをやめてGIMPの使い方をマスターしたいと思っているほどです。
GIMPは自分のコンピュータじゃなくてもフリーなのですぐインストできるのが利点ですね。

絵の書き方は絵の書き方で、プログラムの勉強のついで程度ではなく、
そちら専門に勉強してもいくらでも勉強できるほど奥の深いものだと思います。
ですので、GIMPをDLしたら「GIMP 使い方」などで検索し、使い方を学び、
学んで、それでもどう書けばいいかわからなければ、書店で本などを購入して勉強すればいいと思います。
ドット絵の書き方やキャラの書き方などいろんな本があります。

音楽についても、こちらも奥が本当に深いものだと思います。
音楽を作るソフトも色々あります。
私はCakeWalkを使った事がありますが使いこなせないままいます。
こちらはあまり詳しくないので、どなたかにお任せします。

とりあえず、ゲームを作ったことが無い状態で、全てを自作しようとすると、めまいがしてしまう可能性が高いので、
最初は出来るだけ既にある素材を利用する形で作ってみてはどうでしょうか?
ある程度ゲーム作成の経験を積み、作る前から形が見えるようになってから、
全てを自作してみてはどうでしょう?
または、作ってから、自分の自作の素材に変更してもいいと思います。

後、質問はC言語ではなくても全く構いませんので気軽に聞いて下さい^^


724ポイント を手に入れた。

Name: yu  ..プログラマー(37,615ポイント)   Date: 2009/08/02(日) 12:21   No:37606     
Title: Re:STGの絵やら音楽を作るのに    
自分で作るのが面倒ならネット上に公開されている
フリー素材を使うというのもありだと思いますよ

自分も全く素材とかは作っていませんが
ソフトは入れてあります

ドット絵 : EDGE
絵画加工 : GIMP
音楽作成(MIDI作成) : Domino

音楽は SoundFont と timidity というものを使って WAVE 出力しています
フリーですが、なかなかいい音を出してくれます

MIDIとは波形をそのまま保存するのではなくて (そのまま波形が保存されているのはWAVEとかMP3とかです)
この楽器をこの音程で鳴らせ! 等の命令が詰まっているファイルです


233ポイント を手に入れた。

Name: 御津凪 [URL]  ..ハッカー(108,416ポイント)   Date: 2009/08/02(日) 14:00   No:37609     
Title: Re:STGの絵やら音楽を作るのに    
作曲(DTMと呼ばれる)ツールとしては、Domino や Singer Song Writer のような MIDI に特化したシーケンサソフトや、
Cubase シリーズ(ZUN氏が使用しているツール)や ACID シリーズ(私はこれの Pro 版を使ってます)など、
ループ音源等に対応したツールもあります。

MIDI で一から製作するには、 MIDI の知識が多少なりとも必要ですが、
ループ音源だと配置するだけで曲が作れたりするので楽といえば楽です。

ちなみに、 Cubase や ACID 、 Singer Song Writer は市販ソフトで、最低でも5万はするので、
買えないと思ったなら MIDI で製作していっても良いでしょう。

※私のサイトに適当にループ音源だけで作った曲があるので、どんな感じに出来るのかの確認にでも聞いてみてください。(こちら


PC 上で絵を描くならペンタブが必須でしょう。(BAMBOO COMIC だと、ペンタブにイラストツールも付属してますよ)
紙に下絵を書くなら、絵を取り込むスキャナが必要です。


367ポイント を手に入れた。

Name: Tororo  ..ぴよぴよ(173ポイント)   Date: 2009/08/02(日) 15:36   No:37618     
Title: Re:STGの絵やら音楽を作るのに    
作曲には Studio ftn ScoreEditorをつかっています
フリーですが中々良い音を出してくれるので
重宝しています

説明サイトは少ないですがそれのヘルプをみれば
ほとんどわかりますよ!


68ポイント を手に入れた。

Name: situmon  ..プログラマー(36,858ポイント)   Date: 2009/08/02(日) 17:47   No:37628     
Title: Re:STGの絵やら音楽を作るのに    
こちらは
絵も音楽もどちらも作っていますが、
絵はまず普通に描いてスキャナで読み込みます。
次にペンタブ(使ってなくてもかけますよ。)をつかい
pixiaというソフトで色を塗ります。
それをGIMPで画像の縮小をして敵の絵完成!!です。

音楽はCherryをつかっています。Dominoと大体同じですが、
使った人によってどちらがいいかは分かれますので、
どちらも試してみてください。
Timidity++のことですが、詳しく説明すると(yuさんも説明されていますが)
midiファイルとは例えれば楽譜のことです。
そしてその楽譜をみてひいてくれるのが音源というわけです。
その音源にあたるのがTimidity++です。
これはソフトウェア音源です。
調べて使ってみてください。



68ポイント を手に入れた。

Name: DVDM [URL]  ..入門者(2,930ポイント)   Date: 2009/08/03(月) 00:26   No:37662     
Title: Re:STGの絵やら音楽を作るのに    
自分は絵に関しては基本、PhotoShop7.0一本です。
PCだけで描くならペンタブ、アナログで線画→PCで色付け ならスキャナは必須です。
お絵描きソフトですが、出来るならばレイヤー情報が扱えるソフトが便利です。
フリーで沢山公開されているので自分の好みに合わせてお使い頂くのが宜しいかと思います。


音楽ですがDTM(DeskTop Music)だけでなく、DAW(Digital Audio Workstation)も流行りです。
PC上で音楽制作は勿論、ミックスダウン・レコーディング等を一つのソフトで賄うものです。
こちらもフリーで公開されているものがありますので使ってみるのもいいかもしれません。
ただ、扱う機能がかなり多いので、難しそうだと感じたらDTMから始めてみては如何でしょう。
(といってもDTMも覚えること沢山ありますけど・・・)

とりあえず言えることは、「根気強く頑張る・やり続ける」だと思います。


306ポイント を手に入れた。

Name: 藍霧OO  ..ぴよぴよ(502ポイント)   Date: 2009/08/04(火) 21:19   No:37727 解決!     
Title: ありがとうございます。    
かなり遅くなってしまいすみませんが、皆さんありがとうございます。


特にsitumonさん。画像までつけてもらってとても分かりやすかったです。
おかげでドキューんとバキューんとテキーンといった感じで閃けました。本当にありがとうございます。


なぜか家にスキャナがあったので、自分で描いてPCで色付け、の方で絵は行こうと思ってます(GIMPも昔使いかけた事があったのでDLしてましたし)。


音楽は――ムズカシそうなのでフリーの素材等を使う事にしました。


もう一度。
皆さんほんとにありがとうございました。


では


176ポイント を手に入れた。



Name: tatelis  ..ぴよぴよ(25ポイント)   Date: 2009/08/04(火) 16:26   No:37720       
Title: 画像の指定した座標の色を得る関数    
ある画像を読み込んで指定した座標の色を得たいんです。

int GetPixel(int x, int y, int GrHandle)
 引数
  x, y: 座標
  GrHandle: グラフィックのハンドル
 戻り値
  色情報

このような関数をDXライブラリの力を借りて作ることはできるでしょうか?


25ポイント を手に入れた。


Name: Dixq (管理人)  ..ウィザード(1,047,684ポイント)   Date: 2009/08/04(火) 18:39   No:37722     
Title: Re:画像の指定した座標の色を得る関数    
DXライブラリの本家サイト、リファレンスページ、下の方に、それらが可能な関数が沢山あります。
一度ご覧ください。


41ポイント を手に入れた。

Name: tatelis  ..ぴよぴよ(25ポイント)   Date: 2009/08/04(火) 19:32   No:37725 解決!     
Title: Re:画像の指定した座標の色を得る関数    
DXライブラリのバージョンが古いため該当する関数が見つからなかっただけでした。
DXライブラリを最新のものに更新し、GetPixelSoftImage()関数を用いることで
望みのとおりの動作をさせることができました。
お手数おかけしました。




Name: 華穂  ..初心者(7,545ポイント)   Date: 2009/08/04(火) 05:05   No:37706       
Title: 自機特殊弾    



こんばんわ。
何度も何度もご迷惑をおかけします。

今回は、自機のちょっとした特殊な弾についてどうしてもわからない
ところがあるため、ぜひとも皆さまからのご指南・アドバイスをいただき
たく、こんな真夜中ですが書きこませていただきました。(土下座)


分からないというか・・これはどうすればいいのだろう?というもので、
それが今回のタイトルにある特殊弾というものです。
特殊弾というのは、ステージのクリア特典で使える『チャージショット』
とのことです。

今回・・というか、今これに手を焼かされています。




☆チャージショットについて
@ショットは貫通するもので、雑魚敵は1発で消滅する。

A画面下、128X640のところに設置された(?)ステータス画面に
それぞれチャージバーとチャージゲージの画像を配置。

Bゲージが満タンになる時間は4秒かかり、その間自機は光を放つ。(これは、
自機の画像とは別に、もうひとつ画像を用意しています。(自機が光っている)

C4秒でチャージは完了、QKeyを押すことで発射できる(直進)

Dその増え方・・つまり、ステータス画面側へと設置したチャージバー右に動く・
勝手に(発射することができるまで)溜まるのはオート(AOUT)とする。



というものです。
@に関しては、敵と接触した場合に弾のフラグを0しなければよいということは分かります。
しかし、ここで分からないのが、どのようにしてオートによるチャージのゲージを満タンにする
かということです。(ゲージの大きさは、縦32・横256)
4秒ということはおそらく『GetNowCount();関数』を使うのでは?と考えたのですが、それをどう書いて
いいか分からず・・また、ステータス画面に設置されたチャージバーのオートの移動に関しても
どう書いていいかわからず、こちらでアドバイス・ご指南をいただこうと思いました。


また、チャージ中の自機の光る画像と、普段の自機の画像との入れ替えはどうしればいいのでしょうか?
頭の中で、なんとなくなんですが、『IF文』を使用すれば画像に関しては大丈夫じゃないだろうかとは
思うのですが・・。




どうぞ、よろしくお願いします。



858ポイント を手に入れた。


Name: array [URL]  ..熟練のプログラマー(54,919ポイント)   Date: 2009/08/04(火) 07:53   No:37710     
Title: Re:自機特殊弾    
> 4秒ということはおそらく『GetNowCount();関数』を使うのでは?と考えたのですが、それをどう書いて

これは違うと思います。可能かもしれませんが、パソコンの性能によって処理速度が異なったとき、GetNowCount()関数を使っていると、どのパソコンでも平等に4秒で貯まってしまいます。これでは、パソコンごとにゲームが違う動作をしてしまいますのでFPS制御を用いたほうが良いです。

ゲームはFPS制御しているので(基本的に)1秒間に60回の処理を行っています。(ある理由から60回です。龍神録のFPS制御を読めば書いてあると思います)

なので「 int count = 0 」を用意し「 count++ 」とすれば、1秒でcountの値は60になっています。
ということは、countが240の時、4秒経過したことになります。


話は変わりますが、チャージ系は「現在のチャージゲージの値」を用意し、その値を4秒でMAXになるよう計算して加算していく方が良いかなと思います。

例) 「現在のチャージゲージの値」+= 「最大ゲージ」/ 240.0;

簡単に書くと、これで大体4秒で最大ゲージになると思います。int型だと計算値の切捨てで加算値が0なのでflot型を使うか、他の方法を考えるかした方がいいです。


354ポイント を手に入れた。

Name: 夢夢  ..かけだし(1,233ポイント)   Date: 2009/08/04(火) 11:44   No:37714     
Title: Re:自機特殊弾    
>チャージ中の自機の光る画像と、普段の自機の画像との入れ替えはどうしればいいのでしょうか?
別途、光るエフェクト画像をアニメーションで自機の上に表示させるだけでいいと思います。


48ポイント を手に入れた。

Name: 華穂  ..初心者(7,840ポイント)   Date: 2009/08/04(火) 15:03   No:37719 解決!     
Title: Re:自機特殊弾    




なるほど、『GetNowCount();関数』ではうまくいかないのですね。
私も初めはそれを使って作ってみたのですが、どうもうまくいかず「??」
となりました。

array様、わかりやすいアドバイスありがとうございます。
計算のほうは、実際にいろいろと調べてみて頑張っていきます。
また実際に、龍神録のほうを見てもう少し勉強したいと思います。


夢夢様も、アドバイスありがとうございました。
確かに、アニメーションを使えば出来るかもしれませんね。
アニメーションは使ったことがまだないので、これからこちらのサイトを
見て作ってみたいと思います。



お二方、どうもありがとうございました。
がんばってチャージ攻撃のソースを作っていきたいと思います。

ご協力・わかりやすいアドバイス、ありがとうございました。


295ポイント を手に入れた。



Name: 名無しa  ..ぴよぴよ(195ポイント)   Date: 2009/08/03(月) 23:01   No:37690       
Title: 減速弾    
3方向ショット5発(15°)(減速)
void shot_bullet_H000(int n){
int t=shot[n].cnt;
int k;
if(t>=0 && t<100 && t%20==0){
double angle=shotatan2(n);
for(int i=0;i<3;i++){
if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
shot[n].bullet[k].knd =enemy[shot[n].num].blknd2;
shot[n].bullet[k].angle =angle+PI/12*i-PI/12;
shot[n].bullet[k].flag =1;
shot[n].bullet[k].x =enemy[shot[n].num].x;
shot[n].bullet[k].y =enemy[shot[n].num].y;
shot[n].bullet[k].col =enemy[shot[n].num].col;
shot[n].bullet[k].cnt =0;
shot[n].bullet[k].spd =2;
}
se_flag[0]=1;
}
for(int i=0;i<SHOT_BULLET_MAX;i++){
if(shot[n].bullet[i].flag>0){
int cnt=shot[n].bullet[i].cnt;
if(30<cnt && cnt<80){
shot[n].bullet[i].spd-=1.2/50.0;
}
}
}
}
}



という弾幕を作ってみたのですが、どうもうまくいきません。
ミシャグジさま弾幕(16章)を参考にしたり、龍神録プログラミングの支館(減速ショット・減速しすぎるショット)を参考にしたりしたのですが、減速せずにスピードが2のまま弾が進みます。
分かりにくいのかと思い、「弾速を2、減速を4」などでやってみても、やはりうまくいきませんでした。
どうすればよいのでしょうか、お願いします。


195ポイント を手に入れた。


Name: array [URL]  ..熟練のプログラマー(54,529ポイント)   Date: 2009/08/03(月) 23:40   No:37694     
Title: Re:減速弾    
どの様な動きをイメージされているのか分からないので違う形になってしまうかもしれませんが
ちょっと書き換えてみました。(テストしてないので変わらないかもしれません^^;


void shot_bullet_H000( int n )
{
int t = shot[n].cnt;
int k;

if( t >= 0 && t < 100 && t%20 == 0 )
{
double angle = shotatan2(n);

for( int i = 0; i < 3; i++ )
{
if( shot[n].flag != 2 && ( k = shot_search(n) ) != -1 )
{
shot[n].bullet[k].knd = enemy[shot[n].num].blknd2;
shot[n].bullet[k].angle = angle+PI/12*i-PI/12;
shot[n].bullet[k].flag = 1;
shot[n].bullet[k].x = enemy[shot[n].num].x;
shot[n].bullet[k].y = enemy[shot[n].num].y;
shot[n].bullet[k].col = enemy[shot[n].num].col;
shot[n].bullet[k].cnt = 0;
shot[n].bullet[k].spd = 2;
}
se_flag[0] = 1;
}
}

for( int i = 0; i < SHOT_BULLET_MAX; i++ )
{
if( shot[n].bullet[i].flag > 0 )
{
int cnt = shot[n].bullet[i].cnt;

if( cnt > 30 && cnt < 80 )
{
shot[n].bullet[i].spd -= 1.2/50;
}
}
}
}




347ポイント を手に入れた。

Name: 名無しa  ..ぴよぴよ(272ポイント)   Date: 2009/08/04(火) 00:15   No:37698 解決!     
Title: Re:減速弾    
ちゃんと減速されていました
ありがとうございました!

ひとつ「}」が足りなくて「if」が全体にかかっていたんですね^^;

全く気付きませんでした

通りで自分のは最後の「}」も1つ多いわけですねorz

本当に助かりました
感謝です


77ポイント を手に入れた。

Name: array [URL]  ..熟練のプログラマー(54,565ポイント)   Date: 2009/08/04(火) 07:14   No:37709     
Title: Re:減速弾    
念のために、「 } 」の数は合ってましたが、おっしゃっている通りifがほぼ全体にかかっていました。
「 } 」の位置をずらしただけです


36ポイント を手に入れた。



Name: 華穂  ..初心者(6,364ポイント)   Date: 2009/08/03(月) 23:25   No:37692       
Title: ボスショット    



こんばんわ。
今日はちょっと徹夜覚悟でボスを作ろうかと考えてます。
そこで、ひとまずクラスを作ってみました。
しかし・・ここで問題が発生しまして・・とりあえず、ソースを。



class Boss
{
int Boss1[2], Boss1X, Boss1Y, Boss1W, Boss1H;
int BTama, BTamaX[2], BTamaY[2];
int BLife1, BTSpeed;
int BT_FLag[2];

int ZikiX, ZikiY;

float Radian, Degree, r;
float S, C;
float Target_angle;

public:

Boss();
void boss1();

};

Boss::Boss()
{
//ボスの画像
LoadDivGraph("Boss1.bmp", 2, 2, 1, 64, 64, Boss1);
BTama = LoadGraph("BTama.bmp");

//自機の設定
ZikiX = 0; ZikiY = 176;

//ボス1設定
BLife1 = 30;
Degree = 0;
r = 100;
BT_Flag[0] = 0;
BT_Flag[1] = 0;
BTSpeed = 6;
}

//ボス1の挙動
void Boss::boss1()
{
//ラジアン計算
Radian = Degree * ( PI / 360 );

//角度を1ずつ追加
Degree ++;


//サイン・コサインを求める
S = 1.2*sin(Radian);
C = 2.7*cos(Radian);

//座標を、それぞれサイン・コサインに半径を掛け、画面の半分の値に足す。
Boss1X = 305+r*C;
Boss1Y = 160+r*S;

//移動にて、反転した画像を表示
if(Boss1X-16 > 320)
{
DrawGraph( Boss1X, Boss1Y, Boss1[0], TRUE);
}
else
{
DrawGraph( Boss1X, Boss1Y, Boss1[1], TRUE);
}

//弾の発射
for(i = 0; i < 2; ++i)
{
if(BT_Flag[i] == 0 )
{
BTamaX[i] = Boss1X + 18;
if(i == 0)BTamaY[i] = Boss1Y + 24;
else BTamaY[i] = Boss1Y + 40;

if(BTamaX[i] > 320)
{
//自機から見た敵の角度
Target_angle = atan2(BTamaY[i] - ZikiY, BTamaX[i] - ZikiX);

BTamaX[i] -= cos(Target_angle) * BTSpeed;
BTamaY[i] -= sin(Target_angle) * BTSpeed;
}
else
{
//自機から見た敵の角度
Target_angle = atan2(BTamaY[i] - ZikiY, BTamaX[i] - ZikiX);

BTamaX[i] += cos(Target_angle) * BTSpeed;
BTamaY[i] += sin(Target_angle) * BTSpeed;
}
}
//弾の移動
if( BT_Flag[i] == 1 )
{
if(Boss1X <= 320)
{
BTamaX[i] -= BTSpeed;
}
else
{
BTamaX[i] += BTSpeed;
}

//弾が画面外から出たら消滅
if( BTamaX[i] >= 640 || BTamaX[i] <= -16 )
{
BT_Flag[i] = 0 ;
}
DrawGraph((int)BTamaX[i], (int)BTamaY[i], BTama, TRUE);
}
}
}






これが、ステージ3で、雑魚敵を全滅させた後に出てくるボス1です。
ここのボスは、移動を楕円の形でぐるぐると動きます。(今のソースでは、時計回りの動きですが)
楕円ということで、そこはまぁなんとかできたのですが、問題がちょっと発生しまして・・。

それは、このボスが弾を発射してくれないということです。
このボスは、弾を上下から1発ずつ、つまり計2発の弾を同時に発射し、その弾は自機めがけて
特攻してくるというものです。(上記のソースなら、X軸320を過ぎたら、自機の角度を取り
向かってきます。ホーミングではありません)

特攻ということで、そこは雑魚敵の特攻をまねて作ってみたのですが・・どうにもうまくいかず。
また、ボスということで、自機とは違い弾は間をおいて打ってくるという形にしたいのですが・・
どのようにすればいいのでしょうか?

もちろん、それにはいろいろなやり方があると思っています。
今のところ、考えているのは

1、秒数を数えて、発射する(つまり、5秒たったら発射)
2、発射した弾が、画面外に出たらフラグを0とし再び発射

です。

が、それを考えていても、弾が発射されていない又は弾の画像がうまく表示されていなければ
まったくもって意味がないのでそこは置いときたいと思います。(というより、それを考えて
いないから表示されないのでしょうか?)



今日から3日間は徹夜覚悟で頑張りたいので、どうかご指摘・アドバイス・ご指南の方を
よろしくお願いします。


1,311ポイント を手に入れた。


Name: 夢夢  ..かけだし(1,185ポイント)   Date: 2009/08/04(火) 02:09   No:37703     
Title: Re:ボスショット    
BT_Flag[i]を1にしている部分が見当たりませんが、記述していますか?

31ポイント を手に入れた。

Name: 華穂  ..初心者(6,687ポイント)   Date: 2009/08/04(火) 03:06   No:37705 解決!     
Title: Re:ボスショット    




っあ。
返信が遅くなってすみません、言われてみれば『BT_Flag[i] = 1』を
記述していませんでした。

指摘されるまでまったく気づきませんでしたね・・。
さすがにソースが長くなっているため、細かく見ているつもりでも
見落としていました・・・。

おそらくそれを付け足せば弾が表示されるのでしょうが・・ちょっと今
大変なことに(?)なっておりまして・・何やらソースをコンパイルして起動
させてもすぐに閉じてしまうんですよね。

おそらく、どこかで強制的に終了させているか、危ないコードでも書きこんでいるか・・
それでも助かりました!

夢夢様、毎回毎回本当にご親切なアドバイスとご指摘、ありがとうございます!
私もパンチミスはなくしたいと思っていても・・自分では気づかないところがたくさんあって
正直こちらのサイトを見つけた時にはうれしかったです。


夢夢様、今日からしばらくは何度も分からなくて書きこむことが多くなると思いますが、
その時はどうぞ、よろしくお願いします。



323ポイント を手に入れた。



Name: miruku  ..ぴよぴよ(19ポイント)   Date: 2009/08/03(月) 19:25   No:37682       
Title: マップの作り方    
RPGなどのマップはどうやって作ってるんですか?

19ポイント を手に入れた。


Name: kazuoni [URL]  ..比類無きプログラマー(96,710ポイント)   Date: 2009/08/04(火) 00:17   No:37699     
Title: Re:マップの作り方    
いろいろなやり方がありますが、
管理人さんの紹介している

http://dixq.net/g/#24

が参考にできるかと思います。


42ポイント を手に入れた。



Name: はね  ..中級者(11,683ポイント)   Date: 2009/08/02(日) 22:29   No:37646       
Title: 色と色を掛け合わせて純「赤色」を作る方法    
SetDrawBlendModeを使う等して
二つの色を掛け合わせたら
赤色が作れるようにしたいのですがどうしたらいいでしょうか?
一色で赤色にする方法以外でお願いします。
ちなみに今、こんな感じにやってるんですがうまくいきません。


SetDrawBlendMode( DX_BLENDMODE_ALPHA, 128 );
DrawBox( 0, 340, 0, 420, GetColor( 128,0,0 ), TRUE );
DrawBox( 0, 340, 0, 420, GetColor( 128,0,0 ), TRUE );
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );


144ポイント を手に入れた。


Name: ねこ  ..プログラマー(34,402ポイント)   Date: 2009/08/02(日) 22:41   No:37648     
Title: Re:色と色を掛け合わせて純「赤色」を作る方法    
掛け合わす、というのがどういう表現をしたいのか分かりませんが
提示処理で赤を表示したい場合、GetColor(255,0,0)になります。


36ポイント を手に入れた。

Name: チルチル  ..プログラマー(36,419ポイント)   Date: 2009/08/02(日) 22:53   No:37652     
Title: Re:色と色を掛け合わせて純「赤色」を作る方法    
赤50%と赤50%を重ねて赤100%にするという事でしょうか?

背景が真っ黒なら加算ブレンドで行けるかもしれません・・


32ポイント を手に入れた。

Name: はね  ..中級者(11,818ポイント)   Date: 2009/08/02(日) 22:56   No:37653     
Title: Re:色と色を掛け合わせて純「赤色」を作る方法    
一色で赤色にする方法は
確かにGetColor(255,0,0)で赤にする方法があるのですけど、
二色使って赤を作りたいのです。
色光の三原色的には
赤紫と黄色で赤になるので、
DrawBox( 0, 340, 0, 420, GetColor(255,255, 0), TRUE ); //黄色
DrawBox( 0, 340, 0, 420, GetColor(255, 0,255), TRUE ); //紫
を表示すると、
後の紫色のみ表示されます。
色を混ぜる方法はDXライブラリでは不可能なのでしょうか?


135ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(399,964ポイント)   Date: 2009/08/02(日) 23:01   No:37654     
Title: Re:色と色を掛け合わせて純「赤色」を作る方法    

>赤色が作れるようにしたいのですがどうしたらいいでしょうか?
>一色で赤色にする方法以外でお願いします。

 2つの異なる色を使って演算で赤を作りたい、ということですね。

    DrawBox( 0, 0, 300, 300, GetColor( 255, 255, 0 ), TRUE );
    SetDrawBlendMode( DX_BLENDMODE_SUB, 255 );
    DrawBox( 150, 150, 450, 450, GetColor( 0, 255, 0 ), TRUE );
    SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );

とかどうですか?


274ポイント を手に入れた。

Name: チルチル  ..プログラマー(36,440ポイント)   Date: 2009/08/02(日) 23:03   No:37655     
Title: Re:色と色を掛け合わせて純「赤色」を作る方法    
赤,緑,青を見ると乗算ブレンドで行けるかもしれません

21ポイント を手に入れた。

Name: 御津凪 [URL]  ..ハッカー(108,364ポイント)   Date: 2009/08/02(日) 23:03   No:37656     
Title: Re:色と色を掛け合わせて純「赤色」を作る方法    
加算合成を行えば(DX_BLENDMODE_ADD)可能かと思います。
加算合成は文字通り色成分を加算するので、書き込む色の成分を最大(255)にすれば純色に近づきやすくなります。

たとえば、SetDrawBlendMode 関数に DX_BLENDMODE_ADD, 255 を指定して、
赤色成分のみ 255 にした色で書き込めば、
他の色成分は変わらず、赤色成分は 255 になります。

(光の三原色による掛け合わせは加算合成で表現できます)


138ポイント を落としてしまった。

Name: Justy  ..伝説なるハッカー(400,098ポイント)   Date: 2009/08/02(日) 23:17   No:37657     
Title: Re:色と色を掛け合わせて純「赤色」を作る方法    

>色光の三原色的には赤紫と黄色で赤になるので

 これがイメージに近いかもしれません。

    DrawBox( 0, 0, 300, 300, GetColor( 228, 0, 128), TRUE );
    SetDrawBlendMode( DX_BLENDMODE_MUL, 255 );
    DrawBox( 150, 150, 450, 450, GetColor(255, 241, 0), TRUE );
    SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );


134ポイント を手に入れた。

Name: Dixq (管理人) [URL]  ..ウィザード(1,047,643ポイント)   Date: 2009/08/02(日) 23:37   No:37659     
Title: Re:色と色を掛け合わせて純「赤色」を作る方法    
この前知ったのですが、減算ブレンドはとても処理に時間がかかり、他のブレンドの10倍近い処理時間が必要なようです。
龍神録のファンタズムラストの光の演出が逆転するシーンで全て減算で計算したら、
スペックの良いPCでもゲームになりませんでした。
ですので、減算ブレンドをお使いの際はその辺お気をつけて・・。


27ポイント を手に入れた。

Name: はね  ..中級者(11,928ポイント)   Date: 2009/08/02(日) 23:39   No:37660     
Title: Re:色と色を掛け合わせて純「赤色」を作る方法    
乗算ブレンドでいけました!
リファレンスのページでは
DX_BLENDMODE_MULA   : 乗算ブレンド
と書いてあるのですが、使うときには
DX_BLENDMODE_MUL
と使い、「A」が抜けているのが気になりましたが
とりあえず
ねこさん、チルチルさん、Justyさん、御津凪さん、Dixq (管理人) さん
非常に素早く的確なアドバイスありがとうございました!


2倍のポイントを手に入れた! 110ポイント を手に入れた。

Name: はね  ..中級者(12,062ポイント)   Date: 2009/08/03(月) 08:53   No:37670     
Title: Re:色と色を掛け合わせて純「赤色」を作る方法    
タイトルとは関係ないのですが
乗算ブレンドしたものをさらにαブレンドしたいのですがどうしたらいいでしょうか?

SetDrawBlendMode( DX_BLENDMODE_ALPHA, tesuto.brt );//カウントによって明るさをαブレンドする
SetDrawBlendMode( DX_BLENDMODE_MUL, 255 );
DrawBox( 500, 330, 580, 430, GetColor( 255,0,0 ), TRUE );
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );//ブレンドモードをリセットする。

こんな感じにしてるんですけど、乗算ブレンドは大丈夫なのですがαブレンドは
うまくできてません。アドバイスお願いします


134ポイント を手に入れた。

Name: ねこ  ..プログラマー(34,543ポイント)   Date: 2009/08/03(月) 12:18   No:37674     
Title: Re:色と色を掛け合わせて純「赤色」を作る方法    
SetDrawBlendModeは1種しか設定できなかったはずです。
そのため、2回目の乗算設定で透明ブレンド設定は無効になっています。
255にしているパラメータをtesuto.brtにすればいいとは思いますが
乗算で指定したことがないので思ったように動くかは確認してみて下さい。


74ポイント を手に入れた。

Name: はね  ..中級者(12,120ポイント)   Date: 2009/08/03(月) 12:48   No:37679 解決!     
Title: Re:色と色を掛け合わせて純「赤色」を作る方法    
動きませんでした。
やっぱり一種類しかブレンドできないんですね。
残念です。
ねこさん、アドバイスありがとうございました。


58ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(399,825ポイント)   Date: 2009/08/03(月) 21:14   No:37686     
Title: Re:色と色を掛け合わせて純「赤色」を作る方法    

>やっぱり一種類しかブレンドできないんですね

ちょっとやりたいことを正しく理解している自身はないのですが

SetDrawBlendMode(DX_BLENDMODE_MULA, tesuto.brt);

ではだめですか?


116ポイント を手に入れた。



Name: 華穂  ..入門者(4,761ポイント)   Date: 2009/08/02(日) 19:42   No:37638       
Title: 敵の増加について    



華穂です。
ここ数日なぜかこちらのサイトにつながらなくて、焦りましたが、
今日恐る恐る来てみたらまた観覧できるようになってました。
ちょっと一安心。


今日なのですが・・ちょっと、立てていたスケジュールの進行がかなり遅れていて、
このままだと里帰りできないため、気合い入れて作っているのですが・・やっぱり詰まりました。

えと、前にも似たような(?)質問したと思うのですが、敵の出し方です。
クラスで書いています。(というかこの質問・・しましたっけ?)

まずは・・中途半端なソースコードでも・・(所々分からずひとまずおいてたりしてます)。
今回は、雑魚敵のクラスです。



class EZako
{
    int EZako;
int TEZako;
int EZakoX, EZakoY;
double TEZakoX, TEZakoY;
    //↓はあれです・・当り判定で消滅した時の画像のために用意しましたが・・まだ使わんかも。  
     int BotuEZako, BotuTEZako;
     int EZSpeed;
int EZCounter;
int EZLife;
int TEZ_Set;
float Target_angle;

//自機のXY
int ZikiX, ZikiY;

public:
EZako();
void EZ_move();
void TEZ_move();
};

//雑魚的の初期化
EZako::EZako()
{
//座標設定
EZakoX = 640;
EZakoY = GetRand(300);
TEZakoX = 640;
TEZakoY = GetRand(200);
 EZLife = 1;

//敵の早さ
EZSpeed = 3;

//敵のセット(制御的な?)
TEZ_Set = 0;

//画像ロード
EZako[5] = LoadGraph("EZako.bmp");
TEZako = LoadGraph("EZako.bmp");

}

//波敵
void EZako::EZ_move()
{
//毎フレームに5加算
EZCounter += 3;

//雑魚敵の座標を移動している方向に移動
//Y = y方向中心位置 + 振幅 * sin( π/周期 * e.cnt );
EZakoX -= 1;
EZakoY = 100 + 25*sin( PI/100 * EZCounter);

DrawGraph( EZakoX, EZakoY, EZako[5], TRUE);
}

//特攻敵
void EZako::TEZ_move()
{
//もし、特攻Xが320以上ならまっすぐ進む。
if( TEZakoX > 320)
{
TEZakoX -= EZSpeed;
}
//320を過ぎたなら、自分から見た自機の角度を保持して特攻する
else
{
if( TEZ_Set == 0)
{
//自機から見た敵の角度
Target_angle = atan2(TEZakoY - ZikiY, TEZakoX - ZikiX)

TEZ_Set = 1;
}
TEZakoX -= cos(Target_angle) * EZSpeed;
TEZakoY -= sin(Target_angle) * EZSpeed;
}
DrawGraph( TEZakoX, TEZakoY, TEZako, TRUE);
}





です。
ひとまず、今は敵がそれぞれ特攻と波で1体ずつ出ています。
それぞれ名称は違いますが、同じ画像を使用しています。

えと、それで・・今回は少し困ったことが多いのですが・・。



☆問題☆
@敵の体力は設定しているものの、ステージが進むにつれて体力が増えるため、
どうしていいか分からない。

A敵は、最初は8機。2ステ:14機、3ステ:20機、4ステ:40機、5ステ:50機
おり、波と特攻で分かれている(ステ1なら波5・特3)。そこはいいのだが、
これらの数をどうやってステージごとに管理・表示していいかわからない。(ちなみに、
敵は1機倒されるごとに1機増える。(右端からY軸ランダムで出現)

B敵を複数表示するため配列を使い、またそれプラスfor文を使用して敵を
表示したいがうまくいかない。(誰か配列も含め詳しく教えてください)

CBでもし1ステージの敵がそれぞれ表示できても、2ステージからは
どうすればいいのか、アドバイスがほしい。

Dというか、上記のソースコードではこれらの問題を解決するための
ものがまだ書かれていない・足りていない&あれこれ考えてごちゃごちゃして
手が止まってしまうため、「これとかこのために用意したり、こんな風に使えばいいんじゃね?」
的なアドバイスがほしい。

E一応体力など決めてはいるが・・このままの当り判定に関して別のクラスを作ろう
と考えているため、ここで設定しても意味がないような気がするが・・どうでしょう?





が、今のところ困っている雑魚敵の問題です。
てかここで詰まってるとボスで泣きそうな予感がします。
雑魚敵の座標のところで、GetRandを使ってますが、まだ適当に数字を入れているだけです。
(1体しか表示されてないので)本来は画面右端の画面外から画面内に出てくるように設計を立ててます。
というか、座標のX時点で画面内ギリギリ入ってますね、なんか(殴)



なので、どうか詳しいアドバイス・ご指摘・ご指南のほうをよろしくお願いします。


190ポイント を手に入れた。


Name: 華穂  ..入門者(4,858ポイント)   Date: 2009/08/02(日) 19:46   No:37639     
Title: Re:敵の増加について    




上記の投稿、いろいろずれてたりして見にくくなって申し訳ありません。

あと、


//毎フレームに5加算
EZCounter += 3;


と書いて、コメントの数字と実際の数字が違うのはパンチミスです。
『5』ではなく『3』が正しいです。


いろいろと申し訳ありません。


97ポイント を手に入れた。

Name: 夢夢  ..かけだし(1,154ポイント)   Date: 2009/08/03(月) 12:39   No:37677     
Title: Re:敵の増加について    
1.ステージ毎に+α初期HPを加える or 別データに設定しておく。
2.別データに出現データを作る。(csvファイルなどで 出現ステージ,初期X,初期Y,ステージ開始から○カウント後出現するかなどのように記述、読み込んでデータを元に実行する)
3.ステージ数などで敵出現数が変化するので、敵最大出現数を毎回変更する必要がある。
クラスはあまり使ったことがないので、教えることができませんが、
必要敵数生成→値を変更→ステージが終了したら破棄の流れでいいと思います。
当たり判定などは自機と敵機(多数)で行うので、出現している全ての敵と当たり判定をしないといけません。

for(i=0;i<MAX_ENEMY;i++){
for(ii=0;ii<MAX_P_SHOT;ii++){
if(自機の弾と敵[i]が当たっていたら){
//当たった処理
}
}
if(自機と敵[i]が当たっていたら){
//当たった処理
}
//敵の弾も当たり判定
for(ii=0;ii<MAX_E_SHOT;ii++){
if(自機と敵[i]の弾が当たっていたら){
//当たった処理
}
}
}

これを毎フレーム確認することになると思います。
(弾が発射しているかを確認する手段・現在出現している敵を確認する手段などの処理も入れる必要があります。)

4~6.一色単に考えず、パーツに分けて関数をつくり、最後につなぎ合わせる方が目で見てわかりやすいと思います。
・CSVファイルに入力したデータを元に敵を動かしてみる。
 ・波敵を1 特攻敵を2と決めて、入力した通りに出現するか
 ・初期座標をCSVに設定して、その場所から出現するか
 ・
・敵をランダム生成して、お互いに当たり判定を作り、ぶつけてみる。(進む方角は360度ランダム、当たったらとりあえず消える・画面外に出たら消える)
・体力を設定し、当たったら体力が減るようにし、体力が0になったら消えるようにする。

一通り作ってしまった後に追加しようとすると、色々不都合が出たりします。
プロットを作り、何が必要なのかを再確認してみるのもいいと思います。


523ポイント を手に入れた。

Name: 華穂  ..初心者(5,053ポイント)   Date: 2009/08/03(月) 21:09   No:37685 解決!     
Title: Re:敵の増加について    


返信が遅くなって申し訳ありません、夢夢様!!

なるほど・・そういう流れなら、なんとかなるかもしれませんっ。
助かりました、今日配列を使ってみて、処理をしてみましたが、うまく
いったので、後はステージごとに出すという処理をつくらなければなりませんが・・
なんとか自力で頑張りたいと思います。

夢夢様からのアドバイスも、参考にさせていただきますね!
また、雑魚敵に関してはどうしても最終ステージで50機いる以上構造体を
雑魚敵のクラスで作ることになったため、なんとか・・いけるかなぁと。

いろいろとお世話になって申し訳ありません。
というか、自分が無知すぎるのがはずかしいですが、どうぞこれからもよろしくおねがいします。






195ポイント を手に入れた。



Name: さとり  ..かけだし(1,249ポイント)   Date: 2009/08/02(日) 22:31   No:37647       
Title: 無題    
龍神録を参考にして妖妖夢風のPSP化を始めました。
それで一章から始めて今4章なのですが
どうしてもエラーが出ます。

---graph.cpp---
extern ch_t ch;
extern int img_ch[2][12];

void graph_ch(){
DrawRotaGraphF(ch.x,ch.y,1.0f,0.0f,img_ch[0][ch.img],TRUE);
}

void graph_main(){
graph_ch();
}

---load.cpp---
extern int img_ch[2][12];

void load(){
LoadDivGraph("../dat.player00.png",12,4,3,33,38,img_ch[0]);
}

---main.cpp---
//データのロード
extern void load();

//描画メイン
extern void graph_main();

int img_ch[2][12]; //キャラクタ画像9枚分 X2(変身用)
//キャラクタデータ宣言
int ch_t ch;
//ループで必ず行う3大処理
int ProcessLoop(){
if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す

return 0;
}

int main(){
if(DxLib_Init() == -1 ) return -1;//初期化と裏画面化

load();//データロード

while(ProcessLoop()==0){//メインループ

graph_main();//描画メイン


ScreenFlip();//裏画面反映
}

DxLib_End();//DXライブラリ終了処理
return 0;
}

---struct.h---
typedef struct{
int flag; //フラグ
int cnt; //カウンタ
int power; //パワー
int point; //ポイント
int score; //スコア
int num; //残機数
int mutekicnt; //無敵状態とカウント
int shot_mode; //ショットモード
int money; //お金
int img; //画像
int slow; //スローかどうか
double x,y; //座標
}ch_t;

エラーの内容は
main.c:18: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'ch'
chの前に何か加えろということでしょうか?

ちなみにキー関係はPSPなので手をつけていません







1,006ポイント を手に入れた。


Name: ねこ  ..プログラマー(34,469ポイント)   Date: 2009/08/02(日) 22:44   No:37649     
Title: Re:無題    
int ch_t ch;
↑が要らないと思います。後、構造体定義したヘッダファイルがincludeされてるのか不明です。


67ポイント を手に入れた。

Name: さとり  ..かけだし(1,336ポイント)   Date: 2009/08/02(日) 23:29   No:37658     
Title: Re:無題    
たびたびすみません。
intをはずしincludeをして構造体のエラーがなくなったのですが、新しいエラーが発生しました


graph.c: In function 'graph_ch':
graph.c:9: error: too few arguments to function 'DrawRotaGraphF'
make: *** [graph.o] Error 1


87ポイント を手に入れた。

Name:  ..かけだし(1,212ポイント)   Date: 2009/08/03(月) 00:27   No:37663     
Title: Re:無題    
ミスです

すいません


100ポイント を手に入れた。

Name: pooka [URL]  ..中級者(11,691ポイント)   Date: 2009/08/03(月) 19:26   No:37683     
Title: Re:無題    
少し見ただけなので違うかもしれませんが、
DrawRotaGraphF関数の引数の最後に、「画像の左右反転を行うかのフラグ」があるので
TRUEまたはFALSEを指定すればいけるかもしれません。


73ポイント を手に入れた。



Name: アパッチ  ..ぴよぴよ(90ポイント)   Date: 2009/08/02(日) 18:49   No:37633       
Title: プログラムの内容    
「以下のようなプログラムの内容を詳しく説明せよ」という宿題が出たのですが、明日提出なのを忘れていて全く手をつけていない状況です。
そこで、失礼なのは承知なのですが以下のプログラムを詳しく説明して頂けないでしょうか?
月曜日の12時が締め切りなのでよろしくお願いします。
なお、プログラム中のfortran.txtは添付しておきます。
本当によろしくお願いします。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(void)
{
FILE *fp;
char fortran[10][29];
int i,j,k,l,m,n;
char comment[30];

char L[6][5];
char s[6][5];
char enzanshi[5];
char a,b;
int p,q;

fp = fopen( "fortran.txt", "r" );

if( fp == NULL )
{
puts( "ファイルが開けません" );
return 1;
}
printf("\n\nFORTRANプログラム\n\n");

for(i=0;i<=10;i++)
{
if( fgets( fortran[i], sizeof (fortran), fp ) == NULL )
{
break;
}

printf("%s",fortran[i]);
}


printf("\n\nCプログラム\n\n\n");

if(fortran[0][0] == 'C'){
for(k=0;k<30;k++){
if((fortran[0][k]=='S')&&(fortran[0][k+1]=='H')&&(fortran[0][k+2]=='I')&&(fortran[0][k+3]=='S')&&(fortran[0][k+4]=='O')&&(fortran[0][k+5]=='K')&&(fortran[0][k+6]=='U')&&(fortran[0][k+8]=='E')&&(fortran[0][k+9]=='N')&&(fortran[0][k+10]=='Z')&&(fortran[0][k+11]=='A')&&(fortran[0][k+12]=='N'))
printf("/* 四則演算 */\n\n#include<stdio.h>\n\n int main(void)\n{\n");
}
}





sscanf(fortran[1]+6,"READ(5,10)%2s,%2s",L[0],L[1]);

for(i=0;i<=3;i++)
{
sscanf(fortran[i+3]+6,"%2s=IA%cIB",L[i+2],&enzanshi[i]);
}



for(l=0; l<=5; l++)
{
for(k=0; k<5; k++)
{
s[l][k] = tolower(L[l][k]);
}
}



sscanf(fortran[2]+6,"FORMAT(2%c%d)",&a,&p);

sscanf(fortran[8]+6,"FORMAT(1H,4%c%d)",&b,&q);



if(a == 'I')
{
printf(" int %s,%s;\n",s[0],s[1]);
}

if(b == 'I')
{
printf(" int %s,%s,%s,%s;\n",s[2],s[3],s[4],s[5]);
}



if(fortran[1][6] == 'R' && fortran[1][7] == 'E' && fortran[1][8] == 'A' && fortran[1][9] == 'D' )
  {

  printf(" scanf(\"%%%dd %%%dd\",&%s,&%s);\n",p,p,s[0],s[1]);

  }



if(fortran[7][6] == 'W' && fortran[7][7] == 'R' && fortran[7][8] == 'I' && fortran[7][9] == 'T' && fortran[7][10] == 'E' )
{

for(m=0; m<=3; m++)
{
printf (" %s=%s%c%s;\n",s[m+2],s[0],enzanshi[m],s[1]);
}

for(n=0; n<=3;n++)
{
printf(" printf(\"%%%dd\\n\",%s);\n",q,s[n+2]);
}

}

if(fortran[9][6] == 'E' && fortran[9][7] == 'N' && fortran[9][8] == 'D' )
{
puts(" return 0;\n}");
}


return 0;
}


90ポイント を手に入れた。


Name: non  ..熟練のプログラマー(59,371ポイント)   Date: 2009/08/02(日) 19:09   No:37634     
Title: Re:プログラムの内容    
このプログラムの何を説明すればいいのでしょうか?
何をするプログラムかということでしょうか?
それは、実行すればわかるでしょうし。

私には、このプログラムを作成した人の目的がわかりません。
したがって、この問題を出した人の意図がわかりません。
授業を習っているのですから、何か目的がわかるのではないですか?





152ポイント を手に入れた。

Name: アパッチ  ..ぴよぴよ(246ポイント)   Date: 2009/08/02(日) 19:30   No:37635     
Title: Re:プログラムの内容    
説明足りなくてすみません。
プリントを見る限り、プログラムを1行ずつ説明するらしいです。
例えば9行目に関しては、int i,j,k,l,m,n;はint関数を使ってi,j,k,l,m,nの六つの変数を定義する。
といった感じで説明していくらしいです。
一応、○行目〜○行目までは・・・といった感じにまとめて説明することも可能らしいのですが、なるべく詳しく説明しろとのことです。


156ポイント を手に入れた。

Name: non  ..熟練のプログラマー(59,523ポイント)   Date: 2009/08/02(日) 19:37   No:37637     
Title: Re:プログラムの内容    
試験をやって出来なかった人へのペナルティみたいな課題ですね。
まさか、アパッチさんが全てがわからないということはないですよね。
9行目はちゃんと回答しているのだから。
このままでは、きっと誰も回答を示してはくれません。(たぶん)
まだ、16時間はあるのですから、やれるところまでやって、どうしても
わからない行だけ質問すべきでしょう。


152ポイント を手に入れた。

Name: アパッチ  ..ぴよぴよ(305ポイント)   Date: 2009/08/02(日) 20:00   No:37640     
Title: 無題    
そうですね。
自分でがんばってみます。
ただ、所々に出てくる[]がよくわかりません。
これは何なんですか?


59ポイント を手に入れた。

Name: non  ..熟練のプログラマー(59,555ポイント)   Date: 2009/08/02(日) 20:07   No:37641     
Title: Re:無題    
配列です。・・・って?そのレベルから・・・こりゃ、大変だ。





32ポイント を手に入れた。

Name: アパッチ  ..ぴよぴよ(336ポイント)   Date: 2009/08/03(月) 00:11   No:37661     
Title: Re:無題    
だから今回だけは全部教えてほしいんです。
本当にお願いします



31ポイント を手に入れた。

Name: sizuma [URL]  ..中級者(11,693ポイント)   Date: 2009/08/03(月) 17:28   No:37681     
Title: Re:無題    
>所々に出てくる[]
>配列です
入門者相手だからでしょうけど、一応。

[]は添字演算子。
宣言中では[]は配列だけど、それ以外式の中ではポインタ演算のシンタックスシュガーですね。
宣言外では[]は配列とは無関係です。


2倍のポイントを手に入れた! 212ポイント を手に入れた。



Name: kai  ..かけだし(2,479ポイント)   Date: 2009/08/03(月) 12:18   No:37673       
Title: キーの初期化について    
改造龍神録についてです。
タイトルを作り、4つの選択肢を作り、
その選択肢を選ぶと、番号が光るとします。
光る番号はCheckStateKey(KEY_INPUT_DOWN)==1、CheckStateKey(KEY_INPUT_UP)==1
を使って移動させてます。光る番号を押すとゲームスタートします。

1、ゲームスタート
2、ゲームすたーと
3、げーむスタート
4、げーむすたーと

また、どの選択肢を選んでもゲームメインに移動しゲームスタートするとします。
3番目を選んでからゲームを初めてから、タイトルに戻るボタン(があったとして)を押して
タイトル画面に戻ると、3番目の選択肢の番号が光ってます。

これを、タイトルに戻るボタンを押したら
1番目の選択肢の番号が光るようにキーを初期化したいのですが、
なんという関数を使えばいいのでしょうか?
誰か教えてください・・


209ポイント を手に入れた。


Name: ねこ  ..プログラマー(34,647ポイント)   Date: 2009/08/03(月) 12:20   No:37675     
Title: Re:キーの初期化について    
光る場所を覚える変数があると思いますが、その変数を
ゲームメインに移動するタイミングで初期化するか、タイトルに戻るタイミングで初期化するかしたら良いんじゃないでしょうか?
関数というか変数レベルの問題です。


104ポイント を手に入れた。

Name: kai  ..入門者(2,727ポイント)   Date: 2009/08/03(月) 12:35   No:37676     
Title: Re:キーの初期化について    
光るのはあくまで例でして、
実際はswitch文を使い、
state_0ならばその画像を表示(ゲームスタート)、
その画像を表示中に
CheckStateKey(KEY_INPUT_DOWN)==1ならば
state_1になる&画像を表示(ゲームすたーと)
CheckStateKey(KEY_INPUT_UP)==1ならば
state_5になる&画像を表示(げーむすたーと)
CheckStateKey(KEY_INPUT_Z)==1ならば
ゲームがスタートするみたいにしてます。
なのでキーを初期化すればいいんじゃないと思ったのですが、
そのキー自体の初期化が分からなくて困ってます。

初期化につきましては
func_state=3(タイトル前の初期化)あたりに
second_ini();を用意してあるので
ここで初期化するようにしてます。
初期化が終わったらタイトルメインに飛ぶようにしてあります。
ちなみにfunc_state=5にタイトルメインを持ってきてます。
なのでゲームメインから、タイトルに戻るときは
func_state=3に飛ぶようにして、初期化してます。


248ポイント を手に入れた。

Name: kai  ..入門者(2,806ポイント)   Date: 2009/08/03(月) 12:44   No:37678 解決!     
Title: Re:キーの初期化について    
あ・・w
書いてて分かったのですが
初期化の部分で
state_0をすれば一番てっとりばやいですね
すみません。お騒がせしました。自己解決しました。
アドバイスをくれたねこさん、ありがとうございました。


79ポイント を手に入れた。



Name: kono  ..ぴよぴよ(107ポイント)   Date: 2009/08/02(日) 17:07   No:37621       
Title: Cの後に。。。    
現在Cを勉強しているのですがCの次に学ぶ言語としてはなにが良いのでしょうか?

やはり、Java ・ C++ あたりでしょうか?


28ポイント を手に入れた。


Name: たかぎ [URL]  ..ハッカー(110,026ポイント)   Date: 2009/08/02(日) 17:12   No:37623     
Title: Re:Cの後に。。。    
Cを勉強して、その成果を発揮したのでしょうか?
そうでないなら、何のためにCを学んだのでしょうか?
そこをはっきりさせないと、次々と別の言語を学んでも意味がありません。


67ポイント を手に入れた。

Name: ねこ  ..プログラマー(34,272ポイント)   Date: 2009/08/02(日) 17:39   No:37626     
Title: Re:Cの後に。。。    
言語は道具(ツール)であり目的ではありません。
例えばWEBシステムを作りたい、便利なアプリケーションを作りたい、ブラウザゲームを作りたいと言った目的があれば
それに合った言語を紹介する事も出来ます。


76ポイント を手に入れた。

Name: kazuoni [URL]  ..比類無きプログラマー(96,202ポイント)   Date: 2009/08/02(日) 17:40   No:37627     
Title: Re:Cの後に。。。    
C,C++,Javaと渡り歩いたものです。(達成度は低い)

C++,Javaは自分の考えですが、
C言語のステップアップとするのは間違いとはいいませんが、
正解ではないと思います。

学習する目的が必要かと思います。
それが、学校、会社で必要でも構わないと思いますが。
単に資格のようにもつことに自分はあまりメリットを感じません。
それならば、会社から必要とされた時に必死にやったほうが、
効率も、実践力も身につけれるのではないかと。

単に趣味だとしたら、
「konoさんのやりたいものをやればいい」
になってしまうと思います^^;


2倍のポイントを手に入れた! 430ポイント を手に入れた。

Name: dic  ..プログラマー(29,538ポイント)   Date: 2009/08/02(日) 18:08   No:37631     
Title: Re:Cの後に。。。    
プログラム言語の一覧です

http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E%E4%B8%80%E8%A6%A7

得意、不得意、参考書の種類、多さ、ネット上の情報源、知人や友達も知ってるかなど
考慮するといいかもしれません


136ポイント を手に入れた。

Name: MNS  ..中級者(13,766ポイント)   Date: 2009/08/02(日) 18:16   No:37632     
Title: Re:Cの後に。。。    
http://vipprog.net/wiki/prog_lang_list.html
ここに各言語の簡単な説明があります。
知らない言語も数多くあると思うので、
一通り見てみることをお勧めします。


2倍のポイントを手に入れた! 92ポイント を手に入れた。

Name: 夢夢  ..ぴよぴよ(631ポイント)   Date: 2009/08/03(月) 12:05   No:37672     
Title: Re:Cの後に。。。    
英会話と一緒で、実際に実行してみないと上達もしませんし、
なにか目的がないと覚える意味もありません。
まず、勉強したC言語で何が出来るのか、何がしたいのかを明確にする方が先だと思います。


66ポイント を手に入れた。



Name: dic  ..プログラマー(29,339ポイント)   Date: 2009/08/02(日) 17:08   No:37622       
Title: デストラクタについて確認したいのですが    
以下のようなコードがありますが
基本クラスでデストラクタを宣言、実装してない場合
それを派生したクラスをdeleteするとき、デクトラクタが呼ばれませんが
これはこれで 正しかったのでしょうか?


#include <stdio.h>

class CBase
{
public:
virtual void Show();
};

void CBase::Show()
{
printf( "CBase::Show.\n" );
}

class CDev : public CBase
{
public:
CDev();
~CDev();
void Show();
};

CDev::CDev()
{
printf( "CDev construct.\n" );
}
CDev::~CDev()
{
printf( "CDev destruct.\n" );
}
void CDev::Show()
{
printf( "CDev::Show.\n" );
}

void main()
{
CBase *obj = new CDev;

obj->Show();

delete obj;
}



356ポイント を手に入れた。


Name: たかぎ [URL]  ..ハッカー(110,096ポイント)   Date: 2009/08/02(日) 17:14   No:37624     
Title: Re:デストラクタについて確認したいのですが    
改善点は少なくとも二つあります。

1. CBaseクラスに仮想デストラクタがない。
2. mainの返却値型がvoidなので、未定義の動作を引き起こしている。


70ポイント を手に入れた。

Name: ねこ  ..プログラマー(34,196ポイント)   Date: 2009/08/02(日) 17:37   No:37625     
Title: Re:デストラクタについて確認したいのですが    
意図が分かりませんが、ソース上では正しい動作です。

CBaseのポインタでインスタンスを受け取っているのでdeleteすれば当然CBaseのデストラクタが実行されます。
CDevクラスのデストラクタを実行したいのであれば以下のようにします。

1.たかぎさんの1番にあるようにCBaseのデストラクタにはvirtual定義を付ける
2.delete (CDev*)(obj);というようにキャストしてからdeleteを実行する


2倍のポイントを手に入れた! 210ポイント を手に入れた。

Name: dic  ..プログラマー(29,402ポイント)   Date: 2009/08/02(日) 17:48   No:37629 解決!     
Title: Re:デストラクタについて確認したいのですが    
なるほど
表現を変えると基本クラスで仮想デストラクタがない場合の動作としては正しいか?
と言った方がよかったかもしれません

回答ありがとうございました


63ポイント を手に入れた。

Name: YuO  ..プログラマー(32,065ポイント)   Date: 2009/08/02(日) 19:36   No:37636     
Title: Re:デストラクタについて確認したいのですが    
解決となっていますが,
> 基本クラスで仮想デストラクタがない場合の動作としては正しいか?
その場合,未定義の振る舞いとなります。
なので,根本的に「正しい動作」の定義が存在しません。


34ポイント を手に入れた。



Name: kai  ..かけだし(2,277ポイント)   Date: 2009/07/28(火) 08:03   No:37419       
Title: ちょっとレベルの高いスコア表示の仕方    
改造龍神録のことですが
例えば、スコアアイテムを取ったらch.score+=5000;
としたら、スコアの表示は4桁目だけが動きます。
ただ、最近東方をやってみて分かったのですが
東方では点アイテムを取ったら+1000されるとしたら
スコアの表示が1桁目から計算されて
1〜4桁目の表示が動きます。
このように実装したいのですが計算式などが分からず・・困ってます・・
どのようにしたらこのような表示ができるのでしょうか?
アドバイスお願いします。


66ポイント を手に入れた。


Name: ねこ  ..プログラマー(31,839ポイント)   Date: 2009/07/28(火) 09:06   No:37422     
Title: Re:ちょっとレベルの高いスコア表示の仕方    
実際のスコアと表示するスコアを別変数に保持する事で実装できます。

int real_score = 0, disp_score = 0;
のように二つ変数を用意しておいて、スコアはreal_scoreに加算しておきます。
そして、ループ処理の中に

// 表示スコアが実際のスコアより小さい時
if( disp_score < real_score ){
// 100点ずつ加算
disp_score += 100;
// 実際のスコアを超えたら同じ値にする
if( disp_score > real_score )
disp_score = real_score;
}

というようにすると、スコアがあがってからしばらくは100点ずつ増えます。
これを10点ずつや11点ずつにするとスコアがどんどん回転して増え続けるような感じに見せることが出来ます。


282ポイント を手に入れた。

Name: kai  ..かけだし(2,305ポイント)   Date: 2009/07/29(水) 20:43   No:37470     
Title: Re:ちょっとレベルの高いスコア表示の仕方    
ということは実際に表示するのは
disp_score
のほうを表示すればいいのでしょうか?


28ポイント を手に入れた。

Name: kai  ..かけだし(2,376ポイント)   Date: 2009/08/01(土) 23:44   No:37573     
Title: Re:ちょっとレベルの高いスコア表示の仕方    
東方は+1000点でも+100000点の時でも
同じ時間でカウンタが動いてるように見えるんですけど、
これは特殊な関数か何かを使ってるんでしょうか?


71ポイント を手に入れた。

Name: チルチル  ..プログラマー(36,387ポイント)   Date: 2009/08/02(日) 00:07   No:37579     
Title: Re:ちょっとレベルの高いスコア表示の仕方    
見た感じ星蓮船では
10,1010,1001010
のような単位で加算しているようですね
これはfor文を使えば簡単に似せる事ができます
まあ同じ方法を使わないと完全に同じにはなりませんが・・


62ポイント を手に入れた。

Name: array [URL]  ..熟練のプログラマー(52,540ポイント)   Date: 2009/08/02(日) 00:07   No:37580     
Title: Re:ちょっとレベルの高いスコア表示の仕方    
特殊な関数は使っていないと思います。
同じ時間でカウンタが動くという事は、加算値が違うということになるので

ねこさんのプログラムを拝借すると

#define SCORE_TIME 100 // スコアを加算するカウント

// 表示スコアが実際のスコアより小さい時
if( disp_score < real_score ){
int add_score = real_score - disp_score;

disp_score += add_score / SCORE_TIME;
// 実際のスコアを超えたら同じ値にする
if( disp_score > real_score )
disp_score = real_score;
}

 
この様な形にしてはどうでしょうか、int型で割り算を行うので少数は切り捨てになるので注意が必要ですが
ある程度同じ時間で加算してくれると思います。


298ポイント を手に入れた。

Name: kai  ..かけだし(2,270ポイント)   Date: 2009/08/02(日) 18:00   No:37630 解決!     
Title: Re:ちょっとレベルの高いスコア表示の仕方    
disp_score += add_score / SCORE_TIME;
の部分は
disp_score += add_score / SCORE_TIME + SCORE_TIME;
にしたほうがいいかも?
ともあれ
ねこさん、チルチルさん、arrayさん
アドバイスありがとうございます。
とても参考になりました。
おかげさまで無事実装できました。
ありがとうございました!


106ポイント を落としてしまった。




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +