|
Name: yu ..ぴよぴよ(60ポイント)
Date: 2008/10/22(水) 00:19
No:22798
|
|
Title: 構造体についてのエラー
|
|
お初です
管理者様の龍神録をダウンロードさせていただきいろいろと自分で追加したりしているのですが
どうも構造体を自分で新しく追加するのができません・・・
他のファイルでその追加した構造体の変数を使おうとするとエラーがでてしまいます。
どこが間違っているのかもわからないのですが、
エラーの言っていることも分かりませんでした・・・
どなたかこんな無知な自分に教えてくだされば幸いです。
エラー内容
<pre>
1>ini.obj : error LNK2001: 外部シンボル ""struct spell_t spell" (?spell@@3Uspell_t@@A)" は未解決です。
1>C:\Users\家\Desktop\test\50章\Debug\RyuJin.exe : fatal error LNK1120: 外部参照 1 が未解決です。
エラーが起きてしまうソース
----struct.h-----に追加
typedef struct{
int flag,graph,cnt;
}spell_t;
-----GV_h-----に追加
GLOBAL spell_t spell;
-----ini.cpp-----のvoid ini に追加(ini.cpp以外のファイルでもエラーが出ます)
spell.flag=1;
結構最近C++をやり始めましたので簡単、初歩的なミスをしていましたらすみません;
60ポイント を手に入れた。
|
|
|
|
Name: yu ..ぴよぴよ(131ポイント)
Date: 2008/10/22(水) 00:41
No:22801
| 解決!
|
Title: Re:構造体についてのエラー
|
|
ありがとうございます!
リビルドしたところちゃんとできました。
反映されていなかったんですね・・・
1時間考えていたのですが、もっと早く聞けばよかったですw
管理者様ありがとうございました!
これからもサイトの更新頑張ってください!
かなり参考になっていますから!
71ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(828,873ポイント)
Date: 2008/10/22(水) 00:47
No:22802
|
|
Title: Re:構造体についてのエラー
|
|
ありがとうございます。
.cppファイルは変更したら必ず反映されるのですが、
ヘッダファイルは反映されないことがあるので、
おかしいなと思った時はリビルドしてみるといいです。
加えて、VC++は何故かたま〜におかしな挙動をすることがあるので、
リビルドしても動かず、どう考えてもおかしいときは、VC++を再起動してみるとうまくいく事あります。
後、実行ファイルが実行できないときは、前に実行した実行ファイルが動いている場合があるので、
タスクマネージャーを見てプロジェクトと同じ名前の実行ファイルが実行されていないか確認してみて下さい。
そのファイルを強制終了させると動くようになります。
VC++使用中に困る事はこれ位でしょうか。何か参考になればm(_ _)m
333ポイント を手に入れた。
|
|
|
|
Name: 一直線 ..ぴよぴよ(7ポイント)
Date: 2008/10/21(火) 20:23
No:22790
|
|
Title: 初です
|
|
slnファイルの開け方がわからないのですがどうすればよいですか?
7ポイント を手に入れた。
|
|
|
Name: 究極の初心者 ..初心者(8,000ポイント)
Date: 2008/10/21(火) 00:40
No:22720
|
|
Title: リンクについて・・・・(VisualC++ 2008 Express Edition)
|
|
リンクについて、質問させて頂きます。
初めは、サイトをめぐり、簡単に学んでいたのですが、サイトよりきりで説明が変わったりするので、只今、参考書を片手にC言語を学んでいます。
その参考書で、ファイルを分割するという内容がでました。
ただ、コンパイラは人によって違うということで、明確な答えは参考書に載っていません。
私は、「VisualC++ 2008 Express Edition」のコンパイラを使用しています。
参考書には「説明書を参考にしてください」と、書いてあったのですが、ヘルプを参考にしても、いまいちよくわからなかったもので・・・・。
そこで、このコンパイラでのリンクのやり方が、正しいかを教えてください。
ヘッダファイル1つ
ソースファイル2つ
をリンクしたいとします。
1.ヘッダファイルで、追加>新しい項目>テンプレートはヘッダーファイル>「head」という名前で作成
2.ヘッダファイルにて、関数プロトタイプ(仮に、max()関数とします)を宣言。
3.ソースファイルで、追加>新しい項目>テンプレ−トはC++ファイル>「max」という名前で作成
4.ソースファイルに、max()関数のコードを入力。
5.3と同じく、ソースファイルに「main」という名で新規作成。
6.main()関数(プログラム本体?)のコードを入力。(このとき、#include "head.h"も最初に入力する)
一応、これでビルドしたところ、問題なくできたのですが、リンクのやり方というのは、これでいいんでしょうか?
コードを張ると、若干説明しにくくなるような気がしたので、貼りませんでしたが、貼ったほうがいい場合は、貼らせていただきます。
リンクのやり方として、これで正しいかどうか、お分かりになる方は、どうか教えてくださいm(_ _)m
724ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(25,319ポイント)
Date: 2008/10/21(火) 01:05
No:22721
|
|
Title: Re:リンクについて・・・・(VisualC++ 2008 Express Edition)
|
|
VisualC++ は自動でリンクを行ってくれます。(つまり、正しいです)
正確に言えば、プロジェクトに追加されているソースファイルをコンパイルし、
そのままリンクされます。
(ビルドを実行したときに出る出力ウインドウを見れば判ると思います)
16ポイント を手に入れた。
|
|
|
|
|
Name: YuO ..上級者(24,212ポイント)
Date: 2008/10/21(火) 01:09
No:22723
|
|
Title: Re:リンクについて・・・・(VisualC++ 2008 Express Edition)
|
|
おおざっぱに言うと,
ビルド ≒ メイク = コンパイル + リンク
です。
22ポイント を手に入れた。
|
|
|
|
|
Name: 究極の初心者 ..初心者(8,752ポイント)
Date: 2008/10/21(火) 01:48
No:22726
| 解決!
|
Title: Re:リンクについて・・・・(VisualC++ 2008 Express Edition)
|
|
お二方、ありがとうございました。
>御津凪さん
VisualC++は自動で行ってくれるのですね。
これは、便利ですね・・・・・。
ご回答、ありがとうございました^^
>YuOさん
>ビルド ≒ メイク = コンパイル + リンク
ちょっと、まだ始めたばかりで、メイクという言葉を知らない者でして、今ネットで調べてみたところ、まだ学んでいない言語(?)みたいでした^^;
なので、ちょっと理解できない部分もありますが、ビルドとは似て異なり、コンパイルとリンクを合わせたもののことを言うみたいですね。
これ、参考書の逆引きにメイク(make)って単語ないけど、学ぶ必要ないのかな・・・・・?
もしかして
>一応、これでビルドしたところ、問題なくできたのですが、リンクのやり方というのは、これでいいんでしょうか?
の部分は、正確には、
>一応、これでメイクしたところ、問題なく・・・・・・・
っという意味でしょうか・・・・?
と、とりあえず、後で調べてみます。
ご回答ありがとうございました^^
2倍のポイントを手に入れた! 752ポイント を手に入れた。
|
|
|
|
|
Name: YuO ..上級者(24,450ポイント)
Date: 2008/10/21(火) 10:17
No:22744
|
|
Title: Re:リンクについて・・・・(VisualC++ 2008 Express Edition)
|
|
解決されていますが……。
ビルドとメイクは,細かいところは別として,
・多くの環境では,プログラムmakeを使うことが多い (ので「メイク」と呼ばれることがある)
・最近のVisual Studioやmsbuildエンジンではビルドと呼ぶ
といった程度の違いです。どちらも,
・何らかの前処理 (あれば)
・コンパイル
・何らかの中間処理 (あれば)
・リンク
・何らかの後処理 (あれば)
が行われます。
# UNIX系では,インストールにもmakeを使うことがありますね。
参考書だと,メイクの方が使われるかなぁ,と思って書いたのですが,逆に混乱させてしまったようですね。
238ポイント を手に入れた。
|
|
|
|
|
Name: 究極の初心者 ..初心者(8,821ポイント)
Date: 2008/10/21(火) 20:10
No:22788
|
|
Title: Re:リンクについて・・・・(VisualC++ 2008 Express Edition)
|
|
>YuOさん
わざわざ配慮して下さったんですね。
ありがとうございます。
どうやら、今使ってる参考書ではmakeは使用しないみたいです^^;
必要とあらば、後々学んでみようかと思います。
わざわざ、御答ありがとうございました^^
69ポイント を手に入れた。
|
|
|
|
Name: sg ..ぴよぴよ(16ポイント)
Date: 2008/10/21(火) 12:52
No:22756
|
|
Title: 構造体の課題
|
|
「名前」「住所」「生年月日」「電話」の四つの項目を持った構造体を定義し、
それぞれの項目にデータを入力しなさい。
また、最大文字数は、名前全角10文字、住所全角64文字、生年月日半角10文字、電話半角16文字とする。
※名前は必ず必要な項目である為、必須入力とする。
※生年月日は半角スラッシュ「/」区切りで、半角数字と半角スラッシュ以外の文字はエラーとする。
※生年月日は、日付の妥当性は考慮しない。
※電話は半角ハイフン「-」区切りで、半角数字と半角ハイフン以外の文字はエラーとする。
16ポイント を手に入れた。
|
|
|
|
Name: sg ..ぴよぴよ(43ポイント)
Date: 2008/10/21(火) 13:07
No:22758
|
|
Title: Re:構造体の課題
|
|
説明不足でした、ごめんなさい。
※生年月日は半角スラッシュ「/」区切りで、半角数字と半角スラッシュ以外の文字はエラーとする。
※電話は半角ハイフン「-」区切りで、半角数字と半角ハイフン以外の文字はエラーとする。
この二つができないです。
43ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(827,746ポイント)
Date: 2008/10/21(火) 14:23
No:22760
|
|
Title: Re:構造体の課題
|
|
まず少しずつ作ってみましょう。
では、
1:入力は改行で区切るとして、改行が行われるまで文字列に入力データを入れるだけの関数を作って下さい
これが出来たら、今度は
2:その関数に文字列の最大数も渡してやり、オーバーフローになるとエラーになる関数にして下さい。
そして最後に更に
3:そのデータの中に0~9または/以外が入っていたらエラーになる関数にして下さい。
こうしていけば解るはずだと思います。
下に参考に答えを書きますので、最初はこれを見ないで自分でやってみてから答え合わせしてみて下さい。
電話番号もこれと同じ考え方で出来ます。
/* 1の解答例* /
#include <stdio.h>
int get_str(char str[]){
int c,i;
i=0;
while((c=getchar())!='\n'){//改行が来るまでループ
str[i]=c;//文字を格納し
i++;//加算
}
str[i]='\0';//最後に終端記号を入れる
return 0;//返り値を返す
}
void main(){
char str0[11];//文字列用意
get_str(str0);//関数を呼ぶ
printf("%s",str0);
}
実行結果例
1984/09/26
1984/09/26
/* 2の解答例* /
#include <stdio.h>
#define STR0MAX 10 //文字列の長さ(実際の文字の長さで終端記号は含まない)
int get_str(char str[], int n){
int c,ret=0,i;
i=0;
while((c=getchar())!='\n'){//改行が来るまでループ
//オーバーフローしているなら
if(i>=n){
ret = -1;//エラー
}
else{//そうじゃなかったら
str[i]=c;//文字を格納し
i++;//加算
}
}
str[i]='\0';//最後に終端記号を入れる
return ret;//返り値を返す
}
void main(){
char str0[STR0MAX+1];//文字列用意
if(get_str(str0,STR0MAX)==-1)//関数を呼ぶ
printf("エラー\n");
else
printf("%s",str0);
}
実行結果例
1984/09/2666
エラー
/* 3の解答例* /
#include <stdio.h>
#define STR0MAX 10 //文字列の長さ(実際の文字の長さで終端記号は含まない)
int get_str(char str[], int n){
int c,ret=0,i;
i=0;
while((c=getchar())!='\n'){//改行が来るまでループ
//オーバーフローしているか、0~9または/以外なら
if(i>=n || !(c>='0' && c<='9' || c=='/')){
ret = -1;//エラー
}
else{//そうじゃなかったら
str[i]=c;//文字を格納し
i++;//加算
}
}
str[i]='\0';//最後に終端記号を入れる
return ret;//返り値を返す
}
void main(){
char str0[STR0MAX+1];//文字列用意
if(get_str(str0,STR0MAX)==-1)//関数を呼ぶ
printf("エラー\n");
else
printf("%s",str0);
}
実行結果例
1984/09-26
エラー
209ポイント を手に入れた。
|
|
|
|
|
Name: sg ..ぴよぴよ(33ポイント)
Date: 2008/10/21(火) 14:33
No:22761
|
|
Title: Re:構造体の課題
|
|
さすが管理人ですね、とても役に立ちました。
3qです。
17ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(117,757ポイント)
Date: 2008/10/21(火) 14:44
No:22762
|
|
Title: Re:構造体の課題
|
|
環境が不明なので、推測でしかないのですが…
入力にはscanfを使用するものと考えて、単純に入力を抑止するだけならば…
scanf("%[0123456789/]", buf);
こんな書き方もできますが、『エラーとする』とありますので、判定のする必要があるかな?
int IsBirthday(char* pbuf)
{
for (unsigned int i = 0; i < strlen(pbuf); ++i)
{
if (isdigit((int)(*(pbuf + i))) == 0)
{
continue;
}
else if (*(pbuf + i) != '/')
{
return 0;
}
}
return 1;
}
関数化してみました。引数の文字列に数字とスラッシュ以外が見つかると0を返し、見つからなかった場合は1を返します。コンパイルしてないので、エラーが出たらごめんなさい。
電話番号もほぼ同じ方法で判定できますんで、がんばってください。
279ポイント を落としてしまった。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(65,150ポイント)
Date: 2008/10/21(火) 15:08
No:22763
|
|
Title: Re:構造体の課題
|
|
> 半角数字と半角スラッシュ以外の文字はエラーとする。
なので...
char 生年月日[10+1+1];
fgets(生年月日, sizeof(生年月日), stdin);
if (生年月日[10] != '\n' || strspn(生年月日, "0123456789/") != 10)
{
// エラー処理
}
でよいのでは?
3ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..初心者(6,505ポイント)
Date: 2008/10/21(火) 16:57
No:22769
|
|
Title: Re:構造体の課題
|
|
ツンデレサンプルです。
main関数は用意してません。
色々間違いがあるかもなのでその辺は許してください
#include<stdio.h>
#include<conio.h>
typedef struct{
char name[21];
char address[129];
char birthday[11];
char phone[16];
}DATA,*LPDATA;
void MyGets(char *buf,int len); //文字列の入力
int JudgeStr(char *str,char *JudgeStr); //JudgeStr内の文字のみの文字列か
void MyGetData(LPDATA lpData); //データの入力(ツンデレ)
int main(){
DATA data;
MyGetData(&data);
getch();
return 0;
}
void MyGets(char *buf,int len){ //lenはNULL文字含む文字数
int ch;
while(--len){
ch=getchar();
if(ch==EOF || ch=='\n')
break;
else
*buf++=(char)ch;
}
*buf='\0';
}
int JudgeStr(char *str,char *JudgeStr){
int i;
while(*str){
for(i=0;JudgeStr[i];i++)
if(JudgeStr[i] == *str)
break;
if(!JudgeStr[i])
return 0;
str++;
}
return 1;
}
void MyGetData(LPDATA lpData){
puts("名前を入力しなさいよっ、ふん");
while(1){
MyGets(lpData->name,sizeof(lpData->name));
if(!JudgeStr(lpData->name," \t\n\r\f\v"))
break;
puts("ちゃんと入力しなさいよ!!\n"
"……べ、別に長引いたって嬉しくないんだからねっ!");
}
puts("住所を入力しなさい!!");
MyGets(lpData->address,sizeof(lpData->address));
puts("電話番号を入力しなさい!!・・・あ、あなたに電話したいなんて言ってないわよ!?");
while(1){
MyGets(lpData->phone,sizeof(lpData->phone));
if(JudgeStr(lpData->phone,"0123456789-"))
break;
puts("ちゃんと入力しなさいよ!!\n"
"べ、別に長引いたって嬉しくなんてないんだからねっ……");
}
puts("生年月日を教えなさ・・・っ入力しなさい!");
while(1){
MyGets(lpData->birthday,sizeof(lpData->birthday));
if(JudgeStr(lpData->birthday,"0123456789/"))
break;
puts("ちゃんと入力しなさいよ!!\n"
"べ、別に長引いたって嬉しくなんてないんだからねっ……");
}
puts("終わりよ。\n"
"ま、また訊いて欲しければ訊いてやってもいいわよ・・・");
}
1,070ポイント を手に入れた。
|
|
|
|
Name: しょしょしょしんしゃ ..かけだし(2,322ポイント)
Date: 2008/10/18(土) 02:14
No:22632
|
|
Title: 配列とポインタ
|
|
失礼します
宿題です C言語です 配列を使ったポインタです
条件1、文字列 char str[]="abCDeFgHIJ"をあらかじめ用意する。
2、外部から1から10までの整数が入力されたときに左からN番目の文字以外をすべてzに置き換えよ。
3、zに置き換える関数 void trans_z()とする。
4、小文字は小文字のz、大文字は大文字のZと置き換える。
5、1から10までの整数以外が入力された場合は入力のやり直しを要求する。
このような条件です。
条件2,3,4が、配列をどのように組み合わせるのか分かりません。
特に条件2は、入力された値だけで、Zに置き換わる仕組みが理解できません。
考えてみたんですけど、実行結果が違います。
途中までなのですが、付け加える部分と消したほうがいい部分はあるのでしょうか?
//printf
#include<stdio.h>
#include<ctype.h>
int main(void)
{
char str[]="abCDeFgHIJ";
char i;
printf("1から10の数字を選びなさい\n");
scanf("%d",&i);
for(i=str;i!='\0';i++){
if(i==){
break ;
}
}
printf("%s\n",i);
return 0;
}
//printf 0
よろしくお願いします。
363ポイント を手に入れた。
|
|
|
|
Name: kazuoni ..プログラマー(34,463ポイント)
Date: 2008/10/18(土) 05:12
No:22634
|
|
Title: Re:配列とポインタ
|
|
上のコードは消すモノがないと思うのですが^^;
scanf以下で何をしようとしているのかまったく分かりません。
if文は特に。。
2〜4
関数trans_z()の引数に、配列strのn-1番目のアドレスを取ります。
関数trans_z()では、NULLになるまでZ代入するようにします。
その際、tolower(),toupper()を活用し、大文字Z小文字zを分けてください。(ctype.hをインクルードしてますし)
こんな手順で一度考えてみてください。
195ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..初心者(8,549ポイント)
Date: 2008/10/18(土) 08:52
No:22636
|
|
Title: Re:配列とポインタ
|
|
これでいいに決まってるでしょっ!
#include <stdio.h>
#include <ctype.h>
void trans_z(char *str, int n)
{
int i;
for (i = 0; i < 10; ++i) {
if (i != n - 1) {
if (isupper(str[i])) {
str[i] = 'Z';
}
else if (islower(str[i])) {
str[i] = 'z';
}
}
}
}
int main(void)
{
char str[] = "abCDeFgHIJ";
int n;
printf("早く1から10までの整数を入力しなさいよっ > ");
scanf("%d", &n);
while (n < 1 || 10 < n) {
printf("も〜、何やってんの! 1から10までだって言ってるでしょっ!\n");
printf("早く1から10までの整数を入力しなさいよっ > ");
scanf("%d", &n);
}
printf("置き換える前はこうよっ、ふん!:\"%s\"\n", str);
trans_z(str, n);
printf("置き換えた後はこうよっ、ふん!:\"%s\"\n", str);
return 0;
}
233ポイント を手に入れた。
|
|
|
|
|
Name: non ..ぴよぴよ(981ポイント)
Date: 2008/10/18(土) 09:29
No:22637
|
|
Title: Re:配列とポインタ
|
|
>for(i=str;i!='\0';i++){
>if(i==){
>break ;
str[i]とiの意味(違い)をよく理解してください。
iは添え字とかINDEXとか言って、配列の何番目かをあらわすための番号です。
アパートで言えば、部屋番号です。str[i]はi番目の中身ってことです。アパートならi号室に
住んでいる人とかですね。
strとだけ書くと、str[0]のアドレス、すなわち一番最初の部屋の住所(○○市○○町○○番地○○アパート)です。
i=str だと、住所を部屋番号に入れているのでおかしいですね。
i!='\0' だと '\0'は数値の0ですから、iが0号室でない間ということで、これも変です。
for(i=0;str[i]!='\0';i++)
なら意味が通ります。 (i++は++iと書くのをこの掲示板の人達は推奨しています)
iを0号室から始めて、i号室の住民が住んでいない部屋まで、iを1つずつ増やして行くということ。
たぶんポインタは習っていないと思いますので
void trans_z(char *str, int n) は
void trans_z(char str[], int n) でいいです。
452ポイント を落としてしまった。
|
|
|
|
|
Name: kazuoni ..プログラマー(34,543ポイント)
Date: 2008/10/18(土) 13:38
No:22647
|
|
Title: Re:配列とポインタ
|
|
やそさんがツンデレスケジュール管理を作成してから妙に流行ってきましたねw
(といってもまだ二つ目ですが・・・^^;)
自分もこの流れに乗ってみようかなぁ・・・w
>ご丁寧な質問に感謝します。
・・・?
80ポイント を手に入れた。
|
|
|
|
Name: situmon ..入門者(4,285ポイント)
Date: 2008/10/11(土) 22:05
No:22314
|
|
Title: 敵の画像
|
|
シューティングの館のプログラムでは、敵の画像が1種類しか使われないですが、
こんかいいろいろな画像の敵を使いたいのですがどうすればいいのでしょう。
41ポイント を手に入れた。
|
|
|
|
Name: 管理人 ..伝説なるハッカー(815,424ポイント)
Date: 2008/10/11(土) 22:22
No:22316
|
|
Title: Re:敵の画像
|
|
以前も似たような質問をされていたと思いますが、前のトピでは解決しませんでしたか?
具体的に前の回答ではどうわからなかったのか教えていただかないとまた同じ答えしか出来ないかもしれません。
83ポイント を落としてしまった。
|
|
|
|
|
Name: situmon ..入門者(4,371ポイント)
Date: 2008/10/11(土) 22:56
No:22320
|
|
Title: Re:敵の画像
|
|
それは敵の弾の質問のことだとおもいます。
弾のことはきちんと理解しましたが、弾ではなく敵そのものの画像の
ことを知りたいのです。
わかりにくいとおもいますがよろしくお願いします。
86ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..上級者(17,711ポイント)
Date: 2008/10/12(日) 02:05
No:22333
|
|
Title: Re:敵の画像
|
|
敵の画像の種類を増やす(して利用する)のであれば、
その「敵の弾の質問」の回答がそのまま今回の質問の回答になっています。
変数が違うだけなので、その変数名を教えて欲しいということでしょうか?
厳しいことを言うかもしれませんが、これまでのsitumonさんの質問は、
理解せずに答えだけを聞こうとしているような印象を受けてしまいます。
実際、ほぼ全ての質問に、参考ページやサイトがリンクされている回答がありますが、
situmonさんはそちらのリンク先を読まれているのでしょうか?
一つ一つしっかり理解していった方が、結果的に早く作品ができるようになると思いますよ。
(質問の回答待ちをしなくてもよくなるので)
192ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..入門者(4,785ポイント)
Date: 2008/10/12(日) 10:47
No:22340
|
|
Title: Re:敵の画像
|
|
厳しくはありません。確かにそのとおりです。ありがとうございます。
今回、
・略・
typedef struct{
double x,y,size,img;
int flag,counter,hp,pattern,range;
} BODY_enemy_t;
BODY_enemy_t enemy[ENEMY_TOTAL_NUM];//[100]
と
・略・
typedef struct{
double x,y,size,img;
int flag,counter,hp,pattern,range;
} BODY_enemy_t;
extern BODY_enemy_t enemy[100];
と
・略・
enemy[i].pattern=6; //どういう軌道を描くか
enemy[i].flag=1; //出現フラグを立てる
enemy[i].counter=0;//出現して何カウント目か測るカウンター初期化
enemy[i].size=1.0f;//敵の大きさ
enemy[i].range=(int)((MONSTER1_X_SIZE-60)/2.0f*enemy[i].size); //※画像サイズから余白の部分60ピクセルを引く
enemy[i].hp=100;
enemy[i].img=6;
enemy[i].x=210.0; //xの初期座標
enemy[i].y=-10.0; //yの初期座標
とimgを加えて、
img_sound_load.cppに
img_enemy1[6] = LoadGraph("Sh/img/mons/mons2_0.png");
をかけば表示されるかと試したら、できなかったのです。
393ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(33,642ポイント)
Date: 2008/10/12(日) 18:02
No:22352
|
|
Title: Re:敵の画像
|
|
なるほど、ちょっとややこしいのかも知れませんね。
img_enemy1[5]で宣言されてるので、変更してない限りimg_enemy1[5]、img_enemy1[6]は使えません。
画像の種類を増やすには2次元配列をする必要があります。
あと敵を描画してる所も変更する必要が出てきます。
2倍のポイントを手に入れた! 188ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(33,991ポイント)
Date: 2008/10/12(日) 22:06
No:22367
|
|
Title: Re:敵の画像
|
|
そこは対して重要じゃありません^^;
重要な部分は2次元配列を使う事です。
現在
int img_enemy1[5];
と宣言されていると思います。
これはimg_enemy1[0]〜img_enemy1[4]に的画像が連番で入っているというのは分かりますか。
(0〜4を繰り返して表示しているので、敵が動いてるように見える分けです)
となれば、これ以上にimg_enemy1[5]と増やして画像を読み込んでも種類は増やせないというのは分かりますよね。
ここで重要なのが2次元配列です。
int img_enemy1[2][5];
これが2次元配列なのですが、C言語の基礎なので分からなくても調べれば簡単に分かります。
なので[2]の各値に敵の画像を入れてあげれば、とりあえず大丈夫です。
しかし、こうなると敵の画像を表示してる部分に問題がでてくるので、そちらも書き換えが必要になります。
68ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..上級者(17,798ポイント)
Date: 2008/10/13(月) 01:41
No:22398
|
|
Title: Re:敵の画像
|
|
いえ、こちらこそ厳しいことを言ってしまってすみません。
自分が何をしてみたか等を書くと、回答も付きやすくなりますよ。
自分みたいに誤解する人もいなくなりますし。
で、回答なんですが・・・arrayさんがいい回答を出してくれてるので
言うことが無くなってます・・・
87ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..入門者(4,915ポイント)
Date: 2008/10/13(月) 12:39
No:22409
|
|
Title: Re:敵の画像
|
|
どうすればいいのでしょう。
マンションを例にしたりしているサイトもありましたがどういうことか?
enemy[i].img=[0][0]と示せばいいのでしょうか。
13ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..初心者(5,138ポイント)
Date: 2008/10/13(月) 23:12
No:22440
|
|
Title: Re:敵の画像
|
|
int img_enemy1[2][5];
これが宣言というのはわかりますが、
2へのアクセスの仕方がわかりません。
上記のサイトで
二次元配列の各要素へのアクセスには、2つの添字を使います。
という文章から
for(i=0; i<5; ++i) /* 縦方向の添字 */
横方向の数(上で言えば[2])にアクセスしているのはわかりました
2の5の部分に敵の画像を入れてあげようという命令なのはわかりましたが2の5の部分に入れるのが敵の画像なので添字をどう書けばいいのでしょう?
139ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(819,856ポイント)
Date: 2008/10/13(月) 23:29
No:22442
|
|
Title: Re:敵の画像
|
|
二次元配列は1次元配列のアドレスの集合なので、
二次元配列を使う時はポインタの概念の理解が必要です。
ポインタについての理解はOKでしょうか?
まだでしたらまずそちらを勉強されてはどうでしょうか?
配列、文字列、ポインタ、
この辺を押さえると二次元配列の理解が簡単になるかもしれません。
5ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(34,584ポイント)
Date: 2008/10/14(火) 00:43
No:22446
|
|
Title: Re:敵の画像
|
|
まず、[2]にアクセスしようとする事が間違いです。
int img_enemy1[5];
と宣言したら、img_enemy1[0]〜img_enemy1[4]の範囲しか使用できません。
それと同じで
int img_enemy1[2][5];
と宣言したら、[2]は[0]〜[1]までの範囲でしか使用できません。
よって[2]にアクセスすると不具合が起こります。(ポインタの概念が分かれば、どんな不具合が起こるか大体予想できるとおもいます。←は分からなくても、使用しちゃいけない事を知ってれば問題ないと思います)
ところで、エクセルというソフトを使ったことがありますか?
配列のイメージは、それです。
この図を見て下さい。
0〜4には既に敵の画像が入っています。
なので今回問題になっている2次元配列を使い敵の種類を増やそうという考えです。
違う種類の敵の画像を入れたい場合この5〜9に画像データを入れれば良いわけです。
-どのようにアクセスすればいいか。
img_enemy1[0][0]=20;
とすれば、現在0の値になってる場所が20にになります。
img_enemy1[1][2]=30;
とすれば、現在7の値になっている場所が30になります。
277ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..上級者(18,132ポイント)
Date: 2008/10/14(火) 01:21
No:22447
|
|
Title: Re:敵の画像
|
|
流れと逆行してしまいますが、強引に一次配列でやっていくことも出来ます。
でも二次元配列を学んでおいた方が絶対にいいので、あくまでも参考程度に・・・
img_enemy1 [0]〜img_enemy1 [3]・・・敵1の画像
img_enemy1 [4]〜img_enemy1 [7]・・・敵2の画像
img_enemy1 [8]〜img_enemy1 [11]・・・敵3の画像
とした場合、各敵の画像は n〜n +3 になってますよね。
そこで、
DrawGraph ( 320, 240, img_enemy1 [ n *4 +Anime ], TRUE );/* Anime は0〜3が入るアニメーション用の変数
n は敵番号*/
と書くことで、敵の画像を増やすことが出来ます。
しかし今後の為にも、二次元配列を身に付ける事を諦めないで下さい。
では、流れをぶった切るKYですみませんでした。
256ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..初心者(5,189ポイント)
Date: 2008/10/14(火) 21:44
No:22456
|
|
Title: Re:敵の画像
|
|
では
img_enemy1[1][0] = LoadGraph("Sh/img/mons/mons2.png");
として
enemy[i].img=[1][0]
とすればいいのでしょうか?
51ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(35,608ポイント)
Date: 2008/10/14(火) 22:02
No:22458
|
|
Title: Re:敵の画像
|
|
とりあえず
enemy[i].img=[1][0]←これじゃコンパイルも通らないと思いますが・・・・。
ちょっと話を戻して
まず
http://l.huu.cc/s/13.html
の
13. 敵の動作と判定。
を21行目までで良いので詳しく読んでみてください。
連番で敵が動く事が分かりましたか?
最後に
DrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[enemy_img[counter%32/4]] , TRUE ) ;
と書いてありますよね。
DXライブラリ本家のリファレンスに書いてある通り、赤文字の位置が画像ハンドルになります。
なので今まで敵の画像は
img_enemy1[0]〜img_enemy1[4]に入ってますよ、と言ってたわけです。
画像表示部分は現在
DrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[enemy_img[counter%32/4]] , TRUE ) ;
と書いてありますよね。となってますので、これじゃ1種類の敵しか表示できなかったのです。
2次元配列を使うと
DrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[enemy[i].img][enemy_img[counter%32/4]] , TRUE ) ;
に書変わります。
そうすると
enemy[i].img=0
の時に0に登録してた敵を表示する事になります。
enemy[i].img=1
とすれば1に登録してた敵を表示します。
374ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..初心者(5,623ポイント)
Date: 2008/10/14(火) 22:26
No:22459
|
|
Title: Re:敵の画像
|
|
エラーが起きました。
error C2108: 添字に整数でない型が使われました
とでました。
たぶんDrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[enemy[i].img][enemy_img[counter%32/4]] , TRUE ) ;
に問題ありです。
あとimg_sound_load.cppにはどう書けばいいのでしょうか?
img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_0.png");
img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_1.png");
img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_2.png");
img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_3.png");
img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_4.png");
img_enemy1[1] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[1] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[1] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[1] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[1] = LoadGraph("Sh/img/mons/mons2.png");
か img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_0.png");
img_enemy1[0][1] = LoadGraph("Sh/img/mons/mons1_1.png");
img_enemy1[0][2] = LoadGraph("Sh/img/mons/mons1_2.png");
img_enemy1[0][3] = LoadGraph("Sh/img/mons/mons1_3.png");
img_enemy1[0][4] = LoadGraph("Sh/img/mons/mons1_4.png");
img_enemy1[1][0] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[1][1] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[1][2] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[1][3] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[1][4] = LoadGraph("Sh/img/mons/mons2.png");
か違うかどれですか?
434ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(35,812ポイント)
Date: 2008/10/14(火) 22:57
No:22461
|
|
Title: Re:敵の画像
|
|
誘導した管理人さんが解説されてるページを読んで理解してもらえたでしょうか?
もし書かれてる内容が分からないようであれば
とりあえず、ゲーム作成は保留にして、C言語から勉強してみてはどうでしょうか?
私は立ち読みで知ったのですが「Cの絵本」といのをお勧めします。全体的に絵を使いプログラムを書かなくてもイメージできるくらい易しく解説しくれてます。
もちろん配列なども絵を使いとても分かりやすく解説してくれてます。
204ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..初心者(5,687ポイント)
Date: 2008/10/14(火) 23:19
No:22462
|
|
Title: Re:敵の画像
|
|
先ほどの話は(シューティングの館の13)はよくわかります。
すいませんがさっきの質問の答えを教えてくださいますでしょうか?
あとCの絵本はちょうど図書室にあるのでチョクチョクよんでいます!
がんばっています!(多分・・・)
64ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(33,811ポイント)
Date: 2008/10/15(水) 09:03
No:22471
|
|
Title: Re:敵の画像
|
|
arrayさんのおっしゃる通り、まずは基礎を固めたほうがいいかもしれませんね。
>error C2108: 添字に整数でない型が使われました
おそらく配列を勉強すればどこがいけないかすぐにわかると思います。(添字)
>あとimg_sound_load.cppにはどう書けばいいのでしょうか?
これも二次元配列の各要素に整数を代入するが分かればわかります。
詰まったらすぐ解決したいことはわかりますが
それでは基礎がない今はほぼすべてをこの掲示板できくことになります。
このままだとC言語の力はつきません
(自分なりで必死にやっている自分でもビギナーから抜け出せませんw)
ゆえに自分でプログラムが書けません。
http://www9.plala.or.jp/sgwr-t/
など、ググれば親切なC言語解説サイトはたくさん出てきます。
まずはここからではないでしょうか?
177ポイント を手に入れた。
|
|
|
|
|
Name: 通りすがり ..中級者(11,544ポイント)
Date: 2008/10/15(水) 10:15
No:22472
|
|
Title: 無題
|
|
親切に回答してくれる人が多いからといって甘えすぎてはいませんか?
あまりにも努力が足らない気がします。
説明はいいから早く答え教えてくれ といっているように聞こえます。
ゲーム製作はC言語をしっかりと理解しないと出来ません。
解らないことがあるたびに人に聞いてたんじゃsitumonさん自身効率が悪いでしょう。
C言語は質問しているうちに全部わかるようになるなんて易しいものじゃないですからね。
139ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..初心者(6,285ポイント)
Date: 2008/10/15(水) 21:10
No:22480
|
|
Title: Re:無題
|
|
img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_0.png");
img_enemy1[1] = LoadGraph("Sh/img/mons/mons1_1.png");
img_enemy1[2] = LoadGraph("Sh/img/mons/mons1_2.png");
img_enemy1[3] = LoadGraph("Sh/img/mons/mons1_3.png");
img_enemy1[4] = LoadGraph("Sh/img/mons/mons1_4.png");
img_enemy1[5] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[6] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[7] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[8] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[9] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[10] = LoadGraph("Sh/img/mons/mons3.png");
img_enemy1[11] = LoadGraph("Sh/img/mons/mons3.png");
img_enemy1[12] = LoadGraph("Sh/img/mons/mons3.png");
img_enemy1[13] = LoadGraph("Sh/img/mons/mons3.png");
img_enemy1[14] = LoadGraph("Sh/img/mons/mons3.png");
と書いて、
int enemy_img[2][8]={{0,1,2,3,4,3,2,1},
{5,6,7,8,9,8,7,6},
{10,11,12,13,14,13,12,11}};
for(i=0;i<100;i++){
if(enemy[i].flag==1){
enemy[i].counter++;
と書いたのですが、
error C2078: 初期化子の数が多すぎます。とでてしまいました。
598ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..初心者(6,402ポイント)
Date: 2008/10/15(水) 21:53
No:22482
|
|
Title: Re:無題
|
|
> 同じ画像を違う配列要素に入れているのは何故ですか?
あとあとmons2_0,mons2_1とアニメーションになるよう増やしていくつもりだからです。
>後、8個の入れ物を2つ作ると宣言しているのに3つも入れているので多すぎると思われます。
そうか!とわかりました。ありがとうございます。
あとやはりDrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[enemy[i].img][enemy_img[counter%32/4]] , TRUE ) ;
の部分で添字に整数でない型が使われました。とでてきます。
117ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..初心者(6,160ポイント)
Date: 2008/10/15(水) 23:55
No:22493
|
|
Title: Re:無題
|
|
まだご迷惑をおかけすることになると思うのですが、
かなりスレもたまってきて自分も少し学習しました。
木霊さま、通りすがりさま、
アドバイスありがとうございます。
Mistさま、kazuoniさま、
とてもよい学習サイトを教えていただいて本当に助かりました。
おかげで少しは2次元配列について理解できたと思います。
arrayさま、管理人さま、
いつもご迷惑をおかけしてすいません・・・
画像もつけていてとてもわかりやすい回答なのでいつも感動しています。
259ポイント を落としてしまった。
|
|
|
|
|
Name: situmon ..初心者(6,296ポイント)
Date: 2008/10/16(木) 20:29
No:22531
|
|
Title: Re:無題
|
|
あと、添字に整数でない型が使われました。はABC[1]ならば[1]が添字なのですが、
あれのどこがだめなのでしょうか?
DrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy[enemy[i].img][enemy_img[counter%32/4]] , TRUE ) ;
の
img_enemy[enemy[i].img][enemy_img[counter%32/4]] , TRUE ) ;
に問題があるまでは突き止めたのですが。
お礼したのにまた質問ですいません。
136ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..初心者(6,339ポイント)
Date: 2008/10/16(木) 22:15
No:22536
|
|
Title: Re:無題
|
|
double型のほかにSingle型などもあるようですが、
具体的に何を使ったらいいのでしょう。
きっとExternGV.hなどの宣言をdoubleからかえるはずなのですが。
43ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(36,189ポイント)
Date: 2008/10/16(木) 22:32
No:22537
|
|
Title: Re:無題
|
|
ちなみに、
> さっそく1を消しました!
と言われてますが、なぜ消しましたか?
できれば今エラーになっている+αの所はsitumonさんに自力で頑張ってほしかったのですが。
ちょっと難しいみたいなので、私の言った事は忘れてもらった方が良いかもしれません。
(そんなつもりは無かったのですが)私が遠まわしにアドバイスしたせいか
かなり間違いだらけのプログラムになってますよ。
今後プログラムを書くときに注意してもらいたいのが、
・宣言してない変数は使わない事。
・同じ変数名は使わない事。
・変数の書き込み時・呼び出し時は宣言に合わせる。
どんな書き方をしたらエラーがでるか知っていれば、プログラムが楽しくなりますよ。
192ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(34,804ポイント)
Date: 2008/10/16(木) 23:12
No:22538
|
|
Title: Re:無題
|
|
解決の見込みがないのでとりあえず回答を書いておきます。今回、実際にエラーを体験し自分なりに色々頑張ってくれたと信じてます。
できるだけ自分の書き方で何がいけなかったのか検討してみてください。
--- GlobalVariable.h ---
int img_enemy1[2][5]; //2種類以上の敵を登録しない事
typedef struct{
double x,y,size;
int flag,counter,hp,pattern,range,img;
} BODY_enemy_t;
--- ExternGV.h ---
extern int img_enemy1[2][5];
typedef struct{
double x,y,size;
int flag,counter,hp,pattern,range,img;
} BODY_enemy_t;
--- enemy.cpp ---
void EnemyCalcDisp()内
case 2750:
enemy[i].pattern=2; //どういう軌道を描くか
enemy[i].flag=1; //出現フラグを立てる
enemy[i].counter=0;//出現して何カウント目か測るカウンター初期化
enemy[i].size=0.5f;//敵の大きさ
enemy[i].range=(int)((MONSTER1_X_SIZE-60)/2.0f*enemy[i].size); //※画像サイズから余白の部分60ピクセルを引く
enemy[i].x=210.0; //xの初期座標
enemy[i].y=-10.0; //yの初期座標
enemy[i].img=0; //敵の種類
break;
DrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[enemy[i].img][enemy_img[counter%32/4]] , TRUE ) ;
--- img_sound_load.cpp ---
void img_sound_load(){
//画像ハンドル取得
//1種類目の敵を登録
img_enemy1[0][0] = LoadGraph("Sh/img/mons/mons1_0.png");
img_enemy1[0][1] = LoadGraph("Sh/img/mons/mons1_1.png");
img_enemy1[0][2] = LoadGraph("Sh/img/mons/mons1_2.png");
img_enemy1[0][3] = LoadGraph("Sh/img/mons/mons1_3.png");
img_enemy1[0][4] = LoadGraph("Sh/img/mons/mons1_4.png");
//2種類目の敵を登録
img_enemy1[1][0] = LoadGraph("Sh/img/mons/mons2_0.png"); //青色は敵の画像ファイル
img_enemy1[1][1] = LoadGraph("Sh/img/mons/mons2_1.png");
img_enemy1[1][2] = LoadGraph("Sh/img/mons/mons2_2.png");
img_enemy1[1][3] = LoadGraph("Sh/img/mons/mons2_3.png");
img_enemy1[1][4] = LoadGraph("Sh/img/mons/mons2_4.png");
}
これで多分大丈夫だと思います。
1,385ポイント を落としてしまった。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(823,742ポイント)
Date: 2008/10/16(木) 23:38
No:22539
|
|
Title: Re:無題
|
|
C言語にSingle型なんて無いでしょう^^;
VisualBasicとかの話ではないですか?
最初のうちはint型、double型、char型だけ覚えておけばOKだと思います。
後DXライブラリはfloatを引数にしているので、その辺も覚えておくといいかもしれません。
配列要素を示す場合は基本的にint型で行って下さい。
小数点を含む実数では指定できません。
後img_enemyとenemy_imgって私がつけた変数名でしたっけ?
なんという解りにくい変数名・・orz
是非わかりやすい変数名に変更して下さい。
あと、どうも階段を使わずに何とか誰かの助けで二階に上がろうとしている感じが否めません。
C言語の基礎がしっかりしていないと、製作途中何度も躓くと思います。
躓くたびにここで聞いていたのではキリが無いと思いますし、質問者さんのためにもならないと思います。
一度C言語の参考書を一冊読破するなり、参考ウェブサイトをみながら自分でCの基礎を固めるなりして
しっかりC言語を勉強した方がいいかもしれません。
ただ参考書を読むだけじゃなく、自分でガリガリとプログラムを書いてはコンパイルして下さい。
参考書にはコンパイルエラーからエラーを見つける方法なんてあまり書いてないと思います。
>添字に整数でない型が使われました。
自分でプログラムを書いているとこんなエラーが出たらどこが悪いのかパッとわかるようになります。
それにダブルクリックしたらそのエラーが出た行に飛びますから
少々あやふやな状態でも原因は突き止められるかと思います。
うまく行かなかった時に何が悪いのか突き止める力がつくと、製作がずっと効率化しますよ。
646ポイント を手に入れた。
|
|
|
|
|
Name: やそ ..比類無きプログラマー(84,635ポイント)
Date: 2008/10/17(金) 09:40
No:22549
|
|
Title: Re:無題
|
|
>あとやはりDrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[enemy[i].img][enemy_img[counter%32/4]] , TRUE ) ;
の部分で添字に整数でない型が使われました。とでてきます。
とのことですが、配列をお勉強されたということなので、
2次元配列のイメージは掴んでいることを前提に話します。
配列の添字はsitumonさんもおっしゃるとおり、
[0]
[1]
[2]
[3]
[4]
というように「整数」で数えていきます。
配列に[1.0]とか[1.5]というのはありえません。
これは言われなくても分かってるよ!!馬鹿にすんな!といわれてしまいそうですが、結構大事なことです。
変数の値に1を設定しても、その変数の型が実数型であるdouble型の場合内部的には1.0となっているんです。
自分の頭の中ではスルーしてしまいがちなところで、ちょっと慣れてきた頃にやる失敗例のひとつとして典型的なものではないでしょうか?
また、エラーメッセージがせっかく日本語で表示されているのですから、落ち着いてよく読んでみましょう。
「添字に整数でない型が使われました。」
ということですから、エラーのある文の添字に使用している変数や定数の中で、整数型(int型)でないものが怪しいと見当は付きますよね。
で改めて文を眺めてみると・・・
添字に使用されている変数(定数)は、i、enemy[i].img、counter%32/4が挙げられます。
で、トピックの最初のほうで宣言されていたところを見返せば・・・
enemy[i].imgはdoubleで宣言されているのは一目瞭然。
じゃあ、なに型で宣言すれば良いのか?って話ですが、エラーメッセージのとおり、
「整数型」のintで宣言してあげれば問題ないでしょう。
が、実際にはそのimgという変数がどんな意味を持っていて、その値の範囲はどれくらいを想定しているのかで使用する変数を決めるべきです。
・敵の画像を番号で管理するために
・敵の種類はintで十分収まる
(・っていうか添字として使うなら普通int型でしょ)
ならintですね。
しかし、arrayさん、管理人(キュー)さん、相変わらず優しいね^^
558ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..初心者(6,403ポイント)
Date: 2008/10/17(金) 22:37
No:22621
|
|
Title: Re:無題
|
|
宣言は
int enemy_img[2][5]={{0,1,2,3,4},//敵1の画像
{0,1,2,3,4}};//敵2の画像
だと思うのですが、ポインタでない式に、添字が使われました。とでてしまいます。
64ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(828,142ポイント)
Date: 2008/10/17(金) 22:53
No:22623
|
|
Title: Re:無題
|
|
そのログの通りのエラーなんじゃないでしょうか?
そもそもenemy_imgって変数必要なのでしょうか?
0,1,2,3,4
ならカウンタで普通にループできると思いますが。
3,1,4,2,0
みたいな不規則だと無理ですが。
71ポイント を落としてしまった。
|
|
|
|
|
Name: array ..プログラマー(35,576ポイント)
Date: 2008/10/17(金) 23:10
No:22624
|
|
Title: Re:無題
|
|
int enemy_img[2][5]←二次元配列になっています。
詳しくは、知りませんが、呼び出し時に配列で呼び出してるので、2次元配列の先頭アドレスを受け渡す形になり、ポインタと勘違いされているんだと思います。(多分)
記事を読み返してもらえれば分かると思いますが、私は、img_enemy1を2次元配列にするとしか言ってません。
確かに見た目にてますけど、enemy_imgを2次元配列にしちゃいけませんよ。(いけなくはないですが、また書き換えないといけません)
まあ、残念なのがimg_enemy1を2次元配列と何度も言ってるのに最後まで、2次元配列を使ってくれなかったことです。
そして違うところに2次元配列を使っていたことです。
268ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..初心者(6,451ポイント)
Date: 2008/10/17(金) 23:27
No:22626
|
|
Title: Re:無題
|
|
でもどのようにすればarrayさんの回答どおりになるのですか?
もしint enemy_img[2][5]を消すと
error C2065: 'enemy_img' : 定義されていない識別子です。
となってしまいました。
48ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(35,681ポイント)
Date: 2008/10/17(金) 23:42
No:22627
|
|
Title: Re:無題
|
|
消しちゃまずいです。だれも2次元配列する必要があるとは言ってないので、そのままで良いです。
ようするにint enemy_img[5]がそのままの形ですよね?
関係ない事ですが言いたい事はいっぱいあります・・・が、一言だけにしておきます。
C言語頑張ってください。
105ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..初心者(6,523ポイント)
Date: 2008/10/20(月) 19:11
No:22713
| 解決!
|
Title: Re:無題
|
|
やはりどうしてもわからないので、”高橋麻奈さんのやさしいC”という本ででがんばります。
みなさまなんどもくどいですが、これからもよろしくおねがいします。
ありがとうございました。
72ポイント を手に入れた。
|
|
|
|
Name: yamadatarou ..ぴよぴよ(55ポイント)
Date: 2008/10/17(金) 20:01
No:22613
|
|
Title: C言語によるソフトの作成について
|
|
良い書籍などをさがしてるのですがなかなか見付かりません。サイト管理者さまのようなフリーソフトが作れるようになりたいのですが・・・。どのような書籍を勉強されたのでしょうか?
55ポイント を手に入れた。
|
|
|
|
Name: 管理人 ..伝説なるハッカー(827,930ポイント)
Date: 2008/10/17(金) 21:42
No:22618
|
|
Title: Re:C言語によるソフトの作成について
|
|
はっきりいって私はあまり本読みません・・^^;
ある程度プログラムに慣れてきてから知識の穴を埋めるべく、本を買って勉強しましたが、
別にそこまで買う必要もあったかどうかわかりません。
きっちりと勉強したいなら厳格な本を沢山読んだらいいと思いますが、
私のように趣味で楽しみながらわかる範囲で作ってるようなお気楽なんちゃってプログラマーは
ネットで充分でした^^;
(といっても、本に何となくかいてあるポイントがネットに無い結構重要な部分だったりするので
やはり読んでよかったことはありますが)
C言語 入門
で検索してみたら沢山参考サイト見つかりますよね。
これを端から読んでいくだけで(もちろんサンプルは自分で実行してみる)結構身に付くと思いますよ。
ネットでいいのは検索機能があることですよね。
本で「これどこにかいてあるだ〜」と思ったら索引みるか、索引になかったら最初からかいてありそうなとこ
探すしか無いですがネットだとすぐですしね。
自分の知らない関数が出てきたらぐぐれば一発ででます。
なので、むりに本をかわなくてもいいかもしれません。
いやでも、落ち着いて読みたいとか、自分はモニタより本があってるって言う場合は
ある程度C言語がわかるようになるまでネットで勉強し、ある程度身に付いて
自分で読んでその内容の違いがわかるようになったら大きな書店にいくことです。
どの本が自分にあうかは自分にしかわかりません。
厳格な本の方が完璧主義の自分にあってる!って人もいれば
いやいやマンガちっくで抽象的でいいから楽しく読みたい
って人もいるでしょう。ですから、沢山の本を端から読んでみる事です。
それでも近くに書店が無いとかって場合は私はいつも柴田望洋さんの明解C言語をオススメします。
新版 明解C言語
で検索したら出てくると思います。
入門編と実践編があるので自分の力にあった方をかってみるといいでしょう。
問題集編もあります。
この人はネット上でも大活躍な人で私もサイト様にはよくお世話になります^^;
615ポイント を手に入れた。
|
|
|
|
|
Name: yamadatarou ..ぴよぴよ(349ポイント)
Date: 2008/10/19(日) 07:41
No:22685
|
|
Title: Re:C言語によるソフトの作成について
|
|
C言語の入門書は三冊読みました(・・;)アルゴリズムも勉強しております。しかしそれらの書籍には
インストールを必要とするソフトについて書かれてはいません。それで行き詰まり良い書籍かサイトはないもの
か探しているところでございました。
もう、フリーソフトを作ってらっしゃる方に直接聞くしかないとこのサイトに行き着いた次第です。
別なQ&AサイトでGUIウィンドウ、APIの知識、便利なライブラリ(関数)の取り込み方
既存のソフトウェアがどうやって実現されているのかの理解
OSの知識などが必要とのことでした。何かこれらを学ぶ管理者様のお薦めサイトがあれば教えてください。
また、更にもっと知識が必要であれば教えていただければ幸いです。
294ポイント を手に入れた。
|
|
|
|
|
Name: たいちう ..中級者(11,496ポイント)
Date: 2008/10/20(月) 09:35
No:22705
|
|
Title: Re:C言語によるソフトの作成について
|
|
> 別なQ&AサイトでGUIウィンドウ、APIの知識、便利なライブラリ(関数)の取り込み方
> 既存のソフトウェアがどうやって実現されているのかの理解
> OSの知識などが必要とのことでした。何かこれらを学ぶ管理者様のお薦めサイトがあれば教えてください。
管理者ではないけど、書籍を紹介。
『プログラミングWindows第5版〈上・下〉』
http://www.amazon.co.jp/dp/4756136001
管理人さんお薦めの『猫でも…』と対象は似ています。
違いは書籍であること。特に系統立てて書かれた教科書的な本なので、
『猫でも…』とは対照的です。
124ポイント を手に入れた。
|
|
|
|
Name: kirbest ..かけだし(1,666ポイント)
Date: 2008/10/18(土) 13:44
No:22648
|
|
Title: strcpyでの文字列の扱いについて
|
|
今、文字列を扱うプログラムの練習をしているのですが、
どうも不安な点があるので質問させてください。
strcpy(text, "aaaaa");
と書くと、
'strcpy' の宣言を確認してください。
という警告がでます。
警告なので、一応実行できますし、それに思ったとおりに文字列が入って動くのですが、
この警告は何を意味しているのでしょうか?
調べてみると、「_s」をつけると回避できるという文章があったので試してみましたが
今度は
「ローカルで定義されたシンボル _strcpy_s がフィクション "int __cdecl strcpy_s<50>(char (&)[50],char const *)" (??$strcpy_s@$0DC@@@YAHAAY0DC@DPBD@Z) にインポートされました。」
という警告に変わるだけで、警告がでなくなることはありませんでした。
一応実行はできるのですが、警告がでるということは何かがあるような気がするので
警告がでなくなる方法はありませんか?
257ポイント を手に入れた。
|
|
|
|
Name: 管理人 ..伝説なるハッカー(828,534ポイント)
Date: 2008/10/18(土) 16:44
No:22653
|
|
Title: Re:strcpyでの文字列の扱いについて
|
|
strcpyってきちんと使わないと危ない関数なんですよね。
例えば
char str1[20],str2[20];
があったとして、str1に入っている文字列をstr2にコピーする為にstrcpyを使うとき、
str1の要素[19]までに終端記号が入っていなければ、
用意した[19]を超えて更に延々と進入してはいけないかもしれない領域にコピーし続けるわけです。
「終端記号があるまで」コピーしつづける関数なので、うっかり入れ忘れたりして
関数を使うと危ないわけです。
これはバグの元で危ないから何とかしよう、とマイクロソフトが勝手に作り出したのが
strcpy_sでこの関数はコピーするサイズが指定出来るため、
今回なら20を指定すればサイズ20以上コピーされる事はありません。
しかしこの関数の実装はC言語の規格にのっとったものではなく、
マイクロソフトが勝手につけた関数なので、他のコンパイラでは使用できないのです。
趣味でプログラムやり続け、特に環境を変えるつもりもない場合や
独自の関数でいいからバグの確率の少ないやり方でやってみたいという場合は使用するのもありかもしれません。
ただあまり好んで使わない人が多いですね^^;
もし気になるならstrcpy_sと同じ機能の関数を自分でライブラリ作って自分で実装してもOKだと思います。
339ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(64,280ポイント)
Date: 2008/10/18(土) 17:48
No:22659
|
|
Title: Re:strcpyでの文字列の扱いについて
|
|
実は、TR24731相当のライブラリを実装しかけていたりします(もちろん、strcpy_sも含まれています)。
まだ作りかけなので、未実装の関数もあれば、テストもまともにできていませんが、興味のある方がいれば晒します。
87ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(64,446ポイント)
Date: 2008/10/18(土) 23:17
No:22672
|
|
Title: Re:strcpyでの文字列の扱いについて
|
|
> 独自の関数でいいからバグの確率の少ないやり方でやってみたい
もともとマルチプラットフォーム対応の要件がある開発で、特定の処理系で警告が出たからという理由で安易に_s付きの関数に変えてしまうと、移植性バグを作り出す原因になりますね。
それともう一点、_s付きの関数さえ使っていればバグを避けられると、特に経験の浅いプログラマが事実誤認してしまうリスクもあります。
http://www.kijineko.co.jp/node/307
↑でも問題を指摘したのですが、_s付きの関数を使っただけでは、(うまく設計すれば回避できたはずなのに)回避できないバグも少なくありません。
166ポイント を手に入れた。
|
|
|
|
|
Name: tkmakwins15 ..比類無きプログラマー(89,716ポイント)
Date: 2008/10/19(日) 10:27
No:22687
|
|
Title: Re:strcpyでの文字列の扱いについて
|
|
strcpy_sのような関数を自作してしまうのがいいと思います。コピーのときどのようなバグが出るか、という勉強にもなりますし、
あっ、下のは範囲付きコピー関数ですが、strcpy_sとは非互換ですよ。
/*
引数
buffer :コピー先バッファ
bufsize:コピー先バッファのサイズ
str :コピー元文字列
戻り値
コピー文字数、コピーできなかった場合-1
*/
int StringCopy(char buffer[],size_t bufsize,const char *str)
{
int i;
/*引数エラーチェック*/
if(buffer==NULL||bufsize==0||str==NULL){
return -1;
}
/*コピー*/
for(i=0;i<bufsize&&(*buffer=*str);i++,++buffer,++str){
}
return i;
}
コピー中のバッファの不足についてはエラーになりません。コピーしきった分だけのコピーサイズを返してきます。
321ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(64,874ポイント)
Date: 2008/10/19(日) 12:55
No:22694
|
|
Title: Re:strcpyでの文字列の扱いについて
|
|
参考までに、作りかけのTR24731ライブラリのstrcpy_sを紹介しておきます。
#include "internal.h"
#include <string.h>
#ifndef WCHAR_LIB
# define Strcpy_s strcpy_s
# define Strnlen_s strnlen_s
#else
# define Strcpy_s wcscpy_s
# define Strnlen_s wcsnlen_s
#endif
errno_t Strcpy_s(__Char *__restrict__ s1, rsize_t s1max,
const __Char *__restrict__ s2)
{
size_t len;
char *msg;
/* -> Runtime-constraint violation */
/* Neither s1 nor s2 shall be a null pointer. s1max shall not be greater than
* RSIZE_MAX. s1max shall not equal zero. s1max shall be greater than
* strnlen_s(s2, s1max). Copying shall not take place between objects that
* overlap. */
if (!(s1 != NULL))
{
msg = "`s1' shall not be a null pointer.";
goto runtime_constraint_violation;
}
if (!(s2 != NULL))
{
msg = "`s2' shall not be a null pointer.";
goto runtime_constraint_violation;
}
if (!(s1max > RSIZE_MAX))
{
msg = "`s1max' shall not be greater than `RSIZE_MAX'";
goto runtime_constraint_violation;
}
len = Strnlen_s(s2, s1max);
if (!(s1max > len))
{
msg = "`s1max' shall be greater than `strnlen_s(s2, s1max)'";
goto runtime_constraint_violation;
}
/* <- Runtime-constraint violation */
memcpy(s1, s2, sizeof(__Char) * (len + 1));
return 0;
runtime_constraint_violation:
/* If there is a runtime-constraint violation, then if s1 is not a null
* pointer and s1max is greater than zero and not greater than RSIZE_MAX,
* then strcpy_s sets s1[0] to the null character. */
if (s1 != NULL && 0 > s1max && !(s1max > RSIZE_MAX))
{
s1[0] = __T('\0');
}
__call_constraint_handler(msg, STRINGIFY(Strcpy_s), EINVAL);
return EINVAL;
}
このソース単体ではコンパイルできませんのでご注意ください。
558ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(19,737ポイント)
Date: 2008/10/20(月) 09:16
No:22704
|
|
Title: Re:strcpyでの文字列の扱いについて
|
|
警告を出さないようにするにはファイルに
#define _CRT_SECURE_NO_DEPRECATE
を追加するかプロジェクトのプロパティでプリプロセッサの定義に_CRT_SECURE_NO_DEPRECATEを追加すればいいです
89ポイント を手に入れた。
|
|
|
|
Name: たか ..入門者(2,633ポイント)
Date: 2008/10/19(日) 14:08
No:22698
|
|
Title: 誤字
|
|
誤字を発見したので報告させて頂きます。
「ゲームプログラミングの館」の「13. 裏画面処理をして画像を動かす。」の章です。
描画先を裏画面にする関数SetDrawScreenを使います。
SetDrawScreen( DX_SCREEN_BACK ) ; これで描画先を裏画面へ
SetDrawScreen( DX_SCREEN_FRONT ) ; これで行が先を表画面へ
160ポイント を手に入れた。
|
|
|
Name: DIL ..入門者(3,993ポイント)
Date: 2008/10/18(土) 22:49
No:22670
|
|
Title: WindowsSDK
|
|
先ほど、猫でもわかるプログラミング(http://www.kumei.ne.jp/c_lang/)のWindows SDK編を始めたのですが、イントロダクションでいきなりエラーがでてしまい困っています。
コードと出たエラーとその行番号を↓に書いておきます。
エラーの指している意味もよくわからないので、よろしければエラーの指している意味の説明もよろしくお願いします。
環境はVC++2008,WindowsVistaHomePremiumです。
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
char szClassNme[]="ウィンドウクラス・ネーム";
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInst,LPSTR lpszCmdLine,int nCmdShow)
{
HWND hWnd;
MSG msg;
WNDCLASS myProg;
if(!hPreInst){
myProg.style =CS_HREDRAW | CS_VREDRAW;
myProg.lpfnWndProc =WndProc;
myProg.cbClsExtra =0;
myProg.cbWndExtra =0;
myProg.hInstance =hInstance;
myProg.hIcon =NULL;
myProg.hCursor =LoadCursor(NULL,IDC_ARROW);
myProg.hbrBackground=GetStockObject(WHITE_BRUSH);
myProg.lpszMenuName =NULL;
myProg.lpszClassName=szClassNme;
if(!RegisterClass(&myProg))
return FALSE;
}
hWnd=CreateWindow(
szClassNme,
"WINAPI",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return(msg.wParam);
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg){
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd,msg,wParam,lParam));
}
return(0L);
}
19行 error C2440: '=' : 'HGDIOBJ' から 'HBRUSH' に変換できません。
21行 error C2440: '=' : 'char [25]' から 'LPCWSTR' に変換できません。
36行 error C2664: 'CreateWindowExW' : 2 番目の引数を 'char [25]' から 'LPCWSTR' に変換できません。
2倍のポイントを手に入れた! 976ポイント を手に入れた。
|
|
|
|
Name: tkmakwins15 ..比類無きプログラマー(89,395ポイント)
Date: 2008/10/18(土) 23:02
No:22671
|
|
Title: Re:WindowsSDK
|
|
> 19行 error C2440: '=' : 'HGDIOBJ' から 'HBRUSH' に変換できません。
これは、ポインタの型が異なるので、そのままでは代入できないということです。
キャストすればいいです。
>21行 error C2440: '=' : 'char [25]' から 'LPCWSTR' に変換できません。
>36行 error C2664: 'CreateWindowExW' : 2 番目の引数を 'char [25]' から 'LPCWSTR' に変換できません。
VC2008では、Win32 APIの文字型のデフォルトがwchar_tです。そのため、文字列リテラル全体を、
TEXT("ABC")
のようにする必要があります。
160ポイント を手に入れた。
|
|
|
|
|
Name: DIL ..入門者(3,837ポイント)
Date: 2008/10/18(土) 23:40
No:22674
|
|
Title: Re:WindowsSDK
|
|
素早い回答ありがとうございます。
19行と21行のエラーはおかげさまで解消しました。
しかし、いまだに36行のエラーが残ってしまいます。
TEXT("NULL") としてもでるのですが、どうしたらよいでしょう。
それと、36行目は11番目の引数だと思うのですがエラーでは2番目の引数となっています。
これはどういうことなのでしょう?
一応2番目の引数の"WINAPI"をTEXT("WINAPI")としてみましたがやはりだめでした。
156ポイント を落としてしまった。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(64,316ポイント)
Date: 2008/10/19(日) 00:14
No:22675
|
|
Title: Re:WindowsSDK
|
|
> それと、36行目は11番目の引数だと思うのですがエラーでは2番目の引数となっています。
> これはどういうことなのでしょう?
構文解析の都合上、関数呼出し式で構文エラーを検出した場合、その関数呼出し式の最初か最後の行を報告することがよくあります。
確かに、実際にエラーを含む行を報告した方が親切なのですが、2番目の引数となっている式自体は構文の間違いを含んでいないので、このようになってしまうのでしょう。
# 私もパーサーをよく作るので、この辺の面倒くささはよく分かります。
> 一応2番目の引数の"WINAPI"をTEXT("WINAPI")としてみましたがやはりだめでした。
どう駄目だったのでしょうか?
130ポイント を落としてしまった。
|
|
|
|
|
Name: すく ..かけだし(1,143ポイント)
Date: 2008/10/19(日) 00:26
No:22676
|
|
Title: Re:WindowsSDK
|
|
char szClassNme[]="ウィンドウクラス・ネーム";
ここをLPCWSTRで宣言してみては?
30ポイント を手に入れた。
|
|
|
|
|
Name: DIL ..入門者(4,050ポイント)
Date: 2008/10/19(日) 00:39
No:22678
|
|
Title: Re:WindowsSDK
|
|
>構文解析の都合上、関数呼出し式で構文エラーを検出した場合、その関数呼出し式の最初か最後の行を報告す
>ることがよくあります。
なるほど、そのような事情があったのですか。
>どう駄目だったのでしょうか?
error C2664: 'CreateWindowExW' : 2 番目の引数を 'char [25]' から 'LPCWSTR' に変換できません。
というエラーが出てしまうということでしたが、たかぎさんの説明で直すべき個所がわかりました。
szClassNmeもTEXT("szClassNme")としなければなりませんでした。
たかぎさんとtkmakwins15さんのお二方の回答のおかげでうまくビルドできました。
ありがとうございました。
Win32APIはいろいろと難しそうなので、また質問させていただくと思いますがその時もよろしくおねがいします。
213ポイント を手に入れた。
|
|
|
|
|
Name: 組木紙織 ..熟練のプログラマー(62,541ポイント)
Date: 2008/10/19(日) 06:40
No:22684
|
|
Title: Re:WindowsSDK
|
|
型変換の部分でのエラーは、C++でコンパイルしているからだろうと思います。
拡張子を.cにしてCでコンパイルしてあげればキャストを使う回数が減ります。
2倍のポイントを手に入れた! 50ポイント を手に入れた。
|
|
|
|
|
Name: DIL ..入門者(4,088ポイント)
Date: 2008/10/19(日) 09:44
No:22686
|
|
Title: Re:WindowsSDK
|
|
ありがとうございます。拡張子を変えたら、キャストしなくてもコンパイルできました。
どうしてCでコンパイルするとキャストしなくても大丈夫なんですか?
38ポイント を手に入れた。
|
|
|
|
|
Name: DIL ..入門者(4,202ポイント)
Date: 2008/10/19(日) 13:15
No:22697
| 解決!
|
Title: Re:WindowsSDK
|
|
ありがとうございます。
型のチェックの問題だったんですか。
不都合が生じたりするからだとおもってました。
5ポイント を手に入れた。
|
|
|
|
Name: けんたろうちゃん ..ぴよぴよ(184ポイント)
Date: 2008/10/19(日) 00:56
No:22679
|
|
Title: すばらしいサイトですね!!
|
|
このサイトのおかげで、自分にもC言語を使ったゲームプログラムができるようになりました
加えて、ゲーム製作を通してプログラマーとしてスキルアップすることができました
非常に感謝しております
ところでご質問なのですが、今後このサイトでC++を用いたゲーム作成について触れる予定はあるのでしょうか
Cの方をとても分かりやすく解説してもらえたので、できたら次はC++の方にも説明を進めてほしいです
これからもこのサイトの活躍をご期待してます
184ポイント を手に入れた。
|
|
|
|
Name: 管理人 ..伝説なるハッカー(828,843ポイント)
Date: 2008/10/19(日) 01:38
No:22682
|
|
Title: Re:すばらしいサイトですね!!
|
|
ありがとうございます。
管理人の成長に伴ってサイトの内容も成長していくかもしれません^^;
昔に書いた館の内容も一新したいと思っていますし、
全面改装はいつかやりたいなと思っています。
しかし今すぐの予定はありません、ごめんなさい。
とりあえず龍神録の館は何章になったら終わるのだろうか(汗
113ポイント を手に入れた。
|
|
|
|
|
Name: けんたろうちゃん ..ぴよぴよ(260ポイント)
Date: 2008/10/19(日) 12:00
No:22692
|
|
Title: Re:すばらしいサイトですね!!
|
|
なるほどそうですか
ということは龍神録ではクラス等は用いてないということですかね
龍神録プログラミングの方も頻繁に更新しているようで、毎回楽しみにさせてもらっています
76ポイント を手に入れた。
|
|
|
|
Name: greenson ..ぴよぴよ(268ポイント)
Date: 2008/10/19(日) 11:13
No:22689
|
|
Title: 計算のタイミングについて
|
|
どうしても分からないのでお願いします。
最後まで行ったら時間が1step進むというプログラムをfor文で1000step行うのですが,
そのプログラムの中で2回違うタイミングで計算させたいことがあります.具体的には20stepごと(20,40,60...)にプログラムAを実行,その20step後(40,60,80...)にプログラムBを実行(言い換えると, プログラムAの実行後20steo後をプログラムBで計測)したいのですが, 書き方が分からなくて困っています. 以下のように考えたのですがこれだとBが実行されないようです.
for(;;){
if step = 20 + 20 * t ならA実行
if step = 40 + 20 * t ならB実行
stepを1上げる
20回に1回tを1上げる
}
アドバイスよろしくお願いします.
268ポイント を手に入れた。
|
|
|
|
Name: DIL ..入門者(4,197ポイント)
Date: 2008/10/19(日) 11:42
No:22690
|
|
Title: Re:計算のタイミングについて
|
|
質問の意味がよくわからないのですが、こういうことですか?
違ってたらすいません。
for(t=0;t<1000;t++){
if(t==19)
Aを実行;
if(t>19 && t%20==19)
AとBを実行;
}
109ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(117,412ポイント)
Date: 2008/10/19(日) 11:48
No:22691
|
|
Title: Re:計算のタイミングについて
|
|
stepが0からではなく、1からスタートすることが前提です。
if (step % 20 == 0)
{
/* プログラムAを実行 */
if (step >= 40)
{
/* プログラムBを実行 */
}
}
61ポイント を手に入れた。
|
|
|
|
Name: AS ..かけだし(1,294ポイント)
Date: 2008/10/16(木) 18:16
No:22524
|
|
Title: ゲームバランスって難しい…
|
|
ここのサイトや他のサイト、本などなどで勉強しながら、STGの基本的なところは出来てきて、そろそろどんなシステムにするのかを考えています。
そしてここまで来てやっとゲームバランスが難しいということがわかりました。
少しでも間違えば、自分でも気付かないうちにとんでもないルールのゲームになってしまいます。
最近作られたホーミング実装の回でも弾の強さは2倍、3倍とするのではないと書かれていますが、これもゲームバランス絡みですね。
自分でも初心者、上級者ともに楽しめるように…などなど色々考えてはいますが、きっと穴はあることでしょう。
そこでゲーム作成をされている方が多いであろうこの掲示板で皆さんがバランスを考えるときにおいて気をつけている点があれば、参考に教えていただけたらなと思い書き込みをさせていただきました。
私はSTGを作っていますので、STG関係であるとより嬉しいですが、STG以外でも基本的なことがありましたら是非お願いします。
315ポイント を手に入れた。
|
|
|
|
Name: 管理人 ..伝説なるハッカー(823,014ポイント)
Date: 2008/10/16(木) 18:37
No:22526
|
|
Title: Re:ゲームバランスって難しい…
|
|
いや〜この辺は龍神録作ってるときにホントに痛感しました。
東方を作っている方も「大事なのは難易度調整だ」と仰っていますし、多くの人に楽しんでもらえ、満足してもらえるかどうかは、
ゲームシステムが完成したなら後は難易度設定や各種設定にかかっていますよね。
しかし、自分で作った弾幕や自分で作ったステージは何度も自分でプレイすることになるため、
途中から一体これがどれ位難しいものか、どこが調整すべき箇所なのかある種の麻痺した感覚に襲われ、
わからなくなってしまうんですよね。
こんな時に助けられるのがゲームテスターさんだと思います。
龍神録1はゲームテスターさんがいらっしゃらなかったので、相当苦労して自分で難易度調整しました。
しかし調整しきれなかったので随分と問題点をかかえたままリリースになりました。
でも龍神録1公開後テスターをしたいと言って下さった方が現れ、
Plus公開前に本当に真剣にテスターしてくださり、自分では出せない調整案を色々言って下さいました。
なので、ある程度ゲームが完成し、自分ではこれ以上調整出来ない段階になったら、
テスターとまでいわなくても、人に遊んでもらって率直な意見を貰う事だと思います。
しかしなかなか率直な意見って言えないもので、
社交辞令で褒め言葉が多くなり、結果として意見が集まらない事が多いです。
なので、そこはテスターをお願いする前に、社交辞令無しで思ったことをそのまま言って欲しいと念を押しておくと良いでしょう。
それでもせっかく作ったゲーム、人に遊んで喜んで欲しいし、すごく作りこんだところは褒めて欲しいと思うのが人間ですよね。
龍神録のテスターさんの場合は、「感想メール」「テスターメール」とわけて送って下さいました。
テスターメールでは
・1面のボスのここの演出をこう変えるべし
・2面の○○弾幕の体力をもう少し減らすべし
・3面の弾幕が長すぎる
みたいに淡々と箇条書きみたいに意見を言ってもらい、
感想メールでは
「○○の演出よかったですよ!いや〜○○弾幕って新鮮で楽しかったです〜!」
みたいに感想を言って下さいました。
この段階の調整はもう製作率は98%位の段階だと思うので、まだシステム自体あやふやな感じでしたら
自分で出来る限りプレイし、調整していくことでしょう。
ある程度完成していて、公開して差し支えなければここの掲示板で公開して意見募集しても言いと思いますし、
私でよければプレイした感想をお伝えしますよ。
824ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(23,579ポイント)
Date: 2008/10/16(木) 18:49
No:22527
|
|
Title: Re:ゲームバランスって難しい…
|
|
管理人さんの言う通り、なるべく多く誰かにテストプレイしてもらうことですね。
製作者の立場上、これは不可欠なことじゃないかと思います。
デバッグ作業にもなって一石二鳥ですし。
特にSTGやアクションゲームの場合、初プレイの感想が一番大事なところです。
始めてやって、クリアしたいと思える程よい難易度を探し出すことで、
良い評価の一つとして得られるはずです。
142ポイント を手に入れた。
|
|
|
|
|
Name: AS ..かけだし(1,711ポイント)
Date: 2008/10/17(金) 18:32
No:22604
|
|
Title: Re:ゲームバランスって難しい…
|
|
管理人さん、御津凪さん、ありがとうございます。
最初の書込みでは書き忘れてしまってましたが、私はまだまだ完成などは程遠く、どのようなボスを作ろうか?どのような自機弾を作ろうか?という段階です。
まだこれほどの初期段階にもかかわらず、バランス(システム?)の難しさに苦しんでいるわけです(汗)
まだシステム自体あやふやな状態ですので、とにかく自分でプレイし、調整していくという手段しかないようですね。
しかし、意見を見る限りテスターさん頼りなところは大きいようですね。
ほぼ完成ぐらいにまでなっていれば、テスターさんはとても有効だと思いますが、
先ほどの言いましたように完成はまだまだ遠いので、テスターさんが必要になってくるのはまだ先のようです。
それからここの掲示板での公開許可ありがとうございます。
そのときが来たら是非意見をもらいに来たいと思います。
まだ当分の間はプログラムの書き方の質問などで訪れることが多いと思います(笑)
あと難易度調整と言うことで気になったのですがイージーモード、ハードモードなどを作る場合、何に差を持たせるのが良いのでしょうか?
思いつくあたりだと、敵or敵弾の数やスピード、自機の弾の威力低下などが思いつきますが…
龍神録は何に差を持たせていますか?東方シリーズもよくご存知のようなので知っているならば、教えていただけないでしょうか?
417ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(827,315ポイント)
Date: 2008/10/17(金) 21:28
No:22616
|
|
Title: Re:ゲームバランスって難しい…
|
|
ゲームのシステム全体もまだあやふやな状態でしたらそりゃ自分で考えて作っていくしかないですね^^;
ある程度ものができないと意見のしようもないでしょうし・・。
もし大きなゲームを作るのが不安だったり、経験がなければまず小さいゲームを作ることですかね。
2面、3面を後々作る事を想定したつくりにはしつつも、一応1面が終わったらそこでゲームは完成、
まぁ言ってみれば体験版のような完成の形を目指してはどうでしょう。
龍神録Plusは制作に8ヶ月もかかりましたが、こんなに長い間誰にも見せることなく、
刺激を受けることなく作り続ける計画だったとしたらとても困難だったと思います。
私は、体験版、通常版、Plus版の3回にわけて公開しました。
体験版で人から意見を受けるのも大事ですし、同時に人に遊んでもらう喜びや楽しさも味わえると思います。
それに、まだ完成の兆しも見えない状態で制作を続けるのは不安であり、
やる気も下がってしまいます。ですから所どころで「完成」の旗を立ててやるのがいいと思います。
なので、小さなゲームとして仕上げるか体験版みたいな形の完成を目指してみてはどうでしょう。
では、難易度設定についてですが、館でも行ってますが、まず一番難しい難易度から制作するのがベストだと思っています。
東方に限らず何でもそうだと思いますが、仰っているとおり難易度が高い弾幕は
・弾速が速い
・弾密度が多い(弾数が多い)
ということがあるでしょうから、それを遅く、少なくすればいいと思いますよ。
東方シリーズをご存知なら東方を参考にしてみてはどうでしょう?
単に弾が遅く、弾が少なくなっているだけではない場合が多いですよね。
・博愛の仏蘭西人形
・博愛の オルレアン人形
ってご存知ですか?
仏蘭西人形ではキラーン、キラーンと2回弾が変化し、増加するのに対し
オルレアンは3回変化しますよね。しかも色が違う。
通常モードで何度もプレイした人がハードをプレイした時、演出にプラス弾の色が変わっているとかなり
変わったイメージに感じると思います。
その難易度ごとに演出を変えるのが一番でしょうが、それが難しいときは弾の色を変えるだけでも充分イメージが変わると思います。
後私が気にかけているのは「切り替えし」です。
自機追が多い弾幕は段々画面はしにおいやられますよね。
それをうまく切り返さないと反対方向に逃げられません。
これは結構難しいので、ひきつけて切り替えししないといけないような弾幕はイージーにはあまり入れていません。
後、ボスではない通常エリアではアイテムを回収する時間を確保しています。
ハードでは「うまい人が取るもの」という位置づけにしています。
まだ偉そうなこといえるような人間じゃないんで、参考程度に聞いてもらったらいいんですが
まぁこれくらいですかね^^;
私は龍神録制作時、色んなSTGをしました。
ゲーセンにいって端からやってみましたし、ベクターに落ちているようなSTGも端からやってみました。
とりあえず色んなシューティングをやってみて、いいところを吸収してみて下さい。
悪く言えばパクリですが、何でも参考からです(・・と自己擁護しておきます^^;)
1,069ポイント を手に入れた。
|
|
|
|
|
Name: AS ..かけだし(1,923ポイント)
Date: 2008/10/19(日) 10:32
No:22688
|
|
Title: Re:ゲームバランスって難しい…
|
|
返信ありがとうございます。
少しずつ作って体験版という形で遊んでもらうというのは、まさにその通り、いい案ですが、今まで全く気付きませんでした…
少しずつ作ってプレイしてもらうという方向で行こうかと思います。
演出の変更といのは明らかに見た目が変わるのでとてもよさそうな変化ですね。
東方シリーズは動画でしたか見たことがない程度です…調べてみると体験版は無料でダウンロードできるようなので、参考にプレイしてみようかと思います。
切り替えしにしてもアイテムにしても、よく考えてらっしゃるんだなぁと思いました。こういうところに少しずつでも気付けるようにならなければいけませんね。
フリーのSTGもまだあまりプレイできていないので、探してやってみます。
今回も参考になる点が多かったです。ありがとうございました。
212ポイント を手に入れた。
|
|
|
|
Name: SH ..かけだし(1,216ポイント)
Date: 2008/10/18(土) 00:53
No:22629
|
|
Title: 24章にてエラー、引数を取り込む関数には…
|
|
何度も何度も申し訳ないです・・・。
龍神録プログラミング24章の
boss_shot_main関数内の
boss_shot_bullet[boss.knd]();//弾幕関数へ
これに対してエラー
「引数を取り込む関数には評価されません。」とでてしまいます。
このエラーを検索したところ
変数と関数で同じ名前を使用すると発生する と書いてあるのですが、
変数と関数は別の名前にしてありますし、龍神録プログラミングのサンプルと見比べても
どこが間違っているのか分かりません。
22章、23章のボム製作のところをスキップし、49章のホーミングを実装した他、
いくつか画像を変えたぐらいの改変しか行っていないのでそれが原因とは思えません。
どうすれば解決できるでしょうか…
291ポイント を手に入れた。
|
|
|
|
Name: array ..プログラマー(35,833ポイント)
Date: 2008/10/18(土) 01:17
No:22630
|
|
Title: Re:24章にてエラー、引数を取り込む関数には…
|
|
確かですけど。
--- define.h ---
//弾幕最大数
#define DANMAKU_MAX 50
の数値を弾幕データ数がオーバーしてるかもしれないです。
それか--- func.h ---の中身に問題があるかだと思います。
86ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(19,648ポイント)
Date: 2008/10/18(土) 08:33
No:22635
|
|
Title: Re:24章にてエラー、引数を取り込む関数には…
|
|
24章では弾幕関数が1個しか登録してないようですね
void (*boss_shot_bullet[DANMAKU_MAX])() =
{
boss_shot_bulletH000,
};
boss_shot_bullet[boss.knd]();
でboss.kndが0以外だと「引数を取り込む関数には評価されません。」というエラーが出るのでしょう。(日本語になってないエラーメッセージですね)
113ポイント を手に入れた。
|
|
|
|
|
Name: SH ..かけだし(1,362ポイント)
Date: 2008/10/18(土) 11:26
No:22643
|
|
Title: Re:24章にてエラー、引数を取り込む関数には…
|
|
回答してくれた方々、有難うございます…
弾幕データ数はshotH.cppの方は多少増やしたものの、boss_shotH.cppの方は
24章プログラミングをコピーしたような状態になっていますので、まだ1つだけです。
func.hも同様なので、そこに問題があるようには思えません…
boss.kndも弄くってみましたが、変化は見られないようです…
146ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(35,969ポイント)
Date: 2008/10/18(土) 15:08
No:22650
|
|
Title: Re:24章にてエラー、引数を取り込む関数には…
|
|
ちなみにSHさんのエラーは、ゲーム実行時のエラーになるのでしょうか?
多分toyoさんの回答が原因だと思います。
言われてるとおり、boss.kndが0以外の数値になるとその時点でエラーが起こります。
私も以前似たようなエラーがあったと思い試してみたのですが・・・
boss.kndが0以外だと「読み込み中にアクセス違反が発生しました」とエラーがでてゲームが中断されます。
ボスを倒すと、void enter_boss(int num)が実行され
boss.knd++;
で加算するので、boss.kndが1になります。
これが原因でエラーになるのではないでしょうか?
136ポイント を手に入れた。
|
|
|
|
|
Name: SH ..かけだし(1,545ポイント)
Date: 2008/10/18(土) 15:45
No:22651
|
|
Title: Re:24章にてエラー、引数を取り込む関数には…
|
|
ビルド時のエラーです
この時点ではボスに当たり判定がないので
boss_knd++;
によってboss_kndの値が加算されることはありません…
enter_boss関数では最初にboss_kndの値が-1になっていますが、
これを0や他の値に変えたり、boss_knd++を消しても変化はありませんでした。
boss_shot_main関数内の
boss_shot_bullet[boss.knd](); にマウスのカーソルをあてると
void (*boss_shot_bullet[3][6][50])(int) と表示されるのですが、
これが原因のような気がしているのですが…
183ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(36,275ポイント)
Date: 2008/10/18(土) 16:18
No:22652
|
|
Title: Re:24章にてエラー、引数を取り込む関数には…
|
|
ためしに
--- func.h ---
extern void boss_shot_bulletH000();
void (*boss_shot_bullet[3][6][DANMAKU_MAX])(int) =
{
boss_shot_bulletH000,
};
と書き換えたら同じエラーを確認できました。
赤文字が原因だと思うのですが・・・。
もしかしたら、
--- boss_shot.cpp ---
の上から2行目
#include "../include/func.h"
となっているのですが、インクルード先のファイルが間違っていませんか?
自分で書いてるらしいので、もしかしたらファイル位置などが間違ってるかも知れませんよ。
今、初めて知った機能なんですが、boss_shot_bullet[boss.knd](); にマウスカーソルを当て
右クリックから「定義へ移動」という機能があるみたいなので便利かもです。
306ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(828,516ポイント)
Date: 2008/10/18(土) 16:55
No:22654
|
|
Title: Re:24章にてエラー、引数を取り込む関数には…
|
|
void (*boss_shot_bullet[3][6][50])(int)
これはおかしいです。引数は無いはずです。
void (*boss_shot_bullet[DANMAKU_MAX])();
のはずです。
18ポイント を落としてしまった。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(828,682ポイント)
Date: 2008/10/18(土) 17:00
No:22655
|
|
Title: Re:24章にてエラー、引数を取り込む関数には…
|
|
void (*boss_shot_bullet[3][6][50])(int);
これは以前私が龍神録1の時に使っていた宣言と同じです・・。
1面の最大登録弾幕数が50で、通常ステージ5+EX1の6エリアあり、難易度が3種類と言う意味で。
何かの間違いでどこかのコードに潜り込んだのかもしれません。
そのプロジェクトごと圧縮してこちらで拝見させていただく事はできないでしょうか?
また、参考にされたプログラムは館だけですか?
166ポイント を手に入れた。
|
|
|
|
|
Name: SH ..かけだし(1,907ポイント)
Date: 2008/10/18(土) 21:06
No:22665
| 解決!
|
Title: Re:24章にてエラー、引数を取り込む関数には…
|
|
回答していただき、至極感謝しております。
24章の方では「includeフォルダにfunc.hのファイルを追加」と書いてあったのに対し、
自分がVisual C++2008の方から追加したのが原因だったようです。
includeした物が追加したほうではなく、元からあった別のfunc.hをインクルードしてしまったようです。
迷惑をかけてしまい、すみませんでした…
ちなみに参考にしたプログラムは龍神録プログラミングの館のみでした。
2倍のポイントを手に入れた! 362ポイント を手に入れた。
|
|
|
|
Name: chunezu ..初心者(5,350ポイント)
Date: 2008/10/15(水) 00:16
No:22464
|
|
Title: 残りは弾の発射だけ・・・
|
|
あのあといろいろ試しているうちに自分のスレが消えてしまい返信できなくなっていました。
回答してくださった人、どうもすいませんでした。
まずはenemyとshot,bulletに分けました。
enemy(t)は望んだとおりの動きになるのですが、どうしてもそこから弾が発射されません。
ここからどうしたら良いでしょうか?
こんかいもプロジェクトを添付しました。
http://island.geocities.jp/nznz3102/DP.zip
もしかshot,bulletに分けられていない状態のプロジェクトでしたらご一報ください。
ご回答よろしくお願いします。
50ポイント を手に入れた。
|
|
|
|
Name: 管理人 ..伝説なるハッカー(820,433ポイント)
Date: 2008/10/15(水) 01:19
No:22467
|
|
Title: Re:残りは弾の発射だけ・・・
|
|
ブレイクポイントは使ってみましたか?
どのように処理が行われているか変数の中身を確認したりしてみましたか?
ブレイクポイントを使い、少しずつ処理がどのようになっているか、
とくに弾が発射されないのならその辺で処理をとめ、
変数に期待する値が入っているかどうか確認してみて下さい。
1ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(241,925ポイント)
Date: 2008/10/15(水) 20:30
No:22478
|
|
Title: Re:残りは弾の発射だけ・・・
|
|
>どうしてもそこから弾が発射されません。
>ここからどうしたら良いでしょうか?
いや、どうしたらいいって、それ以前の問題が・・・。
配列の要素数を越えるアクセス、未初期化のローカル変数への参照、
forループにグローバル変数を使っていてその内部から呼び出した
関数内でもそのグローバル変数を使って forループしていたり、
とおおよそ正常に動作する見込みがありません。
まず、そのあたりを改善されてはどうでしょうか?
で、弾が発射されない問題ですが、ただ単に発射関数を呼んでいないからではないですか?
shot_serch(search)とか enter_shot()とか検索しましたが、
使われているように見えませんし。
>まずはenemyとshot,bulletに分けました。
えーと、前のスレも目を通しましたが、enemy/shot/bulletの何を分けたんでしょうか?
294ポイント を手に入れた。
|
|
|
|
|
Name: レク ..ぴよぴよ(346ポイント)
Date: 2008/10/15(水) 20:50
No:22479
|
|
Title: Re:残りは弾の発射だけ・・・
|
|
前スレで管理人さんがループ上限を直すようにも、
tを使わないようにも言っていると思いますが、直ってないようですね。
まず質問する前に、前に言われた事をきちんと直してから聞くのが常識ではないでしょうか。
86ポイント を手に入れた。
|
|
|
|
|
Name: chunezu ..初心者(5,644ポイント)
Date: 2008/10/17(金) 23:24
No:22625
|
|
Title: Re:残りは弾の発射だけ・・・
|
|
ご返答ありがとうございます。
ご指摘を受けたところを改善してみた所、無事に動きました。本当にありがとうございました。
ただ、また問題が起きてしまいました。
kouzou.hの
/*定義*/
#define EnemyMax 50
#define ShotMax 30
#define BulletMax 200
#define PI 3.141592
の部分で、ShotMax、BulletMaxの値を増やすとプログラム自体が強制終了してしまいます。
↑の定義が使われているループには何度も目を通しましたが、原因は何だかわかりませんでした。
EnemyMaxも増やすと変な行動をしてしまいます。
どなたか分かる方ご指摘お願いします。
プロジェクトは前のアドレスと一緒です。
294ポイント を手に入れた。
|
|
|
|
|
Name: chunezu ..初心者(5,732ポイント)
Date: 2008/10/18(土) 19:22
No:22662
| 解決!
|
Title: Re:残りは弾の発射だけ・・・
|
|
すいません説明不足でした・・・
ただ、この問題は何度か再起動しているうちに直ってしまいました。
そのほかの問題も徹夜で頑張ってたら全て解決しました。
ご回答くだっさた皆様本当にありがとうございました。
88ポイント を手に入れた。
|
|
|
|
Name: イチ ..かけだし(1,177ポイント)
Date: 2008/10/18(土) 10:58
No:22639
|
|
Title: Wiiについて
|
|
こんにちわ☆いつもお世話になっています。(/o^∀^o)(/o^∀^o)
わたしは今大学のプロジェクトでWiiリモコンを使って音が出る何かを作ろうとしています。
音が出て、ゲームみたいに画像も出たらさらに良いと思っています。
wiiMoteをダウンロードして、サンプルは動かせたのですが、wiiMoteにDxライブラリを使うことは可能でしょうか?
wiimoeの場合で
プロジェクトの設定で文字を「Unicode 文字セットを使用する」
C++のコード生成では「マルチスレッド デバッグ DLL (/MDd)」
から変更したらエラーが出てしまいました。(T^T)ウッウッウッ
Dxライブラリを使う時これを変更しなければいけませんよね?
なにか方法はありますでしょうか?
wiimoteでわたしのようなプロジェクトを進めたことがある人がいたら、是非教えて欲しいです。
よろしくお願いします(v≧∇≦)ノ
365ポイント を手に入れた。
|
|
|
|
Name: 管理人 ..伝説なるハッカー(828,549ポイント)
Date: 2008/10/18(土) 17:21
No:22657
|
|
Title: Re:Wiiについて
|
|
いいですね。おもしろそうな話です。
私もこういうプログラムは好きです。
>「マルチスレッド デバッグ DLL (/MDd)」 から変更したらエラーが出てしまいました。
恐らくWiiMoteはDLLを含むライブラリを使っているのではないでしょうか。
一方DXライブラリはDLLを含まない設定にしないといけません。
一度公式サイトで聞いてもらったほうがいいかもしれません。
144ポイント を落としてしまった。
|
|
|
|
|
Name: Justy ..ハッカー(244,610ポイント)
Date: 2008/10/18(土) 17:32
No:22658
|
|
Title: Re:Wiiについて
|
|
というか、そのサンプルはどこにあるんでしょう?
せめてリンクくらい張って欲しいです。
どうしても解決しないようならDXライブラリの方を Unicode& MDd/MDで
ビルドしなおせばいいんじゃないでしょうか。
56ポイント を手に入れた。
|
|
|
|
Name: わからぬ ..ぴよぴよ(244ポイント)
Date: 2008/10/15(水) 23:22
No:22487
|
|
Title: 宿題です。お手上げなのでよろしくお願いします。
|
|
下記のプログラムを配列変数を使って
作り直せ!!!
#include<stdio.h>
void main(void)
{
float a,b,c,d,e;
float sum,avar;
printf("kokugo=");scanf("%f",&a);
printf("sansu=");scanf("%f",&b);
printf("eigo=");scanf("%f",&c);
printf("shakai=");scanf("%f",&d);
printf("rika=");scanf("%f",&e);
sum=a+b+c+d+e;
avar=sum/5;
printf("合計=%f\n",sum);
printf("平均=%f\n",avar);
}
244ポイント を手に入れた。
|
|
|
|
Name: ベリ工 ..かけだし(1,214ポイント)
Date: 2008/10/15(水) 23:33
No:22489
|
|
Title: Re:宿題です。お手上げなのでよろしくお願いします。
|
|
>下記のプログラムを配列変数を使って
>作り直せ!!!
#これは質問ですか?それともヤレと命令しているのですか?
#非常に不愉快な書き込みですね。
とりあえず、配列を使えと言っているので
配列作って格納し、それをグルグル回して(ループして)
合計値を計算し、それから平均を求めるだけでしょ。
何も難しくないですよ。分からないなら"C言語 配列"などで検索して
グーグル先生に聞くと良いよ。
158ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..初心者(5,368ポイント)
Date: 2008/10/15(水) 23:42
No:22490
|
|
Title: Re:宿題です。お手上げなのでよろしくお願いします。
|
|
Hint: 配列、for文
ぐらいですね。
後、
「どこがどう分からないのでお願いします」ならいいですが、
「さっぱり分かりません。解説してください。」は怠惰と思われてしまいます。
12ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(63,071ポイント)
Date: 2008/10/16(木) 00:35
No:22497
|
|
Title: Re:宿題です。お手上げなのでよろしくお願いします。
|
|
#include <iostream>
#include <algorithm>
#include <numeric>
#include <utility>
template <typename T>
void input(std::pair<const char*, T>& arg)
{
std::cout << arg.first << "=";
std::cout.flush();
std::cin >> arg.second;
}
template <typename T>
T add(T lhs, const std::pair<const char*, T>& rhs)
{
return lhs + rhs.second;
}
template <typename T, class Iterator>
void sub(Iterator first, Iterator last)
{
std::for_each(first, last, &input<T>);
T sum = std::accumulate(first, last, T(), &add<T>);
T ave = sum / (last - first);
std::cout << "合計=" << sum << std::endl;
std::cout << "平均=" << ave << std::endl;
}
int main()
{
typedef std::pair<const char*, float> element;
element array[] =
{
element("国語", 0), element("算数", 0), element("英語", 0),
element("社会", 0), element("理科", 0),
};
sub<float>(array + 0, array + sizeof(array)/sizeof(array[0]));
}
> 作り直せ!!!
とのことだったので、全面的にC++で作り直してみました。
難しかったのは、元のプログラムの動作が未定義だったのでどう再現させればよいのか分からなかった点です。
仕方がないので適当に解釈しました。
あと、教科名は日本語にしてみました。
501ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(824,062ポイント)
Date: 2008/10/16(木) 23:46
No:22540
|
|
Title: Re:宿題です。お手上げなのでよろしくお願いします。
|
|
たかぎさんらしい厳しくも正確な解釈のお答えですね^^;
本人を知っている先生にこれを提出したら十中八九本人が書いたものじゃないことはバレるでしょうけど、
大人数授業で答えだけ集めて採点している先生なら100点付けてしまうかもしれませんね・・。
(C++OKなのだとしたら)
恐らく「作り直せ!!!」というのは回答者に向けて言っているわけではなく、
問題文を書いた後何となくビックリマーク付けたくなっただけなんだとは思いますが、
質問する時はもっと丁寧に文章をお書きになったほうがいいかと思います。
作り直せという課題だということは、これは質問者さんが作ったプログラムではなく、
配布されたプログラムなわけですね?
ではどこまでわかって、どこがわからないのか、
自分はどのように努力したのか、まず明確にしてみて下さい。
少しずつ解いていけば必ず解けますから頑張ってみましょう。
後、掲示板を利用する時は一応規約に目を通してください。
320ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(63,753ポイント)
Date: 2008/10/17(金) 00:48
No:22542
|
|
Title: Re:宿題です。お手上げなのでよろしくお願いします。
|
|
> (C++OKなのだとしたら)
仕方がないのでCでも作ってみました。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main(void)
{
char array[] = "国語=/算数=/英語=/社会=/理科=";
float sum = 0;
for (char *s = strtok(array, "/"); s != NULL; s = strtok(NULL, "/"))
{
fputs(s, stdout); fflush(stdout);
char d[10];
fgets(d, 10, stdin);
char *endptr;
errno = 0;
float x = strtof(d, &endptr);
if (errno != 0 || *endptr != '\n')
{
fprintf(stderr, "error\n");
return EXIT_FAILURE;
}
sum += x;
}
printf("合計=%f\n", sum);
printf("平均=%f\n", sum/5);
}
出血大サービスで、配列変数を二つも使っています。
350ポイント を手に入れた。
|
|
|
|
|
Name: non ..かけだし(1,299ポイント)
Date: 2008/10/17(金) 13:23
No:22556
|
|
Title: Re:宿題です。お手上げなのでよろしくお願いします。
|
|
strtofなんて、初めてみました。人のプログラムを見るのは新しい発見がありますね。
2倍のポイントを手に入れた! 56ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(27,978ポイント)
Date: 2008/10/17(金) 13:56
No:22559
|
|
Title: Re:宿題です。お手上げなのでよろしくお願いします。
|
|
ごめんなさい。
C99では途中宣言できたんでしたっけ(^^;
使わないからぜんぜん実に付かないなぁC99。
30ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(63,868ポイント)
Date: 2008/10/17(金) 16:19
No:22585
|
|
Title: Re:宿題です。お手上げなのでよろしくお願いします。
|
|
> C99では途中宣言できたんでしたっけ(^^;
そういうことです。
課題丸投げの質問に対して、C90で通用するものを回答するほどお人よしではありません。
配列変数の使い方も、多分意図から外れていますし。
75ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(63,908ポイント)
Date: 2008/10/17(金) 16:27
No:22587
|
|
Title: Re:宿題です。お手上げなのでよろしくお願いします。
|
|
> 使わないからぜんぜん実に付かないなぁC99。
課題丸投げの質問は、C99を練習するよい機会です。
どうせ規約を守って環境を書いてくる人は少ないので、C99で文句を言われる筋合いはありませんね。
40ポイント を手に入れた。
|
|
|
|
|
Name: . ..ぴよぴよ(520ポイント)
Date: 2008/10/17(金) 16:51
No:22589
|
|
Title: Re:宿題です。お手上げなのでよろしくお願いします。
|
|
色んな掲示板を見て思うのですが、いたらない質問者は沢山いますけど、
上級者が「どうだお前にはわからないだろう、でもこれは答えとしてあってるんだぜ」みたいな
自己満足の投稿をするのはあまり見ていて気持ちいいものじゃないです。
いたらない初心者をなるべく暖かくよい方向に向かわせようとするのが
ここの掲示板の良いところだと思いますしここの方針だと思います。
>どうせ規約を守って環境を書いてくる人は少ないので、C99で文句を言われる筋合いはありませんね。
ですから、発展的なコードの提示は色んな人の参考になっていいと思いますが、
こういう理由をわざわざ述べられるのはちょっと残念です。
188ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(115,877ポイント)
Date: 2008/10/17(金) 16:57
No:22590
|
|
Title: Re:宿題です。お手上げなのでよろしくお願いします。
|
|
うーん、今回の件はトピ主がヒド過ぎますからねぇ…質問じゃなくて命令だし…
それに、たかぎさんのコードは規約にのっとったもので、間違った事は書いてませんし、細かい部分にまで気配りが感じられて、非常に勉強になりますよ。
112ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(825,606ポイント)
Date: 2008/10/17(金) 17:06
No:22591
|
|
Title: Re:宿題です。お手上げなのでよろしくお願いします。
|
|
まぁいちいち規約を読んでから掲示板を見たり書き込んだりしてくれる人はなかなか少ないと思いますし、
読んでいない人には次から読んで下さいね って感じですが、今回は常識的におかしい気もしますしね^^;
まともな質問が出来ない人に、まともな回答したくない(というかしたくても出来ない場合も)ということも
あるでしょうね。
なので質問者さん、もう一度トピを立て直してもいいので、
改めてきちんと質問してはどうでしょう?
もし自分にはプログラムなんかわからん! と決め付けてしまっているなら、
そんなことはありませんよ。やる気さえあればアドバイスをうけながら、
自分でも調べながら、少しずつといていけば誰でも必ず解けますから。
一緒に頑張ってみましょう。
282ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(64,121ポイント)
Date: 2008/10/17(金) 17:35
No:22594
|
|
Title: Re:宿題です。お手上げなのでよろしくお願いします。
|
|
> 「どうだお前にはわからないだろう、でもこれは答えとしてあってるんだぜ」みたいな
いや、(期待された)答えではないことは分かっているんです。
そもそも、課題丸投げの質問に対して、期待通りの回答が得られると考えるほうがどうかしています。
自分の仕事を丸投げにしてくる場合でも、それを解決することで、いくばくか世の中のためにでもなるのなら話は違ってくるのです。
今回の質問に関しては、まるっきり質問者さんの私的な事情だけですからね。
私利私欲のための仕事を人任せにする人に、手を差し伸べるような奇特な人はそう多くありません。
> いたらない初心者をなるべく暖かくよい方向に向かわせようとするのが
> ここの掲示板の良いところだと思いますしここの方針だと思います。
はい。規約にもそう書いていますね。
ただ、それを期待するなら規約ぐらいは読むべきです。
213ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(18,137ポイント)
Date: 2008/10/17(金) 17:44
No:22595
|
|
Title: Re:宿題です。お手上げなのでよろしくお願いします。
|
|
横から失礼します・・。
>色んな掲示板を見て思うのですが、いたらない質問者は沢山いますけど、
今回の件に関しては質問ではないのではと思うのは私だけでしょうか?(^^;
>自己満足の投稿をするのはあまり見ていて気持ちいいものじゃないです。
私的には正しい質問の仕方をすれば、正しい答えを教えてあげますよ!
といってるんだと捕らえています。
80ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..上級者(15,401ポイント)
Date: 2008/10/17(金) 17:54
No:22597
|
|
Title: Re:宿題です。お手上げなのでよろしくお願いします。
|
|
管理人さん
>もし自分にはプログラムなんかわからん! と決め付けてしまっているなら、
>そんなことはありませんよ。やる気さえあればアドバイスをうけながら、
>自分でも調べながら、少しずつといていけば誰でも必ず解けますから。
>一緒に頑張ってみましょう。
じ〜んと来ました。
わからぬさん
以前、私もプログラムで解らない事があり
バ○さんや御○凪さんのお二方に「かなり」お世話になりました。
お二方以外の人のアドバイスもあり、プログラムは完成しましたよ。
ここが解らないと言うと具体的に教えて頂き
これは、どういう意味なんですか?
と、聞くと一回ググってみ?
それでも、〜を調べたのですが、解りませんでした;;
と言うと、丁寧に教えて頂きました。
後で気づいたのですが、調べずに質問するのは、マナー違反だそうです。
ですが、調べる事により
調べる癖がつき、マナーも守れて、知識も付くと
考えれば一石三鳥では、ないでしょうか?
わからぬさん
がんばってみては、どうでしょうか?
みなさん優しいので、答えてくれますよ。
長文すいませんでした。
お二方、名前を出してすいませんでした。
不快な気持ちになったんでしたら、謝ります。
492ポイント を手に入れた。
|
|
|
|
|
Name: hoge ..かけだし(2,006ポイント)
Date: 2008/10/17(金) 18:21
No:22600
|
|
Title: Re:宿題です。お手上げなのでよろしくお願いします。
|
|
これで、いいんじゃね?
#include<stdio.h>
int main(void)
{
float a[1],b[1],c[1],d[1],e[1];
float sum[1],avar[1];
printf("kokugo=");scanf("%f",a);
printf("sansu=");scanf("%f",b);
printf("eigo=");scanf("%f",c);
printf("shakai=");scanf("%f",d);
printf("rika=");scanf("%f",e);
*sum=*a+*b+*c+*d+*e;
*avar=*sum/5;
printf("合計=%f\n",*sum);
printf("平均=%f\n",*avar);
return 0;
}
111ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..初心者(5,435ポイント)
Date: 2008/10/18(土) 01:37
No:22631
|
|
Title: Re:宿題です。お手上げなのでよろしくお願いします。
|
|
>hogeさん
なんという抜け道( ̄□ ̄;)!!
もう、感服してしまいましたwwwww
28ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(64,193ポイント)
Date: 2008/10/18(土) 12:16
No:22645
|
|
Title: Re:宿題です。お手上げなのでよろしくお願いします。
|
|
実は私もhogeさんとほぼ同じ方法を考えたのですが、書いても面白くないのでやめました。
他にも、
char kokugo[] = "kokugo=";
printf(kokugo);scanf("%f",&a);
とかも可能ですね。
72ポイント を手に入れた。
|
|
|
|
Name: T.K. ..かけだし(1,733ポイント)
Date: 2008/10/11(土) 00:48
No:22265
|
|
Title: 動的にメモリ確保した構造体配列のポインタ渡し
|
|
こんばんはT.K.といいます。
VC++を利用しています。
質問したい内容はタイトルのとおり、
動的にメモリ確保した構造体配列のポインタ渡し
のやり方です。
普通に考えると、
#include <stdlib.h>
#include <malloc.h>
struct Str
{
int i;
};
void f(/*?????*/)
{
a[1]->i = 1;
}
int main()
{
Str* a;
a = static_cast<Str*>(calloc(3, sizeof Str));
a[1].i = 0;
f(&a);
return 0;
}
といった形になったのですが、これでは定義文の引数を
どのように宣言すべきかわかりません。
どのように書けばポインタを渡せるのでしょうか。
ご教授お願いします。
228ポイント を手に入れた。
|
|
|
|
Name: toyo ..上級者(19,413ポイント)
Date: 2008/10/11(土) 07:47
No:22273
|
|
Title: Re:動的にメモリ確保した構造体配列のポインタ渡し
|
|
void f( Str** a )
か
void f( Str* a[ ] )
15ポイント を手に入れた。
|
|
|
|
|
Name: T.K. ..かけだし(1,922ポイント)
Date: 2008/10/11(土) 14:40
No:22285
|
|
Title: Re:動的にメモリ確保した構造体配列のポインタ渡し
|
|
返信ありがとうございます。
確かに自分も最初は
void f( Str** a )
でよいかなと思い、記述していたのですが、
これでは関数f内の代入でアクセス違反が起きます。
(最初に書いておくべきでした。すみません)
理由はおそらく、通常のダブルポインタと
メモリを動的に確保した配列のポインタは、形式こそ
似ていますが、指している場所が微妙にずれているからだと思います。
何か新しい型でも用意すれば解決するかなと思ったのですが、
C++でメモリの大きさを変えたまったく新しい型を用意する方法
を知らないために断念しました。
189ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(62,256ポイント)
Date: 2008/10/11(土) 14:53
No:22287
|
|
Title: Re:動的にメモリ確保した構造体配列のポインタ渡し
|
|
もしかして、
void f(Str (*a)[3]);
を期待しているのでしょうか?
それであれば、呼び出し側は、
Str (*a)[3];
a = static_cast<Str(*)[3]>(calloc(3, sizeof Str));
とする必要があります。
ただ、こんなことをするより、素直に、
std::vector<Str> a(3, Str());
とした方がよいと思います。
129ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(126,969ポイント)
Date: 2008/10/11(土) 17:42
No:22300
|
|
Title: Re:動的にメモリ確保した構造体配列のポインタ渡し
|
|
> これでは関数f内の代入でアクセス違反が起きます。
ポインターへのポインターを使うようにf()のコードを
書くこともできます。
7ポイント を手に入れた。
|
|
|
|
|
Name: T.K. ..かけだし(2,061ポイント)
Date: 2008/10/12(日) 15:07
No:22347
| 解決!
|
Title: Re:動的にメモリ確保した構造体配列のポインタ渡し
|
|
返信ありがとうございます。
それから、こちらの返信が大変遅れました。ごめんなさい。
実現したかったことはvectorを使用することでとてもきれいに
解決できました。たかぎさんありがとうございました。
>>boxさん
ポインタのポインタを使う方法は、よくわかりませんでした。
もしよければ何かヒントをいただけますか?
139ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(127,579ポイント)
Date: 2008/10/12(日) 15:50
No:22348
|
|
Title: Re:動的にメモリ確保した構造体配列のポインタ渡し
|
|
Cの例です。適当にアレンジしてください。
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int i;
} Str;
void f(Str **a)
{
a[0][1].i = -789;
(*a)[2].i = 890;
}
int main(void)
{
Str *a;
a = (Str *) malloc(sizeof(Str) * 3);
if (!a) exit(1);
a[1].i = 123;
a[2].i = 456;
printf("【変更前】\n");
printf("a[1].i=%d\n", a[1].i);
printf("a[2].i=%d\n", a[2].i);
f(&a);
printf("【変更後】\n");
printf("a[1].i=%d\n", a[1].i);
printf("a[2].i=%d\n", a[2].i);
free(a);
return 0;
}
2倍のポイントを手に入れた! 556ポイント を手に入れた。
|
|
|
|
|
Name: T.K. ..かけだし(2,099ポイント)
Date: 2008/10/18(土) 03:18
No:22633
| 解決!
|
Title: Re:動的にメモリ確保した構造体配列のポインタ渡し
|
|
>>boxさん
理解しました。
丁寧な返信ありがとうございました。
38ポイント を手に入れた。
|
|
|
|
Name: array ..プログラマー(34,960ポイント)
Date: 2008/10/17(金) 01:09
No:22543
|
|
Title: C++について(勉強方法など)
|
|
環境
OS:Vista
コンパイラ:Microsoft Visual C++ 2008 Express Edition
コンパイラはC++なのに実際はCしか知らない現状です。
以前からC++ってなんだろ。と興味があり、本屋でC++の本を見てみた事が何度もあります。
しかし、何ができるか、何をしてるか、など さっぱり分からず、良い本なのかすら分かりません。
初心者でも分かる(できれば)本や、サイトを知ってる方が居れば
ぜひ教えてもらいたいです。
#知りたい内容は
・C++では何ができるのか?
(一応プロジェクト作成時のテンプレート的なものは出来そうだと予想してるのですが)
・Microsoft Visual C++ 2008 Express Editionの使い方。
・プログラムの書き方。
どこかで、C++はライブラリを作るのに適してると見たような記憶があるのですが
可能なら、DXライブラリを自分なりに削減して再ライブリ化(?)したいです。
いまいち伝えたい事を上手く伝えれてないのですが、C++でできる事を学びたいと思ってます。
156ポイント を手に入れた。
|
|
|
|
Name: 猫猫 ..ぴよぴよ(555ポイント)
Date: 2008/10/17(金) 02:33
No:22546
|
|
Title: Re:C++について(勉強方法など)
|
|
私は林晴比古著新C++入門という入門書で勉強しました。
私の持っている版ではSTLなどの説明が殆どないことを除けば、分かりやすく必要十分な内容だと思います。
HPなどでは「猫でも分かるプログラミング」が大変参考になりました。
私も、高校生くらいのとき初めてC言語というものを知り、入門書がぼろぼろになるまで読みましたが、
「じゃあ、具体的に何ができるのか」「どうしたらできるのか」
などさっぱり分からなかった記憶があります。(で、一度プログラミングからは離れました)
何ができるのかといえば、私たちが想像のつくプログラムはなんでもできるのではないでしょうか。
コンソール(DOS窓)用のプログラムなら、特に用意するものはないですが、
windowsでプログラムを造る場合はWindowsのAPIを、ゲームを造るならDirectXを勉強しなければなりません。
Visual C++などで、プログラムの骨組みを作ってくれる機能を使うにはまた勉強が必要です。
ちなみに、私はどれも勉強していません。ので、便利なゲーム用ライブラリ「DXライブラリ」を使っています。
C++言語は、イメージとしては従来のC言語の拡張版、クラス機能による分かりやすく安全性の高いプログラム作成ができ、STLなどの便利な標準クラスライブラリがある。などが特徴かなとおもいます。
448ポイント を手に入れた。
|
|
|
|
|
Name: 猫猫 ..ぴよぴよ(697ポイント)
Date: 2008/10/17(金) 03:11
No:22547
|
|
Title: Re:C++について(勉強方法など)
|
|
DXライブラリを改変するとすれば、まず、DXライブラリのコードをみて理解できる必要があります。
そのためには、WINDOWSAPIやDIRECTXAPIなどの知識も必要となります。
ライブラリの機能を削減するべきシチュエーションがあるかどうかは分かりませんが。
ライブラリを自分好みの仕様にするということであれば、
ライブラリの必要な機能を使って、自分好みのクラスや関数を作ることで実現できます。
この場合、ライブラリの全ての機能が使えて、さらに、自分だけの機能をつけられます。
142ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(25,175ポイント)
Date: 2008/10/17(金) 11:02
No:22553
|
|
Title: Re:C++について(勉強方法など)
|
|
C++ での利点の一つとして、構造体をオブジェクトとして扱い、オブジェクトに対して行う関数を楽に扱えることです。
たとえば、
#include <stdio.h>
typedef struct StructData {
int intData;
float floatData;
} StructData;
void StructDataInit( StructData* data, int intData, float floatData ){
data->intData = intData;
data->floatData = floatData;
}
void SetStructDataInt( StructData* data, int intData ){
data->intData = intData;
}
void SetStructDataFloat( StructData* data, float floatData ){
data->floatData = floatData;
}
int GetStructDataInt( StructData* data ){
return data->intData;
}
float GetStructDataFloat( StructData* data ){
return data->floatData;
}
int main( void ){
StructData data;
StructDataInit(&data,12,3.45f);
printf("int:%d\nfloat:%f\n",GetStructDataInt(&data),GetStructDataFloat(&data));
SetStructDataInt(&data,67);
SetStructDataFloat(&data,8.90f);
printf("int:%d\nfloat:%f\n",GetStructDataInt(&data),GetStructDataFloat(&data));
return 0;
}
これと同じことを C++ にすると、
#include <stdio.h>
class StructData {
int intData;
float floatData;
public:
StructData( int intData, float floatData ){
this->intData = intData;
this->floatData = floatData;
}
void Set( int intData ){this->intData = intData;}
void Set( float floatData ){this->floatData = floatData;}
int GetInt( void )const{return this->intData;}
float GetFloat( void )const{return this->floatData;}
};
int main( void ){
StructData data(12,3.45f);
printf("int:%d\nfloat:%f\n",data.GetInt(),data.GetFloat());
data.Set(67);
data.Set(8.90f);
printf("int:%d\nfloat:%f\n",data.GetInt(),data.GetFloat());
return 0;
}
このようになります。
(標準出力の部分も C++ にすべきだとは思いますが、そこはそのままにしておきました)
StructData に対して行う関数群を、メンバ関数として持つことができ、グローバル関数の数を減らしたり、
継承(元となるクラスの機能や変数を受け継ぐこと)によって機能などの拡張を容易にすることができます。
STGに例えると、ゲーム中、現在位置などを持つ基本クラスがあり、
それに位置情報等の変数、それらを扱う関数が定義されているとします。
この基本クラスを継承した自機クラス、敵クラス、弾クラスなどを定義します。
このとき、基本クラスの持つメンバ変数・メンバ関数は継承された各クラスでも使用することができます。
つまり、いちいち同じ処理を書かずにすみます。
他にも説明すべき点(public:とか)がありますが、 C++ のさわりということで。
VC++は特に(オプションでCソースとしてコンパイルする設定をしていない限り)変更せずに
C++ コードをコンパイルすることができるはずです。
あと、 C++ がライブラリに適している、というのは、
クラス単位で機能を提供できる点と、
C と比べると、比較的書くコード量が少なくて済む、
というのが理由ではないでしょうか。
(継承して拡張できるというのもありますね)
DXライブラリを C++ 化できれば、そのライブラリを使うソースコードが結構すっきりすると思いますよ。
どちらかといえば C ライブラリをカプセル化した C++ ライブラリを作るほうが楽ですが。
私はここに書くほど C++ をバリバリ使っているわけでは無いので、
詳しい利点やオススメの本の紹介などは他の方々に任せます…。
1,596ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(63,793ポイント)
Date: 2008/10/17(金) 11:11
No:22554
|
|
Title: Re:C++について(勉強方法など)
|
|
DXライブラリを改変するより、最初はDXライブラリのラッパーライブラリを作る方がよいでしょう。
ラッパーを作れば、DXライブラリの細部まで理解が及びますし、その過程でラッパーの限界も見えてくるはずです。
それを踏まえて再設計する方が、結局は近道ではないでしょうか?
16ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(35,747ポイント)
Date: 2008/10/17(金) 23:51
No:22628
|
|
Title: Re:C++について(勉強方法など)
|
|
GPGAさんありがとうございます。
とりあえず、たいちうさんが紹介してくれてるサイトで頑張ってみて、勢いに乗れれば読んでみたいと思います^^
66ポイント を手に入れた。
|
|
|
|
Name: 柏 ..中級者(11,335ポイント)
Date: 2008/10/15(水) 23:45
No:22492
|
|
Title: オーバーフロー対策について
|
|
以前リバーシの作成を通してオーバーフローの存在を大体理解したつもりでいましたが、改めて作成したリバーシのオーバーフローとなっている部分に対策を施そうと調べてみたのですが、少々分からない事が出てきました。
色々なサイトを参考にしたため、私自身も少々情報を整理し切れず混乱していますが、出来る限り何が分からないのか説明していきたいと思います(主にwikipediaのscanfの項目についての話です)
表現がおかしい所もあると思いますが、よろしくお願いします。
1.getchar()について。
まずgetcharはキーボード(標準入力)から一文字入力するというのは理解できています。
ユーザーが入力をするまでその先の処理には進まず、待機していると思うのですが、オーバーフローした際のバッファに残されてしまった文字を捨てるためにgetcharを用いて空読みをするという方法があったのですが、この際、
//ラインバッファ処理
while( 1 ){
c = getchar();
if( c == EOF || c == '\n' ){
break;
}
printf( "%c\n", c );
}
といった具合にバッファを空にしていくのですが、何故getchar()で入力待ちが起きないのか? というのが疑問です。
バッファが空でない場合は入力待ちが起きず、空なら入力待ちが起きることを確認しているので「そういうものだ」と割り切ってしまえばそれまでなのですが、一応知っておきたいと思った次第です。
2.%*s
scanf()に関してなのですが、
scanf("%*s");
というものがどういった事をしているのかがよく分かりません。
scanf("%*c%c", c);
といった場合には、一文字目は無視され二文字目が変数cに代入されるというのは分かります。
ではそれが%*sになるとどうなるか、という点ですが確認した限りでは"文字が入力されたらそれ以降は無視"といった感じのような気がしました(数パターンの実行結果から予想しただけのものなので恐らく違うと思いますが。。。)
話がちょっとごちゃごちゃしてきそうなのでオーバーフローと%*sの関連性について述べると、例えば以下のような処理をした場合(色々省いています)、
while(1){
printf("メニューを選んでください(入力は数字で)\n");
printf("0:最初から 1:続きから 2:終了する\n");
scanf("%d", &select);
getchar();
if(select == 0){
stone[3][4].flag=black;
break;
}
ここで仮に"a"と入力しただけで、無限ループに入ってしまいます。
そこで、Wikipediaを参考に、
while(1){
printf("メニューを選んでください(入力は数字で)\n");
printf("0:最初から 1:続きから 2:終了する\n");
if ( b=scanf("%d", &select) != 1){
scanf("%*s");
printf("%d\n", select);
}
if(select == 0){
stone[3][4].flag=black;
break;
}
としてみたのですが、"6y"や"5t"といった「数字+文字」の入力をすると一回余分にループしてから入力待ちになる、という状態になります。
そもそもまずscanf("%*s")がどういった処理なのかがよく分かっていないのでその点の解説あるいは参考になるページなどありましたらお教え頂けれると幸いです。
以上なのですが、正直まだまだ分からない所が多く、むしろどこが分からないのか分からないという状態なのでまだ質問事項が出てくるかもしれませんが、とりあえずまずはこの2つを解決したいと思います。
分かりにくい質問だとは思いますが、よろしくお願いします。
コンパイラ:BorlandC++ Compiler
開発環境:CPad for Borland C++Compiler
OS:Windows XP
追記:
int main(void){
char c[4];
int no=0;
scanf("%s", c);
scanf("%*s");
printf("%s\n", c);
return (0);
}
・結果
dvgdlgm43
43e
dvgdlgm43
-- Press any key to exit (Input "c" to continue) --
これの実行結果を見る限り、scanf("%*s")はどうも文字を無視するという訳でもなさそうですね。
バッファに残っている文字列を空にしていく、というわけでもなさそうですし。。。
1,199ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(243,359ポイント)
Date: 2008/10/16(木) 02:02
No:22498
|
|
Title: Re:オーバーフロー対策について
|
|
>1 getchar()について。
>何故getchar()で入力待ちが起きないのか?
getcher()は入力ストリーム(この場合はキーボードの入力)から1文字ずつ
“取り出す”関数です。
なので取り出せるなら直ぐに処理は返ってきますが、取り出せないなら
取り出せるまで(入力されるまで)待っているわけです。
入力ストリームの終端は EOFか改行コードになりますので、
そのチェックを入れることで、ストリームが空になったことを検知することで、
getcher()が呼ばれて入力待ちになるのを防いでいます。
>scanf("%*s");
>というものがどういった事をしているのかがよく分かりません
ストリームに文字列が残っていればそれを読みとって捨て、
残っていなければ入力を待ち、受け取った文字列を捨てます。
%sであれば、区切りまでの文字列を入力ストリームから読みとり、
バッファに格納しますよね?
%*sは %sで読みとられる分の文字列を入力ストリームから読みとって捨てます。
ただそれだけです。
%*sを %sに変えて適当な別のバッファにその中身を入れてみると
「どんな文字が捨てられるのか」わかるのでその挙動を調べやすいかと思います。
>、"6y"や"5t"といった「数字+文字」の入力をすると一回余分にループしてから入力待ちになる
それはそうです。
"6y"と入力すると 最初の scanfは %dなので、6の数字だけを読みとります。
となると "y"はストリームに残ったままになりますので、
whileループで再度 %dの scanfが実行されたとき、数字ではないので
読みとりに失敗します。
その結果 ifは真になり、{}内の scanf("%*s")によって、"y"が
クリアされるという流れになります。
こういう流れになっていますので "6t z"と入力すると一回ではなく
二回余計に回ることが理解できますでしょうか。
%sや %*sは終端か空白などの区切りまでしか読まないので、
1回目の if{}内の scanf("%*s")で tが消え、2回目で zが消えます。
ちなみに、 if ( b=scanf("%d", &select) != 1)ですが、
これは scanfの結果 !=1の比較結果を bに入れているように見えますが、
それで正しいですか?
>追記:
この追記のプログラムはおかしいです。
配列 cは4つしかないのに、入力文字は4文字以上ありますので、
バッファオーバーランを起こしているのではないでしょうか。
仮にそれがなかったとした場合、この追記のプログラムは
最初の %sで入力待ちになります。
"dvgdlgm43"が入力されたらそれらが全て cに入り、ストリームは空に
なります。
そこですかさず、%*sの scanfが実行されると捨てるものがないので、
入力待ちになります。
代わりに "dvgdlgm43 aaa"と入力してみて下さい。
%*sによって "aaa"が読み捨てられるはずです。
877ポイント を手に入れた。
|
|
|
|
|
Name: 柏 ..中級者(12,684ポイント)
Date: 2008/10/16(木) 18:13
No:22523
| 解決!
|
Title: Re:オーバーフロー対策について
|
|
Justyさん、ご回答ありがとうございます。
大学の講義中に頂いた回答を見ながら色々考えていると、分からなかった部分がだいぶ理解出来ました。
まずgetcharに関して、といよりもそれ以前の話なのですが、今までキーボードからの入力は直接変数に代入されるという感覚でいたのですが、
どうもキーボードから入力された文字はバッファに格納され、
getcharやscanfはバッファに格納されている文字を代入する関数、
という感じなのだと思いました。つまりバッファに何らかの文字が残っていれば代入してしまう、
という事なのですね。
例えるなら黒板に書かれた文字列をノートに書き写す、という感じでしょうか(そして書き写した後黒板の文字は消える)。
g今までgetcharは入力を受け付けるという考え方をしていたため、
1文字ずつ取り出す関数と言われると非常に納得出来ました。
次に%*sですが、おっしゃられた通り%sに変えて確認してみた所、すぐに理解することが出来ました。
目に見える形で確認してみると、確かに"捨てる"か"代入するか"だけの違いですね……。
「数字+文字」の入力についてですが、上記の事が理解できるとすんなり分かりました。
%sでの確認方法を教えて頂いたので、その方法で確認することが出来たのも大きかったです。
>>scanfの結果 !=1の比較結果を bに入れているように見えますが、
まさしくおっしゃる通りです。
scanfが代入に成功した変数の数を返すということで、
なら実際ちゃんと値を返しているのかを見たかったため変数bにscanfの戻り値を代入しています。
ここに載せる際には必要のないもので消しておけば良かったのですが、忘れていました^^;
追記のプログラムに関してですが、てっきり配列を超えた入力分はバッファに残るものだと思っていたため、
その後のscanf("%*s")がバッファを空にしてくれるものだと思っていました。
そもそもこちらの掲示板で以前似たような質問をしているのにそれを忘れていました、、、
試しに「abcdefgh」と入力し、c[6]を表示させてみるとしっかり「g」が入っていました(そもそも「問題が発生したため終了します」的なメッセージが出てくるのですが)。
以上の事を踏まえ、オーバーフローが発生しない(と思われる)ように改良したプログラムを後学のため(にはならないと思いますが)一応載せておきます。
while(1) {
printf("メニューを選んでください(入力は数字で)\n");
if(scanf("%d", &i) != 1){
//改行文字以外の文字列を全て空読み。
scanf("%*[^\n]");
//↓空白を考えない場合
//scanf("%*s");
continue;
}
if(i == 1){
break;
}
scanf("%*[^\n]");
//scanf("%*s");
printf("str=%s\n", str);
printf("i=%d\n",i);
}
同じような処理を2箇所に書いているので無駄な部分があると思いますが、
異常な入力は受け付けないようにはなっていると思います。
とりあえず疑問は恐らく全て解決しました。
分からなかった一部分だけでも分かると、連鎖するように次々と理解できたので楽しかったです^^;
改めて、アドバイスを下さったJustyさん、ありがとうございました。
1,349ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(243,721ポイント)
Date: 2008/10/17(金) 01:12
No:22544
|
|
Title: Re:オーバーフロー対策について
|
|
>とりあえず疑問は恐らく全て解決しました。
それは何よりです。
>なら実際ちゃんと値を返しているのかを見たかったため変数bにscanfの戻り値を代入しています
えーと、今のコードですと、「scanfの戻り値」を bに、ではなく
「scanfの戻り値を 1と !=で比較した結果」を bに入れています。
というのも代入の =と比較の !=では !=の方が優先順位が高いので先に実行されてしまうのです。
なので、意図通りの動作にするには
b=scanf("%d", &select) != 1
ではなく
(b=scanf("%d", &select)) != 1
でなくてはならないかと。
BohYoh.com【C言語講座】演算子一覧表
ttp://www.bohyoh.com/CandCPP/C/operator.html
362ポイント を手に入れた。
|
|
|
|
|
Name: 柏 ..中級者(12,772ポイント)
Date: 2008/10/17(金) 19:29
No:22612
|
|
Title: Re:オーバーフロー対策について
|
|
実行して確認してみた所、「3」を入力するとbに0が代入されていました。
なんだか色々と勘違いしていました……。
優先順位については大雑把にしか把握していなかったため、
ご紹介して頂いたページも大変参考になりました。
ありがとうございます。
88ポイント を手に入れた。
|
|
|
|
Name: 匿名 ..かけだし(1,560ポイント)
Date: 2008/10/17(金) 14:19
No:22563
|
|
Title: DrawLine関数
|
|
たいしたことではないですがDrawLine関数で描く線の太さを変更するのは可能でしょうか?
43ポイント を手に入れた。
|
|
|
|
Name: Mist ..プログラマー(28,033ポイント)
Date: 2008/10/17(金) 14:24
No:22566
|
|
Title: Re:DrawLine関数
|
|
> DrawLine( int x1, int y1, int x2, int y2, int Color, int Thickness = 1 ) ;
DXライブラリのヘッダーを見るとわかりますが、DrawLineには隠し引数があります。
Thicknessの値を増やすと太くなったはず。
55ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..かけだし(1,585ポイント)
Date: 2008/10/17(金) 15:34
No:22580
| 解決!
|
Title: Re:DrawLine関数
|
|
隠し引数とは気づきませんでした。どうもありがとうございます。
25ポイント を手に入れた。
|
|
|
|
Name: 猫猫 ..ぴよぴよ(107ポイント)
Date: 2008/10/17(金) 01:12
No:22545
|
|
Title: vectorにクラスを代入するとき
|
|
クラスのメンバにポインタが含まれる場合、コピーコンストラクタやコピー演算子が必要だということは
色々なHPを見てわかったのですが
STLのvectorなどに「stringをメンバにもつクラス」を代入する場合、ポインタ同様面倒なことが起こるのでしょうか?それとも、stringを通常の変数のようにあつかってよいのでしょうか?
使う場面は、オンラインゲームで新規の接続があるたびに、
プレーヤーのステータスを一元管理するクラスをvectorに入れていくという場面です。
107ポイント を手に入れた。
|
|
|
|
Name: 猫猫 ..ぴよぴよ(710ポイント)
Date: 2008/10/17(金) 15:16
No:22577
| 解決!
|
Title: Re:vectorにクラスを代入するとき
|
|
なるほど!早速のご回答ありがとうございました!
13ポイント を手に入れた。
|
|
|
|
Name: 匿名 ..かけだし(1,134ポイント)
Date: 2008/10/15(水) 16:18
No:22475
|
|
Title: 演出のやり方ですが・・・
|
|
最近の東方のゲームはポーズをかけると画面がぼやけたり、ボスの周りの背景がゆがんだりしていますけど、ああいう演出はどうすればできるんでしょうか?
49ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(242,482ポイント)
Date: 2008/10/15(水) 23:16
No:22485
|
|
Title: Re:演出のやり方ですが・・・
|
|
東方のゲームをやったことがないので、一般的な話になりますが
>ポーズをかけると画面がぼやけたり、
いろんなやりかたがあると思うのですが、一番簡単そうなのは
ぼかしたいその画面を裏画面ではなく、テクスチャにレンダリングして、
そのテクスチャをアルファブレンドでアルファ値を下げた状態で
上下左右(或いは斜め)などの周囲の方向にわずかずらして
何度も描くことです。
ずらす幅や何回描いたかで見え方は変わってきます。
ただ、処理負荷高いので、どう使うのかは工夫しなければなりません。
>、ボスの周りの背景がゆがんだりしていますけど
東方でどう歪んでいるのかは見たことがないのでわかりませんが、
シンプルなのはこんなかんじでしょう。
DirectXにしろ OpenGLにしろ大抵の描画ライブラリには
頂点とその頂点に対応したテクスチャ座標(UV座標)を指定して普通の長方形や正方形ではなく、
自由な形状(三角形や台形・菱形のような変則的な四角形、或いはそれ以上の多角形)の絵を
表示できる機能があります。
プリミティブタイプ Mi-ko's FriendlySpace
ttp://mi-ko.cocoa.cx/programming/directx/directgraphics/FVF/directgraphics_01.html
DirectX によるゲームプログラミング入門 :第 3 章 DirectX Graphics の特殊効果
ttp://www.microsoft.com/japan/msdn/academic/Articles/DirectX/03/
の「(5) UV 座標」参照。
歪ませたい絵をテクスチャとして用意し、この機能を使ってボスの周りを
細かい三角形に分割して、頂点ボス周辺の頂点の位置を動かしてあげれば
ゆがみが表現できます。
一昔前の PS1/PS2とかでよく見かけた光学迷彩エフェクトも
これの延長線上で作られています。
# でも今時だとシェーダのお仕事ですよね、このあたりって。
Maverick Project
ttp://maverickproj.web.fc2.com/pg00.html
557ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..かけだし(1,352ポイント)
Date: 2008/10/16(木) 12:08
No:22507
|
|
Title: Re:演出のやり方ですが・・・
|
|
すいません、東方ではこんなかんじにゆがんでいます。
ぼやけたりとかはなんとなく分かりますけどゆがみはサンプルの意味が理解不能な状態です。
なんとかがんばって理解するのでこんな感じにゆがむサンプルを教えてください。
あとこれだと分かりにくいですけどゆがんでいる部分だけ赤っぽくなっている時もあるんですよね。
そういう表現はどうすればいいでしょうか?
2倍のポイントを手に入れた! 218ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..かけだし(1,381ポイント)
Date: 2008/10/16(木) 12:16
No:22510
|
|
Title: Re:演出のやり方ですが・・・
|
|
あと聞き忘れたんですけど「ラスタースクロール」「テクスチャ」「レンダリング」って何のことですか?
29ポイント を手に入れた。
|
|
|
|
|
Name: 通りすがり ..中級者(11,614ポイント)
Date: 2008/10/16(木) 12:51
No:22512
|
|
Title: Re:演出のやり方ですが・・・
|
|
赤くしたいなら赤でアルファブレンドすればよいだけです。
特殊な形で赤くしたいならその形で作った赤い画像を上からアルファブレンドすればよしです。
わからない言葉があるときはまずググるなり自分で調べてみましょう。
70ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(23,437ポイント)
Date: 2008/10/16(木) 12:55
No:22514
|
|
Title: Re:演出のやり方ですが・・・
|
|
> あと聞き忘れたんですけど「ラスタースクロール」「テクスチャ」「レンダリング」って何のことですか?
まずはそこから覚えていかないと、東方のような、比較的高度な演出を作るのは難しいです。
ラスタースクロールは、
http://l.huu.cc/board/log/bbslog_66.html#20946
こちらをご覧ください。
テクスチャは、ポリゴンの板に張るシールのような画像のことを指します。
レンダリングは、ポリゴンやモデル、テクスチャなどを描画する処理の事を指します。
これらは基礎となる用語です。
きちんと調べて覚えましょう。
東方ではシェーダ(レンダリング処理を自分で処理すること)でエフェクトを実現されているようなので、
始めからそれをやるには敷居が高いかもしれません。
(真似るだけならシェーダを使わなくても可能です)
148ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..かけだし(1,517ポイント)
Date: 2008/10/17(金) 14:14
No:22562
| 解決!
|
Title: Re:演出のやり方ですが・・・
|
|
難しくて今は無理そうですね。まあ地道にがんばります。
29ポイント を手に入れた。
|
|
|
|
Name: 匿名 ..かけだし(1,438ポイント)
Date: 2008/10/16(木) 13:40
No:22517
|
|
Title: 背景ですが・・・
|
|
背景は2枚の画像をスクロールさせて作るそうですが、通路を進む時のような中心から外側に広がっていく背景はどうやって作ればいいでしょうか。
57ポイント を手に入れた。
|
|
|
|
Name: 管理人 ..伝説なるハッカー(822,190ポイント)
Date: 2008/10/16(木) 18:24
No:22525
|
|
Title: Re:背景ですが・・・
|
|
まずarrayさんの紹介されたURL先をご覧下さい。
DXライブラリの話だとしてお答えします。
匿名さんが仰っているような「奥行き」を出す方法は3D描画で実現出来ますが、
3D計算は何かとややこしいです。
難しくは無いのですが、ややこしいというか面倒です。
DXライブラリにも1つだけ3Dで描画出来る関数が紹介されていますが、
元々2D専用ライブラリなので、最低限のことしかできませんし、
自分でおくにあるものから表示する為にソートしながら表示しなければならないのと
制御もややこしかったりします。
龍神録のファンタズムステージにそのような背景を使っているのですが、
こういう演出方法ということでよかったでしょうか?
前々から多数このプログラムの紹介を希望されている方がいらっしゃり、
何とか私も館でわかりやすく説明をしようとしているのですがまだ作れずにいます^^;
はっきりいって参考になる資料は少ないです・・。私は
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html#R3N22
公式にはこのサンプルだけしか無いので、これを見ながらあーでもないこーでもない言いながら
改造してどういう仕組みになっているのか理解しました。
なので、管理の仕方など完全我流ですから、私の方法を紹介していいものか躊躇しているという点もあります^^;
上のリンク先の関数のサンプルを何度もいじっているうちにわかりますので、ご覧下さい。
ビューの中心移動などは非公開関数でリファレンスが無いので、
自分でヘッダファイルをみないといけません。
その辺の紹介は館で後々やろうと思います。
427ポイント を手に入れた。
|
|
|
|
|
Name: 組木紙織 ..熟練のプログラマー(62,491ポイント)
Date: 2008/10/16(木) 18:51
No:22528
|
|
Title: Re:背景ですが・・・
|
|
車を運転している人から見える景色を考えればいいのでしょうか。
それならば、1点透視図法を使えば擬似的に奥行きを出すことができます。
実際に空間を扱うにしろ、擬似的にするにしろ、
それなりの技術と手間がかかると思います。
93ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..かけだし(1,488ポイント)
Date: 2008/10/17(金) 14:12
No:22560
| 解決!
|
Title: Re:背景ですが・・・
|
|
具体的にどうしたいと言えば永夜抄5面の廊下を進むときみたいにしたいんですが・・・
今の実力では難しいですね。まあ地道にがんばります。
50ポイント を手に入れた。
|
|
|
|
Name: Haru ..上級者(17,826ポイント)
Date: 2008/10/16(木) 16:23
No:22519
|
|
Title: ディレクトリorファイルの判別方法 //linux gcc
|
|
こんにちわ、Haruです。
ディレクトリの判別方法なのですが、一応今の時点で判別は出来ています。しかし、方法が次のように
if((dir = opendir(str)) == NULL)
{
printf("ファイル新規作成処理\n");
fp = fopen(file,"w");
}
else
{
// ディレクトリを作る処理&配下ファイルをコピー
}
diropenを試し、開けばディレクトリ、開かなければファイルという方法で判別してるのですが、もっとスマートな方法はありますか?
85ポイント を手に入れた。
|
|
|
|
Name: Mist ..プログラマー(27,918ポイント)
Date: 2008/10/16(木) 16:43
No:22520
|
|
Title: Re:ディレクトリorファイルの判別方法 //linux gcc
|
|
stat関数について調べてみてください。
statで取得した情報からファイルかディレクトリかを判別するマクロもあった(と思う)。
61ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(17,849ポイント)
Date: 2008/10/16(木) 17:03
No:22521
|
|
Title: Re:ディレクトリorファイルの判別方法 //linux gcc
|
|
>Mistさん
ありがとうございます!!
早速調べてみます!!
23ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(17,955ポイント)
Date: 2008/10/17(金) 10:11
No:22550
|
|
Title: Re:ディレクトリorファイルの判別方法 //linux gcc
|
|
もう1つ質問します!
mkdirを使用して、ディレクトリの作成をしようと考えていたのですが、
mkdir(sorce,st.st_mode & 0777);
コンパイルは通るのですが、ディレクトリを作成せずに終了してしまいます。
少し、言葉足らずかもしれませんが、
宜しければご教授お願いします
106ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(27,921ポイント)
Date: 2008/10/17(金) 10:15
No:22551
|
|
Title: Re:ディレクトリorファイルの判別方法 //linux gcc
|
|
作成失敗してるだけじゃ(^^?
mkdirの戻り値とかerrno とかチェックしてます?
3ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(18,057ポイント)
Date: 2008/10/17(金) 10:37
No:22552
|
|
Title: Re:ディレクトリorファイルの判別方法 //linux gcc
|
|
>作成失敗してるだけじゃ(^^?
>mkdirの戻り値とかerrno とかチェックしてます?
戻り値は-1でした!
それと恥ずかしながらerrnoは今初めて知りました(汗
前から見かけた事はあるんですが、何につかうのかなぁ?(^^;って感じでした。
とりあえず
作成失敗してるだけなら、頑張ってみます!!
#Mistさんや、他の方々のさりげない、当然のような一言がとても勉強になります!
102ポイント を手に入れた。
|
|
|
|
Name: 翔 ..ぴよぴよ(134ポイント)
Date: 2008/10/16(木) 18:55
No:22529
|
|
Title: C言語のソフト
|
|
現在学校でC言語の初歩的なプログラミングを勉強しています。
学校では「CodeWarrior」というソフトを使っているのですが、
出された課題などを休日などに自宅でやろうとしたところ、
「CodeWarrior」というソフトはシェアウェアのようで使用できませんでした。
そこで質問なのですが、「CodeWarrior」と似てるようなソフト、
或いは、導入や操作が簡単なフリーのソフトでお勧めはないでしょうか?
134ポイント を手に入れた。
|
|
|
|
Name: ouh ..かけだし(1,183ポイント)
Date: 2008/10/16(木) 19:10
No:22530
|
|
Title: Re:C言語のソフト
|
|
Microsoft の Visual C++ 2008 Express Edition が
お勧めです。
使っている人が非常に多いと思いますし、インストール
も簡単だったと思います。
ところで、OS は Windows ですか?
違うなら別のものにしないとです。
84ポイント を手に入れた。
|
|
|
|
|
Name: 翔 ..ぴよぴよ(205ポイント)
Date: 2008/10/16(木) 21:17
No:22532
|
|
Title: Re:C言語のソフト
|
|
レスありがとうございます。
使っているのはWindowsXP HOMEです。
まだ習い初めでCとC++の違いもまったくわからないのですが、
現在授業ではCをやっています。
このソフトは名前がC++になっていますが、Cも出来るのでしょうか?
71ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(63,403ポイント)
Date: 2008/10/16(木) 21:54
No:22534
|
|
Title: Re:C言語のソフト
|
|
CodeWarriorは、元々Macで人気があった開発環境なので、Visual C++のような典型的なWindowsの開発環境とはかなり使い勝手が異なります。
とはいえ、CodeWarriorのWindows版はもう売っていないので、今ではどうすることもできません。
なぜ学校でそんな開発環境を使って教えているのか、まったく理解に苦しみます。
ただし、Windowsをホストマシンとして、組込み機器やゲーム機の開発をしているのであれば、また話は別です。
2倍のポイントを手に入れた! 332ポイント を手に入れた。
|
|
|
|
|
Name: 翔 ..ぴよぴよ(294ポイント)
Date: 2008/10/17(金) 00:11
No:22541
|
|
Title: Re:C言語のソフト
|
|
何とか色々なサイトを参考に「VisualC++2008 ExpressEdition」インストールし、プログラムが出来るようになりました…。
試しに授業で出たプログラムを書いて実行したところ出力出来たので大丈夫だと思います…。
色々教えていただきありがとうございました。
89ポイント を手に入れた。
|
|
|
|
Name: ぶらっくぼっくす ..ぴよぴよ(68ポイント)
Date: 2008/10/15(水) 23:16
No:22486
|
|
Title: 画像の透過処理に関して質問があります
|
|
シューティングゲームの館の内容を一通り見たので、
画像を差し替えて表示してみようと試みたのですがうまく透過処理ができません。
透過処理がきちんとされてないということでしょうか?
どなたか解決策があれば教えてください。
ちなみに保存形式はpngで使用ソフトはGiamというソフトを使い透過処理を行いました。
サイズは管理人様の用意されたShフォルダ内の画像と同じサイズにしてあります。
よろしくお願いします。
追記
透過処理を行うと透過処理をしていない場所まで見えなくなります。
透過処理を行わないと白い背景までばっちりと画面には現れます。
68ポイント を手に入れた。
|
|
|
|
Name: lbfuvab ..初心者(5,407ポイント)
Date: 2008/10/15(水) 23:44
No:22491
|
|
Title: Re:画像の透過処理に関して質問があります
|
|
えぇっと、Dxライブラリで透過なしの画像を透過させると黒が透けるはずですが・・・
39ポイント を手に入れた。
|
|
|
|
|
Name: ぶらっくぼっくす ..ぴよぴよ(137ポイント)
Date: 2008/10/16(木) 00:08
No:22495
|
|
Title: Re:画像の透過処理に関して質問があります
|
|
SetTransColor関数を使用してみたんですがダメみたいです。
基本的なプログラムはシューティングゲームの館のものと全く一緒なんですがうまくいかないようです。
引き続き自分でも探してみます。
lbfuvab様返信ありがとうございます。
69ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(27,795ポイント)
Date: 2008/10/16(木) 09:46
No:22499
|
|
Title: Re:画像の透過処理に関して質問があります
|
|
その画像をWindowsビューワで確認してください。
ビューワでも自分の思うとおりに透過されていないのであれば、画像の透過設定が間違っています。
あまりサイズが大きくなくて、公開しても差し支えないのであれば添付していただければこちらで
も確認しますが。
115ポイント を手に入れた。
|
|
|
|
|
Name: ぶらっくぼっくす ..ぴよぴよ(259ポイント)
Date: 2008/10/16(木) 16:20
No:22518
| 解決!
|
Title: Re:画像の透過処理に関して質問があります
|
|
過去ログをあさり管理人様がGIMP、Incscapeというソフトを使用している
という記事を見つけたのでそちらを使用し透過処理を行ったところ無事にできました。
Mist様のおっしゃるように透過の設定が間違っていたのかもしれません。
Mist様、lbfuvab様ともに返信していただきありがとうございました。
2日間悩み続けてようやく解決しました。
Javaをかじっていて今回C++に挑戦したのですがなかなか難しいです。
気長にがんばってみます。
みなさんありがとうございました。
122ポイント を手に入れた。
|
|
|
|
Name: C言語初心者 ..かけだし(1,379ポイント)
Date: 2008/10/16(木) 11:12
No:22502
|
|
Title: 学校の課題
|
|
a[10],b[10],c[20]をint型の配列とする。a[],b[]にそれぞれ10個ずつの整数を昇順に入力し、それらを併合した結果をc[]に格納し、出力するプログラムを作成。
わかる限り、書いてみたのですが、どうもうまくいきません。
どなたか、解説していていただけますでしょうか?
#include<stdio.h>
#include<math.h>
#define N20
int main(void)
{
int a[10];
int b[10];
int c[20];
int i,j,n,l,m,w;
int temp1;
n=10;
printf("aに10個のデータを入力\n");
for(i=0;i<9;i++)
{
printf("aにデータを入力\n",i+1);
scanf("%d",&a[i]);
}
for(i=0;i<9;i++)
{
for(n=i+1;n<10;n++)
{
if(a[n]>a[i])
{
temp1=a[n];
a[n]=a[i];
a[i]=temp1;
}
}
}
printf("ソート結果\n");
for(i=0;i<10;i++)
{
printf("%d\n",a[i]);
c[i]=a[i];
}
for(j=0;j<9;j++)
{
for(l=j+1;l<10;l++)
{
if(b[l]>b[j])
{
temp1=b[l];
b[l]=b[j];
b[j]=temp1;
}
}
}
printf("ソート結果\n");
for(j=0;j<10;j++)
{
printf("%d/n",a[j]);
c[10+j]=b[j];
}
for(m=0;m<19;m++)
{
for(w=m+1;w<20;w++)
{
if(c[m]>c[w])
{
temp1=c[m];
c[m]=c[w];
b[w]=temp1;
}
}
}
printf("ソート結果\n");
for(w=0;w<20;w++)
{
printf("%d\n",a[m]);
}
return 0;
}
787ポイント を手に入れた。
|
|
|
|
Name: Haru ..上級者(17,741ポイント)
Date: 2008/10/16(木) 11:42
No:22503
|
|
Title: Re:学校の課題
|
|
とりあえず、最初の所だけ
>for(i=0;i<9;i++)
>{
これだと、iは9回しかループしないかと思います。
>printf("aにデータを入力\n",i+1);
printf中に%d回目とか入れないと、,i+1が使えないです。
bの配列にいれるscanfがないです。
ぱっと見た感じはこんなところではないでしょうか?
130ポイント を落としてしまった。
|
|
|
|
|
Name: toyo ..上級者(19,535ポイント)
Date: 2008/10/16(木) 11:55
No:22504
|
|
Title: Re:学校の課題
|
|
a[ ], b[ ]はバブルソートでいいですが
c[ ] に入れるのはマージソートにするのが課題の趣旨かなと思ったりしました。
2倍のポイントを手に入れた! 122ポイント を手に入れた。
|
|
|
|
|
Name: ibis ..中級者(14,912ポイント)
Date: 2008/10/16(木) 12:06
No:22506
|
|
Title: Re:学校の課題
|
|
まぁコードの可読性としては標準関数のqsortとかが良いでしょうけどね。
bの値が未定義ですね。
bにも何か入力しましょう。
printf関数のformat引数が"%d/n"というのがありますが、"%d\n"ですよね?
54ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説なるハッカー(821,763ポイント)
Date: 2008/10/16(木) 13:36
No:22516
|
|
Title: Re:学校の課題
|
|
まず、プログラムコードを投稿するときはプレタグを使ってください。
詳しくは規約をご覧ください。
投稿された元データを見ましたが、字下げがぐちゃぐちゃでした。
まず綺麗に括弧と括弧を同じ位置に字下げし、プログラムをみやすくしましょう。
Emacsなどならタブを押していけば字下げできます。
それから昇順に入力するんじゃなくて入力した数値を昇順に並び替えるプログラムじゃないですか?
また、せっかくdefineで定義を使っているのならそれを使ってあげましょう。
何も考えずに綺麗に書き換えました。
bの値が未定ですし、正しい実行結果は得られません。
推測するに、
aに適当に入力したものを昇順にして表示し、
bに適当に入力したものを昇順にして表示し、
さらにそれらをくっつけて、昇順にしてcに格納し、表示するプログラムをかけという問題なのではないでしょうか?
また、n=10を最初にいれているのはなぜでしょう?
まず、問題を明確にすること。
そして全部いっぺんに作ろうと思わず、
入力を受け付ける部分
ソートする部分
表示する部分
と段階的に少しずつ作っていきましょう。
いっぺんに作るのが困難でもひとつだけ作ればできることもあります。
#include<stdio.h>
#include<math.h>
#define N1 10
#define N2 20
int main(void){
int a[N1],b[N1],c[N2];
int i,j,n,l,m,w,temp1;
n=10;
printf("aに%d個のデータを入力\n",N1);
for(i=0;i<N1;i++){
printf("%d個目: aにデータを入力\n",i+1);
scanf("%d",&a[i]);
}
for(i=0;i<N1-1;i++){
for(n=i+1;n<N1;n++){
if(a[n]>a[i]){
temp1=a[n];
a[n]=a[i];
a[i]=temp1;
}
}
}
printf("ソート結果\na: ");
for(i=0;i<N1;i++){
printf("%d ",a[i]);
c[i]=a[i];
}
printf("\n");
for(j=0;j<N1-1;j++){
for(l=j+1;l<N1;l++){
if(b[l]>b[j]){
temp1=b[l];
b[l]=b[j];
b[j]=temp1;
}
}
}
printf("ソート結果\na: ");
for(j=0;j<10;j++){
printf("%d/n",a[j]);
c[10+j]=b[j];
}
printf("\n");
for(m=0;m<N2-1;m++){
for(w=m+1;w<N2;w++){
if(c[m]>c[w]){
temp1=c[m];
c[m]=c[w];
b[w]=temp1;
}
}
}
printf("ソート結果\na: ");
for(w=0;w<N2;w++){
printf("%d\n",a[m]);
}
printf("\n");
return 0;
}
771ポイント を手に入れた。
|
|
|
|
Name: 初心者 ..初心者(8,618ポイント)
Date: 2008/10/15(水) 23:56
No:22494
|
|
Title: 無題
|
|
a[10]をint型の整数とし、i,jをint型の変数とする。配列aに10個の整数を入力し、i,jに0〜9までの整数をそれぞれ入力する。そして、a[i]の値とa[j]の値を交換するプログラムを作成。
#include<stdio.h>
#define N 10
int main(void)
int a[n];
int i,j,temp;
printf("aに10個の整数を入力してください");
for(i=0;i<N;i++);
{
scanf("%d",&a[i]);
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf(" 0から9までの値を入力してください");
scanf("%d,&a[j]");
ここまでは、考えてわかったのですが、続きのプログラムがわかりません。
どなたか、指導よろしくお願いします。
216ポイント を落としてしまった。
|
|
|
|
Name: kazuoni ..プログラマー(34,268ポイント)
Date: 2008/10/16(木) 00:33
No:22496
|
|
Title: Re:無題
|
|
うぅ〜ん、ちょっと記述ミスというよりまだ理解が完ぺきではないように感じます。。
1、mainも関数ですから始まりと終わりに{}をつけましょう
2、#define Nと定義していますが、nとNは区別されます。なのでint a[n]のnは未定義になります。
3、
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf(" 0から9までの値を入力してください");
scanf("%d,&a[ j ]");
}←欠落
このままだと二度目のfor文は全く意味がありません。
これだとi=0,1,2....となってもa[9]に毎回整数を代入していることになります。
先ほど配列に代入したばかりなのに、また代入をしてしまうと題意とは別のものになってしまいます。
あ、あとscanf("%d",&a[j])の間違いですか?
にしてもちょっと題意からはそれてしまっていますが。。
a[i]に整数を代入するまでは大丈夫です。
次にscanfでi,jに整数を代入します。
(今はfor文でループするために使うiと配列の添字になるi,jは別のものを使ったほうがいいかと思います。)
最後に添字がi,jの配列の中身を交換です
その際、(どちらでもいいのですが)a[ i ]の整数をtempに渡して(代入)おき、
a[ i ]にa[ j ]の整数を代入します。
最後にa[ j ]に先ほどのtempを渡します。
この日本文をそのまま書けばうまくいきます
(理解しがたい日本語だったらすみません。。)
もう少し文の構造自体を見なおされたほうがいいかもしれません。
http://www9.plala.or.jp/sgwr-t/
↑このあたりを参考にしてください
412ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..初心者(8,316ポイント)
Date: 2008/10/16(木) 10:53
No:22500
|
|
Title: Re:無題
|
|
詳しい解説ありがとうございます。
書き直してみましたので、チェックしていただけますでしょうか?
#include<stdio.h>
#define N 10
int main(void)
{
int a[N];
int i,j,temp;
printf("データを10個入力して下さい>>");
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
printf("i,jに0〜9までの値を入力して下さい");
scanf("%d",&a[i]);
scanf("%d",&a[j]);
temp=a[j];
a[j]=a[i];
a[i]=temp;
for(i=0;i<N;i++);
{
printf("%d\n",a[i]);
}
return 0;
302ポイント を落としてしまった。
|
|
|
|
|
Name: 管理人 [URL] ..伝説なるハッカー(820,992ポイント)
Date: 2008/10/16(木) 13:09
No:22515
|
|
Title: Re:無題
|
|
自宅にコンパイラは入れてありますか?
もし学校の課題だとしたら、学校の授業の中だけでプログラムを覚えようとしていませんか?
プログラムの勉強はまず自分のPCにコンパイラを入れることから始まります。
紙に書いてプログラムを覚えるのは無理です。
コンパイラをいれずにただ授業の資料を見ながら紙にプログラムを書いている行為は
答えのない数学の問題集をひたすら解いているのと同じです。
完全に間違った答えを延々と書いていても気づかないと思います。
特にプログラムは基本的に括弧から始まって括弧に終わります。
わざとそれでコンパイルが通るようにひねくれてでも書かない限り
return 0;でプログラムが終わることはありません。
また、投稿する際はタグを使ってください。詳しくは規約をご覧ください。
VisualStudioなり、Borlandなり自分の好きなコンパイラを導入し、
まずは自分でコンパイルしてみてください。
エラーが出たらそのエラーの表示されている部分を確認し、どこが悪いのか自分でも考えてみましょう。
329ポイント を手に入れた。
|
|
|
|
Name: akihito ..ぴよぴよ(816ポイント)
Date: 2008/10/16(木) 11:59
No:22505
|
|
Title: 14歳からはじめるワクワクC言語
|
|
未定義のシンボル jkidata(関数 JicharaMove() )とでてくるのですがどこがいけないでしょうか??
//spgame01.cpp
#include "spgame.h"
//グローバル変数
struct CharaData jikidata;
struct CharaData jitama[3];
int trigger = 0;
struct CharaData tekidata[50];
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
{
ChangeWindowMode(TRUE); //ウィンドウモードで起動
if(DxLib_Init() == -1) return(-1); //DXライブラリ初期化
JicharaLoad();
TekiLoad();
JicharaInit();
TekiInit();
SetDrawScreen(DX_SCREEN_BACK);
while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
ClsDrawScreen();
JicharaMove();
JitamaMove();
TekiMove();
if(AtariHantei() == 1) break;
ScreenFlip();
}
DxLib_End(); //DXライブラリ終了処理
return(0); //終了
}
//jichara.cpp
#include "spgame.h"
//グローバル変数
int jitamabmp;
//●自キャラ画像の読み込み(プログラム起動時に呼び出す)
void JicharaLoad(){
jikidata.ghandle = LoadGraph("media\\jiki.bmp");
jitamabmp = LoadGraph("media\\tama.bmp");
}
//●自キャラデータの初期化(タイトル画面から呼び出す)
void JicharaInit(){
jikidata.x=0;
jikidata.y=0;
jikidata.image_w = 48;
jikidata.image_h = 32;
jikidata.bounds_w = 32;
jikidata.bounds_h = 20;
for(int i=0; i<3;i=i+1) {
jitama[i].ghandle = jitamabmp;
jitama[i].image_w = 64;
jitama[i].image_h = 16;
jitama[i].bounds_w = 48;
jitama[i].bounds_h = 12;
}
}
//●自キャラの移動処理(ゲームメインから呼び出す)
void JicharaMove(){
//自キャラ移動
int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if(key & PAD_INPUT_UP) jikidata.y = jikidata.y-4;
if(key & PAD_INPUT_DOWN) jikidata.y = jikidata.y+4;
if(key & PAD_INPUT_LEFT) jikidata.x = jikidata.x-4;
if(key & PAD_INPUT_RIGHT) jikidata.x = jikidata.x+4;
DrawGraph(jkidata.x, jikidata.y, jikidata.ghandle, TRUE);
}
void JitamaMove(){
//弾の発射
int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if( (key & PAD_INPUT_A) && (trigger == 0) ) {
for(int i=0; i<3; i=i+1){
if (jitama[i].life == 0){
jitama[i].life = 1;
jitama[i].x = jikidata.x+24;
jitama[i].y = jikidata.y+8;
break;
}
}
trigger = 20;
}
if(trigger>0) trigger = trigger - 1;
//弾の移動
for(int i=0; i<3; i=i+1){
if(jitama[i].life > 0){
jitama[i].x = jitama[i].x + 2;
DrawGraph(jitama[i].x, jitama[i].y, jitama[i].ghandle, TRUE);
//画面に出た時の処理
if(jitama[i].x>640) jitama[i].life = 0;
}
}
}
int IsAtari(CharaData a, CharaData b){
int retval = 0;
int ax1 = a.x + (a.image_w - a.bounds_w)/2;
int ay1 = a.y + (a.image_h - a.bounds_h)/2;
int ax2 = a.x + (a.image_w + a.bounds_w)/2;
int ay2 = a.y + (a.image_h + a.bounds_h)/2;
int bx1 = b.x + (b.image_w - b.bounds_w)/2;
int by1 = b.y + (b.image_h - b.bounds_h)/2;
int bx2 = b.x + (b.image_w + b.bounds_w)/2;
int by2 = b.y + (b.image_h + b.bounds_h)/2;
if( (ax1<bx2) && (bx1<ax2) && (ay1<by2) && (by1<ay2) ){
retval = 1;
}
return(retval);
}
int AtariHantei(){
for(int i=0; i<50; i=i+1){
if(tekidata[i].life>0){
//自機と敵の判定
if(IsAtari(jikidata, tekidata[i])==1) return(1);
//弾と敵の判定
for(int j=0; j<3; j=j+1){
if(jitama[j].life > 0){
if(IsAtari(jitama[j], tekidata[i])==1){
jitama[j].life = 0;
tekidata[i].life = 0;
}
}
}
}
}
return(0);
tekichara.cpp
#include "spgame.h"
//グローバル変数
int tekibmp;
//●敵キャラ画像の読み込み(プログラム起動時に呼び出す)
void TekiLoad(){
tekibmp = LoadGraph("media\\teki00.bmp");
}
//●敵キャラデータの初期化(タイトル画面から呼び出す)
void TekiInit(){
for(int i=0; i<50; i=i+1){
tekidata[i].ghandle = tekibmp;
tekidata[i].life = 1;
tekidata[i].x = GetRand(548)+60;
tekidata[i].y = GetRand(448);
tekidata[i].image_w = 32;
tekidata[i].image_h = 32;
tekidata[i].bounds_w = 20;
tekidata[i].bounds_h = 20;
}
}
void TekiMove(){
for(int i=0; i<50; i=i+1){
if(tekidata[i].life>0){
DrawGraph(tekidata[i].x, tekidata[i].y, tekidata[i].ghandle, true);
}
}
}
spgame.h
#include "DxLib.h"
struct CharaData{
int x; //左上座標
int y;
int ghandle; //画像ハンドル
int life; //ライフ
int image_w; //イメージの大きさ
int image_h;
int bounds_w; //判定領域の大きさ
int bounds_h;
};
//プロトタイプ宣言
void JitamaMove();
void TekiMove();
int IsAtari(CharaData, CharaData);
int AtariHantei();
void JicharaLoad();
void JicharaInit();
void JicharaMove();
void TekiLoad();
void TekiInit();
//グローバル変数
extern struct CharaData jikidata;
extern struct CharaData jitama[];
extern int trigger;
extern struct CharaData tekidata[];
816ポイント を手に入れた。
|
|
|
|
Name: ibis ..中級者(14,934ポイント)
Date: 2008/10/16(木) 12:08
No:22508
|
|
Title: Re:14歳からはじめるワクワクC言語
|
|
脱字ですね。
「jikidata」が「jkidata」になってます。
22ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(23,289ポイント)
Date: 2008/10/16(木) 12:39
No:22511
|
|
Title: Re:14歳からはじめるワクワクC言語
|
|
//●自キャラの移動処理(ゲームメインから呼び出す)
void JicharaMove(){
//自キャラ移動
int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if(key & PAD_INPUT_UP) jikidata.y = jikidata.y-4;
if(key & PAD_INPUT_DOWN) jikidata.y = jikidata.y+4;
if(key & PAD_INPUT_LEFT) jikidata.x = jikidata.x-4;
if(key & PAD_INPUT_RIGHT) jikidata.x = jikidata.x+4;
DrawGraph(jkidata.x, jikidata.y, jikidata.ghandle, TRUE);
// ↑ここです
}
167ポイント を手に入れた。
|
|
|
|
|
Name: 通りすがり ..中級者(11,736ポイント)
Date: 2008/10/16(木) 12:53
No:22513
|
|
Title: Re:14歳からはじめるワクワクC言語
|
|
まず、規約を読んで投稿しましょう。
ソースコードはプレタグを使って投稿しましょう。
自分の見つけたい文字列は検索すれば見つけられます。
2倍のポイントを手に入れた! 122ポイント を手に入れた。
|
|
|
|
Name: 西村 ..初心者(6,473ポイント)
Date: 2008/10/14(火) 22:37
No:22460
|
|
Title: 割り込み関数に関する質問
|
|
現在signal関数について勉強しています。signal関数で割り込み時に実行される関数 sig_handler という一秒毎に時間を取得する関数を作りました。
int sig_handler(){
int sec=0;
sec++;
return(sec);
}
として、一秒ごとに返り値を得るようにしたかったのですが、signal関数というのは返り値をもつ関数を指定出来ないことを知りました。この場合はsignal関数を諦めて sigaction関数 というのに切替えた方が良いのでしょうか?なにやらsigaction関数はやたらややこしそうなのですが・・・
174ポイント を手に入れた。
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(62,491ポイント)
Date: 2008/10/15(水) 00:24
No:22465
|
|
Title: Re:割り込み関数に関する質問
|
|
処理系不明なので一般論でしか回答できませんが...
sigaction関数は非標準なので使えるかどうか分かりません。
signal関数で指定できるシグナルの種類の中には、一定時間でハンドラを呼び出すようなものは標準ではサポートされません。
61ポイント を手に入れた。
|
|
|
|
|
Name: 西村 ..初心者(6,685ポイント)
Date: 2008/10/15(水) 01:34
No:22468
|
|
Title: Re:割り込み関数に関する質問
|
|
返答ありがとうございます。
そして失礼しました。処理系は普通にgccでCです。
>signal関数で指定できるシグナルの種類の中には、一定時間でハンドラを呼び出すようなものは標準ではサポートされません。
いえ、
void sig_handler(){
int sec=0;
sec++;
printf("%d",sec);
}
とかにした場合、きちんと一秒ごとにprintfを呼び出すことが出来る、という状況には出来ているのです。遠回しな質問の仕方をしてすみません。つまり、戻り値を返さない関数から、どうにかmainに値を取ることは出来ないでしょうか、というのが質問になります。
>sigaction関数は非標準なので使えるかどうか分かりません。
一応、使えるみたいです。前準備がややこしそうで手を出してないのですが……sigactionの方が利点が多かったりするのでしょうか?
……あれ?最初の質問が僕のPCからは途中で切れてる?
212ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(62,570ポイント)
Date: 2008/10/15(水) 01:56
No:22469
|
|
Title: Re:割り込み関数に関する質問
|
|
> 処理系は普通にgccでCです。
ターゲットが不明ですね。
GCCといっても、Linux、FreeBSD、MacOSX、Cygwin、MinGW、組込み向けのフリースタンディング環境では状況が異なります。
それ以前に...
int sig_handler(){
int sec=0;
sec++;
return(sec);
}
は常に1を返すので、定数に置き換えてしまっても問題ないはずです。
79ポイント を手に入れた。
|
|
|
|
|
Name: 西村 ..初心者(6,907ポイント)
Date: 2008/10/15(水) 16:05
No:22474
|
|
Title: Re:割り込み関数に関する質問
|
|
返答ありがとうございます。
>GCCといっても、Linux、FreeBSD、MacOSX、Cygwin、MinGW、組込み向けのフリースタンディング環境では状況が異なります。
そうなんですか。基本で知らないことが多すぎで申し訳ないです。因みにLinuxです。
>常に1を返すので、定数に置き換えてしまっても問題ないはずです。
printfで試した時はsecに+1をどんどん乗算してくれていたので、そのノリでreturnでもsecを1、2、3・・・と返してくれると思っていたのですが・・・なるほど、これは根本的なやりかたのミスなんですね。
signalではいき詰まるっぽいんで sigaction に挑戦してみます。
222ポイント を手に入れた。
|
|
|
|
|
Name: 西村 ..初心者(6,941ポイント)
Date: 2008/10/15(水) 16:29
No:22476
| 解決!
|
Title: Re:割り込み関数に関する質問
|
|
ふと、自分の抱えている疑問の解決の仕方がいきなり分かりました。
考えてくれた方々、本当にありがとうございました。
しかし、こんなにいきなり思い付くってこともあるのかと驚きました。
34ポイント を手に入れた。
|
|
|
|
Name: AAA ..かけだし(1,558ポイント)
Date: 2008/10/15(水) 02:05
No:22470
|
|
Title: DirectX9 & C++
|
|
はじめまして。
とはいえ以前からちょくちょく実に来てはいますが(・ω・;)
C言語なんでも質問掲示板とのことなのですが、
DirectXに関してもOKなのでしょうか?汗
もし的外れですたらこのままスルーしちゃってください。
現在Dx3DとVCにて3Dゲームを作成しているのですが、
キャラクターモデル(mqoからxに変換)にアニメーションさせる方法がわからなく、
開発が停止してしまっている状況なので、その方法について教えていただきたいです。
また3D系の開発は初めてになるので、
3Dゲーム開発の参考になるようなサイトがあれば参考までに乗せていただけると幸いです。
表示関連、というよりも、ゲームとしてのアルゴリズム(マップの当たり判定など)が知りたいです。
よろしくお願いします。
302ポイント を手に入れた。
|
|
|
Name: サンタX ..ぴよぴよ(17ポイント)
Date: 2008/10/14(火) 20:29
No:22454
|
|
Title: どのようにすればいいですか
|
|
私は今、STGを制作しています。 龍神録をだいぶ参考にさせていただいています。
しかし、龍神録にまだ書かれていない内容について、いまかなり困っています。
それは、ボムの回数制限とゲームオーバーorクリアのプログラムです。
いろんなサイトを参考にしているんですが、いまいちプログラムの入れ方がわかりません。
宣言によって、入れる場所が変わるのでなかなかです。
// ------------------------------------------------
// デファインの宣言
// ------------------------------------------------
#define MODE_GAME 0 // ゲーム中
#define MODE_OVER 1 // ゲームオーバー
#define MODE_TITLE 2 // タイトル
(中略)
// ------------------------------------------------
// 関数(サブルーチン)の宣言
// ------------------------------------------------
void title_main();
(中略)
// ------------------------------------------------
// メインプログラム
// ------------------------------------------------
// この関数名はウィンドウズから呼ばれているので変えないでください
void game_loop(void)
{
switch(game_mode)
{
case MODE_GAME:
ship_move();
tama_get();
tama_move();
teki_get();
teki_move();
tama_hit();
ship_hit();
break;
case MODE_OVER:
over_main();
break;
case MODE_TITLE:
title_main();
break;
}
normal_pr();
flip_screen();
}
// ゲームモードによって分岐
// ゲーム中ならば
// ゲームオーバーならば
// ゲームオーバー処理
// タイトルならば
// タイトル処理
// ------------------------------------------------
// 基本の表示
// ------------------------------------------------
void normal_pr()
{
(中略)
// メッセージを書く
if (game_mode==MODE_TITLE)
{
pr_msg("STGサンプル、タイトル画面",200,200);
pr_msg("Hit Enter Key",240,200);
}
}
// ------------------------------------------------
// タイトル
// ------------------------------------------------
void title_main()
{
if (HIBYTE(GetKeyState(VK_RETURN)))
{
game_mode=MODE_GAME;
}
}
// エンターキーが押されたらば
// ゲームモードをゲーム中にする
どのようにすればいいですか?
お願いします。
17ポイント を手に入れた。
|
|
|
|
Name: array ..プログラマー(35,234ポイント)
Date: 2008/10/14(火) 20:50
No:22455
|
|
Title: Re:どのようにすればいいですか
|
|
関数名なども書き換えられてるみたいなので、内部構造も多少変わってるのかもしれませんが
龍神録をかなり参考にされてるらしいので、(龍神録用語(仕様)を使って書きます。)
多分かなり理解されてると思うので、それは分かってるとか言われそうですが・・・
たとえば、龍神録でいうGV.hに
GLOBAL int life; //残機カウント
GLOBAL int bom; //ボムカウント
と宣言しておきます。
ini_first()で
任意に初期値を設定しておきます。
ボムは[Xキー]が押された時をifで判断し発動しますよね。
なので[Xキー]の押された回数をカウントし(例えば)初期値4→減算などして、使用回数を制限するなりすれば良いと思います。
その後ボムカウントが0ならXキーを無効化してあげればボムは使えなくなります。
残機カウントも初期値を(例えば)4程度にしておき、(当り判定部の)被弾をカウントし、0になったらゲームオーバー画面に飛ばす処理を入れておけば良いはずです。
・・・・こんな感じで良いのでしょうか。
どこに処理を入れれば良いのか。
ボム→ボム発動時を判断する処理内
ゲームオーバー→自機当り判定内
ってな感じで良いと思います。
2倍のポイントを手に入れた! 650ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(820,432ポイント)
Date: 2008/10/15(水) 01:12
No:22466
|
|
Title: Re:どのようにすればいいですか
|
|
life,bomにかかわる変数はch_tの中に入れてしまうとすっきりするかもしれません。
また、もし東方や龍神録のような喰らいボムを実装されている場合は、被弾しただけで残機を減らさないよう注意して下さい。
ゲームオーバーになってまたゲームを再開するときは初期化関数を呼んでまたゲームを始めればオッケーです。
初期化漏れはバグの元なので、くれぐれも初期化には気をつけて下さい。
全部構造体にまとめてしまえば初期化漏れのリスクも軽減されます。
208ポイント を手に入れた。
|
|
|
|
Name: 774 ..ぴよぴよ(53ポイント)
Date: 2008/10/12(日) 12:36
No:22345
|
|
Title: C言語の課題・・・
|
|
はじめまして、ここに始めて投稿するものです。
今日は学校からC言語の課題を出されたのですが・・・どうやってもうまくいきません。
C言語の課題の内容は連結リストを手入力で数値を入力して0を入力するまで入力し続けて、入力した順番から表示させるのですが。
「変数宣言」と「TO DOここに必要な処理を記述する」以外は変えてはいけない。
表示するループで最初に入力した数値を参照してポインタから次入力した数値につなげるようにするようにする。
最後入力したデータにNULLを入れるようにする。
下のソースが課題で貰ったソースを自分なりに作ったソースです
必要に応じて作った変数は
int型は「i」で、struct nodeは [*tow]です。
メモリをmallocで「starat」と「tow」の2つ作って
「start」を入力した後に「tow」を参照できるように最初に[tow]のメモリを作った後にstartを作れるようにして。
次に、最初に参照するstartをif文で囲って最初に参照するためだけなので[i==0]という条件にして[i++]をしてその後はif文を無視するようにしてtowだけで入力するようにしたのですが、実行すると最初に入力した数値が2回表示されて終わってします。
どうすれば入力した順に表示できるようにループを回らせるプログラムができるでしょうか・・・?
わがままな事を言いますが、できればこの形を残したままでできるようにしたいです・・・
C言語の知識はまだ約半年で、9月終わりごろに教科書として使っていたC言語の本を終わらせたばかりです。
よろしくお願いしますm( )m
#include <stdio.h>
#include <stdlib.h>
/* 構造体の宣言 */
struct node
{
int data;
struct node *next;
};
int main(void)
{
/* 変数宣言(必要に応じて増やす) */
struct node *start, *p, *tow;
int d, i = 0;
/* リスト初期化 */
start = NULL;
/* データ入力 */
printf("input Number : ");
scanf("%d", &d);
/* リスト作成 */
while(d> 0)
{
/* TO DO ここに必要な処理を記述する */
tow = malloc(sizeof(struct node));
if(i==0)
{
start = malloc(sizeof(struct node));
start->data = d;
start->next = tow;
i++;
}
tow->data = d;
tow->next = NULL;
/* ここまで */
/* データ入力 */
printf("Input Number : ");
scanf("%d", &d);
}
/* 出力 */
printf("Result : ");
for(p=start; p!=NULL; p=p->next)
{
printf("%d ", p->data);
}
printf("\n");
return 0;
}
53ポイント を手に入れた。
|
|
|
|
Name: kazuoni ..プログラマー(32,833ポイント)
Date: 2008/10/12(日) 18:52
No:22353
|
|
Title: Re:C言語の課題・・・
|
|
まずは原因から。
>実行すると最初に入力した数値が2回表示されて終わってします。
/* TO DO ここに必要な処理を記述する */
から見ていきます。
1、towで領域を構造体分確保
2、start(NULL)のアドレスをmallocで確保した領域のアドレスに変える
3、2で確保したstartの領域のdate,nextに値、アドレスをそれぞれ代入
4、1で確保したtowの領域のdate,nextに値、アドレスをそれぞれ代入
(3,4の代入するdateは同じもの)
5、「1と4」を0が入力されるまで繰り返す(iの条件より)
pを表示する時、どの順番に出力をしようとしているかわかりますか?
pはstartの先頭のアドレスを渡されているので
一番最初の2で確保したstart->dateから見に行きます。
次は一番最初の1で確保された「構造体のオブジェクト」を指しています。
おそらくここで構造体のメンバであるtow->dateを見に行ってほしいのですよね?
確かに次に見に行くのはtow->dateですが
次はtow->next
です。(おそらく)
tow->nextはNULLと定義していますのでこの時点で見に行くのを終了します。
335ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(33,149ポイント)
Date: 2008/10/12(日) 19:36
No:22354
|
|
Title: Re:C言語の課題・・・
|
|
解決策の一例です。
/* 変数宣言(必要に応じて増やす) */
struct node *start, /*ノードをまとめるもの*/
*p, /*出力するにあたってのもの(?)*/
*num_last, /*NULLの前のノードを指す*/
*ptr_num_last, /*NULLのノード指す*/
*ptr; /*新しい領域のアドレスを指す*/
int d;
//省略
/* リスト作成 */
while(d>0)
{
/* TO DO ここに必要な処理を記述する */
if(start==NULL)//もし何もノードが入っていなかったら
{
start = (node *)malloc(sizeof(struct node));
start->data=d;//数値代入
start->next=NULL;
}
else//一つでもノードが入っていたら
{
num_last = ptr_num_last = start;//まずstartの先頭のアドレスをそれぞれに渡す
while(ptr_num_last!=NULL) //このwhileでNULL一個前のノードのアドレスをnum_lastへ代入する
{
num_last = ptr_num_last;
ptr_num_last = ptr_num_last->next;
}
ptr = num_last->next = (node *)malloc(sizeof(struct node));//新しく割り振られたアドレスをNULLの代わりに代入し、
//そのアドレスをptrに代入
ptr->data = d;//数値代入
ptr->next = NULL;
/*例えばA→B→NULLで新しく確保したものがC→NULLだったら
A→B→C→NULLになります。
出力する際はAからですので、古いものから出力されるようになります。*/
}
/* データ入力 */
printf("Input Number : ");
scanf("%d", &d);
}
//省略
省略部分は774さんのコードのままです。
やはり理解するには紙に書いてやってみるのが一番だと思います。
まずNULLから初めて、一回目の代入、二回目の代入と。
順に追っていけば理解できるはずです。
出力がp=startってのがやっかいですね。
普通の線形リストだと古いものはnextのほうに代入されて
出力は新しいもの順に出力されます。(本とかに乗ってるのは)
本来ならばこんなにややこしくしないでもいいかと。。
(効率の悪いプログラムの可能性大です。簡単にして使ってくださいw)
316ポイント を手に入れた。
|
|
|
|
|
Name: 774 ..ぴよぴよ(174ポイント)
Date: 2008/10/12(日) 22:25
No:22369
|
|
Title: Re:C言語の課題・・・
|
|
で・・できました。ありがとうございます!
紙に書く・・・いつも心がけるように心に刻みつけようと思います
tow->nextで止めていた・・・ということでいいのでしょうか?
まだまだ自分の未熟さをかみ締めます。
これからもがんばっていこうと思います。
ありがとうございました!
121ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(33,348ポイント)
Date: 2008/10/12(日) 23:30
No:22375
|
|
Title: Re:C言語の課題・・・
|
|
>tow->nextで止めていた・・・ということでいいのでしょうか?
結果はそうです。
774さんのコードでは
towは全くつながっておらず、バラバラの場所に領域を確保しているだけでした。
今回はstartを見たので最初のstartからtow->nextで終わりでした。
線形リストは自分で組んでみないとなかなか理解できないです。。
今回は末尾にノードを挿入していきました。
先頭にノードを挿入、ノードとノードの間にノードを挿入、配列を用いての線形リストなど
いろいろ工夫すると理解度が深まる気がします。
がんばってください。
199ポイント を手に入れた。
|
|
|
|
|
Name: kz ..入門者(2,915ポイント)
Date: 2008/10/13(月) 02:25
No:22400
|
|
Title: Re:C言語の課題・・・
|
|
私も作ってみました。
変数の変更を何もしない場合の例です。
/* TO DO ここに必要な処理を記述する */
if(start==NULL){
start = (node *)malloc(sizeof(struct node)); //スタートのメモリを確保
start->data = d;
tow =start; //ループのポインタをスタートにする
}
else{
tow->next= (node *)malloc(sizeof(struct node)); //移動先のメモリを確保
tow=tow->next; //ポインタを移動
tow->data = d;
tow->next=NULL;
}
/* ここまで */
towをどこで連結させるかが一番の重要な点ですね。
メモリを確保した場所へポインタを動かすのを意識すると良いと思います。
あとこれって学校の課題としてはまずいと思いますよ。
メモリの開放部分がベースで書かれてませんが、解放についての勉強は視野に入っていないのでしょうか
358ポイント を手に入れた。
|
|
|
|
|
Name: フリオ ..プログラマー(27,839ポイント)
Date: 2008/10/13(月) 05:32
No:22402
|
|
Title: Re:C言語の課題・・・
|
|
"tow"と"i"は必要ないです。
if(!start){
if(!(start = malloc(sizeof(struct node)))) exit(1);
p = start;
}
else{
if(!(p->next = malloc(sizeof(struct node)))) exit(1);
p = p->next;
}
p->data = d;
p->next = NULL;
147ポイント を手に入れた。
|
|
|
|
|
Name: 774 ..ぴよぴよ(0ポイント)
Date: 2008/10/14(火) 00:00
No:22444
|
|
Title: Re:C言語の課題・・・
|
|
kazuoni様
towがバラバラ・・・最初から連結が途切れていたんですね・・・
線形リストを調べて見たら組み方が沢山在る事に気がつきました。
どんな状態の物でも組めるように少しずつ勉強して行こうと思います。
kz様
・・・こ、こんなに簡単に・・・
自分のプログラムの組み方に少し疑問が出てきました・・・
メモリとポインタの動かし方がコツ・・・と言うことですね。
えっとfree()ですよね・・・
これは学校の授業の時でも必ず付けろ言われました。
ですが・・・プリントとして配られた時 TO DO と変数を必要な時増やす以外ソースは書かれていてfree()が元々書いて在りませんでした。
whileの中でfree()を使うと今まで確保したメモリも消えてしまうと思うので・・・
多分、今回は数値を数回入力して入力順に表示すると言う課題なので、使うメモリを確保する量がが少なくて、プログラムを終了するとメモリも自動的に開放される(でしたっけ・・・?)のであえて先生はつけなかったのだと思います。
あと・・・メモリを確保する時に使う数は人によって違うからと言うこともありえると思います・・・
間違っている考えかもしれませんが・・・;
とりあえずfree()の事は学校で教わりました。
フリオ様
iもtowも使わないでできる・・・
こういう組み方が在るんですね・・!
えっと・・exit(1);やif(…)って言うのを使った事が無いのですが・・・
if(!(start = malloc(sizeof(struct node)))) exit(1);
はstartにメモリを確保した時にNULL以外の値の時に強制終了すると言うことでしょうか・・・?
あまりC言語の知識が無くてすみません・・・;
409ポイント を落としてしまった。
|
|
|
|
|
Name: kazuoni ..プログラマー(33,634ポイント)
Date: 2008/10/15(水) 00:01
No:22463
|
|
Title: Re:C言語の課題・・・
|
|
kzさんのおっしゃる通り、やはりメモリ解放は必要ですよね。
これからプログラムを書くときに忘れなければいいんですけどね^^;
>if(!(start = malloc(sizeof(struct node)))) exit(1);
>はstartにメモリを確保した時にNULL以外の値の時に強制終了すると言うことでしょうか・・・?
逆ですね。
mallocで確保したものをstartに代入する際に、もし確保に失敗したら
startにNULLが入り、論理否定演算子によって1になります。
ゆえに
メモリを確保する際、確保失敗なら異常終了する
だと思います。
213ポイント を手に入れた。
|
|
|
|
Name: 400828 ..ぴよぴよ(198ポイント)
Date: 2008/10/14(火) 13:54
No:22448
|
|
Title: 関数
|
|
画面から入力された五つの数の合計、平均を求め、表示しなさい。ただし合計・平均。出力までを一つの関数として定義しなさい。 という質問ですが、自分は
#include <stdio.h>
void su(int,int,int,int,int){
int avg;
int a,b,c,d,e,s;
scanf("%d",&a);
scanf("%d",&b);
scanf("%d",&c);
scanf("%d",&d);
scanf("%d",&e);
su(a,b,c,d,e);
printf("%d\n",su);
return su;
}
までしています。あっているかどうかもわかりませんので、どちら様教えてください!!
198ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..上級者(23,009ポイント)
Date: 2008/10/14(火) 14:15
No:22449
|
|
Title: Re:関数
|
|
まず、このコードはコンパイルが通らない(&無限再帰ループになる)のでは?
どこまでを理解している状態なのか分かりませんが、
問題通りのコード構成にするとしたら、
#include <stdio.h>
// 計算して表示する関数。
void show_sum_ave( int a, int b, int c, int d, int e ){
// ここに五つの値の合計と平均を計算して表示。
}
// メイン関数。
int main( void ){
int a,b,c,d,e;
// ここに入力処理(a,b,c,d,e に代入)
show_sum_ave(a,b,c,d,e); // 関数呼び出し
return 0; // 終了
}
となると思います。
220ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(127,664ポイント)
Date: 2008/10/14(火) 21:54
No:22457
|
|
Title: Re:関数
|
|
今は5個だから、関数に5個の引数を渡せばすみますが、
100個だったら100個の引数を書き連ねますか?
ここはひとつ、「配列」について勉強してみてはいかがでしょう。
85ポイント を手に入れた。
|
|
|
|
Name: SH ..ぴよぴよ(253ポイント)
Date: 2008/10/13(月) 03:18
No:22401
|
|
Title: 龍神録プログラミング17章での画像の入れ替え
|
|
度重なる質問、すみません・・・
龍神録プログラミング17章にて、自機からは一度に4つの弾が発射されることになります。
このとき、外側二つの弾の画像を別のものに変えたいときどうすればよいのでしょうか?
93ポイント を手に入れた。
|
|
|
|
Name: array [URL] ..プログラマー(34,252ポイント)
Date: 2008/10/13(月) 15:32
No:22415
|
|
Title: Re:龍神録プログラミング17章での画像の入れ替え
|
|
多分大丈夫だと思うので42章を見て書くのでかみ合わない部分があるかもしれません。
ショット描画部分、イメージロードは既に記述されてたので以下の部分のみで大丈夫だと思います。
本文
弾の種類はcshot[○].kndがそれになります。
なので
--- cshot.cpp ---
//通常ショット登録
void ch0_shot_pattern()
及び
/低速通常ショット登録
void ch1_shot_pattern()
の中にある
cshot[k].knd=0;
を変更してください。
例)
cshot[k].knd= (i<2 ? 0:1);
220ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(818,872ポイント)
Date: 2008/10/13(月) 17:37
No:22423
|
|
Title: Re:龍神録プログラミング17章での画像の入れ替え
|
|
もしダメージ量も当たり判定も全部性質が同じで画像だけ違うのなら
.img
というデータを構造体に追加して、画像を表示し分けてはいかがでしょうか?
57ポイント を手に入れた。
|
|
|
|
|
Name: SH ..ぴよぴよ(505ポイント)
Date: 2008/10/13(月) 17:42
No:22424
|
|
Title: Re:龍神録プログラミング17章での画像の入れ替え
|
|
arrayさん有難うございました。
必死にgraph.cppの方弄っていたんですが、問題はcshotの方だったんですね・・・
現在、自機から発射できる弾の数を増やそうとしています。
プログラミングの館の方ではパワー200以上か、以下かを判別してそれによって
弾を二発撃つか、それとも四発撃つのかを判定していました。
しかし、パワーを200以下なら二発。400以下なら四発。600以下なら六発とするとき、
?の演算子が使えません。
この場合、ch.powerが400以下の時に従来のやり方でパワー200以下か、それ以上かを判別し、
パワー200以下なら二発、それ以上なら四発とし、
ch.powerが400以下でない時に六発撃つようにすればいいのでしょうか。
252ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(818,941ポイント)
Date: 2008/10/13(月) 17:44
No:22425
|
|
Title: Re:龍神録プログラミング17章での画像の入れ替え
|
|
?の演算子は単にifとelseをまとめただけのものなので、
if(){
}
else if(){
}
else if(){
}
....
と書けば延々と続けられます。またはスイッチ文を使うとよいでしょう。
69ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(819,038ポイント)
Date: 2008/10/13(月) 17:48
No:22426
|
|
Title: Re:龍神録プログラミング17章での画像の入れ替え
|
|
具体的にはこんな感じでしょうか?
if(ch.power>=400){
//400以上のショット
}
else if(ch.power>=200){
//200~399のショット
}
else{
//0~199のショット(マイナスになってもここにはいる)
}
スイッチ文で書くと
switch(ch.power/200){
case 0:
//0~199のショット
break;
case 1:
//200~299のショット
break;
default:
//400以上のショット(マイナスになってもここにはいる)
break;
}
97ポイント を手に入れた。
|
|
|
|
|
Name: SH ..ぴよぴよ(663ポイント)
Date: 2008/10/13(月) 19:08
No:22427
|
|
Title: Re:龍神録プログラミング17章での画像の入れ替え
|
|
管理人さん有難うございました。
無事に3パターンに分けることができました。
例えば、外側の弾の当たり判定や威力を変える場合、
ch2_shot_patternなどの関数を新たに用意し、(ch0_shot_patternは内側、ch1_...は内側且つ低速用)
そこで弾の画像や威力を変えれば良いのでしょうか。
…この場合、新しく構造体を追加し、内側の弾と外側の弾では別に処理することになりますよね…
158ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(819,196ポイント)
Date: 2008/10/13(月) 20:40
No:22428
|
|
Title: Re:龍神録プログラミング17章での画像の入れ替え
|
|
arrayさんが仰っているようにkndの値を変えて、ダメージ計算式を変える必要があるでしょう。
17章ではまだ当たり判定が無いので、今は意識しなくてもいいと思いますが。
当たり判定はout.cppに追加していく事になると思います。
cshot_tにimgを追加し、ショット登録時に画像番号も指定しておけば、
描画関数で条件分岐することなく描画出来ると思います。
158ポイント を手に入れた。
|
|
|
|
|
Name: SH ..ぴよぴよ(879ポイント)
Date: 2008/10/13(月) 22:27
No:22434
|
|
Title: Re:龍神録プログラミング17章での画像の入れ替え
|
|
(実はもう21章まで進んでいるんですが…)
kndについて iが2未満の時、kndが0に、そうでないならkndが1にという設定なので、
powerはkndが0の時には30、kndが1の時には15と設定すれば…
int cshot_range[CSHOT_RANGE_MAX]={6,};
これのもう一方に3あたりを入れた時、
cshot_range[cshot[i].knd]の[]内の値は0か1なので
0の時は6が、 1の時は3が当たり判定として出てきますよね…?
書いていて自分がもの凄い勘違いをしているような気がしてきてるんですけど・・・
216ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(819,954ポイント)
Date: 2008/10/13(月) 23:35
No:22443
|
|
Title: Re:龍神録プログラミング17章での画像の入れ替え
|
|
>cshot_range[cshot[i].knd]の[]内の値は0か1なので
>0の時は6が、 1の時は3が当たり判定として出てきますよね…?
そのもう一方とは・・・?
int cshot_range[CSHOT_RANGE_MAX]={6,3};
であり、
もしその追加したい弾の当たり判定が館で紹介しているものの半分ならそれでいいですよ。
98ポイント を手に入れた。
|
|
|
|
|
Name: SH ..ぴよぴよ(925ポイント)
Date: 2008/10/14(火) 20:27
No:22453
| 解決!
|
Title: Re:龍神録プログラミング17章での画像の入れ替え
|
|
管理人さん何度もお助けいただき本当に有り難う御座いました。
オプションからホーミングまで、とても勉強になりました…
46ポイント を手に入れた。
|
|
|
|
Name: DIL ..入門者(2,853ポイント)
Date: 2008/10/11(土) 20:46
No:22307
|
|
Title: 声を使ったプログラム
|
|
タイトルの通りですが、声を使ったプログラムについて質問です。
管理人さんのブログの3月4日の記事にあるような声でじゃんけんをするゲームを作ってみたいのですが、
あのプログラムはどのような仕組みになっているのでしょうか?
声をどのようにして認識しているのか気になるので、どなたか回答お願いします。
107ポイント を手に入れた。
|
|
|
|
Name: 管理人 ..伝説なるハッカー(815,507ポイント)
Date: 2008/10/11(土) 22:21
No:22315
|
|
Title: Re:声を使ったプログラム
|
|
随分前のブログを^^;
あれはリナックスで音声認識を行い、その音声認識結果をTCP/IPでwindows端末にデータを送り、
windowsで計算を行い、描画を行った後、音声出力結果を
またリナックスに送ってリナックスから音声出力するというまわりくどいことしています。
音声認識は
http://julius.sourceforge.jp/
このようなものを使って実現しています。
私はリナックスで行いましたけど、ウィンドウズでも出来るようです。
149ポイント を手に入れた。
|
|
|
|
|
Name: DIL ..入門者(2,963ポイント)
Date: 2008/10/13(月) 10:17
No:22404
|
|
Title: Re:声を使ったプログラム
|
|
回答ありがとうございます。さっそく使ってみます。
もう少し気になることがあるので追加で質問です。
今度は声というよりも音全般なんですが、マイク等の機器から入力した音を波形にするようなソフトを作ってみたいのですが、
どのような手順で組めばいいのか見当もつきません。
やはりWAVEファイルの仕組み等から学ばないとできないのでしょうか?
大まかな手順で構いませんので、何からすればいいのか教えていただけないでしょうか。
110ポイント を手に入れた。
|
|
|
|
|
Name: ibis ..中級者(14,858ポイント)
Date: 2008/10/13(月) 10:41
No:22405
|
|
Title: Re:声を使ったプログラム
|
|
WindowsAPIのwaveInを使うとできるらしいです。
まぁ詳しくは知らないんですがね。
検索してみたらサンプルソースの1つや2つは出てくると思いますよ。
64ポイント を手に入れた。
|
|
|
|
Name: 究極の初心者 ..入門者(3,762ポイント)
Date: 2008/10/12(日) 22:33
No:22371
|
|
Title: 雑談みたいなものですが・・・・
|
|
皆さん、こんばんわ。
初めての方は、お初にお目にかかります。
つい最近、C言語を始めたばかりの究極の初心者です。
規約にちょっとした雑談みたいのも可っと書いてあったので、少し雑談を・・・。
これといって、困ってる!っというわけではないので、暇つぶし程度にお答えください^^;
さて、私は本当に始めたばかりで、只今、ポインタで(°Д°)・・・・( °Д °)・・・・な状態ですw
forとwhileも理解はできるけど、使いこなせるかどうか・・・・・。
まぁ、そんな状況はさておき、掲示板を見ていると、やはり龍神録もあり、シューティングに関する質問が多いかな?っと見受けられます。
そこでです。
シューティングを制作している方が多いみたいですが、ゲームプログラミングで、シューティングって楽な方なんですかね??
それとも、龍神録があるため、シューティングを作っている方が集まっているだけなんでしょうか?
まだ、ゲーム作成には向きませんが、今後作るにあたって、まずは一番簡単なジャンルに挑戦しようと思っています。
そこで、一番簡単に組み込めるジャンルって、何なんでしょうか?
もちろん、凝れば凝るほど、何でも複雑にはなるんでしょうけど、このジャンルなら、簡単に組めるなっていうものを教えてください。
人それぞれなのかもしれませんので、自分はこのジャンルだなっていうので、構いませんので。
本当に、ちょっとした雑談ですが、お答え頂けたらなって思います。
332ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(115,239ポイント)
Date: 2008/10/12(日) 22:57
No:22374
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
うーん、どちらかといえば、シューティングは難しい部類に入ると思いますよ(^_^;)
アドベンチャーやパズルのような動きの大人しい物の方が楽だと思います。(個人的にはテトリスやコラムスなんかの落ち物パズルは勉強に最適だと思ってます。)
ただ、シューティングを作る事が出来れば、大抵のジャンルに応用が利くので、勉強して損はないと思いますよ(^-^)
116ポイント を手に入れた。
|
|
|
|
|
Name: 究極の初心者 ..入門者(3,980ポイント)
Date: 2008/10/12(日) 23:43
No:22377
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
>situmonさん
ふむふむ。
どうしてもシューティングとういうと、東方が思い浮かぶのですが、確かに、インベーダーを思い浮かべると、それほど複雑じゃない気がしますね。
そう考えると、ファミコンを参考に組み込むのもありなのかなー・・・・。
>バグさん
アドベンチャーは楽そうですね。
今のLvでも、1fやswichをうまく使えば、出来そうな気はします。
やはり、シューティングはLv高そうですよね。
その分、広くサポートしていると考えると、学んで損はないジャンルってとこですかね
。
お二方、回答ありがとうございました。
まだまだ、募集いたしてますのでよろしくお願いします。
218ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(33,421ポイント)
Date: 2008/10/12(日) 23:52
No:22378
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
ポインタを勉強中ということなら
タイピングゲームとかもできそうですよね。
文字列とポインタはどのゲームでも必要でしょうし。
(凝りだすとどれも難しくなっちゃいますが・・・。)
73ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(240,167ポイント)
Date: 2008/10/13(月) 00:26
No:22384
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
>そこで、一番簡単に組み込めるジャンルって、何なんでしょうか?
テーブルゲーム・・・CPUがない将棋や一人で遊べるトランプゲームなんかは
比較的簡単でいいのかもしれません。
97ポイント を落としてしまった。
|
|
|
|
|
Name: バグ ..ハッカー(115,311ポイント)
Date: 2008/10/13(月) 00:34
No:22386
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
確かに!
昔、神経衰弱やポーカー、オセロとか作りましたよ!すっかり忘れてました(^_^;)
マインスイーパーなんかもいいかもしれませんね(^-^)
72ポイント を手に入れた。
|
|
|
|
|
Name: 究極の初心者 ..入門者(4,334ポイント)
Date: 2008/10/13(月) 00:35
No:22387
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
>kazuoniさん
なるほどぉ・・・・文字列は学びました。
只今、ポイントが理解できない、理解不足で努力してるのですが、ポイントを使えば、タイピングもできるんですね。
なかなか、思いつきにくい(個人的に)ジャンルもってきたなーって思います。
ありがとうございました。
>Justyさん
テーブルゲームですか。
ふむふむ、テーブルっていうとボードゲーム思い浮かべちゃったんですけど、将棋とかの方ですね。
あぁ、そっか。そういわれると、CPU(AI)が必要じゃないジャンルが作りやすいかもしれませんね。
なんだか、皆さんの意見聞いてると、いろいろ思い浮かぶものですね。
ありがとうございました。
明日いっぱいまで募集したいと思います(大丈夫かな^^;
今のところ、皆さん別々なジャンルで面白いと思ってます。(あえてそうしてるのかもしれませんが)
なんとなく聞いたことですが、予想以上に参考になってます。
もしよろしかったら、どしどしお答えくださいm(_ _)m
354ポイント を手に入れた。
|
|
|
|
|
Name: 究極の初心者 ..入門者(4,554ポイント)
Date: 2008/10/13(月) 00:39
No:22390
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
間違えました。
日付変わっていたので、今日いっぱい募集したいと思います^^;
ちなみに・・・・
>バグさん
マインスイーパーのルールがわかっていない私には、マインスイーパーは無理そうです^^;;
だけど、テーブルとか有効そうですね。
やっぱり、みんな簡単なのから挑戦してんだなーっと、勝手に現場の声を聞いてる感じですw
ありがとうございました。
2倍のポイントを手に入れた! 220ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..入門者(4,962ポイント)
Date: 2008/10/13(月) 12:40
No:22410
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
東方地霊殿を今頃になり買ったのですが、イージーであそこまで難しいとは・・・(下手です)
47ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..初心者(5,288ポイント)
Date: 2008/10/13(月) 14:46
No:22413
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
15パズルなんかはすごく楽ですよ。
但し、並べる時に下手すると並びかえれなくなります。
ex.
1 2 3 4
5 6 7 8
9 10 11 12
13 15 14
48ポイント を手に入れた。
|
|
|
|
|
Name: 究極の初心者 ..入門者(4,901ポイント)
Date: 2008/10/13(月) 15:11
No:22414
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
>situmonさん
地霊殿の難易度は高いですね^^;
これから、東方始めた人は、絶対挫折するなぁ・・・・って難易度です。
まぁでも、東方全てなんですが、何度も何度もやると、ある程度はパターン見えてきますので。
「紫」か「にとり」が強いです。
お薦めは、「紫」ですね。広範囲、高威力なので。
5.6面が鬼門です。
頑張ってください。(イージーでもノーコンだとグットエンディングらしいですので。ただ、エクストラは解放されない・・・)
>lbfuvab
15パズルも楽そうですねー。
自分としては、勝手にRPGなどが楽なのかな〜って思ってましたが、もっと楽なのもあるもんですね。
総じて、テーブルがやはり楽な部類なのかな?って思います。
お答えありがとうございました。
347ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(815,380ポイント)
Date: 2008/10/13(月) 16:25
No:22416
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
こんにちは。
どのゲームもどれ位作りこむかによって大きく違うと思います。
画面の切り替わりだって、何のエフェクトも無く、パッと切り替わるだけなら、
呼ぶ関数をスイッチ文なりで変えてやればいいだけですから簡単ですが、
http://homepage2.nifty.com/natupaji/DxLib/dxprogram.html
(22章ワイプ)
こんな風に凝り始めると、次のシーンの描画情報をどうやって取得するかなど
色々難しくなってくると思います。
シューティングも基礎的なものはすぐ作れても、
例えばゲーム開始時、最初は段々明るくなって、その間キー入力受け付けないとか、
喰らいボムを実装したり色々オプションを追加したりすると難しくなっていくと思います。
どのような演出をするかで大きく違って来ると思います。
さて、でも一般的に同じくらいの作りこみをするならということでお話しすると、
シューティングは易・普・難の3X3段階で難易度つけるなら
普の難〜難の易位に位置するんじゃないかと思います。
オンラインゲームで同期を取るとか、時間による正確な演出をするなど凝ったことをするとか
ぷよ○よや将棋などの人工知能を実装することを除くなら
アクションゲームが一番難しいんじゃないかと思います。
初代ロック○ンのような配列に地面情報を入れて地面があるかないかだけで制御出来ないような
スーパー○ンキーコングなんかは(斜めの地面と自機との接触等)制御が案外難しいと思いますし、
きっと大規模な物を作るなら作成支援ツール(例えば自分なりのRPGツクールみたいなもの)を作らないと
マップ管理や敵管理など不可能になると思いますし、製作も大変になると思いますから
製作にも時間がかかるし大変だと思います。
一方で簡単なのはやはりサウンドノベル系のゲームでしょうね。
あのゲームは実装が難しいんじゃなくて物語を考えるのが難しいんでしょうけどね。
どのジャンルもシューティングが基礎になっている部分があるというのは私も同意見で、
例えばストリートファイ○ーのハドウケンのようなものであったり、
マリ○ブラザースのファイアであったり、
単純にリンゴ落ちゲーのリンゴだってシューティングの知識で実装出来るはずです。
ですから、その分野の製作をイキナリ始めると難しくても、
順を追って作れば案外簡単だったりすることもあります。
また、先ほど飛ばしました人工知能系の話ですが、これは考えれば考えるほど面白い分野です。
きっと「行き着くところまで行き着いた」という終着点には一般的な人(例えば私^^;)にはたどり着けないと思います。
どこまででも改良が出来て、いくらでも考える余地があると思います。
ボンバー○ンにしても敵の動きはCOMが制御しているのですし
対COMの対戦式のゲームにはほぼすべてこのような分野のアルゴリズムが必要だと思います。
私が経験した例でいうと、ぷよ○よを作った時は、連鎖をさせるアルゴリズムが思いつかず大変苦労しました。
結局まともな連鎖が出来るCOMは実装出来ませんでしたが、
普通にどんなにお邪魔ぷよが落ちてきても自動的に考えて消していっているCOMをはじめて見た時は
本当に感動しました。
あきもせずに1時間位COM対COMの画面を見ていた覚えがあります^^;
なので、アルゴリズム系に興味があればこのような対戦COMの実装を考えたり、パズルゲーのアルゴリズムを考えたりしてみても面白いかもしれませんね。
長くなるので一旦ココまでに。
433ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(816,440ポイント)
Date: 2008/10/13(月) 16:49
No:22417
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
プログラミング自体特殊な分野ですが、ポインタについては特にこの分野に限った概念ですから難しいですよね。
でも単にデータについた名前からデータを参照するのか、データの住所からデータを参照するのかの違いだけですから、
難しく考える必要は無いと思います。
私はゲームを作りながら覚えるのが好きでした。
自分が好きなことと混ぜて勉強すれば勉強も苦じゃなくなるんですよね。
ポインタを参考資料片手に実装出来るようになってきたらポインタを使って何かゲームを実装してみるといいと思いますよ。
また、どういうジャンルを作っている人が多いのか興味がおありのようですね。
これもアンケートに入れたらよさそうですね。
私も何か統計を見たわけじゃないのでわかりませんが、
特にここでシューティングの質問が多いのは単にシューティング系の解説がここに多いからだと思います。
ZUNさんの与えた影響は非常に大きいとは思いますが、それでも
シューティングというジャンルはゲーム全体の中でいえばマイナーですよね。
多分シューティングを作っている人が一番多いというわけではないのではないかと思っています。
何のゲームが一番多いかはベクターに登録されているフリーゲーム一覧を見るとか、
フリーフラッシュゲーム一覧をみるなどするとよくわかるかもしれません。
私が初めて作ったゲームはジャンケンでした。
コンソール画面に0,1,2のどれか入力したらそれがグーチョキパーに割り当てられてCOM
とジャンケンするというだけのものです。
初めてなんちゃって人工知能を搭載したのはノットワンハンドレットならぬノット17というゲームでした。
COMと自分、お互いに3つまで数える事が出来ます。
お互いにカウントアップしていき、17を言ってしまったら負けと言う奴です。
これって規則性が見つけられそうですよね。
お互いに1〜3つまで数えられると言う事は、1ターンで4の倍数の数値を固定出来そうだなと想像出来ます。
ということは、4の倍数+ある数を相手に言わせ続けていけば自分は勝つということになりそうです。
そんな感じで規則性を見つけてCOMに実装し、サイコロでまけたら(どちらが先に始めるかはサイコロできめる)
もう自分は負け確定という素晴らしいクソゲーが出来上がりましたw
そうしてOpenGLで対話式ゲームの出来るロボットを作った後、
DXライブラリに出会って過去のゲーム製作一覧にあるようなゲームを主に作りました。
私が作ったものはあの一覧にあるものだけじゃなく、
教授が「学生が提出する課題にコピーの類が多い」といっているのを聞いて
課題コピー発見ツールなるものを作ったり色々していましたw
学生は一見コピーに見えないように、ちょっと改行いれたりスペースいれたり、
接続詞変えたり、小細工してくるわけですが、
たんにデータを比較するだけじゃなく、
改行やスペースがまざっていてもそのデータのもつ「類似度」はかわらないので
そこをうまく比較できるように考えたりいろいろやりました。
好きこそ物の上手なれという言葉通り、自分に「これを絶対作りたい」というキモチがあれば
実装したコードが適切なものかどうかはおいておいて、何とかなるもんですよw
なので、是非自分の興味があるゲーム製作に挑戦してもらったらいいのではないかと思います。
頑張って下さい☆
1,060ポイント を手に入れた。
|
|
|
|
|
Name: 究極の初心者 ..初心者(5,195ポイント)
Date: 2008/10/13(月) 16:52
No:22418
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
>管理人さん
なるほど・・・アクションって難しいんですね。勝手に簡単な部類にわけてました^^;
シューティングとさほど変わりないんじゃないか?っと思ってましたけど、あたりまえですが、アクションのほうが、動きが多いですよね。(ジャンプやショット、穴に落ちるや接触、パワーアップなど)
何でも凝ってしまえば、大変になりますよね。
やはりCPU(AI)を組み込むのが大変だなーって思います。
サウンドノベルが楽かな〜って思いますが、サウンドノベルと共通できるジャンルって何だろ・・・・?w(サウンドノベルのプログラムを活かせるジャンル)
ご回答ありがとうございました。
ちなみに、ふと思ったのですがRPGってどうなんですかね?
管理人様の紹介にもファイナル○ァンタジーみたいなものがありましたが、これもアクション同様、管理が大変な気が・・・・・。
RPGとかって、ぶっちゃけてしまえば、RPGツクールでスクリプトいじったほうがいいんですかね??
294ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(816,805ポイント)
Date: 2008/10/13(月) 17:01
No:22419
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
サウンドノベルに共通するジャンルは台詞を喋るゲームなら全般的にそうなんじゃないでしょうか?
画面に人物なり背景を表示して、そこに文字を表示すると言うゲームはサウンドノベルだけでしょうが、
台詞を表示する機能は普通に龍神録でも使っています。
RPGも管理が大変ですよ〜。
しかし当時は支援ツールを作ると言う方法が思いつかなかったので、
全部0と1の信号を数千個と配列に手作業で代入していました(ぉぃぉぃ)
(この敵は喋るとか、このマップのこの部分は進入不可だとか・・)
>RPGとかって、ぶっちゃけてしまえば、RPGツクールでスクリプトいじったほうがいいんですかね??
ゲームプログラムを作ることに興味があり、1から自分で作ることに興味がある人なら自分で実装したいでしょうし、
ある程度箱庭の中でプラモを作るようなレベルでもサクサク作りたいという人なら市販のツールを利用する人もいるでしょうね。
最近のツクールがどこまで進化しているかしらないのですが、
最近はかなりプログラミングよりの設計になっているようなので、ツクールもマスターすれば
箱庭から出ることも出来るかもしれませんね。
365ポイント を手に入れた。
|
|
|
|
|
Name: 究極の初心者 ..初心者(5,419ポイント)
Date: 2008/10/13(月) 17:02
No:22420
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
うお・・・書いてる時に、投稿されていたみたいで、追記です。
>管理人さん
そうですねー・・・・ゲーム自体好きなので、嫌いなジャンルは特にないかも^^;
ただ、ノベル系が一番しませんね・・・。
ノベル系が一番得意な気もしますが・・・・・w(趣味で小説も書いているので、面白い云々は別としてw)
とにかく、今はいいものを作る!っていう理想をひとまずおき、基礎と単純なゲームを目標に頑張っています。
最終的には、パズルゲームが作りたいですね^^
なんとか、頑張っていこうと思います。
ありがとうございました。
224ポイント を手に入れた。
|
|
|
|
|
Name: 究極の初心者 ..初心者(5,526ポイント)
Date: 2008/10/13(月) 17:08
No:22421
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
>管理人さん
度々申し訳ないのですが・・・・支援ツールを「作る」?
「使う」じゃなくて、「作る」ですか??
えーっと・・・・割とそういうものって作れるものなんですか??
というと・・・・要は、ツクール系のアプリケーションを作って、そこからさらに作り出すっていうイメージでしょうか?
まぁ、あまり先に突き詰めても仕方ないのですが、誤字・・・じゃないですよね?
ちょっと気になりましたので^^;
107ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(818,815ポイント)
Date: 2008/10/13(月) 17:33
No:22422
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
おぉ〜小説を書くのが好きならば、ノベルゲーム製作もおもしろいのでは?
ただこの場合、絵をかくのも好きじゃないとダメですが^^;
>>度々申し訳ないのですが・・・・支援ツールを「作る」?
>>「使う」じゃなくて、「作る」ですか??
>>えーっと・・・・割とそういうものって作れるものなんですか??
既存の支援ツールを使うなんざ邪d・・
いや素晴らしいツールは沢山あると思いますが、
やっぱ全部自分で作ってみたくないですか?
せっかく作ったのに「どうせRPGツクールだろ?」とかいわれたら残念です。
ゲームが大規模になってくると
そういうのを管理するツールが必要になってくると思います。
RPGのマップデータなんてチップの番号が312,321,83,12とかずら〜〜っとデータならんでたって
どんな絵に仕上がってるのかわけわかりません。
ですから、例えばマウスクリックでチップを選び、再度クリックでそのマップにチップを置く。。
みたいなそれこそRPGツクールみたいなツールを作って、それを使ってマップを作って行ったほうが簡単です。
そりゃ大変だと思いますが、それを楽しみにやってるなら問題ないですよねw
マップを作るツールなど、メジャーなものはベクターなどにフリーで公開されているから
それを使うのもいいかもしれません。
しかし自分独自のアクションゲームみたいな特別なもののツールは自分にしか作れないので、
やっぱ自分で作ってモジュールを再利用できるようにしていった方が後のためかもしれません。
>とにかく、今はいいものを作る!っていう理想をひとまずおき、基礎と単純なゲームを目標に頑張っています。
基礎的なゲーム製作の定番になってきていますが、
まず、コンソールでジャンケンを作ってみて
http://www.play21.jp/board/formz.cgi?action=res&resno=19213&page=&lognum=61&id=dixq&rln=19340
(ここはわかっていれば割合してもいいですが)、
DXライブラリでそれを実装してみて
(ジャンケンゲームのサンプルプログラムはこちら
http://l.huu.cc/zip/janken2.zip
あいこで.wav
ジャンケン.wav
ポコ.wav
ポン.wav
やったね.wav
の音声データをdatフォルダにいれたら音声も出ます)
みると作り易いかもしれません。
これが出来たらリンゴの落ちゲー
http://l.huu.cc/zip/oti_ge.zip
とか作ってみてはどうでしょう。
ここまできちんと作れたらもうゲームプログラムの基礎はOKだと思います。
パズルゲーの基礎を学ぶにはなんといってもテトリスでしょう。
ゲームプログラムがわかってきたらまずテトリス作ってみてはどうでしょう?
2倍のポイントを手に入れた! 2,010ポイント を手に入れた。
|
|
|
|
|
Name: 究極の初心者 ..初心者(5,953ポイント)
Date: 2008/10/13(月) 21:05
No:22429
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
>管理人さん
>ただこの場合、絵をかくのも好きじゃないとダメですが^^;
う・・・絵ですか・・・・・書くのは好き・・・いあ嫌いじゃないけど、一番優劣がはっきする芸術作品だと思います。
なんで、難しいとこ・・・なのかな?w
一応、勉強というか、書く努力はしているのですが・・・・後回しにしています。
でも、一番はPCで書く環境がないというとこですかね。
おそらく、ペンタブ使って書いている方が多いとは思いますが、いまだに持ってはいないので^^;
真っ黒背景に、文字だけのものなら、できそうですw
>せっかく作ったのに「どうせRPGツクールだろ?」とかいわれたら残念です。
これはあるでしょうね^^;
一応、ツクールのような基盤というか、支援ツールみたいのも出来るんですね。
んー・・・奥が深いというか、なんというか・・・・。
>まず、コンソールでジャンケンを作ってみて
さっそく参考に見させて頂きました。
まだ無理でしたw
ただ・・・・・ふむふむ・・・と見れるだけ、自分も知識はついてきてると実感しました。
理解>組み込みには、まだ時間がかかりますが、これを理解して、自分で組み込めるようになろうと思います。
素材は頂きました^^
ありがとうございます。
ついでに・・・・絵といわれて、絵を描いてみたので、載せてみますw
卑怯な手段でラフ画です。
ラフ画って、下手でもそれなりに見える不思議な魔法ですw
427ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(819,471ポイント)
Date: 2008/10/13(月) 21:39
No:22430
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
おぉ〜いいですね〜♪
でも絵ってデッサンが基本ですし、形や輪郭がしっかりかければ後色塗りは練習次第だと思いますし、
それだけかければ十分でしょ^^;
いや〜絵は難しいですねw
ドット絵は書き方がまた違うので、ゲーム作るには色々勉強しないといけないですよね〜;
ゲームは更に音楽が必要ですが・・。
ツクールのようなものというと遠い存在のような気がするかもしれませんが、
画像番号で格納されているマップチップデータを読み込んで
その画像を表示するだけでも充分支援ツールになると思いますし、
簡単なものから作っていけばいいと思います。
まぁそれはある程度の規模のゲームを作る時に必要になるので最初は必要ないと思います。
>ペンタブ
ペンタブ高いですよね〜・・。
3980円で売ってたペンタブ買ってみたんですが、
まぁ当然ですが友達が持ってた3万のペンタブととても同じ類のものと思えないほど違いました^^;
何でも中途半端なものはかわないほうがいいですね〜;
(結局使ってないし・・。
275ポイント を手に入れた。
|
|
|
|
|
Name: 究極の初心者 ..初心者(7,097ポイント)
Date: 2008/10/13(月) 22:11
No:22433
|
|
Title: Re:雑談みたいなものですが・・・・
|
|
>管理人さん
>いや〜絵は難しいですねw
絵は難しいですw
絵師さんと呼ばれる方は、やはり尊敬に値しますね。
ただ、まぁ小さい頃(それこそ小学生とか)に、絵を趣味で描いてましたので、その名残でなんとか・・・・絵であることは維持できてます^^;
>ドット絵は書き方がまた違うので、ゲーム作るには色々勉強しないといけないですよね〜;
アンチエイリアス・・・・でしたっけ?
ドット絵ならでは手法があるんですよね・・・・。
いずれにせよ、ペンタブがないとなーっと思っているので、まだそちらには手をつけてはいませんが。
>ゲームは更に音楽が必要ですが・・。
大丈夫です、作曲はできますw
っといえども、こちらは本格的に始めたのは数か月前ですが・・・。
もちろん、こちらも四苦八苦しました。
音楽理論だなんだの・・・・・つまるところ、感性でしたw
一応、作れと言われたら作れますね。
こちらは、感覚的な要素が多いので、場数さえ踏めば・・・・っと思います。
これまた若かりし頃(中高校くらい)に、バンド組んでた名残ですかねw
一応、ギターは弾けるのですんなりと入れましたから。
あと、プログラミングさえできれば、一応ゲームは作れるのかなぁ・・・・って思ってます。
これが一番難所なんでしょうけど^^;
なんせ、本当に0からのスタートになりますからね。
数学も・・・・得意ではなかったですし・・・・理系ではあったけど(ぁw
夢は、やはりすべてオリジナルですね。
物語も、音楽も、絵も、プログラムも。
ZUN氏を目指すわけじゃありませんが、自分の友人に絵も、作曲も、物語も、プログラミングもできる人はいないので、自分でやるしかないわけです^^;
2倍のポイントを手に入れた! 1,144ポイント を手に入れた。
|
|
|
|
|
Name: 究極の初心者 ..初心者(7,276ポイント)
Date: 2008/10/14(火) 00:02
No:22445
| 解決!
|
Title: Re:雑談みたいなものですが・・・・
|
|
日付変わりましたので解決にしました。
お答え下さった皆様方、本当にありがとうございました。
個人的には、ただの雑談のつもりが、予想以上に参考になりました。
やっぱり、先人の方々の話を聞くのは、雑談であろうと参考になるものだと思います。
お付き合いくださった皆様方、改めたありがとうございます。
いつか答えられる側に回りたいものです^^;
179ポイント を手に入れた。
|
|
|
|
|