|
Name: Huzzy ..かけだし(1,260ポイント)
Date: 2009/04/09(木) 23:33
No:31954
|
|
Title: エラーメッセージの意味;;
|
|
前回に引き続き、龍神録第32章のプログラムを
組んでいたのですが、以下のエラーメッセージ×2が
一向に消えてくれません;;
1>boss_shotH.obj : error LNK2019: 未解決の外部シンボル "double __cdecl bossatan3(int,double,double)" (?bossatan3@@YANHNN@Z) が関数 "void __cdecl boss_shot_bulletH006(void)" (?boss_shot_bulletH006@@YAXXZ) で参照されました。
1>D:\c++\mikudius\miku3\Debug\miku3.exe : fatal error LNK1120: 外部参照 1 が未解決です。
それまでのエラー(文法・誤字脱字ミス等)はダブルクリックで
特定の箇所を自動判別できたのですが、この2つはそれも出来ません。
この章に、至るまで何度かこのような判別不能のメッセージが
出てきたのですが(今までは疾駆八苦の末、奇跡的に消えました;)
今回はお手上げ状態です;;
何方かこの2つのエラーメッセージの表している意味、もしくは
どの辺りを変更しろと言っているのか?
を判断出来る方がいらっしゃいましたら、ご教授の程
よろしくお願いします。
368ポイント を手に入れた。
|
|
|
|
Name: SooA [URL] ..中級者(14,465ポイント)
Date: 2009/04/10(金) 02:52
No:31962
|
|
Title: Re:エラーメッセージの意味;;
|
|
boss_shotH.obj ( boss_shotH.cpp ) 内の
boss_shot_bulletH006() で bossatan3() って関数を
使ってるけど該当する関数が見つからないって感じのメッセージです。
定義されてますか?
リビルドしてもエラー出ますか?
86ポイント を手に入れた。
|
|
|
|
|
Name: dic ..上級者(17,533ポイント)
Date: 2009/04/10(金) 10:13
No:31965
|
|
Title: Re:エラーメッセージの意味;;
|
|
プロジェクごとソースをアップしてくれれば
エラーが分かるかと思います
私の環境 VC++6 では第32章はコンパイルできました
43ポイント を手に入れた。
|
|
|
|
|
Name: huzzy ..ぴよぴよ(36ポイント)
Date: 2009/04/10(金) 18:20
No:31979
| 解決!
|
Title: Re:エラーメッセージの意味;;
|
|
返答有り難う御座います。
確認したところ、boss_shot.cpp内の
double bossatan3を書き忘れているという
単純なミスでした;;
ご指導有り難う御座いました。
36ポイント を手に入れた。
|
|
|
|
Name: piyo ..入門者(3,138ポイント)
Date: 2009/04/10(金) 13:04
No:31968
|
|
Title: 文字列の検索?
|
|
お世話になります。
今回、例えば
”/export/home/a/a.txt”
という文字列があった場合、”/export/home/a”までを取得したいのですが、
どうやったらいいのかさっぱりわかりません。。
”./b.txt”の場合は"."が取得したいです。
strtokで”/”を区切りにして・・・・とも思ったのですが、
どうにもスマートになりません。
どなたかいい方法を教えてください。。
140ポイント を手に入れた。
|
|
|
|
Name: GPGA ..熟練のプログラマー(62,011ポイント)
Date: 2009/04/10(金) 13:25
No:31969
|
|
Title: Re:文字列の検索?
|
|
これは文字列内の最後の「/」より前の文字列を取得したいということでいいのですかね?
であるならば、以下のプログラムでできます。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
const char* src = "/export/home/a/a.txt";
const char* p = strrchr(src, '/');
if (p != NULL) {
const int len = p - src + 1;
char* dst = (char*)malloc(len + 1);
strncpy(dst, src, len);
dst[len - 1] = '\0';
printf("%s\n", dst);
free(dst);
}
return 0;
}
161ポイント を手に入れた。
|
|
|
|
|
Name: nayo ..中級者(10,128ポイント)
Date: 2009/04/10(金) 14:21
No:31970
|
|
Title: Re:文字列の検索?
|
|
文字列をいったんすべて読んでしまった後、文字列の後ろから「/」を探して、
見つけたら\0に置き換えるとかどうでしょうか
30ポイント を手に入れた。
|
|
|
|
|
Name: hss12 ..中級者(12,068ポイント)
Date: 2009/04/10(金) 15:28
No:31972
|
|
Title: Re:文字列の検索?
|
|
書いてたら解決しちゃいましたか。
文字列を読んでいき/の位置をendに記憶させ、最後の/を\0に変えています。
ポインタを使って書いていたんですがどうもうまくいかず配列にしてしまいました。
#include <stdio.h>
int main(void){
char str[] = "/export/home/a/a.txt";
int start = 0;
int end = 0 ;
while(str[start] != '\0'){
if(str[start] == '/') end = start;
start++;
}
if(end != 0) str[end] = '\0';
printf("%s\n", str);
return 0;
}
112ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(155,279ポイント)
Date: 2009/04/10(金) 16:27
No:31973
|
|
Title: Re:文字列の検索?
|
|
ちょっと冗長かな?(^_^;)
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[] = "/export/home/a/a.txt";
size_t len = 0;
for (len = strlen(str) - 1; len >= 0; --len)
{
if(*(str + len) == '/')
{
*(str + len) = '\0';
break;
}
}
printf("%s\n", str);
return 0;
}
194ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(61,700ポイント)
Date: 2009/04/10(金) 17:14
No:31976
|
|
Title: Re:文字列の検索?
|
|
すっごいあほなことやってたので、訂正
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
const char* src = "/export/home/a/a.txt";
const char* p = strrchr(src, '/');
if (p != NULL) {
const int len = p - src;
char* dst = (char*)malloc(len + 1);
strncpy(dst, src, len);
dst[len] = '\0';
printf("%s\n", dst);
free(dst);
}
return 0;
}
元の文字列を壊していいなら↓
#include <stdio.h>
#include <string.h>
int main(void)
{
char s[] = "/export/home/a/a.txt";
char* p = strrchr(s, '/');
if (p != NULL) {
*p = '\0';
printf("%s\n", s);
}
return 0;
}
311ポイント を落としてしまった。
|
|
|
|
Name: 初心者 ..プログラマー(29,208ポイント)
Date: 2009/04/09(木) 22:27
No:31948
|
|
Title: 並べ替え
|
|
はじめまして
いきなりですが値を並べ替えて順番に変数に格納するにはどうすればいいでしょうか?
例えば
a[0]=0;a[1]=1;a[2]=2;a[3]=3・・・a[9]=9;
となっているのを
a[0]=3;a[1]=2;a[2]=6;a[3]=1・・・a[9]=0;
のように並べ替えるものです
ご教授お願いします><
環境はVC++とDXライブラリです
163ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(137,980ポイント)
Date: 2009/04/09(木) 22:44
No:31950
|
|
Title: Re:並べ替え
|
|
> いきなりですが値を並べ替えて順番に変数に格納するにはどうすればいいでしょうか?
箱から出したばかりの、きれいに並んでいるトランプを
シャッフルするようなことを考えていますか?
24ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..プログラマー(29,247ポイント)
Date: 2009/04/09(木) 22:44
No:31951
|
|
Title: Re:並べ替え
|
|
ごめんなさい
そこに触れるのをわすれてました;
ランダムです
音楽プレイヤーのシャッフル機能のような感じにしたいと思っています
39ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(138,127ポイント)
Date: 2009/04/09(木) 23:06
No:31952
|
|
Title: Re:並べ替え
|
|
今回の場合、配列の添字の最小値は0、最大値は9ですね。
そこで、
1)0(添字の最小値)〜9(添字の最大値)の範囲の整数の乱数を2個発生させます(m, nとします)。
2)m, nを配列の添字として、a[m]とa[n]とを入れ替えます。
3)前2項の操作を適当な回数だけ繰り返します。
以上の処理で、配列の中身がランダムに並ぶでしょう。
147ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..プログラマー(29,300ポイント)
Date: 2009/04/09(木) 23:19
No:31953
| 解決!
|
Title: Re:並べ替え
|
|
なるほど!!
入れ物を何度も入れ替えるということですね
自分じゃ絶対思いつかなかった;
とても早い解決ありがとうございます
53ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(14,277ポイント)
Date: 2009/04/10(金) 01:48
No:31960
|
|
Title: Re:並べ替え
|
|
並べ替えるデータ量が今の比ではないくらい多くなる場合、
乱数の出によっては入れ替わらない部分が出てしまいます、
入れ替え回数を増やせばその確率は減りますがスマートではありません。
そういったケースのために別のやり方も書いておきます。 // 元のデータ
char a[10] = { 0,1,2,3,4,5,6,7,8,9 };
// 置き換え後のデータ
char b[10] ;
int i, r, max = 10 ;
// シード
srand( time(NULL) ) ;
// 元データの回数実行
for( i=0; i<max; i++ )
{
// 乱数で元データを選ぶ
r = rand() % ( max-i ) ;
b[i] = a[r] ;
// 使った場所に最後尾のデータを入れる
a[r] = a[ (max-1)-i ] ;
// 結果の表示
printf( "%d \n", b[i] ) ;
}
215ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(22,784ポイント)
Date: 2009/04/10(金) 09:36
No:31963
|
|
Title: Re:並べ替え
|
|
特に、乱数を多用する場面ではr = (int)(rand() / (RAND_MAX + 1.0) * (max - i)); のようにするとより良いでしょう。
2倍のポイントを手に入れた! 140ポイント を手に入れた。
|
|
|
|
Name: rei ..ぴよぴよ(55ポイント)
Date: 2009/04/09(木) 12:19
No:31930
|
|
Title: タイトル画面⇒選択
|
|
〜初めにロード画面⇒タイトル画面を出して、スタートボタンを押してゲームを始める〜
までのプログラムがよく分かりません><
出来れば61章あたりで作ってくれたら凄くうれしいです
55ポイント を手に入れた。
|
|
|
Name: 昴 ..入門者(3,170ポイント)
Date: 2009/04/09(木) 15:41
No:31940
|
|
Title: 構造体と関数
|
|
こんにちは。いつもお世話になっています。
C言語は初心者でテキストを見ながら進めています。
WindowsのVistaを使っています。
今回質問させて頂くのは、構造体に関することです。
#include <stdio.h>
#include <string.h>
struct seiseki {
int no;
char name[20];
double average;
};
struct seiseki seiset( void );
int main( void )
{
struct seiseki sei;
sei = seiset();
printf( "%d %s %f\n", sei.no, sei.name, sei.average );
return 0;
}
struct seiseki seiset( void )
{
struct seiseki sei2;
sei2.no = 1001;
strcpy( sei2.name, "中田太郎" );
sei2.average = 76.5;
return sei2;
}
・seiset関数内でsei2 = { 1001, "中田太郎", 76.5 };というふに初期値を設定することと、上記のように設定
することに何か違いみたいなものはあるのでしょうか?
・main関数内で、struct seiseki sei;と構造体宣言しているのですが、この時、(int no; char name[20], double average)分、メモリーに割り当てられるのですか?
458ポイント を落としてしまった。
|
|
|
|
Name: box ..ハッカー(137,956ポイント)
Date: 2009/04/09(木) 20:05
No:31944
|
|
Title: Re:構造体と関数
|
|
> ・seiset関数内でsei2 = { 1001, "中田太郎", 76.5 };というふに初期値を設定することと、上記のように設定
> することに何か違いみたいなものはあるのでしょうか?
struct seiseki sei2 = { 1001, "中田太郎", 76.5 };
のように、変数sei2の定義と初期化を同時に行なう場合のことですね?
両者の間に違いはありません。
> ・main関数内で、struct seiseki sei;と構造体宣言しているのですが、この時、(int no; char name[20], double average)分、メモリーに割り当てられるのですか?
正確には、sizeof(struct seiseki)というサイズです。
それが、構造体の各メンバーのサイズを足し合わせた値と
同じになるとは限りません。
なぜなら、構造体定義におけるメンバーの並び順やサイズによっては、
メンバーとメンバーとの間に境界合わせのための
すき間(パディング)が入ることがあるためです。
145ポイント を落としてしまった。
|
|
|
|
Name: 昴 ..入門者(3,628ポイント)
Date: 2009/04/09(木) 13:31
No:31931
|
|
Title: 可変長引数
|
|
こんにちは。いつもお世話になっています。
C言語は初心者でテキストを見ながら進めています。
質問があるのですが、va_start(ap, v)は可変長引数を操作する上で必要なデータを取得するマクロとあったのですが、このマクロとはどういう意味でしょうか?
よろしくお願いします。
2倍のポイントを手に入れた! 148ポイント を手に入れた。
|
|
|
|
Name: toyo ..プログラマー(29,970ポイント)
Date: 2009/04/09(木) 13:40
No:31932
|
|
Title: Re:可変長引数
|
|
#define 〜
で定義されたものをマクロといいます。
ちなみにVisualC++2008では
#define va_start _crt_va_start
#define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
と定義されてました。
70ポイント を手に入れた。
|
|
|
|
|
Name: hss12 ..中級者(11,698ポイント)
Date: 2009/04/09(木) 14:28
No:31936
|
|
Title: Re:可変長引数
|
|
マクロは
オブジェクト形式マクロと
関数形式マクロの2種類あります。
オブジェクト形式マクロは
#define MAX 5
for(i=0; i<MAX; i++)
のように使います。
for(i=0; i<5; i++)
に置き換わります。
質問の場合は関数形式マクロですが
/*和を求めるマクロ*/
#define add(x, y) ((x)+(y))
printf("aとbの和は%d", add(a, b));
この場合
printf("aとbの和は%d", ((a)+(b)));
に置き換わります。
214ポイント を手に入れた。
|
|
|
|
|
Name: 昴 ..入門者(3,122ポイント)
Date: 2009/04/09(木) 15:44
No:31941
| 解決!
|
Title: Re:可変長引数
|
|
マクロといっても、オブジェクト形式マクロと関数形式マクロがあるのですね。
とても、勉強になりました。
お二方、解答ありがとうございました。
48ポイント を落としてしまった。
|
|
|
|
Name: 南瓜 ..ぴよぴよ(273ポイント)
Date: 2009/04/06(月) 20:17
No:31828
|
|
Title: 質問です
|
|
はじめまして。少しC言語について勉強して興味をもってので、ゲームとは直接関係ないプログラムを作ったんですけど
うまくいかないので質問させてください。
[1]・数値を入れてレベル99までのランダムに上昇するステータスを計算する
最終的には異なる3つの上昇率を各ステータスから選び計算させたい
・ /*
レベル99までの各ステータスを計算
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int GetRandom(int min, int max);
int main(void)
{
int i, level, hp, ep, attck, defense, hit; /* 初期ステータス */
int asum; /* レベル99の各合計値 */
srand((unsigned int)time(NULL));
puts("初期レベルとステータスを入力してください");
printf("レベル:"); scanf("%d", &level);
printf("HP:"); scanf("%d", &hp);
printf("EP:"); scanf("%d", &ep);
printf("攻撃:"); scanf("%d", &attck);
printf("防御:"); scanf("%d", &defense);
printf("命中:"); scanf("%d", &hit);
for(i = level + 1; i <= 99; i++) { /* レベルアップボーナスの回数 */
asum = attck + (99 - level) * GetRandom(8, 10);
printf("レベル99の攻撃は%dです\n", asum );
}
return (0);
}
int GetRandom(int min, int max)
{
return min + (int)(rand() * (max - min + 1.0) / (1.0 + RAND_MAX));
}
・初期レベルとステータスを入力してください
レベル:28
HP:1240
EP:1195
攻撃:374
防御:277
命中:276
レベル99の攻撃は1084です
レベル99の攻撃は1013です
レベル99の攻撃は1013です
レベル99の攻撃は1013です
レベル99の攻撃は1013です
レベル99の攻撃は1013です
レベル99の攻撃は1013です
レベル99の攻撃は942です
・……とランダムに?計算しているのはいいんですが(本当は一個だけ表示させたいのですが)
初期ステータス+8+8+10+9+10+9+……という風に計算させたいんです。今は攻撃力だけ表示するようにしていますが
うまくいきません
[2]・OS:MacBook Mac OSX
[3]・C言語
・かなり初歩的なレベルだと思います(for,while文くらいしかつかえないのとコンパイラとライブラリの意味がわからないので)
273ポイント を手に入れた。
|
|
|
|
Name: hss12 ..中級者(9,073ポイント)
Date: 2009/04/07(火) 02:48
No:31841
|
|
Title: Re:質問です
|
|
何をやりたいのか良く分かりませんが、こんな感じでしょうか。
(attckをattackに変更しました。)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int GetRandom(int min, int max);
int main(void){
int i;
int level, attack;
srand((unsigned int)time(NULL));
puts("初期レベルとステータスを入力してください");
printf("レベル:");
scanf("%d", &level);
printf("攻撃:");
scanf("%d", &attack);
for(i = level+1; i <= 99; i++){
attack = attack + GetRandom(8, 10);
printf("計算中、レベル%dの攻撃は%dです\n", i, attack );
}
printf("レベル99の攻撃は%dです\n", attack );
return (0);
}
int GetRandom(int min, int max){
return min + (int)(rand() * (max - min + 1.0) / (1.0 + RAND_MAX));
}
302ポイント を手に入れた。
|
|
|
|
|
Name: 南瓜 ..ぴよぴよ(775ポイント)
Date: 2009/04/07(火) 22:15
No:31877
|
|
Title: Re:質問です
|
|
hss12さん ありがとうございます。おかげで思ったような結果になりました。
上にも書いた「異なる3つの上昇率を各ステータスから選び計算させたい」がどのように文をつくればいいのか悩んでいます。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int GetRandom(int min, int max);
int main(void)
{
int i;
int a1, a2, a3; /* 成長タイプ */
int level, hp, ep, attack, defense, hit; /* 初期ステータス */
srand((unsigned int)time(NULL));
puts("成長タイプを入力ください");
printf("攻撃"); scanf("%d", &???)
a = GetRandom(10, 12);
b = GetRandom(9, 11);
c = GetRandom(8, 10);
puts("初期レベルとステータスを入力してください");
printf("攻撃:"); scanf("%d", &attack);
for(i = level + 1; i <= 99; i++) { /* レベルアップボーナスの回数 */
attack = attack + GetRandom(8, 10);
???は何を書けばいいのかわからないところで、
attack = attack + GetRandom(8, 10)のGetRandomの所に上から選んだa,b,cを代入させて計算させたいんです。
502ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(138,081ポイント)
Date: 2009/04/07(火) 22:20
No:31878
|
|
Title: Re:質問です
|
|
// int a1, a2, a3; /* 成長タイプ */
int a[3]; /* 成長タイプ */
int level, hp, ep, attack, defense, hit; /* 初期ステータス */
srand((unsigned int)time(NULL));
//puts("成長タイプを入力ください");
//printf("攻撃"); scanf("%d", &???)
//a = GetRandom(10, 12);
//b = GetRandom(9, 11);
//c = GetRandom(8, 10);
a[0] = GetRandom(10, 12);
a[1] = GetRandom(9, 11);
a[2] = GetRandom(8, 10);
puts("初期レベルとステータスを入力してください");
printf("攻撃:"); scanf("%d", &attack);
for(i = level + 1; i <= 99; i++) { /* レベルアップボーナスの回数 */
attack += a[rand() % 3];
こういうことがしたいのでしょうか?
2倍のポイントを手に入れた! 90ポイント を手に入れた。
|
|
|
|
|
Name: hss12 ..中級者(9,255ポイント)
Date: 2009/04/08(水) 02:45
No:31883
|
|
Title: Re:質問です
|
|
すみません。
attack = attack + GetRandom(8, 10);
は
attack += GetRandom(8, 10);
と書くべきでした。
boxさんの方法で良いと思いますが
ランダムでなく入力したいのなら
do {
puts("成長タイプを入力してください(0〜2)");
printf("攻撃"); scanf("%d", &growtype);
} while (growtype < 0 || growtype > 2);
for(i = level + 1; i <= 99; i++) {
a[0] = GetRandom(10, 12);
a[1] = GetRandom(9, 11);
a[2] = GetRandom(8, 10);
attack += a[growtype];
}
で、どうでしょうか。(growtypeやaは好きなのに変えてください)
または、配列を使わずに
for(i = level + 1; i <= 99; i++) {
switch (growtype) {
case 0: attack += GetRandom(10, 12); break;
case 1: attack += GetRandom(9, 11); break;
case 2: attack += GetRandom(8, 10); break;
}
}
あるいは、あらかじめ
switch (growtype) {
case 0: r_min = 10; r_max = 12; break;
case 1: r_min = 9; r_max = 11; break;
case 2: r_min = 8; r_max = 10; break;
}
としておいて
for(i = level + 1; i <= 99; i++) {
attack += GetRandom(r_min, r_max);
}
338ポイント を落としてしまった。
|
|
|
|
|
Name: 南瓜 ..ぴよぴよ(887ポイント)
Date: 2009/04/08(水) 21:19
No:31910
|
|
Title: Re:質問です
|
|
boxさん、hss12さん ありがとうございますm(_ _)m
おかげで作りたかったプログラムができました。それと//aや//putsの // にはどんな意味があるんでしょうか?
同じ内容でも配列やswitch文といろいろなやり方があってC言語はおもしろいですね
112ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(138,101ポイント)
Date: 2009/04/08(水) 21:32
No:31911
|
|
Title: Re:質問です
|
|
> // にはどんな意味があるんでしょうか?
その行の // に続く部分をコメントにする、という意味です。
20ポイント を手に入れた。
|
|
|
|
|
Name: 南瓜 ..ぴよぴよ(911ポイント)
Date: 2009/04/08(水) 22:20
No:31918
| 解決!
|
Title: Re:質問です
|
|
なるほど、そういう意味ですか。ありがとうございます。
24ポイント を手に入れた。
|
|
|
|
|
Name: hss12 ..中級者(11,484ポイント)
Date: 2009/04/09(木) 03:48
No:31929
|
|
Title: Re:質問です
|
|
正確には//コメントはC++という言語のコメント方法で
C言語は/*コメント*/を使います。
最近はC++やJavaで//コメントを使う人が多いからか
C言語のコンパイラも//に対応しているみたいですが
古いコンパイラだとエラーになる可能性が高いので注意してください。
C言語の入門書だと//コメントは紹介していないかもしれないので
C++やJavaを勉強していない人は知らないかもしれないですね。
プログラムを修正するときにコメントを使うことは良くあります。
例えば
//int a;
としてあとで使うかもしれない時や参考にするために残しておきます。
/**/は複数行コメントできるのが特徴ですが
例えば
/*
int a; /*コメント*/
int b;
*/
とコメントの中にコメントがあるとエラーになるので注意が必要です。
2つ目の/*がコメントとみなされてしまい、1つ目の*/でコメントが終了してしまいます。
無駄知識ですがD言語の
/+
int a; /+コメント+/
int b;
+/
はエラーにならないです。
裏技ですが
if(0){
int a; /*コメント*/
int b;
}
なんてこともできます。ifは0のときは実行されません。
481ポイント を手に入れた。
|
|
|
|
Name: kerotan0820 ..入門者(4,292ポイント)
Date: 2009/04/08(水) 22:19
No:31917
|
|
Title: 将来ゲームを作るにあたって・・・
|
|
いつもお世話になっております。
今回はちょっとプログラムとかではなく勉強の過程についてお聞きしたいことがあります
僕はC言語のまだ繰り返し文という初歩的な範囲までしかやってないにもかかわらずゲーム製作をするという大胆な夢を持ち、DXライブラリを学習しています。
基礎(土台)を固めずいきなりDXライブラリに手を出し、途中で挫折、なんてことはしたくありません
将来自分の力のみでプログラムを組めるようにもなりたいのですが、今のような状態でいいのでしょうか・・・
将来ゲームプログラマーなどになれなくても趣味でゲーム政策などでもぜんぜんいいなと思います。
ですが、後悔はしたくないので今の僕のやってることに間違いというかアドバイスがあったら一言よろしくお願いします・・・
本当にくだらない質問ですみません。自分は初心者でやってることが何かもわからなかったりするくらいです。
僕なんかよりもずっと長い経験を持ってる皆様にお聞きしたいと思いました
どうか回答のほうよろしくお願いします。
ちなみに僕は今14歳(中3)です。高校に入るまでに一本くらいゲームを作りたいと思っています。
279ポイント を手に入れた。
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(79,264ポイント)
Date: 2009/04/08(水) 22:35
No:31919
|
|
Title: Re:将来ゲームを作るにあたって・・・
|
|
おそらく現段階でちょっと厳しいかなっていうのは
数学的な思考です。三角関数、線形代数等は中学生だとちょっと厳しいかもです。。
(一から自分でやれば高校、大学で確実に役に立ちますが・・・)
しかし、そこまで複雑な計算は排除すれば、
パズル・テーブルゲーム、タイピングゲーム、ライフゲーム等は作れるのではないでしょうか。
ちょっと三角関数をやればシューティングゲームも可能です。
>いきなりDXライブラリ
これは特に問題はないかと思います。
っというのも、画像描写等はこれを使用しないとできません。
なので、関数の内容、戻り値等はしっかり下見をしてからなら、必ず役に立ちます。
(っというかゲーム作成にあたって画像、音楽に長けるライブラリは必要かと思います)
いろいろ書きましたが、しかしまずは簡単なゲームから始めたほうがいいですね。
ジャンケンゲーム、ちょっとした計算ゲーム・・・
これならC言語の初歩的な知識があればできます。
後はゲームを作りながら、ポインタ、構造体等をじっくり理解していけばよいです。
(もちろん一度C言語入門書をすべて一通り読んでおくことをお勧めしますが・・・。)
年齢は関係ないですよ^^
ここの常連様のtkさんは(確か)今年高校2年ですが、
大学3年の自分よりはるかにプログラミング能力に長けていますw
(勝手に名前出してしまって申し訳ありません。。)
がんばってください^^
445ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(78,470ポイント)
Date: 2009/04/08(水) 22:56
No:31920
|
|
Title: Re:将来ゲームを作るにあたって・・・
|
|
まず一つ、誰にでもゲームを作ることは可能です。
この点は重要だと思います。
一番単純なじゃんけんや、数当てゲームも立派なゲームです。
まずはそこから始めていくといいでしょう。
確かに土台がきちんとなっていないと、自分の思い通りのプログラムが書けず、
挫折・破綻をしてしまうかもしれません。
しかし、それは先のことを考えず、無理をして書いた場合です。
今作ろうとしているゲームをプログラムでどのように動かすか、
という点が固まっていればおのずと製作が進むはずです。
規模が大きくなってくると、ゲームのシステム面やより底辺にあるプログラム群の土台が何よりも一番
必要になってきます。
kerotan0820 さんの望む、途中で挫折をしない方法としては、
・他の方(ここのサイトのサンプルなど)の簡単なプログラムを読む
・分からない言葉・方法が出てきたらすぐに本やネットで理解できるまで調べる
・どういう風に動いているのか(細かいところまで)想像できない複雑なゲームは作らない
といったところでしょうか。
ところで、数学は得意でしょうか?
kazuoni さんのおっしゃるように、数学的思考、つまり「式」の考え方が比較的重要なのではないかなとほのめかしてみます。
(C言語など、プログラミング言語は「式」の集まりなので。)
まあ実際、書き方と処理さえ分かっていれば特に問題は無いのですけれども。
以上、仕事でも趣味でもゲームプログラムをしている者の発言でした。
# ちなみに関係ないかと思われがちですが、人付き合いもプログラマにとって重要な要素ですよ。
649ポイント を手に入れた。
|
|
|
|
|
Name: yu [URL] ..上級者(24,726ポイント)
Date: 2009/04/08(水) 22:57
No:31921
|
|
Title: Re:将来ゲームを作るにあたって・・・
|
|
体験談です。
自分は高校一年生の夏休みにこのサイトを見つけました。
ゲーム制作に興味が出て、自分でゲームを作ろう!と思い、
龍神録のソースからいきなり学習を始めました。
プログラミングなんてしたことがないですし、最初は大変でした。
ですが、龍神録の処理をひとつひとつ追っていって、
理解できないところは調べて次へ進む・・・というのを繰り返し、
夏休み中に龍神録の処理が一通り分かるようになりました。
多分こんな方法で学習する人は少ないと思いますし、
現在の自分を見ても基礎から固めた方が良かったと思っています。
ゲーム作るだけなら良かったかもしれませんが、自分はもうすぐ授業でプログラミングがありました。
そのため基礎を復習し直す羽目になりました。
ちなみに、龍神録のようなSTGを作る際に使う数学的知識は
高校一年生の範囲だったので、学校での数学、物理が非常に簡単になりました。(要は三角関数です)
#レーザー部を除いてです。orz
まだ学習していない範囲とかだと、自分で頑張らないといけないかもしれません。
ですが、一度関数化とかしてしまえば後は使うだけなので理解できていなくても誰かが考えてくれた式を利用すればゲームは作ることができると思います。(実際、自分も未だにレーザーの当たり判定の計算方法を理解していません)
しかし、自分でゲームを一から作るのであれば、理解していないと厳しいかもしれません。
295ポイント を手に入れた。
|
|
|
|
|
Name: Mikan [URL] ..初心者(7,317ポイント)
Date: 2009/04/08(水) 23:49
No:31923
|
|
Title: Re:将来ゲームを作るにあたって・・・
|
|
C言語で言えば
printf:scanf:ifが解れば簡単なゲームは作れます。
勉強するにあたって、覚えたい!だけでは続かないことが多いです。
仮にSTGを作りたいと思えば、このサイトをで勉強してSTGを作りながらC言語を学ぶ方が充実感があると思います。
ゲームを作りたいという目標があれば、最初っから完成度の高いものは作れないので、途中で挫折こともあると思いますが、それによって学ぶことのほうが多いです^^
局所で解らないことがあれば、この掲示板で質問をすれば回答があると思いますので、先のことは考えずに色々作ってみてはいかがでしょうか?
勉強の仕方は賛否両論ありますが、私は作りたいものを作りながら覚えていくのが好きです^^
166ポイント を手に入れた。
|
|
|
|
|
Name: kerotan0820 ..入門者(4,858ポイント)
Date: 2009/04/09(木) 00:58
No:31924
|
|
Title: Re:たくさんの回答ありがとうございます
|
|
本当にたくさんの回答をありがとうございます。
大体皆さんからの回答が一致していたので、僕の率直な全体への新たな質問などを書きたいと思います。
今ここをみて僕はとても迷っています。
僕がC言語を始めて知ったのは中学2年生のはじめの時期で、今から地道にやれば3年の初めにはちょっとしたゲーム製作ができてるかなと思っていたのですが、思った以上に環境を作ることなどに手間がかかって、挫折気味の日々をすごし結局本格的にはじめようとし始めたのが今です。
今からC言語の基礎を作っていくべきか・・・
それともそんなにあせらず、本格的なゲームは高校のうちにできればよい、それまではC言語をやろうという二つの考えがあります。
そこでこれはどうかなという案がひとつだけあります…
DXライブラリは無理をせずに地道に進め、メインをC言語とする…
僕はブログで学習範囲をまとめてるのですが(http://clanguage.blog20.fc2.com/)C言語をまとめながらDXライブラリも地道にまとめつつでやろうかなと思っています。
>>じゃんけんゲームなどの簡単なゲームを作るとよい
C言語を繰り返し文などまで事実上一応進めていますが、本来そこまでの範囲で作れるはずのじゃんけんゲームやちょっとした計算ソフトが作れる実力がないです。
僕が使用してる本にはprintf関数はもちろんすぐ出ますが、こちらが入力したのに大して何らかの処理をするという関数などの説明は見た限りまったくないのです。本を二冊持っていますが一冊にはこういった欄がありました。
"合計と平均を求める"
このプログラムの内容はこうでした
各表示された教科の点数を入力し、その合計と平均を求めるというものです。
このような知識を徹底的に身につければよいのでしょうか。
何の計画性もなしにプログラミングに触れ始めたために今僕がこうなっているのでしょうけど、今目標を決めたいと思います。
あとひとつ・・・
Visual C++2008でC言語の勉強をする際の設定などはどうなるのでしょうか。
DXライブラリの際とはやはり設定は違いますよね?
長々とすみませんでした・・・
566ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(80,008ポイント)
Date: 2009/04/09(木) 01:36
No:31925
|
|
Title: Re:たくさんの回答ありがとうございます
|
|
>本格的なゲームは高校のうちにできればよい、それまではC言語をやろう
ゲーム制作≠C言語勉強
っと考えているようですが、そうではないですよ。
確かに大規模は難しいかもしれませんが、
数当てゲーム、ジャンケンゲームは
srand,scanf,printf,条件文(if,for,while,switch)が理解できれば作れます。
これにDXライブラリを使えば画像・音楽を用いたゲームができます。
これで立派なゲームです。
Blogを拝見しましたが、すでにDXライブラリでDrawGrapgはつかえているようです。
(LoadGraphScreen()は不具合が出る恐れがあるので、LoadGraph→DrawGraph()のがよい)
基礎を積むのはよいことです。その途中で、ちょっと凝ってみようかな。
って思ったらそっちにそれていっても全然よいと思います。
そのゲームを組んでみて、
「文字列を引数にしたいなぁ・・・」
「なんか主人公のデータが多くて管理しづらい。。おっ、そういえば構造体ってやつが・・・」
なんてなったらまたC言語の基礎に戻ってくれば良いです。
本を眺めているよりは、実践で悩むほうが各段に早く理解できます。
>C言語をまとめながらDXライブラリも地道にまとめつつでやろうかな
もし早くゲームが作りたい(or C言語を早く習得したい)なら、これはあまりオススメができません。
ものすごく時間がかかると思います。
今自分が「C言語まとめよう!」
なんて考えだしたら、学校もあるから3ヶ月はほしいですね・・・w(まだ理解度が低いのでまとめられない・・・w)
もし、他人に教えるつもりでならなおさらプログラミング経験を積んでからです。
〜変更〜
>Visual C++2008でC言語の勉強をする際の設定などはどうなるのでしょうか。
「新規プロジェクト」→「全般 空のプロジェクト」で大丈夫です。
744ポイント を手に入れた。
|
|
|
|
|
Name: kerotan0820 ..入門者(4,962ポイント)
Date: 2009/04/09(木) 02:08
No:31928
| 解決!
|
Title: Re:たくさんの回答ありがとうございます
|
|
ありがとうございます
調べてみます^^
結果をまとめると・・・
・C言語を勉強する
にしましたw
DXライブラリも暇つぶしくらいの感覚でじみちーにやりますけどね^^w
いろいろとありがとうございました
118ポイント を落としてしまった。
|
|
|
|
Name: 狼太郎 ..かけだし(1,467ポイント)
Date: 2009/04/08(水) 20:23
No:31909
|
|
Title: プログラム実行しても
|
|
#include"DxLib.h"
struct shot{
int x,y,flag;
};
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nShowCmd){
ChangeWindowMode(TRUE);
if(DxLib_Init()==-1) return -1;
int i=0;
char key[256];
int count=0;
int image[16];
GetHitKeyStateAll(key);
LoadDivGraph("char.png",16,4,4,32,32,image);
struct shot tama[10];
SetDrawScreen(DX_SCREEN_BACK);
for(i=0;i<10;i++){
tama[i].flag=0;
tama[i].x=640/2; tama[i].y=480;
}
while(1){
if(ProcessMessage()==-1)break;
ClearDrawScreen();
if(count<5)
count++;
else if(key[KEY_INPUT_RETURN]==1){
count=0;
for(i=0;i<10;i++){
if(tama[i].flag==0){
tama[i].flag=1;
break;
}
}
}
for(i=0;i<10;i++){
if(tama[i].flag==1){
tama[i].y-=8;
DrawGraph(tama[i].x,tama[i].y,image[1],TRUE);
if(tama[i].y<-32){
tama[i].y=480;
tama[i].flag=0;
}
}
}
if(key[KEY_INPUT_ESCAPE]==1)break;
ScreenFlip();
}
DxLib_End();
return 0;
}
実行しても真っ暗でなにも出てきません・・
どこか間違っているらしいのですが・・よく分からないので質問しました。
アドバイスくださるとうれしいです。
440ポイント を手に入れた。
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(78,819ポイント)
Date: 2009/04/08(水) 21:56
No:31915
|
|
Title: Re:プログラム実行しても
|
|
ちょっと見落としていました。。
>GetHitKeyStateAll(key);
不定置ではないですね。ちゃんと一回は呼び出しているので
key[]には0が格納されてます。。
GetHitKeyStateAll(key);
これは毎ループ検査しないといけません。
(ちょっと入れ子になってしまい、すみません。。)
107ポイント を手に入れた。
|
|
|
|
|
Name: 狼太郎 ..かけだし(1,517ポイント)
Date: 2009/04/08(水) 22:03
No:31916
| 解決!
|
Title: Re:プログラム実行しても
|
|
できましたwありがとうございます!
毎回読み込まなくてはいけなかったんですね・・覚えておきます
36ポイント を手に入れた。
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(75,744ポイント)
Date: 2009/04/06(月) 03:41
No:31794
|
|
Title: テトリス動作チェックのお願い
|
|
題名の通り、C++でちょこちょこつくっていたテトリスが最低限完成したので、
動作チェックをお願いしたく、参上しました^^
まず初めに、音が出るので注意してください^^;
LeadMeに詳しい操作等は書いてあるので、そちらを参照してください。
不具合、不都合等ございましたら、ご報告いただけうとありがたいです。
動作がよさそうなら、機能を追加し、
コードをきれいにしたら、前回のようにまたコードをUPし、組み方に
突っ込んでもらいたいと思っています。
っというか、前回Justyさん、たかぎさんにアドバイスして下さった点に
ちょこちょこ変なのがついたっという感じになっていますが。。
外部変数は使わないのモットーで組みましたが、
何をメンバにして
何をメンバ関数にして
何を静的変数にして
・・・
などが混乱しています。
そして、基本的にシングルトンから成り立っているクラスばかりなんですが・・・
これがいいのかどうか^^;
コピー禁止、二重生成・解放禁止等は前回のJustyさんのプログラムを
見よう見まねで作ってますが、はたして、オブジェクト指向で組めているのかどうか・・・
ここは次回お願いします。
DL先(バグ発見により、停止します)
523ポイント を落としてしまった。
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(75,956ポイント)
Date: 2009/04/06(月) 04:28
No:31795
|
|
Title: Re:テトリス動作チェックのお願い
|
|
追記です。。
ゲームは赤ライン超えた瞬間に強制的に終了です^^;
PAUSEはエンターキー、強制終了はエスケープです。
今回の作品を作るのにあたって、
以前バグさんが作られたテトリスをかなり参考にさせていただきました。(動作、画面構成等)
っといか、もろかぶりです^^;すみません。。
時には動作を参考するためにウン時間とはまったり・・・
ここからオリジナリティをつけていきますので^^;
212ポイント を手に入れた。
|
|
|
|
|
Name: BEMANI ..プログラマー(25,674ポイント)
Date: 2009/04/06(月) 05:10
No:31796
|
|
Title: Re:テトリス動作チェックのお願い
|
|
>>kazuoniさん
URLをそのままクリックするとアクセス禁止されてしまいました。
アドレスバーに張れば問題はなかったです。
気になった点・・・
赤ライン付近にブロックがある状態で消した時、ブロックの落ち方が変でした。
落ちると言うか、ブロックが増えました・・・。
再現例ですが、一番左の列に適当にブロックを置いていき、
赤ライン付近(またはぴったり)で置くのをやめ、とりあえず一列消してみて下さい。
赤ラインを越してしまった状態で、ブロックが消せる状態でも強制終了しました。
消えてから判定する方がいいのではないかな〜と思いました。
後はLeadMe.txtのスペルが違うくらいでした;;
正しくはReadMeです。(Leadだと先導といった意味です・・・)
276ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(154,929ポイント)
Date: 2009/04/06(月) 08:55
No:31798
|
|
Title: Re:テトリス動作チェックのお願い
|
|
お、よくできてますね♪(^o^)b
ラインが消えるときの処理とかもキレイにつくってますねぇ…私はあの手の演出部分を作りこむのが面倒な人なので…(^_^;)
1つだけ個人的に気になったのが、ハードドロップ後に動かせてしまうのが気になるかなぁ…?
これも遊び手の好みの問題であってバグではないので、限りなくイチャモンに近いですが(苦笑)
116ポイント を落としてしまった。
|
|
|
|
|
Name: hss12 ..初心者(8,587ポイント)
Date: 2009/04/06(月) 11:34
No:31804
|
|
Title: Re:テトリス動作チェックのお願い
|
|
既出以外で気になったのは
左右下のボタンを長押ししたときにブロックが動き始めるまでに
少しタイムラグがあり非常にストレスがたまります。
製品版をけっこうやりこんでいるのでとても気になります。
ハードドロップは反応良いのですが。
あと、せめてNEXTがないと組み方が変わってくるのでやりこめないです。
99ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(77,158ポイント)
Date: 2009/04/06(月) 12:23
No:31811
| 解決!
|
Title: Re:テトリス動作チェックのお願い
|
|
プレイしていただき、ありがとうございます^^
>BEMANIさん
>アクセス禁止
大変失礼しました。。直だとこうなるんですね^^;
>ブロックの落ち方
むむっ。これはフィールドコピーで規定回数コピーできていないのが
原因でした。。
>LeadMe
大学生として、お恥ずかしい限りです。。
>バグさん
>ラインが消えるときの処理
クラス化してるおかげか、修正が少しで済むので、
数通り消去を実装しましたが、これが一番しっくりきました^^;
設定等で変更できるようにしたりっとも考えてます。
>ハードドロップ後に動かせてしまう
本家は動かせないんでしたっけ?
ここはオプションで有無を設定できるようにしておきます。
(ゴーストを出す場合はなしでいいかと思いますが、ゴーストなしだと自分は落としミスするので・・・w)
>hss12さん
>長押し
本家をプレイした事がなかったもので。。大変失礼しました。。
タイムラグを今の1/3〜半分に変更します。
>NEXT
これからすぐに実装します!
っといっても表示するだけですが^^;(すでに実装済み)
今後、キャラとかを画面外に割り込ませていこうかと
思っており、まだその構成ができていなかったので、ホールド、NEXTは
まだ未実装になってました。。
本当にご指摘ありがとうございます。
ご意見を参考に、完成版を数日後(?)にUPしたいと思います!
今回はこれで一応解決にさせていただきますが、
まだ何かお気づきの点がりましたら、書き込んでいってください!
最後に、プレイしていただいた皆様、本当にありがとうございました!
次回もよろしくお願いします。
追記
もしこんなのがあったらいいなっていうのがありましたら、
これも書き込んでいってください^^;
今後は
・NEXT×3
・ホールド
・ゴースト
・得点
・ステージ性(これはどこまで凝るか分かりませんが・・・)
・ハイスコア
等を予定してます。
2倍のポイントを手に入れた! 1,202ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(154,854ポイント)
Date: 2009/04/06(月) 14:26
No:31815
|
|
Title: Re:テトリス動作チェックのお願い
|
|
>>ゴーストを出す場合はなしでいいかと思いますが、ゴーストなしだと自分は落としミスするので・・・w
これはグリッドのようなものを表示してやればいいんじゃないでしょうか?
グリッド表示するだけで、落としミスは激減すると思いますよ(^-^)
75ポイント を落としてしまった。
|
|
|
|
|
Name: Mato ..ぴよぴよ(541ポイント)
Date: 2009/04/06(月) 18:08
No:31823
|
|
Title: Re:テトリス動作チェックのお願い
|
|
本家ですと、詰まった所でテトリミノの向きを変え(zorxキー)ても、適当にブロックを勝手に移動させてくれます。
細かく検証したことはないので、どういうアルゴリズムなのか想像つかないんですが……
あと、ハードドロップ後に動かすことは本家では無理ですよー。
上手くなると速さ勝負の面が強くなってきますしね。
ともあれ、よく出来ていると思います。
ステージに期待させて頂きますっ(´▽`)
94ポイント を手に入れた。
|
|
|
|
|
Name: dic ..上級者(17,490ポイント)
Date: 2009/04/06(月) 18:19
No:31824
|
|
Title: Re:テトリス動作チェックのお願い
|
|
横槍ですいませんが
jpg機能を使われてます
著作権の表示がないようなのでその点のみ書き込みさせていただきます
ライセンスについて
http://homepage2.nifty.com/natupaji/DxLib/dxlicense.html
より
・下記の機能を使用した場合は、配布するソフトウエアのドキュメント等に各機能に応じた
著作権表示を含めてください。
JPEG 画像を読みこむ機能を使用した場合
libjpeg Copyright (C) 1991-1998, Thomas G. Lane.
this software is based in part on the work of the Independent JPEG Group.
231ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(77,616ポイント)
Date: 2009/04/06(月) 18:48
No:31825
|
|
Title: Re:テトリス動作チェックのお願い
|
|
ご回答ありがとうございます!
ですが、ありえないほど大きなバグを先ほど発見したので、
修正次第またUPします。
メインフィールドに食い込む動作を発見しましたorz
もしかしたらまずいことになるかもしれないので、
DLしてくださった皆様には、大変申し訳ないのですが、
ごみ箱に捨ててください^^;
>Matoさん
>適当にブロックを勝手に移動
その実装よりバグが出ました・・・。
自分はミノ回転軸中心にx,y共に±1のメインフィールド
を下からすべて探査して、置けるようならそこへっというようにしています。
(バグ出てますが・・・w)
今回実装したSpinは本家より探査範囲が1狭い事がわかったので、
再度実装しなおしてきます。
>ステージに期待させて頂きます
できる限り今まで見たことのないテトリスかつ
本来のシンプルさを失わないようにするつもりです。(・・・難しい・・・)
>dicさん
>ライセンスについて
かなり重要な忠告本当にありがとうございます!
DXライブラリの注意書きをしっかり読んでませんでした。。
次回は熟読して、不足がないように心がけます。
ッというわけで、DL停止します^^;
458ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(155,001ポイント)
Date: 2009/04/07(火) 18:40
No:31871
|
|
Title: Re:テトリス動作チェックのお願い
|
|
私も以前公開して中途半端に放ってあるテトリス(ちなみに開発言語はC#で.NET使ってます)を修正しようかなぁ…とか思いつつ、タイトル画面だけ作ってみました。完成はもう少し先かなぁ…(^_^;)
>>kazuoniさん
便乗レスでごめんなさいm(__)m
115ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(77,787ポイント)
Date: 2009/04/07(火) 18:50
No:31873
|
|
Title: Re:テトリス動作チェックのお願い
|
|
な、なんと・・・。
自分のやつがすごくアナログに見えます・・・w
完成楽しみにしています!
#現在本家とは違って、メインフィールドの大きさを変えれるような
(サイズしかり、フィールドの幅・高さもしかり[10*20]⇔[20*40]とか)
仕様にしてますが、まったく考慮していなかったので、ちょこちょこと修正作業に追われてます・・・
101ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(155,068ポイント)
Date: 2009/04/07(火) 19:18
No:31874
|
|
Title: Re:テトリス動作チェックのお願い
|
|
私がフィールドのサイズ変更を実装するならば、フィールド管理クラスのコンストラクタに縦・横の幅を引数で渡してブロック情報を格納する領域を動的に確保するかな?
で、縦・横幅の数値を取得するためのアクセッサも実装しておけば、他クラスから情報を知る事ができるので便利かな?とか思います。
67ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(78,274ポイント)
Date: 2009/04/07(火) 21:50
No:31875
|
|
Title: Re:テトリス動作チェックのお願い
|
|
>ブロック情報を格納する領域を動的に確保する
ちょっと自分の構想の中で、
ステージがいきなり大きくなるとかってのもちょっとだけ考えていて、(^^;)
先にある程度大きく確保することを採用しました。
大した大きさではなく、bool型なのでいいかなって思いまして^^;(30*72ぐらい)
フィールド操作も範囲を決めてめすので、無駄な探査ないですし。
(ただ、使わない配列がたくさんあるんですよね・・・)
>、フィールド管理クラス
>縦・横幅の数値を取得するためのアクセッサ
まさにそのとおりに実装しました!
一つ質問なのですが・・・
static const int型の変数っというのは普通どこに書きますか?
外部変数で扱っても問題はないんでしょうか?
なんだか自分は外部変数が良くないっという認識しかないので、
以下のように実装したのですが・・・
class GlobalConst{
public:
static const int ONE_CELL_SIZE=20;
static const int MAIN_FIELD_X=100;
static const int MAIN_FIELD_Y=480;
.....
};
class A : public GlobalConst{...};
こんな使い方はおかしいですかね?^^;
487ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(76,701ポイント)
Date: 2009/04/07(火) 22:12
No:31876
|
|
Title: Re:テトリス動作チェックのお願い
|
|
class GlobalConst{
public:
enum {
ONE_CELL_SIZE = 20,
MAIN_FIELD_X = 100,
MAIN_FIELD_Y = 480,
.....
};
};
列挙体としての使い方ではないけれど、こういう方法があります。
81ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(78,579ポイント)
Date: 2009/04/08(水) 20:09
No:31908
|
|
Title: Re:テトリス動作チェックのお願い
|
|
DLさせていただきました!
いやー。頭が上がりませんw
素晴らしいの一言です^^;
レベルが高い時はいいのですが、
低い時にちょっと横の動きが若干早いかなって思ったりするのですが・・・
本家をプレイした事がないので個人的な意見です^^;
やはりサウンドが付くと一気にゲームらしくなりますね。
自分も作業をしたいんですが・・・学校が始まるっという残念さ。。
(本業なんだからしかたがないですけど。。)
ゆっくり作業進めていきます
制作お疲れ様です!
212ポイント を手に入れた。
|
|
|
|
Name: 昴 ..入門者(3,450ポイント)
Date: 2009/04/08(水) 18:39
No:31902
|
|
Title: printf
|
|
こんにちは。いつもお世話になっています。
C言語は初心者で、テキストを見ながら進めています。
Windowsのvistaを使っています。
・今回の質問は、テキストに載っていた、「printfの引数には、最初に文字列を与えます。この文字列の中は、
%dや%sといった書式指定が含まれています。実際に出力される文字列は%dや%sといった書式指定の部分は、
printfの第2引数以降に指定された値に、変換されて出力されます。つまり、最初の文字列中に含まれる%の数だけ、引数が必要になります。」とあったのですが、
・printfの引数には、最初に文字列を与えるとはどういうことでしょうか?
printf( "%d", 3 ); この場合の3は引数になるのですよね?この引数に文字列を与えるということでしょうか?
・printfの第2引数以降に指定された値に、変換されて出力されます。
どうして、第2引数以降なのでしょうか?第1引数はどうしたのでしょうか?
よろしくお願いします。
177ポイント を手に入れた。
|
|
|
|
Name: 昴 ..入門者(3,480ポイント)
Date: 2009/04/08(水) 19:03
No:31907
| 解決!
|
Title: Re:printf
|
|
すいません、初歩的なことでした^^;
解答ありがとうございました。
30ポイント を手に入れた。
|
|
|
|
Name: 昴 ..入門者(3,169ポイント)
Date: 2009/04/07(火) 11:20
No:31845
|
|
Title: clock関数
|
|
こんにちは。いつもお世話になっています。
C言語は初心者で、現在テキストを参考にしながら進めています。
WindowsのVistaを使っています。
今回の質問は、clock関数を用いて、xミリ秒経過するのを待つ関数に関してです。
int sleep( unsigned long x )
{
clock_t c1 = clock(), c2;
do {
if ( ( c2 = clock() ) == ( clock_t ) -1 ) {
return ( 0 );
}
} while ( 1000.0 * ( c2 - c1 ) / CLOCKS_PER_SEC < x );
return ( 1 );
}
・( clock_t ) -1 というのはclock_t型でキャストされた-1とテキストにあったのですが、-1はどういう意味があるのでしょうか?よろしくお願いします。
304ポイント を手に入れた。
|
|
|
|
Name: 昴 ..入門者(3,215ポイント)
Date: 2009/04/07(火) 12:08
No:31848
|
|
Title: Re:clock関数
|
|
解答ありがとうございます。
すいません、もう一つ質問がありました。
・どうして、1000.0を掛けるのでしょうか?
46ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(76,620ポイント)
Date: 2009/04/07(火) 12:22
No:31849
|
|
Title: Re:clock関数
|
|
clock 関数は文字通りクロック時間を返すので、 CLOCKS_PER_SEC を使って秒単位に変換します。
second = ( c2 - c1 ) / CLOCKS_PER_SEC; // 秒単位に変換
今回必要としているのはミリ秒なので、
一度経過クロック時間に 1000 を掛けてから CLOCKS_PER_SEC で割ることにより、
単位をミリ秒に変換しています。
milli_second = 1000 * ( c2 - c1 ) / CLOCKS_PER_SEC; // ミリ秒単位に変換
ちなみに上の式の計算順序では小数点以下は計算に影響がないため、
1000 にしても計算結果は変わりません。
223ポイント を手に入れた。
|
|
|
|
|
Name: 昴 ..入門者(3,239ポイント)
Date: 2009/04/07(火) 15:46
No:31853
| 解決!
|
Title: Re:clock関数
|
|
めっちゃ、理解出来ました。
ありがとうございました。
24ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..プログラマー(29,640ポイント)
Date: 2009/04/08(水) 08:37
No:31885
|
|
Title: Re:clock関数
|
|
xの値によっては1000 * ( c2 - c1 )がclock_t型をオーバーフローする可能性を考えてdouble型にしているのでは
CLOCKS_PER_SECが1000000ならその可能性も高くなりますし
78ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(76,836ポイント)
Date: 2009/04/08(水) 14:33
No:31887
|
|
Title: Re:clock関数
|
|
> xの値によっては1000 * ( c2 - c1 )がclock_t型をオーバーフローする可能性を考えてdouble型にしているのでは
そういえば CLOCKS_PER_SEC の値を見ていませんでした。
1000000 なら、2147 ミリ秒を超えたらオーバーフローしますね。
(clock_t が long 型の場合)
milli_second = (unsigned long)(1000ULL * ( c2 - c1 ) / CLOCKS_PER_SEC);
で、 64bit で計算しても回避可能ですね。
135ポイント を手に入れた。
|
|
|
|
|
Name: 昴 ..入門者(3,273ポイント)
Date: 2009/04/08(水) 18:18
No:31898
|
|
Title: Re:clock関数
|
|
>1000000 なら、2147 ミリ秒を超えたらオーバーフローしますね。
これって、どういう意味ですか?
34ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(77,648ポイント)
Date: 2009/04/08(水) 18:44
No:31903
|
|
Title: Re:clock関数
|
|
32bit符号付き(long型)の場合、 1000000 * 2147 では、
2147000000 と正しく計算されるのですが、
1000000 * 2148 となると、
-2146967296 となってしまいます。(これがオーバーフロー)
これは、最初に提示されている sleep 関数で 1000.0 を 1000 にした場合
0 〜 2147 ミリ秒までしか正しく処理されないということになります。
もし、2148 以上を指定した場合は、オーバーフローで負数になっているため、
2148 ミリ秒までしか待ってくれません。
そのため、 2147 ミリ秒以上待つ可能性がある場合は提示されている関数のままの状態か、
経過時間の計算時に 64bit 整数として計算するように直すといいと思います。
2倍のポイントを手に入れた! 600ポイント を手に入れた。
|
|
|
|
Name: 煌 ..ぴよぴよ(336ポイント)
Date: 2009/04/08(水) 17:51
No:31892
|
|
Title: 困っています!!助けてください。
|
|
#include <stdio.h>
main()
{
printf("This is a test!");
}
上記の文をデバック開始しようとすると下記のようなエラーになってしまいます。
(Visual C++ 2008 Express Edition使用)
------ ビルド開始: プロジェクト: fms, 構成: Debug Win32 ------
コンパイルしています...
a.cpp
c:\documents and settings\xxx\デスクトップ\a\a.cpp(3) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
ビルドログは "file://c:\Documents and Settings\xxx\デスクトップ\a\Debug\BuildLog.htm" に保存されました。
fms - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
295ポイント を手に入れた。
|
|
|
|
Name: toyo ..プログラマー(29,900ポイント)
Date: 2009/04/08(水) 18:05
No:31894
|
|
Title: Re:困っています!!助けてください。
|
|
関数の戻り値が指定されてないというエラーです
int main()
とmain関数の戻り値をintに指定してください
またmain関数の終わりに
return 0;
を追加してください
2倍のポイントを手に入れた! 160ポイント を手に入れた。
|
|
|
|
|
Name: ouh ..入門者(3,569ポイント)
Date: 2009/04/08(水) 18:08
No:31895
|
|
Title: Re:困っています!!助けてください。
|
|
とりあえず、main の前に int と書いて main 関数の最後に return 0;
と書けばいいかと思います。
あわてないでしっかり勉強しましょう。
68ポイント を手に入れた。
|
|
|
|
|
Name: 煌 ..ぴよぴよ(342ポイント)
Date: 2009/04/08(水) 18:16
No:31897
| 解決!
|
Title: Re:困っています!!助けてください。
|
|
皆さんありがとうございました。
助かりました。
6ポイント を手に入れた。
|
|
|
|
Name: ふぁんとむ ..入門者(4,983ポイント)
Date: 2009/04/08(水) 15:46
No:31889
|
|
Title: ブロック崩し
|
|
テキスト本を一冊終え、コチラの龍神録を半分ほど進めたところで、一旦区切りを付けて現在VC++2008で『ブロック崩し』を1から作成しています
方々を参考に何とか三角関数を利用してボールの角度を算出することに成功したので、ボールの発射角度を主導で変化させられるようにしようと、変更を加えているところなのですが、その際にビリヤードゲームのように軌道予測を表示させようと四苦八苦しています
ボールの角度変更そのものは問題なく動作するのですが、予測角度の方が自機に当たったら跳ね返るように表示したいのですが、どうやっても自機を素通りしてしまいます
void ball_move()
{
double x1, x2, y1, y2;
//画面枠との当たり判定
if (ball.x>FMX-8 || ball.x<FX+3)
{
se_flag[0]=1;
ball.mx*=(-1);
}
if (ball.y>FMY-8 || ball.y<FY+3)
{
se_flag[0]=1;
ball.my*=(-1);
}
if (ball.x>rod.x && ball.x<rod.x+rod.cnt*8 && ball.y+8>RY && ball.y<RY+4)
{
se_flag[0]=1;
ball.my=ball.my*(-1);
}
//ブロックとの当たり判定
for (int y=0; y<BMY; y++)
{
for (int x=0; x<BMX; x++)
{
x1=block[y][x].x-16; x2=block[y][x].x+16;
y1=block[y][x].y-8; y2=block[y][x].y+8;
if (block[y][x].flag>0)
{
//ブロック左右判定
if (x1<ball.x && x2>ball.x && ball.y>y1 && ball.y<y2)
{
ball.mx*=-1;
if (block[y][x].power<10)
{
block[y][x].power--;
if (block[y][x].power<1)
{
block[y][x].flag=0;
se_flag[2]=1;
} else {
se_flag[1]=1;
SetDrawBlendMode(DX_BLENDMODE_MUL,0);
DrawBox(x1, y1, x2, y2, GetColor(191, 191, 191),TRUE);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
}
} else se_flag[1]=1;
break;
}
//ブロック上下判定
if (ball.x>x1 && ball.x<x2 && ball.y+4>y1 && ball.y-4<y2)
{
ball.my*=-1;
if (block[y][x].power<10)
{
block[y][x].power--;
if (block[y][x].power<1)
{
block[y][x].flag=0;
se_flag[2]=1;
} else {
se_flag[1]=1;
SetDrawBlendMode(DX_BLENDMODE_MUL,0);
DrawBox(x1, y1, x2, y2, GetColor(191, 191, 191),TRUE);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
}
} else se_flag[1]=1;
}
}
}
}
//移動計算
if (ball.flag>0)
{
ball.x+=fcos[ball.angle]*ball.mx*ball.speed;
ball.y+=fsin[ball.angle]*ball.my*ball.speed;
//待機処理
} else {
//上が押されたら発射方向を右へ
if (CheckStatePad(configpad.up)>0)
{
ball.angle+=2;
if(ball.angle>=310) ball.angle=310;
}
//下が押されたら発射方向を左へ
if (CheckStatePad(configpad.down)>0)
{
ball.angle-=2;
if(ball.angle<=45) ball.angle=45;
}
//軌道予測
shot.cnt++;
if (shot.cnt%50==0)
{
shot.x =ball.x;
shot.y =ball.y;
shot.my =ball.my;
}
if (shot.x>rod.x && shot.x<rod.x+rod.cnt*8 && shot.y+8>RY && shot.y<RY+4)
{
shot.my=shot.my*(-1);
}
//予測軌道の表示
shot.x+=fcos[ball.angle]*ball.mx;
shot.y+=fsin[ball.angle]*ball.my;
//発射ボタンが押されたら、発射
if (CheckStatePad(configpad.shot)>0)
{
ball.flag=1;
shot.flag=0;
}
//ボールの待機位置
ball.x=fcos[ball.angle]+(rod.x+(rod.cnt*8)/2);
//ball.x=rod.x+(rod.cnt*8)/2;
}
}
void first_ini()
{
stage_count =1;
configpad.down =0;
configpad.left =1;
configpad.right =2;
configpad.up =3;
configpad.shot =4;
configpad.jump =5;
configpad.change=6;
configpad.start =13;
rod.x =FMX/2-16;
rod.speed =4;
rod.cnt =6;
for(int i=0; i<360; i++)
{
fsin[i]=(float)sin(i*PI/360);
fcos[i]=(float)cos(i*PI/360);
}
ball.flag =0;
ball.speed =3;
ball.angle =45;
ball.x =rod.x+(rod.cnt*8)/2;
ball.y =RY-16;
ball.mx =cos(ball.angle*PI);
ball.my =sin(ball.angle*PI/2);
shot.x =ball.x;
shot.y =ball.y;
shot.my =ball.my;
shot.flag =1;
shot.cnt =0;
}
現在の問題点としては…
・予測軌道が上手く表示されない
//予測軌道の表示
shot.x+=fcos[ball.angle]*ball.mx;
shot.y+=fsin[ball.angle]*ball.my;
のところを
//予測軌道の表示
shot.x+=fcos[ball.angle]*ball.mx;
shot.y+=fsin[ball.angle]*shot.my;
と変更すると、表示角度が水平になってしまったりしまいます
・ボールがたまにありえない動きをする
ブロックは画像幅で当たり判定を取っているのに対し、ボールはDrawRotaGraphFの表示位置で当たり判定をとっているせいか、ブロックの角に当たってブロックを2つ消して同じ軌道を戻ってしまったり、ブロックを上下にジグザグ移動しながら水平にブロックを消しながら進んだりする
当面、問題がありそうな部分をコピペしておきましたが、プロジェクトそのものを添付しておいた方がよいでしょうか?
http://www1.axfc.net/uploader/H/so/74134
DL PASS:block
↑にプロジェクトを上げさせていただきました
お力添えいただきますようお願いしますm(__)m
1,745ポイント を手に入れた。
|
|
|
|
Name: toyo ..プログラマー(29,740ポイント)
Date: 2009/04/08(水) 16:12
No:31890
|
|
Title: Re:ブロック崩し
|
|
プロジェクト丸ごとあったほうが実際に動作させて確認できるのでわかりやすいと思います
とりあえず
fsin[i]=(float)sin(i*PI/360);
は
fsin[i]=(float)sin(i*2*PI/360);
ではないでしょうか
floatならsinf( )やcosf( )という関数もありますが中身は(float)sin( )のマクロだったりするので結局一緒ですかね
100ポイント を手に入れた。
|
|
|
|
Name: X ..かけだし(1,833ポイント)
Date: 2009/04/07(火) 16:35
No:31855
|
|
Title: 教えてください。
|
|
プログラムを作り無事にエラーを出さずにコンパイルに成功したのですが、実行すると望んでいたプログラムと違いました・・・・
自分なりに違うところを考えてみたのですが結局どこが間違っているのかわからなかったのでヒントを下さい><
答えを教えてもらうと成長しないのでヒントでお願いします。
たぶんアルゴリズムが違うと思うのですが・・・・
//日常英会話穴埋め問題//
#include <stdio.h>
int main(void)
{
int answer_no=0; //問題数//
char user_answer=0; //アプリ利用者の答えを代入する変数//
char apri_answer=0; //アプリ本体の答えを代入する変数//
int correct=0; //正解数を格納する変数//
printf("日常英会話問題\n");
while(answer_no != 10)
{
if(answer_no == 0)
{
printf("【問.1】日曜日どこで待ち合わせしますか?:");
printf("Where shall we ( @ ) on Sunday?\n");
scanf("%c",&user_answer);
apri_answer='meet';
if(user_answer == apri_answer)
{
correct=correct+1;
}
}
else if(answer_no == 1)
{
printf("\n【問.2】そこにはどうやって行けますか?:");
printf("How do I ( A ) there?\n");
scanf("%c",&user_answer);
apri_answer='get';
if(user_answer == apri_answer)
{
correct=correct+1;
}
}
else if(answer_no == 2)
{
printf("\n【問.3】私の名前は覇王です。つづりはエイチ・エー・オーです。:");
printf("My ( B ) is Hao, it\'s spelled H-O-A.\n");
scanf("%c",&user_answer);
apri_answer='name';
if(user_answer == apri_answer)
{
correct=correct+1;
}
}
else if(answer_no == 3)
{
printf("\n【問.4】どちらへ行かれますか?:");
printf("Where would you ( C ) to go?\n");
scanf("%c",&user_answer);
apri_answer='like';
if(user_answer == apri_answer)
{
correct=correct+1;
}
}
else if(answer_no == 4)
{
printf("\n【問.5】道に迷ってしまいました。:");
printf("Excuse me. I have ( D ) my way.\n");
scanf("%c",&user_answer);
apri_answer='lost';
if(user_answer == apri_answer)
{
correct=correct+1;
}
}
else if(answer_no == 5)
{
printf("\n【問.6】ドライブへ行こうよ。:");
printf("Let\'s ( E ) for a drive.\n");
scanf("%c",&user_answer);
apri_answer='go';
if(user_answer == apri_answer)
{
correct=correct+1;
}
}
else if(answer_no == 6)
{
printf("\n【問.7】もっとゆっくり話してもらえますか?:");
printf("Could you speak ( F ) slowly?\n");
scanf("%c",&user_answer);
apri_answer='more';
if(user_answer == apri_answer)
{
correct=correct+1;
}
}
else if(answer_no == 7)
{
printf("\n【問.8】英語はあまり話せません。:");
printf("I don\'t speak English very ( G ).\n");
scanf("%c",&user_answer);
apri_answer='well';
if(user_answer == apri_answer)
{
correct=correct+1;
}
}
else if(answer_no == 8)
{
printf("\n【問.9】部屋を見せていただけますか?:");
printf("May I ( H ) the room,please?\n");
scanf("%c",&user_answer);
apri_answer='see';
if(user_answer == apri_answer)
{
correct=correct+1;
}
}
else
{
printf("\n【問.10】お疲れ様でした。また明日!:");
printf("OK, thanks. ( I ) you tomorrow!\n");
scanf("%c",&user_answer);
apri_answer='see';
if(user_answer == apri_answer)
{
correct=correct+1;
}
}
answer_no++;
}
printf("以上で日常英会話問題を終了します。\n");
printf("あなたの正解数は%dです。\n",&correct);
printf("お疲れ様でした!");
return 0;
}
1,833ポイント を手に入れた。
|
|
|
|
Name: X ..かけだし(1,893ポイント)
Date: 2009/04/07(火) 16:37
No:31856
|
|
Title: Re:教えてください。
|
|
実行すると
問1は入力できて、その後は入力されずにすべて表示され、正解数もありえない数になってしまいます。
60ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(154,886ポイント)
Date: 2009/04/07(火) 16:44
No:31857
|
|
Title: Re:教えてください。
|
|
『文字』と『文字列』の違いについて調べてみることをオススメします。頑張って♪(^-^)
32ポイント を手に入れた。
|
|
|
|
|
Name: X ..かけだし(1,952ポイント)
Date: 2009/04/07(火) 16:49
No:31859
|
|
Title: Re:教えてください。
|
|
バグさん
迅速な回答ありがとうございます。
まだC言語を始めて一ヶ月も経たない初心者ですが頑張って間違ってるところを探してみます^^
59ポイント を手に入れた。
|
|
|
|
|
Name: non ..プログラマー(39,412ポイント)
Date: 2009/04/07(火) 16:51
No:31860
|
|
Title: Re:教えてください。
|
|
たくさんあるので、1つだけ・・・
apri_answer='meet';
これは、できません。
char apri_answer[20];
のように答えを入れる配列を用意し、
strcpy(apri_answer,"meet");
で、答えを代入します。
入力した答えと一致しているかは
strcmp関数を使います。
65ポイント を手に入れた。
|
|
|
|
|
Name: X ..ぴよぴよ(893ポイント)
Date: 2009/04/07(火) 17:27
No:31863
|
|
Title: Re:教えてください。
|
|
なんか編集したらすごいエラーが出てしまったのですが・・・ww
//日常英会話穴埋め問題//
#include <stdio.h>
#include <string.h>
int main(void)
{
int answer_no=0; //問題数//
char user_answer[20]; //アプリ利用者の答えを代入する変数//
char apri_answer[20]; //アプリ本体の答えを代入する変数//
int correct=0; //正解数を格納する変数//
printf("日常英会話問題\n");
while(answer_no != 10)
{
if(answer_no == 0)
{
printf("【問.1】日曜日どこで待ち合わせしますか?:");
printf("Where shall we ( @ ) on Sunday?\n");
scanf("%c",&user_answer);
strcpy(apri_answer="meet");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 1)
{
printf("\n【問.2】そこにはどうやって行けますか?:");
printf("How do I ( A ) there?\n");
scanf("%c",&user_answer[]);
strcpy(apri_answer="get");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 2)
{
printf("\n【問.3】私の名前は覇王です。つづりはエイチ・エー・オーです。:");
printf("My ( B ) is Hao, it\'s spelled H-O-A.\n");
scanf("%c",&user_answer);
strcpy(apri_answer="name");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 3)
{
printf("\n【問.4】どちらへ行かれますか?:");
printf("Where would you ( C ) to go?\n");
scanf("%c",&user_answer);
strcpy(apri_answer="like");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 4)
{
printf("\n【問.5】道に迷ってしまいました。:");
printf("Excuse me. I have ( D ) my way.\n");
scanf("%c",&user_answer);
strcpy(apri_answer="lost");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 5)
{
printf("\n【問.6】ドライブへ行こうよ。:");
printf("Let\'s ( E ) for a drive.\n");
scanf("%c",&user_answer);
strcpy(apri_answer="go");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 6)
{
printf("\n【問.7】もっとゆっくり話してもらえますか?:");
printf("Could you speak ( F ) slowly?\n");
scanf("%c",&user_answer);
strcpy(apri_answer="more");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 7)
{
printf("\n【問.8】英語はあまり話せません。:");
printf("I don\'t speak English very ( G ).\n");
scanf("%c",&user_answer);
strcpy(apri_answer="well");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 8)
{
printf("\n【問.9】部屋を見せていただけますか?:");
printf("May I ( H ) the room,please?\n");
scanf("%c",&user_answer);
strcpy(apri_answer="see");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else
{
printf("\n【問.10】お疲れ様でした。また明日!:");
printf("OK, thanks. ( I ) you tomorrow!\n");
scanf("%c",&user_answer);
strcpy(apri_answer="see");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
answer_no++;
}
printf("以上で日常英会話問題を終了します。\n");
printf("あなたの正解数は%dです。\n",&correct);
printf("お疲れ様でした!");
return 0;
}
1,096ポイント を落としてしまった。
|
|
|
|
|
Name: SCI ..上級者(22,644ポイント)
Date: 2009/04/07(火) 17:32
No:31864
|
|
Title: Re:教えてください。
|
|
strcpyの使い方に問題があるようです。
#追記
よく見たら、scanfの使用法及び配列型の扱いも混乱されていますね。
20ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(58,891ポイント)
Date: 2009/04/07(火) 17:35
No:31865
|
|
Title: Re:教えてください。
|
|
scanfとstrcpyの使い方が間違ってます。
文字列を読み込む場合は%cではあません。
strcpyの書き方はnonさんが書いてくれているけど。
あと、変数に&をつけた場合の意味についても勉強してください。
> printf("あなたの正解数は%dです。\n",&correct);
これは間違いです。
99ポイント を手に入れた。
|
|
|
|
|
Name: X ..かけだし(1,971ポイント)
Date: 2009/04/07(火) 17:38
No:31866
|
|
Title: Re:教えてください。
|
|
ありがとうございます。確認してみたところ直してエラーが出ませんでした。
//日常英会話穴埋め問題//
#include <stdio.h>
#include <string.h>
int main(void)
{
int answer_no=0; //問題数//
char user_answer[20]; //アプリ利用者の答えを代入する変数//
char apri_answer[20]; //アプリ本体の答えを代入する変数//
int correct=0; //正解数を格納する変数//
printf("日常英会話問題\n");
while(answer_no != 10)
{
if(answer_no == 0)
{
printf("【問.1】日曜日どこで待ち合わせしますか?:");
printf("Where shall we ( @ ) on Sunday?\n");
scanf("%c",&user_answer);
strcpy(apri_answer,"meet");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 1)
{
printf("\n【問.2】そこにはどうやって行けますか?:");
printf("How do I ( A ) there?\n");
scanf("%c",&user_answer);
strcpy(apri_answer,"get");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 2)
{
printf("\n【問.3】私の名前は覇王です。つづりはエイチ・エー・オーです。:");
printf("My ( B ) is Hao, it\'s spelled H-O-A.\n");
scanf("%c",&user_answer);
strcpy(apri_answer,"name");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 3)
{
printf("\n【問.4】どちらへ行かれますか?:");
printf("Where would you ( C ) to go?\n");
scanf("%c",&user_answer);
strcpy(apri_answer,"like");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 4)
{
printf("\n【問.5】道に迷ってしまいました。:");
printf("Excuse me. I have ( D ) my way.\n");
scanf("%c",&user_answer);
strcpy(apri_answer,"lost");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 5)
{
printf("\n【問.6】ドライブへ行こうよ。:");
printf("Let\'s ( E ) for a drive.\n");
scanf("%c",&user_answer);
strcpy(apri_answer,"go");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 6)
{
printf("\n【問.7】もっとゆっくり話してもらえますか?:");
printf("Could you speak ( F ) slowly?\n");
scanf("%c",&user_answer);
strcpy(apri_answer,"more");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 7)
{
printf("\n【問.8】英語はあまり話せません。:");
printf("I don\'t speak English very ( G ).\n");
scanf("%c",&user_answer);
strcpy(apri_answer,"well");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 8)
{
printf("\n【問.9】部屋を見せていただけますか?:");
printf("May I ( H ) the room,please?\n");
scanf("%c",&user_answer);
strcpy(apri_answer,"see");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else
{
printf("\n【問.10】お疲れ様でした。また明日!:");
printf("OK, thanks. ( I ) you tomorrow!\n");
scanf("%c",&user_answer);
strcpy(apri_answer,"see");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
answer_no++;
}
printf("以上で日常英会話問題を終了します。\n");
printf("あなたの正解数は%dです。\n",&correct);
printf("お疲れ様でした!");
return 0;
}
1,078ポイント を手に入れた。
|
|
|
|
|
Name: X ..入門者(2,946ポイント)
Date: 2009/04/07(火) 17:47
No:31867
| 解決!
|
Title: Re:教えてください。
|
|
できました^^
たぶんこれであってますよね?
//日常英会話穴埋め問題//
#include <stdio.h>
#include <string.h>
int main(void)
{
int answer_no=0; //問題数//
char user_answer[20]; //アプリ利用者の答えを代入する変数//
char apri_answer[20]; //アプリ本体の答えを代入する変数//
int correct=0; //正解数を格納する変数//
printf("日常英会話問題\n");
while(answer_no != 10)
{
if(answer_no == 0)
{
printf("【問.1】日曜日どこで待ち合わせしますか?:");
printf("Where shall we ( @ ) on Sunday?\n");
scanf("%s",&user_answer);
strcpy(apri_answer,"meet");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 1)
{
printf("\n【問.2】そこにはどうやって行けますか?:");
printf("How do I ( A ) there?\n");
scanf("%s",&user_answer);
strcpy(apri_answer,"get");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 2)
{
printf("\n【問.3】私の名前は覇王です。つづりはエイチ・エー・オーです。:");
printf("My ( B ) is Hao, it\'s spelled H-O-A.\n");
scanf("%s",&user_answer);
strcpy(apri_answer,"name");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 3)
{
printf("\n【問.4】どちらへ行かれますか?:");
printf("Where would you ( C ) to go?\n");
scanf("%s",&user_answer);
strcpy(apri_answer,"like");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 4)
{
printf("\n【問.5】道に迷ってしまいました。:");
printf("Excuse me. I have ( D ) my way.\n");
scanf("%s",&user_answer);
strcpy(apri_answer,"lost");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 5)
{
printf("\n【問.6】ドライブへ行こうよ。:");
printf("Let\'s ( E ) for a drive.\n");
scanf("%s",&user_answer);
strcpy(apri_answer,"go");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 6)
{
printf("\n【問.7】もっとゆっくり話してもらえますか?:");
printf("Could you speak ( F ) slowly?\n");
scanf("%s",&user_answer);
strcpy(apri_answer,"more");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 7)
{
printf("\n【問.8】英語はあまり話せません。:");
printf("I don\'t speak English very ( G ).\n");
scanf("%s",&user_answer);
strcpy(apri_answer,"well");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else if(answer_no == 8)
{
printf("\n【問.9】部屋を見せていただけますか?:");
printf("May I ( H ) the room,please?\n");
scanf("%s",&user_answer);
strcpy(apri_answer,"see");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
else
{
printf("\n【問.10】お疲れ様でした。また明日!:");
printf("OK, thanks. ( I ) you tomorrow!\n");
scanf("%s",&user_answer);
strcpy(apri_answer,"see");
if(0 == strcmp(user_answer, apri_answer))
{
correct=correct+1;
}
}
answer_no++;
}
printf("以上で日常英会話問題を終了します。\n");
printf("あなたの正解数は%dです。\n",correct);
printf("お疲れ様でした!");
return 0;
}
教えてもらいつつ完成しましたが、なんとなく理解できてきたと思います。
わかると楽しいですね@@
これからもっと勉強していいものを作りたいと思います!
またわからなくなったら質問させていただくこともあると思いますがそのときはよろしくお願いします。
975ポイント を手に入れた。
|
|
|
|
|
Name: X ..入門者(2,986ポイント)
Date: 2009/04/07(火) 17:48
No:31868
|
|
Title: Re:教えてください。
|
|
すみません。
タグを使い忘れて見づらくなってしまいました・・・orz
2倍のポイントを手に入れた! 40ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..入門者(4,352ポイント)
Date: 2009/04/07(火) 18:30
No:31870
|
|
Title: Re:教えてください。
|
|
後はあれですかね、
同じような処理を繰り返しているのを
関数化してみるとか…。
29ポイント を手に入れた。
|
|
|
|
|
Name: conio [URL] ..中級者(13,630ポイント)
Date: 2009/04/07(火) 23:56
No:31882
|
|
Title: Re:教えてください。
|
|
強制では無いですが、
----------------------
correct=correct+1;
⇒correct++;
----------------------
こちらの方が、短く書けたりします。
あと、
--------------------------------------------------------------------------------
printf("\n【問.3】私の名前は覇王です。つづりはエイチ・エー・オーです。:");
printf("My ( B ) is Hao, it\'s spelled H-O-A.\n");
--------------------------------------------------------------------------------
重要では無いかもしれませんが、"H-A-O" が "H-O-A"になってます。
最後に、単純に1〜10までの問題を表示・解答させるだけならばwhile文とanswer_noという変数は
無くても問題なかったりします。
----------------------------------------------------------------------------------
int main(void)
{
char user_answer[20]; //アプリ利用者の答えを代入する変数//
char apri_answer[20]; //アプリ本体の答えを代入する変数//
int correct=0; //正解数を格納する変数//
printf("日常英会話問題\n");
printf("【問.1】日曜日どこで待ち合わせしますか?:");
printf("Where shall we ( @ ) on Sunday?\n");
scanf("%s",user_answer);
strcpy(apri_answer,"meet");
if(0 == strcmp(user_answer, apri_answer))
{
correct++;
}
printf("\n【問.2】そこにはどうやって行けますか?:");
printf("How do I ( A ) there?\n");
scanf("%s",user_answer);
strcpy(apri_answer,"get");
if(0 == strcmp(user_answer, apri_answer))
{
correct++;
}
printf("\n【問.3】私の名前は覇王です。つづりはエイチ・エー・オーです。:");
printf("My ( B ) is Hao, it\'s spelled H-O-A.\n");
scanf("%s",user_answer);
strcpy(apri_answer,"name");
if(0 == strcmp(user_answer, apri_answer))
{
correct++;
}
printf("\n【問.4】どちらへ行かれますか?:");
printf("Where would you ( C ) to go?\n");
scanf("%s",user_answer);
strcpy(apri_answer,"like");
if(0 == strcmp(user_answer, apri_answer))
{
correct++;
}
printf("\n【問.5】道に迷ってしまいました。:");
printf("Excuse me. I have ( D ) my way.\n");
scanf("%s",user_answer);
strcpy(apri_answer,"lost");
if(0 == strcmp(user_answer, apri_answer))
{
correct++;
}
printf("\n【問.6】ドライブへ行こうよ。:");
printf("Let\'s ( E ) for a drive.\n");
scanf("%s",user_answer);
strcpy(apri_answer,"go");
if(0 == strcmp(user_answer, apri_answer))
{
correct++;
}
printf("\n【問.7】もっとゆっくり話してもらえますか?:");
printf("Could you speak ( F ) slowly?\n");
scanf("%s",user_answer);
strcpy(apri_answer,"more");
if(0 == strcmp(user_answer, apri_answer))
{
correct++;
}
printf("\n【問.8】英語はあまり話せません。:");
printf("I don\'t speak English very ( G ).\n");
scanf("%s",user_answer);
strcpy(apri_answer,"well");
if(0 == strcmp(user_answer, apri_answer))
{
correct++;
}
printf("\n【問.9】部屋を見せていただけますか?:");
printf("May I ( H ) the room,please?\n");
scanf("%s",user_answer);
strcpy(apri_answer,"see");
if(0 == strcmp(user_answer, apri_answer))
{
correct++;
}
printf("\n【問.10】お疲れ様でした。また明日!:");
printf("OK, thanks. ( I ) you tomorrow!\n");
scanf("%s",user_answer);
strcpy(apri_answer,"see");
if(0 == strcmp(user_answer, apri_answer))
{
correct++;
}
printf("以上で日常英会話問題を終了します。\n");
printf("あなたの正解数は%dです。\n",correct);
printf("お疲れ様でした!");
return 0;
}
957ポイント を手に入れた。
|
|
|
|
|
Name: hss12 ..中級者(10,079ポイント)
Date: 2009/04/08(水) 05:16
No:31884
|
|
Title: Re:教えてください。
|
|
短く書くならこんな感じでどうでしょうか。
#include <stdio.h>
#include <string.h>
/*問題数*/
#define QNO 10
char *question[]={
"【問.1】日曜日どこで待ち合わせしますか?:Where shall we ( @ ) on Sunday?\n",
"【問.2】そこにはどうやって行けますか?:How do I ( A ) there?\n",
"【問.3】私の名前は覇王です。つづりはエイチ・エー・オーです。:My ( B ) is Hao, it\'s spelled H-A-O.\n",
"【問.4】どちらへ行かれますか?:Where would you ( C ) to go?\n",
"【問.5】道に迷ってしまいました。:Excuse me. I have ( D ) my way.\n",
"【問.6】ドライブへ行こうよ。:Let\'s ( E ) for a drive.\n",
"【問.7】もっとゆっくり話してもらえますか?:Could you speak ( F ) slowly?\n",
"【問.8】英語はあまり話せません。:I don\'t speak English very ( G ).\n",
"【問.9】部屋を見せていただけますか?:May I ( H ) the room,please?\n",
"【問.10】お疲れ様でした。また明日!:OK, thanks. ( I ) you tomorrow!\n",
};
char *apri_answer[]={
"meet",
"get",
"name",
"like",
"lost",
"go",
"more",
"well",
"see",
"see",
};
int main(void){
char user_answer[20]; /*アプリ本体の答えを代入する変数*/
int correct=0; /*正解数を格納する変数*/
int i;
printf("日常英会話問題\n");
for(i=0; i<QNO; i++){
printf("%s", question[i]);
scanf("%s", user_answer);
if(strcmp(user_answer, apri_answer[i]) == 0) correct++;
}
printf("以上で日常英会話問題を終了します。\n");
printf("あなたの正解数は%dです。\n", correct);
printf("お疲れ様でした!\n");
return 0;
}
824ポイント を手に入れた。
|
|
|
|
|
Name: conio [URL] ..中級者(13,767ポイント)
Date: 2009/04/08(水) 09:10
No:31886
|
|
Title: Re:教えてください。
|
|
>hss12さん
そうですね
あえて、プログラムを大きく改変するような事はしませんでしたが、
予め問題や解答などのデータベースを作っておけば良いかなと思います。
---------------------------------------------------------------------
今のところ、このプログラムでは どこを間違えたのかが分からないので
出来れば、後で正しい解答や間違った箇所を表示するものがあっても良いとも思いました。
137ポイント を手に入れた。
|
|
|
|
|
Name: hss12 ..中級者(11,003ポイント)
Date: 2009/04/08(水) 14:52
No:31888
|
|
Title: Re:教えてください。
|
|
>後で正しい解答や間違った箇所を表示
書いてみました。分かりにくいかもしれないです。
#include <stdio.h>
#include <string.h>
#define QNO 10
char *question[]={
"【問.1】日曜日どこで待ち合わせしますか?:Where shall we ( @ ) on Sunday?\n",
"【問.2】そこにはどうやって行けますか?:How do I ( A ) there?\n",
"【問.3】私の名前は覇王です。つづりはエイチ・エー・オーです。:My ( B ) is Hao, it\'s spelled H-A-O.\n",
"【問.4】どちらへ行かれますか?:Where would you ( C ) to go?\n",
"【問.5】道に迷ってしまいました。:Excuse me. I have ( D ) my way.\n",
"【問.6】ドライブへ行こうよ。:Let\'s ( E ) for a drive.\n",
"【問.7】もっとゆっくり話してもらえますか?:Could you speak ( F ) slowly?\n",
"【問.8】英語はあまり話せません。:I don\'t speak English very ( G ).\n",
"【問.9】部屋を見せていただけますか?:May I ( H ) the room,please?\n",
"【問.10】お疲れ様でした。また明日!:OK, thanks. ( I ) you tomorrow!\n",
};
char *apri_answer[]={
"meet",
"get",
"name",
"like",
"lost",
"go",
"more",
"well",
"see",
"See",
};
int main(void){
char user_answer[QNO][20]; /*アプリ本体の答えを代入する変数*/
int result[QNO]; /*結果を代入する変数*/
int correct=0; /*正解数を格納する変数*/
int i;
printf("日常英会話問題\n");
for(i=0; i<QNO; i++){
printf("%s", question[i]);
scanf("%s", user_answer[i]);
if(result[i] = strcmp(user_answer[i], apri_answer[i])==0) correct++;
}
printf("以上で日常英会話問題を終了します。\n");
printf(" 結果 解答 正解\n");
for(i=0; i<QNO; i++){
printf("問.%-2d %s ", i+1, result[i] ? "○" : "×");
printf("%-6s%-6s\n", user_answer[i], apri_answer[i]);
}
printf("あなたの正解数は%dです。\n", correct);
if(correct==QNO) printf("全問正解です!\n");
printf("お疲れ様でした!\n");
return 0;
}
924ポイント を手に入れた。
|
|
|
|
Name: yussanstar ..ぴよぴよ(951ポイント)
Date: 2009/04/07(火) 22:35
No:31880
|
|
Title: (主に)管理人さん 見てください!!
|
|
(主に)管理人さんへ
サンプルプログラミングの館にある
RPGのサンプルプログラムを
再びダウンロード&インストールできるようにしてほしいです。
S.P.の館にあるものでなくてもかまいません。
ぜひ、お願いします。
2倍のポイントを手に入れた! 156ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) ..ウィザード(1,013,722ポイント)
Date: 2009/04/07(火) 22:45
No:31881
|
|
Title: Re:(主に)管理人さん 見てください!!
|
|
私に個人的に何かメッセージを送ってくださる時はメールで伝達頂けるとありがたいです^^;
今サンプルプログラミングの館のRPGのサンプルDLしてみましたが、
正常にDL出来るようです。
最近IEでは正常にDL出来ないトラブルがあるようですので、
DL出来ないときは他のブラウザを使ってみて下さい。
123ポイント を手に入れた。
|
|
|
|
|
Name: kbZU ..ぴよぴよ(102ポイント)
Date: 2009/04/05(日) 01:33
No:31717
|
|
Title: Re:PSPでやりたい
|
|
失礼ですが
DXライブラリポータブルってなんですか?
自分はPCとかにはよわいからよくわからないんですけど
そこんところも教えてもらえませんか?
74ポイント を手に入れた。
|
|
|
|
|
Name: kbZU ..ぴよぴよ(137ポイント)
Date: 2009/04/05(日) 02:00
No:31720
|
|
Title: Re:PSPでやりたい
|
|
そうですか
自分はUMDの吸出しとかそこらへんしかしらないんで良くわからないです
35ポイント を手に入れた。
|
|
|
|
|
Name: kbZU ..ぴよぴよ(212ポイント)
Date: 2009/04/05(日) 03:03
No:31728
|
|
Title: Re:PSPでやりたい
|
|
バージョンは2.70以上だったらいいんでしょうか?
フォルダとかもつくるんですか?
44ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..ウィザード(1,013,215ポイント)
Date: 2009/04/05(日) 09:45
No:31736
|
|
Title: Re:PSPでやりたい
|
|
今行いたいのは
・自分でプログラムを書いてPSPでその作ったゲームを動かしたい
・人が作ったPSP用のプログラムをPSPで動かしたい
のどちらでしょうか?
後者はよく知りませんが、前者ならまずはC言語で作るならC言語による制作が出来る環境を整え、
C言語の入門サイトを見て回ることお勧めします。
123ポイント を手に入れた。
|
|
|
|
|
Name: kbzu ..ぴよぴよ(28ポイント)
Date: 2009/04/05(日) 10:32
No:31742
|
|
Title: Re:PSPでやりたい
|
|
失礼しました
人が作ったプログラムをPSPで動かしたいんです
28ポイント を手に入れた。
|
|
|
|
|
Name: kbZU ..ぴよぴよ(29ポイント)
Date: 2009/04/06(月) 00:33
No:31788
|
|
Title: Re:PSPでやりたい
|
|
このサイトにある弾幕シューティングゲーム、四聖龍神録をPSPでできるようになったら悩みが解くと思います
29ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..上級者(19,325ポイント)
Date: 2009/04/06(月) 01:13
No:31789
|
|
Title: Re:PSPでやりたい
|
|
ん〜PSPで龍神録がやりたければ
@誰かが移植してくれるのを待つ。
A自分で移植する。
B誰かに移植を依頼する。
Cwineのようなソフトを作る。
Cは論外として、@もまず無いと思います。
Bはえらくお金がかかります。
Aがまだ一番ありえそうですね。
62ポイント を手に入れた。
|
|
|
|
|
Name: kbZU ..ぴよぴよ(265ポイント)
Date: 2009/04/06(月) 01:23
No:31791
|
|
Title: Re:PSPでやりたい
|
|
わかりました
何とか適当にがんばりたいと思います
今の所友人もPSPで四聖龍神録ができないといっておりますが
がんばりたいと思います
53ポイント を手に入れた。
|
|
|
|
|
Name: kbZU ..ぴよぴよ(295ポイント)
Date: 2009/04/06(月) 11:39
No:31807
|
|
Title: Re:PSPでやりたい
|
|
betcometなどもPSPに四聖龍神録を移植するときにつかうんですか?
30ポイント を手に入れた。
|
|
|
|
|
Name: fatens ..かけだし(2,341ポイント)
Date: 2009/04/06(月) 11:59
No:31809
|
|
Title: Re:PSPでやりたい
|
|
betcometとは何でしょうか?
私が知らないだけかもしれませんが、BitCometのことであるなら移植には必要ないでしょう。
38ポイント を手に入れた。
|
|
|
|
|
Name: シューティング大好き ..ぴよぴよ(135ポイント)
Date: 2009/04/07(火) 15:40
No:31851
|
|
Title: Re:PSPでやりたい
|
|
lbfuvabさん
今@が進んでます^^;
もうPSP上で動いててあとは最適化などの段階ですw
まあお約束ですがCFWが入ってるPSPじゃないと実行できませんが・・・
67ポイント を手に入れた。
|
|
|
|
|
Name: シューティング大好き ..ぴよぴよ(201ポイント)
Date: 2009/04/07(火) 15:42
No:31852
|
|
Title: Re:PSPでやりたい
|
|
あ正確にはこちらで公開されてるサンプルプログラムの
50章にあたる部分の移植ですね
メモリの関係で音は鳴らしていませんがグラフィックは
PC用のままで動いてます
66ポイント を手に入れた。
|
|
|
|
|
Name: PSP ..ぴよぴよ(3ポイント)
Date: 2009/04/07(火) 16:12
No:31854
|
|
Title: Re:PSPでやりたい
|
|
今2チャンで龍神録のPSP移植が話題のようですね。
3ポイント を手に入れた。
|
|
|
|
Name: iyhakj ..ぴよぴよ(419ポイント)
Date: 2009/04/06(月) 22:21
No:31834
|
|
Title: 教えてください
|
|
はじめまして、iyhakjと申します。
今回は学校から出た宿題がどうしてもわからないので質問させていただきます。
問題は以下のようなものです
(キーボード上から秒数を入力すると,その秒数を時間,分,秒
に変換して出力するプログラムを作成してください。なお,入力可能な時間は0秒から
1000000秒とし,それ以外の秒数が入力された場合はエラー処理を行ってください。)
というものです。
今のところ自分はこうすればできると思っています。
まず、入力された数をaとし、 a÷3600 の計算を行います。出た答えをb時とし、余りをcとします。
その後余りcを60で割る計算 c÷60 を行い、結果をd分、余りをe秒と表示する。
for文とif文を使えば作れると思っているのですが、ソースコードをどう作ったらいいのかわかりません。
Cのプログラミング歴は2ヵ月くらいで、条件分岐(if)、配列、繰り返し命令(for,while)、scanf、printf
などの使い方はわかるのですがソースコード状にすることが苦手です。
使っているソフトはvisual C++ 2008です。
本当にソースコードがわからなくで困っています。
長文ですみません。どうぞよろしくお願いします。
419ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(137,991ポイント)
Date: 2009/04/06(月) 23:36
No:31839
|
|
Title: Re:教えてください
|
|
全部を一度に作ろうとせずに、部分ごとに考えればよいでしょう。
まずは、秒数を入力するところだけを考えてみてください。
a〜eという無機質な名前ではなく、見ただけで意味がわかる変数名を付けるとよいでしょう。
67ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..上級者(19,555ポイント)
Date: 2009/04/07(火) 02:54
No:31842
|
|
Title: Re:教えてください
|
|
入力に関しては標準入力がキーボードに割り当てられている場合(多分課題が想定している環境)
scanfで良いです。
>for文とif文を使えば作れると思っているのですが、ソースコードをどう作ったらいいのかわかりません。
for分を使う必要性が見つからないのですが・・・
使うなら以下を工夫してfor分にしたらいいと思いますよ。
ユーザ入力をinputとしています。
second = input;
minute = second/60;
second %= 60;
hour = minute/60;
minute %= 60;
230ポイント を手に入れた。
|
|
|
|
|
Name: hss12 ..中級者(9,593ポイント)
Date: 2009/04/07(火) 03:23
No:31843
|
|
Title: Re:教えてください
|
|
とりあえず、
>まず、入力された数をaとし、 a÷3600 の計算を行います。出た答えをb時とし、余りをcとします。
>その後余りcを60で割る計算 c÷60 を行い、結果をd分、余りをe秒と表示する。
の通りに作ってみましたが、そのままではないですか?
なぜ書けないのでしょう。
>a÷3600 の計算を行います。出た答えをb時とし、
これはb=a/3600になります。
>余りをcとします。
これはc=a%3600です。
同じく計算し、
printf("%d時間%d分%d秒\n", b,d,e);
で表示できると思います。
エラー処理はif文が必要かもしれませんが
for文は使わなくても良いような。
2倍のポイントを手に入れた! 520ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..熟練のプログラマー(46,170ポイント)
Date: 2009/04/07(火) 11:35
No:31847
|
|
Title: Re:教えてください
|
|
考え方がそこまで出ているのなら、あとはプログラムに直すだけなんですが・・・
>まず、入力された数をaとし、 a÷3600 の計算を行います。出た答えをb時とし、余りをcとします。
>その後余りcを60で割る計算 c÷60 を行い、結果をd分、余りをe秒と表示する。
そのまま組んでみました。変数名は分かりやすいものに変えてあります。
#include <stdio.h>
int main()
{
int input;
int hour;
int second;
int minute;
int temp;
printf("秒数を入力してください");
scanf("%d", &input);
if(input>=1000000 || input<0){
printf("error");
return -1;
}
hour = input/3600;
temp = input%3600;
minute = temp/60;
second = temp%60;
printf("時:%d 分:%d 秒:%d\n", hour, minute, second);
return 0;
}
iyhakjさんの言うような考え方をそのままプログラムに直しただけです。
(動作確認はしていません)
他の方のアドバイスでもうすでに完成されているかもしれませんが^^;
356ポイント を手に入れた。
|
|
|
|
|
Name: iyhakj ..ぴよぴよ(760ポイント)
Date: 2009/04/07(火) 14:10
No:31850
| 解決!
|
Title: 皆さん、本当にありがとうございます!
|
|
皆さん、ありがとうございます。
たった今皆さんのアドバイスをもとに作ってみたところきちんと動作しました。
//課題1 キーボード上から秒数を入力すると,その秒数を時間,分,秒 に変換して出力するプログラム
#include <stdafx.h>
void main(void)
{
unsigned long int h,m,s,a,b;
printf("秒数を入力してください。(※入力可能な時間は0秒から 1000000秒まで)\n");
scanf("%d",&a); //キーボード上から入力
if(1000000<a) //入力した値が1000000より大きい場合
{
printf("エラーです。入力可能な数字は0から1000000までです。\a"); //\aを使い音でもエラーを知らせる
}
else //それ以外
{
h=a/3600; //hの値は入力された数÷3600
b=a%3600; //bの値は入力された数÷3600の余り
m=b/60; //mの値は余り÷60
s=a%60; //sの値は余り÷60の余り
printf("%d時間%d分%d秒です。",h,m,s);
}
}
このように作ってみました。for文要りませんでしたね(汗)
ホント感謝の気持ちでいっぱいです!どうもありがとうございました!(礼)
341ポイント を手に入れた。
|
|
|
|
Name: Bear ..ぴよぴよ(571ポイント)
Date: 2009/04/05(日) 19:45
No:31772
|
|
Title: 初質問です
|
|
こんにちわ。いつも色々参考にさせてもらっています。
今回、初めて質問させていただきます。よろしくお願いします。
質問は2つです。
僕は初心者でMFCでアドレス帳みたいなのを作ったことがあるレベルです。
今、WinAPI関数をいろいろ試しているところです。
開発環境は 学校がVC6.0(XPとVista)
家がVC2008 (Vista)
でともにProfessional Editionです。
そこで質問なんですが、CopyFileEx()という関数をいろいろ試していたらVC6.0のときは
"error C2065 CopyFileEx()は定義されていない識別子です"
とでます。同じコードでもVC2008では問題なくビルドされるのですが何故でしょうか? CopyFileExの定義もとをたどっていくとちゃんとCopyFileExW()とCopyFileExA()は定義されていたし、kernel32.libも読み込んでいました。またwindows.hもインクルードしています。他にどのような原因の可能性があるのでしょうか?
ちなみに関係ないかもしれないですがCopyFile()やMoveFileEx()はVC6.0でも問題なくビルドされました。
2つ目の質問はMessageBox()関数などの文字列を引数として代入する場合にVC6.0では中の文字列をそのまま””で引数として入れれたのに、VC2008では
"const char[11]からLPCWSTRに変換できません"
とでます。そこでLPCWSTRにキャストしても表したい文字列ではなくなっているのです。
これはなぜでしょうか?何か設定で変えれたりするのでしょうか?
すみませんが、ご教授ください。
571ポイント を手に入れた。
|
|
|
|
Name: SooA [URL] ..中級者(13,620ポイント)
Date: 2009/04/05(日) 21:07
No:31777
|
|
Title: Re:初質問です
|
|
二つ目の質問に関しては
プロジェクトのプロパティ設定で
構成プロパティ -> 全般 -> 文字セット を
Debug, Release 共に
「マルチバイト文字セットを使用する」に変更します。
MessageBox記述例
if( MessageBox( NULL, TEXT("終了します。よろしいですか?"), TEXT("終了") , MB_OKCANCEL ) == IDOK )
80ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(338,872ポイント)
Date: 2009/04/06(月) 22:45
No:31837
|
|
Title: Re:初質問です
|
|
>error C2065 CopyFileEx()は定義されていない識別子です
>どのような原因の可能性があるのでしょうか
_WIN32_WINNTが定義されていない、とか?
83ポイント を手に入れた。
|
|
|
|
|
Name: Bear ..ぴよぴよ(645ポイント)
Date: 2009/04/07(火) 08:23
No:31844
| 解決!
|
Title: Re:初質問です
|
|
>_WIN32_WINNTが定義されていない、とか?
どうもそのようでした。なぜそうなのかはわかりませんが、
#define _WIN32_WINNT 0x0400
を追加したらうまく通りました。
CopyFileExはWindows NT 4.0以上の環境で使えるため0x0400はWindows NT 4.0を定義するものと理解しているのですがあっていますでしょうか?
>VC6.0用のSP(サービスパック)が適用されていない場合は
最新のSPを適用させてみてください
ご指摘ありがとうございます。学校のSPが最新かどうか調べてみます。
66ポイント を手に入れた。
|
|
|
|
Name: kira ..ぴよぴよ(75ポイント)
Date: 2009/04/05(日) 17:30
No:31761
|
|
Title: ZIPファイルが開けません。
|
|
「後半部分が欠落した破損ZIPファイル。(または、書庫ではないのかもしれません)」と表示されてZIPファイルが開けなくて困っています。
解凍ソフトはインストール済です。
75ポイント を手に入れた。
|
|
|
|
Name: EX ..ぴよぴよ(364ポイント)
Date: 2009/04/05(日) 17:32
No:31762
|
|
Title: Re:ZIPファイルが開けません。
|
|
何かファイルを変にいじるとなるかもしれません。
もう一回ダウンロードしてみてダメだったら・・・
38ポイント を手に入れた。
|
|
|
|
|
Name: kira ..ぴよぴよ(235ポイント)
Date: 2009/04/05(日) 17:41
No:31764
|
|
Title: Re:ZIPファイルが開けません。
|
|
ちなみに「龍神録プログラミングの館」の「1章プロジェクト素材を用意しよう」の「プロジェクトをまとめてダウンロード」の「project.zip」です。
他サイトなどのzipは問題なく開けました。
2倍のポイントを手に入れた! 160ポイント を手に入れた。
|
|
|
|
|
Name: kira ..ぴよぴよ(263ポイント)
Date: 2009/04/05(日) 17:57
No:31765
| 解決!
|
Title: Re:ZIPファイルが開けません。
|
|
firefoxで開いたら平気でした。ありがとうございました。
28ポイント を手に入れた。
|
|
|
|
|
Name: Nodens ..ぴよぴよ(41ポイント)
Date: 2009/04/06(月) 22:41
No:31836
|
|
Title: Re:ZIPファイルが開けません。
|
|
はじめまして。Nodensっていいます。
FireFoxでもLhasaでも開けないんですが、どうすれば良いでしょうか。
41ポイント を手に入れた。
|
|
|
|
Name: あ〜る ..かけだし(2,060ポイント)
Date: 2009/04/01(水) 17:49
No:31493
|
|
Title: ゲーム背景について
|
|
お久しぶりです、あ〜るです
最近、ゲームの基盤はだいたい出来てきたので、GIMPを使って背景なんかを作ろうと思い、使い方を勉強する為に色々なサイトや本を見ているんですけど、どれも写真の加工方法のやり方ばかりで、ゲームの背景の作り方が載っているのがありません
というかゲーム背景という物は写真を加工して作る物なんでしょうか?
そこら辺もよくわかりません
なのでお勧めの本やサイトがありましたら教えて頂けないでしょうか?
よろしくお願いします
173ポイント を手に入れた。
|
|
|
|
Name: あ〜る ..かけだし(2,118ポイント)
Date: 2009/04/01(水) 18:04
No:31495
|
|
Title: Re:ゲーム背景について
|
|
すいません、結構大事な事忘れてました…
作ってるのは弾幕シューティングで、目指してる背景は龍神録や東方ぐらいのものを目指してます
58ポイント を手に入れた。
|
|
|
|
|
Name: yu [URL] ..上級者(23,209ポイント)
Date: 2009/04/01(水) 19:14
No:31505
|
|
Title: Re:ゲーム背景について
|
|
う〜ん・・・
背景の作り方と言われてもたくさんの方法があると思います。
自分で建物を作るとしたら
自分で絵を書く、どこかの絵を参考にして書く、写真を撮って加工、とか手段はたくさんあります。
それに、作るものが2Dか3Dかで絵が変わると思います。
自分で作るのが大変なら、素材を使うというのも手ですね。
115ポイント を手に入れた。
|
|
|
|
|
Name: あ〜る ..入門者(2,514ポイント)
Date: 2009/04/01(水) 22:19
No:31522
|
|
Title: Re:ゲーム背景について
|
|
アドバイスありがとうございます
自分で背景を書くにしても、どうしてもなんかゲームに馴染まないというか、CGっぽくないというか、そんな感じになっちゃうんです…
背景は2Dのスクロールするやつも3Dの背景も両方作ってみたいです
ゲーム自体を何から何まで全部一人で作ってみたいので素材はあまり使いたくないです…
2倍のポイントを手に入れた! 212ポイント を手に入れた。
|
|
|
|
|
Name: yu [URL] ..上級者(23,510ポイント)
Date: 2009/04/01(水) 22:32
No:31528
|
|
Title: Re:ゲーム背景について
|
|
>自分で背景を書くにしても、どうしてもなんかゲームに馴染まないというか、
>CGっぽくないというか、そんな感じになっちゃうんです…
すごくわかります。
自分はかなり多く素材使ってゲーム作成していますが、
いざ自分の絵をゲームに取り入れるとそれだけが
周りと比較して浮いてるんですよね〜・・・
浮かないようにするには、絵がうまくなるしかないですけどねw
そのためには絵を書いて練習するしか・・・
他の人のを見て参考にするのもありだと思います。
2Dでスクロールさせるのだと、切れ目に注意です。
3Dは案外絵がうまくなくてもそれなりに格好は付きますよw
ですが、3Dはやはり面倒くさいです。
186ポイント を手に入れた。
|
|
|
|
|
Name: EX ..ぴよぴよ(76ポイント)
Date: 2009/04/01(水) 22:38
No:31530
|
|
Title: Re:ゲーム背景について
|
|
Paintgraphicという少し高めの有料ソフトがありますが使ってみてはいかがですか?
細かい色や演出までできますよ
1ポイント を手に入れた。
|
|
|
|
|
Name: あ〜る ..入門者(2,742ポイント)
Date: 2009/04/01(水) 22:47
No:31531
|
|
Title: Re:ゲーム背景について
|
|
>yuさん
むぅ…やっぱり結局練習あるのみ、っていう結論になっちゃいますよね(笑)
ただ、まだいまひとつGIMPの使い方がよくわからず絵も書けないっていう…
>EXさん
情報ありがとうございます
ただまだ学生という身分なので何分財政面には厳しいところがあり有料のソフトは使う事が出来ないんです…
それで、フリーの画像ソフトではGIMPがいいという話を聞き使ってみようとしてるんですけど、ゲーム背景作りに関係してるサイトや本が無いんです……
どこかいいサイトやいい本知りませんでしょうか?
228ポイント を手に入れた。
|
|
|
|
|
Name: EX ..ぴよぴよ(122ポイント)
Date: 2009/04/01(水) 23:03
No:31533
|
|
Title: Re:ゲーム背景について
|
|
う〜ん、確かなんかの雑誌に付録でCGソフトがついてた気がするのでどっかにアップロードしときます
2倍のポイントを手に入れた! 46ポイント を手に入れた。
|
|
|
|
|
Name: あ〜る ..入門者(2,657ポイント)
Date: 2009/04/01(水) 23:15
No:31534
|
|
Title: Re:ゲーム背景について
|
|
ありがとうございます
アップロードしたらそのどっかも教えて欲しいですけど(^-^;
35ポイント を手に入れた。
|
|
|
|
|
Name: EX ..ぴよぴよ(192ポイント)
Date: 2009/04/01(水) 23:28
No:31536
|
|
Title: Re:ゲーム背景について
|
|
あ〜でも見つからないかもしれないですし…
考え方を変えてみましょう。
作ってくれる人とか探してみたら?
56ポイント を手に入れた。
|
|
|
|
|
Name: あ〜る ..入門者(2,895ポイント)
Date: 2009/04/01(水) 23:37
No:31538
|
|
Title: Re:ゲーム背景について
|
|
学校でもゲーム製作を手伝ってくれる人を探してみたんですけどテストプレイヤーばかり集まって、一緒にゲームを作ってくれるような情熱のある人はいませんでした…
只今プログラミングから画像製作、作曲まで一人でやるというZUNさん状態(泣)
2倍のポイントを手に入れた! 238ポイント を手に入れた。
|
|
|
|
|
Name: EX ..ぴよぴよ(298ポイント)
Date: 2009/04/01(水) 23:46
No:31540
|
|
Title: Re:ゲーム背景について
|
|
話がそれるが、東方の音楽や
煉獄庭園、MIDIの里、魔王魂、3104式、LEE土橋の非凡用的MIDI置き場、雑音空間、Extra Oceanとかあるけど
48ポイント を手に入れた。
|
|
|
|
|
Name: あ〜る ..入門者(3,136ポイント)
Date: 2009/04/01(水) 23:57
No:31542
|
|
Title: Re:ゲーム背景について
|
|
ゲームを全部自分の力で作ろうとしてるので、作曲も必要なんです。
ただ曲作りに関しては、小さい頃からピアノを習っていましたし、ピアノ自体大好きなんで問題はないですね。
パソコンで曲を作るソフトも大分前にこの掲示板で教えてもらったんでオッケーです。
やっぱり問題なのは背景とかですねぇ・・・
105ポイント を手に入れた。
|
|
|
|
|
Name: BEMANI ..上級者(24,777ポイント)
Date: 2009/04/02(木) 01:57
No:31550
|
|
Title: Re:ゲーム背景について
|
|
自分も同じパターンなのでなんとなくわかる気がします。
絵は自分で補えますが、音楽はさすがに諦めそうです・・・。
>画像ソフト
もし手が届くなら、SAIが凄く安いと思います。(5000円ほどだったかと思います)
下手に高いソフトを買うより、全然いいと思います。
5000円でも厳しいのでしたらしょうがないです;
>絵
練習しかないですね。
別にPCで描かなくても、紙に絵を描くだけでも全然問題ないと思います。
スキャナがあればそのまま絵を取り込んで彩色出来ますが、ない場合はPCに直描きですかね。
>ゲームに使う背景
具体的にこんなのが描きたい!ってのがあれば、それに近い画像を検索して真似て描いてみればいいです。
例えば森が描きたいなら樹の画像を検索してそれを真似して何本も描けば森になりますし、
海が描きたいなら光の反射を参考にハイライトを入れていくとかそんな感じで作っていけばいいです。
yuさんも仰ってますが、背景などは写真を加工するという手もあります。
GIMPに写真を加工するだけの性能があるかは解りませんが、ちょっと使った感じ加工出来そうでした。
といっても触って30分ほどだったので詳しい事は解りませんが。
>音楽
ピアノパートだけでは寂しいので、リズムパートやベース等、パート毎に打ち込むことになると思います。
ピアノ以外の知識もいりますし、そのあとのソフトの使い方や、ゲームで使える音楽にするやり方も学ばなければなりません。
何度も挫折しそうになるかもしれませんが頑張って下さいね。
2倍のポイントを手に入れた! 920ポイント を手に入れた。
|
|
|
|
|
Name: あ〜る ..入門者(3,199ポイント)
Date: 2009/04/02(木) 08:26
No:31553
|
|
Title: Re:ゲーム背景について
|
|
アドバイスありがとうございます
やっぱり色々とやり方があるみたいですねぇ…
自分でも色々試して頑張ってみます
ありがとうございます
63ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..上級者(23,042ポイント)
Date: 2009/04/02(木) 08:27
No:31554
|
|
Title: Re:ゲーム背景について
|
|
すべて自分で作らないと自分らしさを出したゲームは作れないと思います。
曲もcherryでつくっていますが、
wavにするときどうしても音質が下がってしまいますが・・・
ゲームに使う背景ですが、自分のテーマに沿った写真を撮ってつくったものが一番きれいです。
(自分の経験から)
絵はペンタブレットでかいています。pixiaは無料で高品質、フィルタも自分で入れられるので、
SAIを買おうと思う前に試してみてはどうでしょう?
BENAMIさまのアドバイスを阻んでしまうようですいません。
それとZUNさんは東方文花帖で どうしてゲームが作れるようになったかというと血のにじむ努力があったから、といっていますから、ひたすら努力かもしれません・・・
まだ中学生で、少ししかプログラミングに触れていない自分が言ってすいません。
自分もがんばっていきたいと思います。
240ポイント を手に入れた。
|
|
|
|
|
Name: あ〜る ..入門者(3,255ポイント)
Date: 2009/04/02(木) 08:48
No:31556
|
|
Title: Re:ゲーム背景について
|
|
なるほど…写真を加工するんですか、参考にします。
>ZUNさんは血の滲むような努力を〜
僕もあれを見て、よし!自分ももっと頑張ろうと思いました(^-^)
色々と難しいですけど頑張って行きましょう
56ポイント を手に入れた。
|
|
|
|
|
Name: kerotan0820 ..入門者(4,013ポイント)
Date: 2009/04/06(月) 14:17
No:31814
|
|
Title: Re:ゲーム背景について
|
|
pixiaなどのフリーソフトでも絵を描いたりするには十分だと思いますよ。
SAIは前までフリーソフトだったのですが有料化してしまいましたし・・・
絵がCGらしくないというのはべた塗りだからでしょう。
影などをうまくつける技術などがあればCG〜>< みたいになると思いますw
139ポイント を手に入れた。
|
|
|
|
|
Name: Mikan [URL] ..初心者(7,151ポイント)
Date: 2009/04/06(月) 21:12
No:31829
|
|
Title: Re:ゲーム背景について
|
|
以前、ここで同じような質問をして背景を作ってみたMikanですw
私もGIMPを使っていますが、フィルタを適用するだけでも結構よさそうなのできますよ^^
自分が適当に作った背景は1個ですが、私のHPにおいていますので、参考になるかわかりませんがどぞw
私の作り方はとりあえず、写真などにフィルタを適用したら、どんな感じで仕上がるのか見て、
あとは組み合わせで作りました^^
フリーのブラシを使うと、結構こった背景になりましたよ^^
ブラシの著作権がどうなるかわからなかったのでアップはしていませんが・・w
188ポイント を手に入れた。
|
|
|
|
|
Name: あ〜る ..入門者(3,864ポイント)
Date: 2009/04/06(月) 22:04
No:31832
|
|
Title: Re:ゲーム背景について
|
|
>kerotan0820さん
なるほど影を上手くつけるんですね…
こんど試してみます!
ありがとうございました
>Mikanさん
ほんとフィルタ様々ですよねw
GIMPはオープンソースだから、いろんなとこで追加機能があるんですね…盲点でした
色々見てみます、教えて下さってありがとうございました
あ、あともう一つ質問なんですけど、東方ではステージ背景で雪とか桜とか紅葉とかがひらひら降ってくるじゃないですか
あれはどうやっているのかわかりますでしょうか?
とても単純なスクロールだけだったら出来ない気がするので
やっぱりそういうアニメーションを作るソフトみたいのを使ってるのでしょうか?
教えて下さい
115ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(76,429ポイント)
Date: 2009/04/06(月) 22:20
No:31833
|
|
Title: Re:ゲーム背景について
|
|
> 東方ではステージ背景で雪とか桜とか紅葉とかがひらひら降ってくるじゃないですか
あのアニメーションを簡単に表現する方法として、
弾とかと同じような構造で管理させて、
ランダムに配置・移動を行なえば可能ですよ。
(余り多く出すと重くなるので注意。DXライブラリで半透明処理を行う場合は特に重くなります)
90ポイント を手に入れた。
|
|
|
|
|
Name: あ〜る ..入門者(3,990ポイント)
Date: 2009/04/06(月) 22:30
No:31835
|
|
Title: Re:ゲーム背景について
|
|
あーー!!なるほど!
その発想はありませんでした!
背景の一部だからアニメーションだと勝手に思い込んでしまい……
半透明処理はGIMPの使い方がだんだんわかってきたのできっと大丈夫です
これでもっといい感じの背景が作れる気がします
教えて下さってありがとうございました!
126ポイント を手に入れた。
|
|
|
|
Name: 煌 ..ぴよぴよ(41ポイント)
Date: 2009/04/06(月) 21:18
No:31830
|
|
Title: 初期ウィンドウサイズについて
|
|
#include "DxLib.h"
--------------------------
ChangeWindowMode( TRUE ) ;
ですと、640*480ですが、exeを起動したときの標準サイズを800*600にしたい場合はどのようにすればよいのでしょうか?
41ポイント を手に入れた。
|
|
|
Name: Huzzy ..ぴよぴよ(601ポイント)
Date: 2009/04/06(月) 02:14
No:31792
|
|
Title: 横スクロールにするには?
|
|
現在グラディウスを模したシューティングを
作るため此方のサイトで勉強中なのですが…;
20章で出てくる背景を縦方向にスクロ−ルさせる方法を
どうにかして横方向にしようと何度か挑戦したのですが
どう足掻いても背景画が上方から下方へ行くばかり;;
何かお心辺りがあるお方がいましたら、ご教授ください;
お願いします;;
65ポイント を手に入れた。
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(76,267ポイント)
Date: 2009/04/06(月) 02:19
No:31793
|
|
Title: Re:横スクロールにするには?
|
|
DrawGraph(FIELD_X,count%700+FIELD_Y-700,img_back[0],FALSE);
DrawGraph(FIELD_X,count%700+FIELD_Y ,img_back[0],FALSE);
のcountの影響を受けるのをy→x方向に変えるだけでは?
102ポイント を落としてしまった。
|
|
|
|
|
Name: Huzzy ..ぴよぴよ(820ポイント)
Date: 2009/04/06(月) 08:23
No:31797
|
|
Title: Re:横スクロールにするには?
|
|
DrawGraph(FIELD_X,count%700+FIELD_Y-700,img_back[0],FALSE);
DrawGraph(FIELD_X,count%700+FIELD_Y ,img_back[0],FALSE);
を下記のように
DrawGraph(FIELD_Y,count%700+FIELD_X-700,img_back[0],FALSE);
DrawGraph(FIELD_Y,count%700+FIELD_X ,img_back[0],FALSE);
変更したのですが、それぞれ画像の表示される位置が若干ずれるだけで
縦スクロールのままでした;;
変更すべき点は別の所なのでしょうか;;
219ポイント を手に入れた。
|
|
|
|
|
Name: fatens ..かけだし(2,303ポイント)
Date: 2009/04/06(月) 10:11
No:31802
|
|
Title: Re:横スクロールにするには?
|
|
縦スクロールは上から下、すなわちy座標が変化します。
横スクロールは右から左、すなわちx座標が変化します。
>DrawGraph(FIELD_Y,count%700+FIELD_X-700,img_back[0],FALSE);
>DrawGraph(FIELD_Y,count%700+FIELD_X ,img_back[0],FALSE);
このように変更しても、x座標はFIELD_Yという定数なので変化しません。
countの働きをもう一度考えてみると分かるのではないでしょうか。
178ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..プログラマー(29,562ポイント)
Date: 2009/04/06(月) 11:17
No:31803
|
|
Title: Re:横スクロールにするには?
|
|
引数の場所が違います
x座標が第1引数でy座標が第2引数なので
DrawGraph(count%700+FIELD_X-700, FIELD_Y, img_back[0], FALSE);
DrawGraph(count%700+FIELD_X , FIELD_Y, img_back[0], FALSE);
ではないでしょうか
88ポイント を手に入れた。
|
|
|
|
|
Name: hss12 ..初心者(8,771ポイント)
Date: 2009/04/06(月) 11:55
No:31808
|
|
Title: Re:横スクロールにするには?
|
|
軽く説明しますと
#define FIELD_X 32
#define FIELD_Y 16
となっているはずなので
DrawGraph(FIELD_X,count%700+FIELD_Y-700,img_back[0],FALSE);
DrawGraph(FIELD_X,count%700+FIELD_Y ,img_back[0],FALSE);
は
DrawGraph(32, count%700+16-700, img_back[0],FALSE);
DrawGraph(32, count%700+16 , img_back[0],FALSE);
に置き換わります。
つまり、FIELD_XとFIELD_Yを変えても位置が16ずれるだけです。
DrawGraphは
DrawGraph(X座標, Y座標, 画像, FALSE);
なので横スクロールするにはX座標を変化させなければならないです。
count%700は0から699の値が順番に増えていきます。
184ポイント を手に入れた。
|
|
|
|
|
Name: Huzzy ..ぴよぴよ(892ポイント)
Date: 2009/04/06(月) 19:40
No:31827
| 解決!
|
Title: Re:横スクロールにするには?
|
|
漸く理解することが出来ました;;
DrawGraph(X座標, Y座標, 画像, FALSE);
であることを見落としていました;;
ご教授有難う御座います;;
72ポイント を手に入れた。
|
|
|
|
Name: wood ..ぴよぴよ(204ポイント)
Date: 2009/04/06(月) 16:53
No:31821
|
|
Title: フォントの使用方法
|
|
質問です。既出だったらすみません。
Windowsに標準でインストールされていないフォントを使用したいのですが、
flashのようなフォントを埋め込む機能ってあるのでしょうか?
56ポイント を手に入れた。
|
|
|
Name: 生徒かいちょー ..ぴよぴよ(903ポイント)
Date: 2009/04/06(月) 13:53
No:31812
|
|
Title: はじめまして。
|
|
はじめまして。お初にお目にかかります。生徒かいちょーと申します。
今回始めて質問させていただきますよろしくお願いします。
それで、その質問なのですが私実は初心者でしてこのHPのゲームプログラミングの館さんのを見て作らせてもらってます。
その、初期の段階なんですがウィンドウモードの表示でビルドをしたときに
------ ビルド開始: プロジェクト: DxLib_VC2005用, 構成: Debug Win32 ------
リンクしています...
サンプルプログラム(学習用).obj : error LNK2005: _WinMain@16 は既に test.obj で定義されています。
C:\Documents and Settings\KAZUKI-SETA\デスクトップ\DxLib_VC\サンプルプログラム実行用フォルダ\Debug\DxLib_VC2005用.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
ビルドログは "file://c:\Documents and Settings\KAZUKI-SETA\デスクトップ\DxLib_VC\サンプルプログラム実行用フォルダ\Debug\BuildLog.htm" に保存されました。
DxLib_VC2005用 - エラー 2、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
のようなものが出て一向にビルドできません。
一度再起動や再インストールしてみたのですがそれでもできませんでした。
cppの方もゲームプログラミングの館さんのほうから移させていただいて
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
WaitKey() ; // キーの入力待ち(『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
こうなって、います。
どなたか、ビルドをする方法を知っている方はいませんか?
分かる方がいましたら教えてもらえないでしょうか?
それでは、長文失礼いたしました。
903ポイント を手に入れた。
|
|
|
|
Name: 生徒かいちょー ..ぴよぴよ(936ポイント)
Date: 2009/04/06(月) 14:33
No:31817
|
|
Title: Re:はじめまして。
|
|
やはりひとつのプロジェクトにひとつのcppなのでしょうか?
二つだとやはり間違った動作が起きてしまうのですか?
33ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(58,656ポイント)
Date: 2009/04/06(月) 14:44
No:31818
|
|
Title: Re:はじめまして。
|
|
ソースファイルが複数あっても問題ではないですが、今回の場合両方にWinMainがありませんか?
WinMainが2個あるのがおかしいというエラーです。
71ポイント を手に入れた。
|
|
|
|
Name: kerotan0820 ..入門者(3,854ポイント)
Date: 2009/04/05(日) 22:05
No:31780
|
|
Title: 関数辞典のような本などは売られていますか?
|
|
ゲームプログラミングの館で線や図を描画するプログラムの勉強をしていたのですが、さまざまな関数が出てきますが、関数などを集めた本などは売られていないのでしょうか。
もし売られていたら教えてください
お願いします
場違いでしたらすみません・・・ 質問の許容範囲がわからなくて;
68ポイント を手に入れた。
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(76,369ポイント)
Date: 2009/04/05(日) 22:14
No:31782
|
|
Title: Re:関数辞典のような本などは売られていますか?
|
|
物理・数学的な表現をプログラミングするなら本屋に行けばありますよ。
たしかゲームプログラミングの棚にもあると思います。
(ある程度大きな本屋なら)
「関数」かどうかは別として・・・
それよりもっと詳しくとなると、数学の棚のコーナーに行けば
線形代数や解析関連の本があるかと思います。
それを自分なりに理解し、関数化すれば何とかなるかと。
34ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(338,739ポイント)
Date: 2009/04/06(月) 00:08
No:31786
|
|
Title: Re:関数辞典のような本などは売られていますか?
|
|
Windowsで見る関数グラフィックス
ttp://www.morikita.co.jp/mokuji/0749.html
かなり前の本ですが、関数と結果のグラフが載っていてそれなりに役立ちました。
最近は開いていませんが、今でも持ってます。
80ポイント を手に入れた。
|
|
|
|
|
Name: fatens ..かけだし(2,125ポイント)
Date: 2009/04/06(月) 09:12
No:31799
|
|
Title: Re:関数辞典のような本などは売られていますか?
|
|
DrawLine関数やDrawBox関数のことですよね?
それでしたら、DXライブラリの本家にほとんど載っています。
ttp://homepage2.nifty.com/natupaji/DxLib/index.html
↑のDXライブラリの関数リファレンスマニュアル&サンプルプログラム
115ポイント を手に入れた。
|
|
|
|
Name: すこーる ..ぴよぴよ(758ポイント)
Date: 2009/04/05(日) 20:32
No:31775
|
|
Title: Makefile?のエラー
|
|
ビルドしたらこのようなエラーがでました
1>------ ビルド開始: プロジェクト: test, 構成: Release Win32 ------
1>メイクファイル プロジェクト動作を実行しています。
1>'make' は、内部コマンドまたは外部コマンド、
1>操作可能なプログラムまたはバッチ ファイルとして認識されていません。
1>Project : error PRJ0019: ツールはエラー コードを返しました : "メイクファイル プロジェクト動作を実行しています。"
1>ビルドログは "省略しました" に保存されました。
1>test - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
test.cの内容
#include <pspkernel.h>
#include <dxlibp.h>
PSP_MODULE_INFO("TEST", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER);
int main()
{
DxLib_Init();
while(ProcessMessage() != -1)
{
ClearDrawScreen();
printfDx("Hello world!");
ScreenFlip();
}
DxLib_End();
return 0;
}
Makefileの内容
TARGET = TestProject
OBJS = test.o
INCDIR =
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
LIBDIR =
LDFLAGS =
LIBS =
LIBS += dxlibp.a -lpspgu -lpng -lz -lm -lpsprtc -lpspaudio -lpspaudiocodec -lpsputility -lpspjpeg#DXライブラリPortable使用時に追加
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Title
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak
どちらも同じフォルダに入れています
何が原因なのでしょうか?
visual C++ 2008 Express Editionを使ってます
過去ログも調べました
調べが甘かったのかもしれません 長文失礼します
758ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(76,148ポイント)
Date: 2009/04/05(日) 20:46
No:31776
|
|
Title: Re:Makefile?のエラー
|
|
環境変数に make.exe へのパスが通っていないのが原因です。
スタートメニューの「Visual C++ 2008 Express Edition」内にコマンドラインツールがあるので、
それを使って(開かれたコマンドプロンプト内で) make を実行するか、
実際に環境変数に make.exe を含むディレクトリへのパスを通した上で、再度実行してみてください。
「環境変数 PATH」で検索すると、パスの通し方が載っているサイトがいくつか見つかります。
32ポイント を手に入れた。
|
|
|
|
|
Name: すこーる ..かけだし(1,081ポイント)
Date: 2009/04/05(日) 21:43
No:31778
|
|
Title: Re:Makefile?のエラー
|
|
パス通ってました^^;
なので、make.exeをmakefileと同じ場所に置き
コマンドラインツールで実行したら
無事できました(EBOOT.PBP、ELF、SFO等が作成)
それでもエラーがでますが、なぜでしょう?
PSPでは動作もしました
1>------ ビルド開始: プロジェクト: test, 構成: Debug Win32 ------
1>メイクファイル プロジェクト動作を実行しています。
1>process_begin: CreateProcess((null), psp-config --pspsdk-path, ...) failed.
1>makefile:19: /lib/build.mak: No such file or directory
1>make: *** No rule to make target `/lib/build.mak'. Stop.
1>Project : error PRJ0019: ツールはエラー コードを返しました : "メイクファイル プロジェクト動作を実行しています。"
1>ビルドログは "省略しました" に保存されました。
1>test - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
放置はまずいですよね?
323ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(137,924ポイント)
Date: 2009/04/05(日) 22:06
No:31781
|
|
Title: Re:Makefile?のエラー
|
|
> それでもエラーがでますが、なぜでしょう?
エラーメッセージを読んでいますか?
> 1>makefile:19: /lib/build.mak: No such file or directory
/lib/build.mak
というファイルがない、と言われています。
どうすれば直るか、私は同じ環境を持っていないのでわかりません。
50ポイント を手に入れた。
|
|
|
|
|
Name: すこーる ..かけだし(1,189ポイント)
Date: 2009/04/05(日) 22:16
No:31783
|
|
Title: Re:Makefile?のエラー
|
|
言うとおりでした
単純なミスでした・・・
申し訳ございませんでした
御津凪さん、boxさん
答えてくださりありがとうございました
2倍のポイントを手に入れた! 108ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(76,339ポイント)
Date: 2009/04/05(日) 22:19
No:31784
|
|
Title: Re:Makefile?のエラー
|
|
先ほど DXライブラリPortable を調べてきました。
makefile の一文に、
PSPSDK=$(shell psp-config --pspsdk-path)
となっている箇所があります。
この様子だと shell もパスに通っている必要があるようです。
(ここで PSPSDK のパスを取ってきている)
そのため、PSPSDK の値が空となり、 PSPSDK の提供するビルド用メイクファイルへのパスが正しく通っていません。
つまり、
> パス通ってました^^;
と言っていますが、 make, shell がデフォルトで実行されていないため、通っていないと考えられます。
(存在していないパスを通していませんか?)
とりあえず、
http://sourceforge.jp/projects/dxlibp/wiki/FrontPage
に、チュートリアル等があるので、実際にやってみて同様の問題が起きないか確認してみてください。
(ちなみに私は DXライブラリPortable 利用者ではないので余り詳しくはないです)
191ポイント を手に入れた。
|
|
|
|
|
Name: すこーる ..かけだし(1,184ポイント)
Date: 2009/04/06(月) 12:19
No:31810
|
|
Title: Re:Makefile?のエラー
|
|
それを参考に作ったのですが
もう一度作り直してみたら無事出来ました
エラーも出ませんでした
ここまで答えてくれた方
本当にありがとうございます
5ポイント を落としてしまった。
|
|
|
|
Name: TKOZ ..上級者(20,791ポイント)
Date: 2009/04/06(月) 09:42
No:31800
|
|
Title: 3Dエンジン制作について
|
|
ネットカフェから書き込みです。
DXライブラリで3Dエンジンなるものを作っているのですが、
フラットシェーディングの部分で
つまづいてしまいました。
環境は、WindowsXP CPU2.66GHz HDD30GB VisualC++6.0です。
立方体を回転させるプログラムなのですが、
回転させると、ちらついてしまうんですよ。
どこの計算が間違っているのか、アドバイスをお願いします。
ソースは、Main.cppに全て書いてありますので、それをアップします。
2倍のポイントを手に入れた! 168ポイント を手に入れた。
|
|
|
Name: 匿名 ..中級者(10,204ポイント)
Date: 2009/03/14(土) 20:44
No:30740
|
|
Title: 画像を歪ませたいんですが・・
|
|
画像をグニャグニャさせるサンプルとかを見たんですが、画像の一部だけをグニャグニャするにはどうしたらいいでしょうか?そのままやると境目が目立ってしまうんです。最終的には背景に水面に石を落した時のような変化をつけてみたいんですが・・
42ポイント を手に入れた。
|
|
|
|
Name: 朽木 ..かけだし(2,296ポイント)
Date: 2009/03/14(土) 20:59
No:30741
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
>水面に石を落した時のような―
ググってみると、参考になりそうなサイトがいくつかあったので、そちらを見てみてはいかがでしょうか。
下に、私が検索して「関係ありそうだなー」って思ったページを挙げてみました。
1.JavaApplet
ttp://oshiete1.goo.ne.jp/qa2551462.html
で、単純(私は理解できなかったけど@@;)な方法で解決しようとしている書き込みがあります。
2.ActionScript
ttp://sakeprog.cocolog-nifty.com/sake/2008/06/post_296b.html
3.C++(Direct3D)
ttp://www.shader.jp/xoops/html/modules/wordpress/index.php?p=97
ttp://www.shader.jp/xoops/html/modules/wordpress/index.php?p=208
Shader.jpを検索してみたら面白そうなものがありました。これが一番参考になるのではないでしょうか。
(※ごめんなさい、画像変形サンプルあるし、一部だけってのを全然読んでませんでした。)
184ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(10,142ポイント)
Date: 2009/03/15(日) 16:18
No:30784
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
・・さて、見てみたのですが。
やはりこれは一筋縄ではいかないようですね。
Cで書かれているサンプルがあまりないようですし・・
さてどうすれば・・
少し考える必要がありますね・・
88ポイント を落としてしまった。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(328,211ポイント)
Date: 2009/03/15(日) 16:38
No:30786
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
環境もそうですし、どのサンプルの話なのかもわからないので、
何とも答えようがないのですが。
>画像をグニャグニャさせるサンプルとかを見たんですが、
>画像の一部だけをグニャグニャするにはどうしたらいいでしょうか
そのサンプルを改良して影響範囲を制限するだけでできるのでは?
128ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(10,195ポイント)
Date: 2009/03/15(日) 18:43
No:30790
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
う〜ん、まあそうなんですけど。
DXライブラリのサンプルとかならいいんですが。
さすがに言語が違うと理解できないので改良できないんですよね・・
53ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(328,331ポイント)
Date: 2009/03/15(日) 22:47
No:30796
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
DXライブラリということなら、いくつか手はありますが、
図のように絵を細かく分割して頂点を増やし、必要な頂点をぐにゃぐにゃ操作して、
DrawPolygonBase()で一気に描画というのがオーソドックスな方法ではないかと思います。
別解としては、管理人さん作のサンプル
ttp://dixq.net/sm/d5.html
のような方法もあります。
120ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(10,256ポイント)
Date: 2009/03/16(月) 15:37
No:30817
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
これは良いですね、まさにこんな風に歪ませたかったんですよ。
サンプルがあったら見せてください。
ところでDrawPolygonBase関数ってどんな関数ですか?
検索しても見つからなかったんですが・・
61ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(10,564ポイント)
Date: 2009/03/16(月) 20:14
No:30857
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
確かにヘッダファイルにありましたね、DrawPolygonBase関数
DrawPolygonBase( VERTEX *Vertex, int VertexNum, int PrimitiveType, int GrHandle, int TransFlag ) ;
注釈には2Dポリゴンを描画すると書かれていますね。
Justyさんの画像を見ると確かに2Dポリゴンぽいですが、これはどうやって使えばいいのでしょうか?
引数から推測すると3Dポリゴンの様にVERTEX *Vertexは頂点・・ですかね。
VertexNumはポリゴンの数、PrimitiveTypeはポリゴンを敷き詰めるパターン・・かな?
GrHandleはポリゴンに使う画像、TransFlagは透過フラグってところですかね?
この関数は結構使えそうなのでぜひとも使い方を教えてください。
あとどこかでサンプルプログラムとかが公開されていたら教えてください。
234ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(16,092ポイント)
Date: 2009/03/16(月) 20:19
No:30859
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
同ヘッダ内でVERTEX構造体が定義されていますね。検索すると見つかりますよ。
19ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(10,838ポイント)
Date: 2009/03/16(月) 20:49
No:30862
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
えーと、それっぽいのがありました。
// 主に2D描画に使用する頂点データ型(公開用)
typedef struct tagVERTEX
{
float x, y ;
float u, v ;
unsigned char b, g, r, a ;
} VERTEX ;
3Dポリゴンの時のようにポリゴンの数×3個、配列で用意すればOK・・かな?
変数名は3Dと同じようなので、yは下が0となるのでしょうか?
uとvは画像の使う場所のようですが、絵を細かく分割しますから(0,0),(0,1),(1,0),(0,1),(1,0),(1,1)みたいな順番で代入していくんでしょうか?
そういえばGrHandleは多分画像ハンドルだと思うのですが、絵は分割されてますから複数になりますよね・・画像ハンドルを渡すと関数内で分割してくれるんでしょうか?
飲み込みが悪くてすいませんが、長い目で見てください。
274ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(16,278ポイント)
Date: 2009/03/16(月) 21:11
No:30864
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
実際にコードを打ってテストするのが一番早いのですが(笑)
私はこの関数を使ったことはありませんが、ほとんどDirectXに渡すデータそのものの感じがします。
uvはテクスチャ座標です。
GrHandleはテクスチャに使う画像ハンドルでしょう。
分割とか複数とかが何を言いたいのか分かりませんが、普通にuvで指定した範囲をポリゴンのテクスチャとして設定するものかと思いますよ。
何より、実際にプログラムを作ってみてください(私が作ってもいいのだけれど・・・
130ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(11,037ポイント)
Date: 2009/03/16(月) 22:16
No:30871
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
そうなんですけど引数の意味がわからないとプログラムの作りようが・・
分割とか複数とかは、
>>図のように絵を細かく分割して頂点を増やし、必要な頂点をぐにゃぐにゃ操作して、
>>DrawPolygonBase()で一気に描画というのがオーソドックスな方法ではないかと思います。
と言うわけでDrawPolygonBase関数にグラフィックハンドルを渡せば関数内で分割して描画してくれる・・ならいいんですが、そうでない場合グラフィックハンドルは一枚ずつ渡さないといけないのかなって事です。
まあ一気に描画って言うぐらいだから関数内で分割してくれるのかな?
199ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(328,797ポイント)
Date: 2009/03/16(月) 22:45
No:30873
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
>サンプルプログラムとかが公開されていたら教えてください
さわりだけ。
int image = LoadGraph("xxxx.png");
VERTEX v[] =
{
{ 0, 0, 0, 0, 255, 0, 255, 255 },
{ 0, 300, 0, 1, 255, 0, 255, 255 },
{ 300, 0, 0.5f, 0, 255, 255, 255, 255 },
{ 300, 300, 0.5f, 1, 255, 255, 255, 255 },
{ 500, 0, 1, 0, 0, 255, 255, 255 },
{ 500, 300, 1, 1, 0, 255, 255, 255 },
};
DrawPolygonBase(v, 6, DX_PRIMTYPE_TRIANGLESTRIP, image, 0);
>まあ一気に描画って言うぐらいだから関数内で分割してくれるのかな?
そのための u, vです。
あぁ、1点修正が。
一気に、とは書きましたが、実際にはすべてをストリップにつなげるのは
ちょっと厄介なので、何回〜何十回か呼ぶ必要がありそうです。
466ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(11,171ポイント)
Date: 2009/03/16(月) 23:03
No:30874
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
ああなるほど、渡したグラフィックハンドルのどの部分を使うかをu, vで座標ごとに指定しているわけですね。
後わからない所は・・DX_PRIMTYPE_TRIANGLESTRIPの意味がわからないです。
2倍のポイントを手に入れた! 134ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(328,723ポイント)
Date: 2009/03/16(月) 23:07
No:30875
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
DXライブラリではないですが。
プリミティブタイプ Mi-ko's FriendlySpace
ttp://mi-ko.cocoa.cx/programming/directx/directgraphics/FVF/directgraphics_01.html
74ポイント を落としてしまった。
|
|
|
|
|
Name: SCI ..上級者(16,599ポイント)
Date: 2009/03/17(火) 10:11
No:30882
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
とりあえず、簡単にテスト用として。
頂点の数だけVERTEXを用意します。
頂点の位置、uv座標をいろいろ変えると、いわゆる「変形」になりますね。
頂点カラーはテクスチャカラーと乗算です。
プリミティブタイプはJustyさんの言うとおりで、DirectXで調べるといいですね。
101ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(11,284ポイント)
Date: 2009/03/17(火) 18:48
No:30902
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
トライアングルストリップですか、
意味は・・テクスチャに隙間ができないようにするんでしょうか?
後は変形ですけど・・座標を手打ちで入力するわけにはいかないし、そもそもどう変えればいいのかもわからないし、やっぱり何か物理学的な式とかで計算しないといけないんでしょうか?
113ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(11,342ポイント)
Date: 2009/03/19(木) 22:46
No:31094
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
Justyさんの画像から察すると、中心に近いほど大きく、外側に行くほど小さく変形すればいいみたいですね。
それを表現する計算式は・・ちょっと思いつかないですね。
58ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(18,365ポイント)
Date: 2009/03/20(金) 00:44
No:31096
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
適当に作ってみましたが、こんな感じですか?
これは、xy平面上の0〜10の正方形の中に、0.1刻みで点を用意し、一部を半球面(Justyさんの画像)っぽく変換を施してプロットしたものです。
速度やアルゴリズムを最適化するにはそれなりの学術的知識が必要になるのでしょうが、なんとなくそれっぽくでもこんな感じになりますね。
142ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(332,570ポイント)
Date: 2009/03/20(金) 02:41
No:31099
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
>座標を手打ちで入力するわけにはいかないし
まずは普通に規則正しく座標が並んだデフォルトの座標を求めるので、
x軸、y軸の for二重ループで計算できます。
>そもそもどう変えればいいのかもわからないし
いろいろやり方があり、処理内容によって微妙に異なりますが、おおむね
1デフォルトの座標・UV座標を計算する
2デフォルトの座標・UV座標からのオフセット(何らかの計算)で歪ませる
3トライアングルストリップ構築〜描画
という流れでいいかと思います。
1は最初の1回のみで、後は2と3を毎フレーム繰り返すことになります。
190ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(11,421ポイント)
Date: 2009/03/20(金) 14:24
No:31109
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
SCIさんの画像は確かにそれっぽく見えますね。
変換する時の点の座標はどうやって求めたんですか?
そういえばJustyさんの画像も綺麗に歪んでいますけど、あれはどうやったんでしょうか?
79ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(18,707ポイント)
Date: 2009/03/20(金) 15:25
No:31110
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
イメージとしては「平面の上に半球を置き、平面を引き伸ばして半球の内側にくっつける」です。「魚眼レンズ」が一番近いですね。
つまり、半径の上の中点は半球に沿った半円周上でも中点です。
それを、中心から対象の点に向かうベクトル方向に対して考えて、平面上に正射影したと考えればいいかと。
射影変換だったか、アフィン変換だったか・・・よく分かりませんが・・・
r↑ = (x - x0, y - y0)
θ = (π/2) * (|r↑|/R)
r' = Rsinθ
x' = r'cosφ + x0
y' = r'sinφ + y0
(φ = arg(r↑))
ホントにこれでいいのかは知りませんが。
これが半楕円面やその他の曲線に対する変換(波紋とか)だと、より一般的な変換を考えなければなりません。
この画像では格子点数(ポリゴンの頂点に相当)がかなり多いので境界がはっきりしていますが、ポリゴンの数を荒くすればJustyさんの画像に近づくと思います。
342ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(11,469ポイント)
Date: 2009/03/21(土) 00:10
No:31121
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
お、おお・・やはり複雑な式が必要みたいですね。
でも一度数値を代入してしまえば、ループの中でDrawPolygonBase関数を呼ぶだけですから、できない事も無さそうですね。
しかし数学は苦手なので、ちょっと式の文字の意味がわからないですね・・
これをプログラムでやるとすると、どういう風に書けばいいんでしょうか?
48ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(19,432ポイント)
Date: 2009/03/21(土) 01:02
No:31122
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
あまりいいコードではありませんが・・・#include <stdio.h>
#include <math.h>
int main(void)
{
//中心と半径
const double cx = 5.0, cy = 5.0, r = 3.0;
//元座標
double x, y;
//変換後の、中心からの距離と座標
double r1, x1, y1;
//中心からの距離(の平方)、偏角
double d, ang;
FILE *fp = fopen("data.txt", "w");
for (x = 0.0; x < 10.0; x += 0.5)
{
for (y = 0.0; y < 10.0; y += 0.5)
{
d = (x - cx) * (x - cx) + (y - cy) * (y - cy);
if (d < r * r && y - cy != 0.0 && x - cx != 0.0)
{
ang = atan2(y - cy, x - cx);
r1 = r * sin(M_PI * sqrt(d) / (2.0 * r));
x1 = cx + r1 * cos(ang);
y1 = cy + r1 * sin(ang);
}
else
{
x1 = x;
y1 = y;
}
fprintf(fp, "%.8f %.8f\n", x1, y1);
}
}
fclose(fp);
return 0;
} 上のプロットを生成するために使ったコードを、少し修正したものです。
当たり半径を半球の範囲より小さくすると、膨張を浅くすることができますね。
ただ、この方法をゲーム(に限らず)の描画処理に速度的に使えるかどうかは分かりません。
数式についてはかなり簡単な部類だと思いますよ。
今回は画像処理ではなく、比較的簡単な図形を幾何学的に点を移動させているだけなので。
それはそうと、今更ですが
>そのままやると境目が目立ってしまうんです。
これをちょっと見てみたいのですが・・・
706ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(11,774ポイント)
Date: 2009/03/21(土) 16:06
No:31132
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
こんな感じでしょうかね、境目が目立ってすごい事になってます。
プログラムは
#include "DxLib.h"
#include <math.h>
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);SetOutApplicationLogValidFlag( FALSE );
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
int img = LoadGraph("aa.png");//画像をロード
DrawGraph( 0 , 0 , img , FALSE ) ;//画像を描画
for( int i=0;i<200;i++ ){
SetDrawArea( 50 , 100+i , 250 , 101+i );//描画可能領域のセット
DrawGraph( sin((float)i/20)*50 , 0 , img , FALSE ) ;//sin波で左右に揺らしながら一列づつ画像を描画
}
ScreenFlip();//表画面に反映
WaitKey();//キーの入力待ち
DxLib_End();
return 0;
}
こんな感じです。
ところでSCIさんのサンプルですが
Error: 外部シンボル 'WinMain' が未解決(C:\BORLAND\BCC55\LIB\C0W32.OBJ が参照)
が出るので、少し変えて実行してみたら、見事に数値が出力されました。
しかし・・fwrite関数とかは使えるようになったんですが
fprintf関数とかはまだ使い方を覚えてないんですよね・・
だからこのままだと求めた数値を有効利用できないので
すみませんがファイルを使わないで
VERTEX構造体に直接座標を代入して描画するようなサンプルを作っていただけないでしょうか?
305ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(19,492ポイント)
Date: 2009/03/21(土) 16:38
No:31136
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
なるほど、1列ずつずらしながら描画していますね。
>Error: 外部シンボル 'WinMain' が未解決(C:\BORLAND\BCC55\LIB\C0W32.OBJ が参照)
あのコードは座標の数値を出力するだけの「コンソールアプリ」なので、設定を「コンソールアプリケーション」にするとコンパイルできます。
>だからこのままだと求めた数値を有効利用できないので
あのサンプルでは、出力した数値を別のグラフソフト(gnuplot)でプロットしました。
頂点データを使ったものも作ってみました。
コードは修正してから載せるのでちょっと待っててください(汗
60ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(19,555ポイント)
Date: 2009/03/21(土) 16:52
No:31139
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
それから、DxLibの3D機能を使えば、座標変換が少し簡単になります。
正射影の部分はDxLibの3Dポリゴン処理で勝手にやってくれるので(笑
63ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(11,797ポイント)
Date: 2009/03/21(土) 17:38
No:31145
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
そういえばそうでしたね。
設定と言う機能があったのを忘れていました・・
23ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(19,685ポイント)
Date: 2009/03/21(土) 19:01
No:31148
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
うーん、微妙・・・
射影変換をDxLib(というかDirectX)に任せると、デフォルトでは画面中心に向くので、膨らみの角度もそれに伴って変わりますね。
奥行きの歪みじゃなくて、上の横波のような歪みを滑らかに作るには、また別の変換式を考えなければなりません。
DirectXならシェーダを使うとか(全然知らないけど)ありますが・・・
130ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(11,920ポイント)
Date: 2009/03/21(土) 23:28
No:31150
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
上の画像は境目がどんな感じで目立つかを見せるための物ですから
実際はJustyさんとSCIさんの画像のように歪めばいいんですけど
確かに普通に描画すると画面中心によってしまいますよね。
私も以前それで失敗した事があります。
デフォルトではって事は何か変える方法があるのでしょうか?
123ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(20,355ポイント)
Date: 2009/03/22(日) 00:34
No:31152
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
>確かに普通に描画すると画面中心によってしまいますよね。
>私も以前それで失敗した事があります。
>デフォルトではって事は何か変える方法があるのでしょうか?
ん、何か勘違いしていませんか?
「中心に向く」というのは、無限遠点が画面中心にあるということです。
この辺は、3Dグラフィックスのビュー変換、透視変換に関する話です。これが原因の失敗というのが思いつかないのですが・・・
DrawPolygon3Dではなく、DrawPolygonBaseで2D座標のみを扱う場合、正射影も自分で計算します。
その場合、無限遠点は「画面平面の法線」方向なので、膨らみは単純に平行移動します。イメージしづらいとは思いますが・・・
とは言え、この2つの違いは処理速度くらいの差しかないので、表現上は気にしなくてもいいでしょう。
2倍のポイントを手に入れた! 670ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(12,073ポイント)
Date: 2009/03/22(日) 11:45
No:31156
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
そうなんですか、無限遠点が画面中心にあると言うのは理解していましたが
2Dもそうなのかと勘違いしてしまいました。
ちなみにどんな失敗をしたかと言うと3Dポリゴンで階段を描画しようとしたら
画面の右の方はスコアボードがあるので階段の中心が画面中心からずれてしまうので
左右の拡大率に差が出てしまったんですよね・・
153ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(12,103ポイント)
Date: 2009/03/25(水) 00:41
No:31208
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
でも、四聖龍神録とかだと真っ直ぐに描画されているんですよね。
あれも3Dポリゴンだと思いますけど、何か無限遠点の位置を変更する方法でもあるのかな?
30ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(20,562ポイント)
Date: 2009/03/25(水) 01:04
No:31211
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
>匿名さん
なんか「真っ直ぐ」の認識が食い違っていますね(笑
3Dについては透視点とか射影変換を復習してみてください。
座標変換を自前でやる場合、そこに3Dの概念は存在しないので、ビュー変換自体が意味を持ちません。
立体の絵を平面に手描きする感じです。透視点を意識して描かない限り、一貫した消失点が存在している必要はありません。
本題に戻りますが、歪みの件は方向性が見えてきましたか?
154ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(12,256ポイント)
Date: 2009/03/25(水) 20:32
No:31241
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
そうですね、真っ直ぐじゃなくて左右対称ですね。
歪みの件ですがDrawPolygonBase関数の使い方は大体わかってきました。
しかし色々な数値をうまく代入していくのが難しいですね。
SCIさんに教えてもらった変形の式はちょっと理解に手こずっています。
画像のどの部分と対応しているかはわかりますが、うまくDrawPolygonBase関数に値を渡せません。
153ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(21,012ポイント)
Date: 2009/03/26(木) 00:21
No:31247
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
>しかし色々な数値をうまく代入していくのが難しいですね。
どのような順序で頂点をつなぐかにも寄りますが、うまく数列の一般項を定めれば多少まとまりますね。
ちなみにNo:31148の画像はDrawPolygon3Dを使ってます。
膨張も、すべて座標変換するのではなく、高さを計算してz座標を変化させています。
>SCIさんに教えてもらった変形の式はちょっと理解に手こずっています。
三角関数とベクトルで考えるしか(笑
あ、作図しないとイメージは難しいかも知れません。
208ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(13,333ポイント)
Date: 2009/03/26(木) 19:50
No:31273
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
まあ、式の意味がわからなくてもできない事はないと思いますが・・
ちなみにSCIさんのサンプルで出した値を構造体に代入して描画するプログラムを作っては見たんですが、
実行結果が↑です。完全に迷走状態ですね、何で背景が消えてるんだろう・・
プログラムはこんな感じです。
即席ですのでちょっと雑・・
#include "DxLib.h"
#include <math.h>
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);SetOutApplicationLogValidFlag( FALSE );
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
int img = LoadGraph("aa.png");//画像をロード
int GHandle = MakeGraph( 300 , 300 );//空のグラフィックを作成
int X=200,Y=240;//描画する中心をセット
VERTEX v[400];//構造体の宣言
//中心と半径
const double cx = 5.0, cy = 5.0, r = 3.0;
//元座標
double x, y;
//変換後の、中心からの距離と座標
double r1, x1, y1;
//中心からの距離(の平方)、偏角
double d, ang;
DrawGraph( 0 , 0 , img , FALSE ) ;//背景を描画
GetDrawScreenGraph( X-150 , Y-150 , X+150 , Y+150 , GHandle );//背景の一部をキャプチャ
for (x = 0.0; x < 10.0; x += 0.5)
{
for (y = 0.0; y < 10.0; y += 0.5)
{
d = (x - cx) * (x - cx) + (y - cy) * (y - cy);
if (d < r * r && y - cy != 0.0 && x - cx != 0.0)
{
ang = atan2(y - cy, x - cx);
r1 = r * sin(M_PI * sqrt(d) / (2.0 * r));
x1 = cx + r1 * cos(ang);
y1 = cy + r1 * sin(ang);
}
else
{
x1 = x;
y1 = y;
}
v[(int)(x*2)*20+(int)(y*2)].x=X-150+300/19*(x1*2);
v[(int)(x*2)*20+(int)(y*2)].y=Y-150+300/19*(y1*2);
v[(int)(x*2)*20+(int)(y*2)].u=x/10;
v[(int)(x*2)*20+(int)(y*2)].v=y/10;
v[(int)(x*2)*20+(int)(y*2)].b=255;
v[(int)(x*2)*20+(int)(y*2)].g=255;
v[(int)(x*2)*20+(int)(y*2)].r=255;
v[(int)(x*2)*20+(int)(y*2)].a=255;
}
DrawPolygonBase(v, 400, DX_PRIMTYPE_TRIANGLESTRIP, GHandle, 0);//画像を描画
}
ScreenFlip();//表画面に反映
WaitKey();//キーの入力待ち
DxLib_End();
return 0;
}
1,077ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(57,363ポイント)
Date: 2009/03/26(木) 20:02
No:31274
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
歪みとは関係ないけど
> if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
これはダメです。
DxLib_Initで成功して、SetDrawScreenに失敗した場合にDxLib_Endしないで終了してしまいます。
56ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(334,986ポイント)
Date: 2009/03/26(木) 21:55
No:31277
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
>プログラムはこんな感じです
以前書いた回答の手順のうち、1と2は行っていますが、
3の前半「トライアングルストリップ」の構築ができていません。
トライアングルストリップはどういうものなのか(どういう順番で座標リストを作るのか)、
図を引いたりしてもう一度見直してみた方がいいかと思います。
216ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(21,068ポイント)
Date: 2009/03/26(木) 23:10
No:31279
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
>まあ、式の意味がわからなくてもできない事はないと思いますが・・
できるのなら、私はもう何も言えませんね。
56ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(13,560ポイント)
Date: 2009/03/27(金) 14:36
No:31298
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
しかし、やはり難しいようですね。
for (x = 0.0; x < 10.0; x += 0.5)
{
for (y = 0.0; y < 10.0; y += 0.5)}
から縦横20個に分けていると解釈して構造体を20×20で400個用意して、
for文の値から画像のどの点に対応しているか代入したつもりですが、
よく考えたらトライアングルストリップの説明に「三角形を並べて図形を作る」って書いてあったような・・
このプログラムだと座標を格子状に並べていますから、こうなるのも当然かも、全然三角形を作ってないし・・
すみません、やっぱり自分一人じゃ無理です・・
227ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(335,466ポイント)
Date: 2009/03/28(土) 00:06
No:31304
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
>やはり難しいようですね
慣れてしまえばそれほど難しいものではないのですが,
まずは単純な3つか4つくらいの頂点のトライアングルストリップを
作っていろいろいじって慣れてください。
それからでないと、いきなりグリッド状のストリップを作るのは
難しいかもしれません。
>構造体を20×20で400個用意して、
>for文の値から画像のどの点に対応しているか代入
したのなら、あとはその情報を元にトライアングルストリップを構築するだけです。
まずは添付の図のような順番で横方向に頂点情報を作ります。
横一列分の頂点リストができあがったのなら、そのリストを DrawPolygonBase()に
流し込みます。
それが終わったら次の列を処理します。
それを縦の列の数の分だけ繰り返せば、完了です。
あと、
for (x = 0.0; x < 10.0; x += 0.5) // 座標でループ
{
for (y = 0.0; y < 10.0; y += 0.5)}
こういう浮動小数点数を使ったループではなく、
きちんと分割数を定義して
for(int y=0; y<=NumY; ++y) // 分割数でループ
{
for(int x=0; x<=NumX; ++x)
のようなループとした方が、配列の参照するインデックスを求めたりするのは勿論、
UV値を求めるとき等、計算しやすくなるかと思います。
480ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(13,595ポイント)
Date: 2009/03/28(土) 00:42
No:31305
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
確かに図にするとわかりやすいですね。
こんな風に頂点をジグザグに配置していけばいいんですか、私完全に直線状に配置してました・・
35ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(13,636ポイント)
Date: 2009/03/30(月) 10:07
No:31384
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
・・でもよく考えたらSCIさんのサンプルは二重ループですから、やはり式の意味を理解しないとトライアングルストリップを構築できませんね・・
41ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(14,194ポイント)
Date: 2009/03/31(火) 13:41
No:31430
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
ちょっと一筋縄では行かないので、トライアングルストリップの練習をしてみました。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);SetOutApplicationLogValidFlag( FALSE );
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
int GHandle = LoadGraph("aa.png");//画像をロード
VERTEX v[3];//構造体の宣言
v[0].x=100;
v[0].y=100;
v[0].u=0;
v[0].v=0;
v[0].b=255;
v[0].g=255;
v[0].r=255;
v[0].a=255;
v[1].x=200;
v[1].y=100;
v[1].u=1;
v[1].v=0;
v[1].b=255;
v[1].g=255;
v[1].r=255;
v[1].a=255;
v[2].x=200;
v[2].y=200;
v[2].u=1;
v[2].v=1;
v[2].b=255;
v[2].g=255;
v[2].r=255;
v[2].a=255;
DrawPolygonBase(v, 3, DX_PRIMTYPE_TRIANGLESTRIP, GHandle, 0);//画像を描画
ScreenFlip();//表画面に反映
WaitKey();//キーの入力待ち
DxLib_End();
return 0;
}
よく考えたらトライアングルストリップなんだから頂点は三個一組で用意するべきでしたね・・
3Dポリゴンの時のように「画像は2の乗数サイズしか使用出来ない」とか「取り込んだ画像は正常に描画されない」みたいな心配もありますが、一応うまく描画されました。
ここからフィールドを構築・・できるだろうか?
384ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(14,902ポイント)
Date: 2009/04/02(木) 13:53
No:31566
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
とりあえず描画はできましたが、上下左右の端が不自然になってしまいました。
このままだと無駄な処理が多すぎるので、何とか簡略化したいんですが・・
<#include "DxLib.h"
#include <math.h>
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);SetOutApplicationLogValidFlag( FALSE );
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
int img = LoadGraph("aa.png");//画像をロード
VERTEX v[40];//構造体の宣言
//中心と半径
const double cx = 5.0, cy = 5.0, r = 3.0;
//元座標
double x, y;
//変換後の、中心からの距離と座標
double r1, x1, y1;
//中心からの距離(の平方)、偏角
double d, ang;
for (x = 0.0; x < 10.0; x += 0.5){
for (y = 0.0; y < 10.0; y += 0.5){
d = (x - cx) * (x - cx) + (y - cy) * (y - cy);
if (d < r * r && y - cy != 0.0 && x - cx != 0.0){
ang = atan2(y - cy, x - cx);
r1 = r * sin(M_PI * sqrt(d) / (2.0 * r));
x1 = cx + r1 * cos(ang);
y1 = cy + r1 * sin(ang);
}
else{
x1 = x;
y1 = y;
}
v[(int)(y*4)].x=x1*50;
v[(int)(y*4)].y=y1*50;
v[(int)(y*4)].u=x/10;
v[(int)(y*4)].v=y/10;
v[(int)(y*4)].b=255;
v[(int)(y*4)].g=255;
v[(int)(y*4)].r=255;
v[(int)(y*4)].a=255;
x+=0.5;
d = (x - cx) * (x - cx) + (y - cy) * (y - cy);
if (d < r * r && y - cy != 0.0 && x - cx != 0.0){
ang = atan2(y - cy, x - cx);
r1 = r * sin(M_PI * sqrt(d) / (2.0 * r));
x1 = cx + r1 * cos(ang);
y1 = cy + r1 * sin(ang);
}
else{
x1 = x;
y1 = y;
}
v[(int)(y*4)+1].x=x1*50;
v[(int)(y*4)+1].y=y1*50;
v[(int)(y*4)+1].u=x/10;
v[(int)(y*4)+1].v=y/10;
v[(int)(y*4)+1].b=255;
v[(int)(y*4)+1].g=255;
v[(int)(y*4)+1].r=255;
v[(int)(y*4)+1].a=255;
x-=0.5;
}
DrawPolygonBase(v, 40, DX_PRIMTYPE_TRIANGLESTRIP, img, 0);//画像を描画
}
ScreenFlip();//表画面に反映
WaitKey();//キーの入力待ち
DxLib_End();
return 0;
} あと、2Dポリゴンでも画像は2の乗数サイズしか使用出来ないようですね・・
678ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(13,271ポイント)
Date: 2009/04/02(木) 17:15
No:31596
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
上のプログラムを少し改良してみました。
その結果、歪んでいる部分が画面からはみ出ると描画できなくなるという問題が出てきました。
これはどうやったら解決できるか分からないので、何か方法があったら教えてください。
あと、静止画だと分かりにくいのでちょっと適当な画像で実行してみてください。
#include "DxLib.h"
#include <math.h>
int count=0;
void wait_fanc(){
int term;
static int t=0;
term = GetNowCount()-t;
if(16-term>0)
Sleep(16-term);
t=GetNowCount();
return;
}
void fps(){
int i;
static int t=0,ave=0,f[60];
f[count%60]=GetNowCount()-t;
t=GetNowCount();
if(count%60==59){
ave=0;
for(i=0;i<60;i++)
ave+=f[i];
ave/=60;
}
if(ave!=0){
DrawFormatString(350,250,GetColor(255,255,255),"%.1fFPS",1000.0/(double)ave);
}
return;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);SetOutApplicationLogValidFlag( FALSE );
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
int img = LoadGraph("aa.png");//画像をロード
int GHandle = MakeGraph( 256 , 256 );//空のグラフィックを作成
int X=100,Y=100;
float Count=0,CountX=0,CountY=0;
VERTEX v[40];//構造体の宣言
//中心と半径
const double cx = 5.0, cy = 5.0, r = 5.0;
//元座標
double x, y;
//変換後の、中心からの距離と座標
double r1, x1, y1;
//中心からの距離(の平方)、偏角
double d, ang;
char Key[256];
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
DrawGraph( 0 , 0 , img , FALSE ) ;//背景を描画
fps();
GetDrawScreenGraph( X , Y , X+256 , Y+256 , GHandle );//背景の一部をキャプチャ
CountX=0;
for (x = 0.0; x < 10.0; x += 0.5){
CountY=0;
for (y = 0.0; y < 10.0; y += 0.5){
d = (x - cx) * (x - cx) + (y - cy) * (y - cy);
if ( d < r * r && ( y - cy != 0.0 || x - cx != 0.0 ) ){
ang = atan2(y - cy, x - cx);
r1 = r * sin(M_PI * sqrt(d) / (2.0 * r));
x1 = cx + r1 * cos(ang);
y1 = cy + r1 * sin(ang);
}
else{
x1 = x;
y1 = y;
}
v[(int)(y*4)].x=X+x1*25.6;
v[(int)(y*4)].y=Y+y1*25.6;
if ( d < r * r ){
v[(int)(y*4)].u=x/10+cos(Count+CountX)/80;
v[(int)(y*4)].v=y/10+sin(Count+CountY)/80;
v[(int)(y*4)].b=255-(50-d)*2;
v[(int)(y*4)].g=255-(50-d)*2;
}
else{
v[(int)(y*4)].u=x/10;
v[(int)(y*4)].v=y/10;
v[(int)(y*4)].b=255;
v[(int)(y*4)].g=255;
}
v[(int)(y*4)].r=255;
v[(int)(y*4)].a=255;
x+=0.5;
d = (x - cx) * (x - cx) + (y - cy) * (y - cy);
if ( d < r * r && ( y - cy != 0.0 || x - cx != 0.0 ) ){
ang = atan2(y - cy, x - cx);
r1 = r * sin(M_PI * sqrt(d) / (2.0 * r));
x1 = cx + r1 * cos(ang);
y1 = cy + r1 * sin(ang);
}
else{
x1 = x;
y1 = y;
}
v[(int)(y*4)+1].x=X+x1*25.6;
v[(int)(y*4)+1].y=Y+y1*25.6;
if ( d < r * r ){
v[(int)(y*4)+1].u=x/10+cos(Count+CountX)/80;
v[(int)(y*4)+1].v=y/10+sin(Count+CountY)/80;
v[(int)(y*4)+1].b=255-(50-d)*2;
v[(int)(y*4)+1].g=255-(50-d)*2;
}
else{
v[(int)(y*4)+1].u=x/10;
v[(int)(y*4)+1].v=y/10;
v[(int)(y*4)+1].b=255;
v[(int)(y*4)+1].g=255;
}
v[(int)(y*4)+1].r=255;
v[(int)(y*4)+1].a=255;
x-=0.5;
CountY+=0.5;
}
DrawPolygonBase(v, 40, DX_PRIMTYPE_TRIANGLESTRIP, GHandle, 0);//画像を描画
CountX+=0.5;
}
count++;
ScreenFlip();
wait_fanc();
if( Key[ KEY_INPUT_UP ] == 1 )Y-=3;
if( Key[ KEY_INPUT_LEFT ] == 1 )X-=3;
if( Key[ KEY_INPUT_DOWN ] == 1 )Y+=3;
if( Key[ KEY_INPUT_RIGHT ] == 1 )X+=3;
// if( X<0 )X=0;
// if( X>384 )X=384;
// if( Y<0 )Y=0;
// if( Y>223 )Y=223;
Count+=0.05;
}
DxLib_End();
return 0;
}
1,631ポイント を落としてしまった。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(336,573ポイント)
Date: 2009/04/02(木) 21:31
No:31615
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
>歪んでいる部分が画面からはみ出ると描画できなくなるという
それはそうです。
GetDrawScreenGraph()で指定した範囲に画面の外が含まれていると
自動的に補正され画面外を含まない範囲になるよう補正されます。
その為、得られたグラフィックスは望んだものとは異なるものとなるので
挙動がおかしくなるのではないでしょうか。
試しに、DrawPolygonBase()をやめて、普通に DrawGraph()で GHandleを
表示してみてください。
147ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(13,367ポイント)
Date: 2009/04/03(金) 13:38
No:31636
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
確かに普通に描画するとよくわかります。
どうやら補正されているというより取り込まれて無いみたいですね。
でも歪んでいる部分が画面からはみ出るパターンも作りたいんですよね・・
何か方法はないでしょうか?
96ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(22,482ポイント)
Date: 2009/04/03(金) 16:28
No:31638
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
コードを試してないんでよく分かってませんが、こういう状態でしょうか。
歪んだ部分は左の画面外に出ています。
53ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(336,869ポイント)
Date: 2009/04/03(金) 22:45
No:31652
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
>取り込まれて無いみたいですね
あー、エラーになって更新されないわけですね。
>でも歪んでいる部分が画面からはみ出るパターンも作りたいんですよね・
今の方法って、何かしらの背景を表示したら、GetDrawScreenGraph()で必要な部分を切り取って
動かない部分はDrawGraphで、動く部分は DrawPolygonBase()で行っているわけですよね?
画面から切り取るときの座標を必ず画面内におさまるよう調整してあげれば
できなくもないですが、手っ取り早いのは画面全体をとりこんで、そのすべてをグリッド化、
必要なとこだけ頂点情報をいじって表示すればいいんじゃないでしょうか。
ttp://www.play21.jp/board/formz.cgi?action=res&resno=30740&page=&id=dixq&lognum=#30796
みたいに。
296ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(13,476ポイント)
Date: 2009/04/04(土) 12:15
No:31668
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
あれ?動かない部分は頂点を動かしてないだけで背景の時しかDrawGraphは使ってないと思いますけど?
画面全体を取り込んで必要なとこだけ頂点をいじるのは使えそうですね。
ちょっとやってみます。
ところでSCIさんの画像ですが、確かにそんな感じですが、その画像はどうやって作ったんですか?
109ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(13,595ポイント)
Date: 2009/04/04(土) 16:28
No:31675
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
と思ったんですが、画面全体のグリッド化はやってみると意外に難しかったです。
これはちょっと時間かかりそうですね・・
あと今の方法だと歪んでいる所と歪んでいない所の境目が目立ってしまうんですよね。
SCIさんの画像みたいに目立たなくするにはどうしたらいいでしょうか?
119ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(22,502ポイント)
Date: 2009/04/04(土) 16:50
No:31677
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
いや、方法は同じはずなので、境界は変わらないと思いますよ。
多分、使う画像によって目立つ場合があるのでは?
20ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(14,993ポイント)
Date: 2009/04/04(土) 20:47
No:31697
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
うーん、結構画像に関係なく目立ってます。
とりあえず、画面全体のグリッド化をやってみました。何か表示サイズがおかしいですが、それはともかく
歪んでいる部分が画面の外に出ると画像の端がめくれて元の背景が見えるという問題が発生しました・・
これは・・どうすればいいでしょうか?
#include "DxLib.h"
#include <math.h>
int count=0;
void wait_fanc(){
int term;
static int t=0;
term = GetNowCount()-t;
if(16-term>0)
Sleep(16-term);
t=GetNowCount();
return;
}
void fps(){
int i;
static int t=0,ave=0,f[60];
f[count%60]=GetNowCount()-t;
t=GetNowCount();
if(count%60==59){
ave=0;
for(i=0;i<60;i++)
ave+=f[i];
ave/=60;
}
if(ave!=0){
DrawFormatString(577,465,GetColor(255,255,255),"%.1fFPS",1000.0/(double)ave);
}
return;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);SetOutApplicationLogValidFlag( FALSE );
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
int image = LoadGraph("背景.png"),board = LoadGraph("枠.png");//画像をロード
int GHandle = MakeGraph( 384 , 448 );//空のグラフィックを作成
VERTEX v[50];//構造体の宣言
int X,Y;
int i;
//中心と半径
double cx = 244, cy = 240, r = 100;
//元座標
double x, y;
//変換後の、中心からの距離と座標
double r1, x1, y1;
//中心からの距離(の平方)、偏角
double d, ang;
char Key[256];
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
SetDrawArea( 32 , 16 , 416 , 464 );//描画可能領域のセット
DrawGraph( 32 , 16+count%700 , image , FALSE ) ;//背景を描画
DrawGraph( 32 , 16+(count%700)-700 , image , FALSE ) ;//背景を描画
GetDrawScreenGraph( 32 , 16 , 416 , 464 , GHandle );//背景の一部をキャプチャ
for (y = 16; y < 464; y += 16){
for (x = 32; x <= 416; x += 16){
for ( i = 0; i < 2; i++ ){
y+=16*i;
d = (x - cx) * (x - cx) + (y - cy) * (y - cy);
if ( d < r * r && ( y - cy != 0.0 || x - cx != 0.0 ) ){
ang = atan2(y - cy, x - cx);
r1 = r * sin(M_PI * sqrt(d) / (2.0 * r));
x1 = cx + r1 * cos(ang);
y1 = cy + r1 * sin(ang);
}
else{
x1 = x;
y1 = y;
}
v[(int)(x-32)/8+i].x=x1;
v[(int)(x-32)/8+i].y=y1;
if ( d < r * r ){
v[(int)(x-32)/8+i].u=(x-32)/384;
v[(int)(x-32)/8+i].v=(y-16)/448;
}
else{
v[(int)(x-32)/8+i].u=(x-32)/384;
v[(int)(x-32)/8+i].v=(y-16)/448;
}
v[(int)(x-32)/8+i].b=255;
v[(int)(x-32)/8+i].g=255;
v[(int)(x-32)/8+i].r=255;
v[(int)(x-32)/8+i].a=255;
y-=16*i;
}
}
DrawPolygonBase(v, 50, DX_PRIMTYPE_TRIANGLESTRIP, GHandle, 0);//画像を描画
}
SetDrawArea( 0 , 0 , 640 , 480 );//描画可能領域のセット
DrawGraph( 0 , 0 , board , TRUE ) ;//枠を描画
fps();
count++;
ScreenFlip();
wait_fanc();
if( Key[ KEY_INPUT_UP ] == 1 )cy-=3;
if( Key[ KEY_INPUT_LEFT ] == 1 )cx-=3;
if( Key[ KEY_INPUT_DOWN ] == 1 )cy+=3;
if( Key[ KEY_INPUT_RIGHT ] == 1 )cx+=3;
}
DxLib_End();
return 0;
}
1,398ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(22,624ポイント)
Date: 2009/04/04(土) 21:13
No:31703
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
>うーん、結構画像に関係なく目立ってます。
まず「目立つ」の認識が食い違っていますね。私には目立っている(私のものと差がある)ようには見えませんが・・・
>歪んでいる部分が画面の外に出ると画像の端がめくれて元の背景が見える
自身でそのようにプログラムしているので当然の結果です。
何がしたいかにもよるので、一概に「こうすればいい」というのはありませんね。
122ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(337,508ポイント)
Date: 2009/04/04(土) 21:20
No:31705
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
>動かない部分は頂点を動かしてないだけで背景の時しかDrawGraphは使ってないと思いますけど?
あー、まぁその背景の時の描画がそのまま残っている、ということです。
>あと今の方法だと歪んでいる所と歪んでいない所の境目が目立ってしまうんですよね
うっすらとしか見えないのですが、四角い境目のことですか?
ひょっとしたら x, y座標ともに 0.5を引いたら一致するかもしれませんね。
>元の背景が見えるという問題が発生しました・
元々背景を残したまま、上から DrawPolygonBase()で描画しているので、
・ GetDrawScreenGraph()の直後で ClearDrawScreen()を呼んで表示用の画面をクリアする
・ 表示用の画面ではなく一時的なテクスチャに対して背景をレンダリングする
のどちらかでとりあえず背景は見えなくなります。
395ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..上級者(15,012ポイント)
Date: 2009/04/04(土) 23:07
No:31712
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
確かにそれほど差があるわけでもないですね。
動かすことで強調されていたようです。
とりあえず背景は置いといて正しいサイズで描画できるように改良してみます。
19ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..上級者(15,059ポイント)
Date: 2009/04/06(月) 11:36
No:31805
|
|
Title: Re:画像を歪ませたいんですが・・
|
|
ところでSCIさんの画像は端がめくれていませんが、SCIさんはどのような方法で描画しているんですか?
47ポイント を手に入れた。
|
|
|
|
Name: 危 ..ぴよぴよ(76ポイント)
Date: 2009/04/05(日) 19:56
No:31773
|
|
Title: C言語を始めるには
|
|
C言語を始めるにはまずなにをしればいいですか?
また何をどんなサイトで勉強しればいいですか?
C言語とググるだけでいろんなページが出てくるので困ってます。
みなさんはどこでC言語を学びましたか?
76ポイント を手に入れた。
|
|
|
|
Name: TKOZ ..上級者(20,623ポイント)
Date: 2009/04/05(日) 20:12
No:31774
|
|
Title: Re:C言語を始めるには
|
|
C言語を始めるには、CまたはC++のコンパイラが必要です。
コンパイラは、無償で手に入るマイクロソフトの
VisualC++ 2008 ExpressEditionがお勧めです。
http://www.microsoft.com/japan/msdn/vstudio/Express/
ちなみに、VisualC++ 2005 ExpressEditionは、3月31日に提供終了となってしまいました。
参考書籍は、私の場合は「やさしいC」という本を購入し、勉強しました。
ですが、ポインタについてあまり詳しく載っていないので、もし、「やさしいC」を買うとしたら、
ステップアップしたいなら、副読本が必要です。
246ポイント を手に入れた。
|
|
|
|
|
Name: kerotan0820 ..入門者(3,786ポイント)
Date: 2009/04/05(日) 22:03
No:31779
|
|
Title: Re:C言語を始めるには
|
|
超初心者の僕ですが、僕は最初は本を使い勉強していました。
ROMに最初から必要なものが含まれていたため指示通りやればできたので楽でした^^
今はここでゲームを作る勉強してますが、基礎的な事はやっぱり深く理解する必要があるんだなと思いましたw
なんか感想文みたいですみません。
初心者の意見です^^
21ポイント を手に入れた。
|
|
|
|
|
Name: あ〜る ..入門者(3,749ポイント)
Date: 2009/04/06(月) 00:13
No:31787
|
|
Title: Re:C言語を始めるには
|
|
僕も最初は本でした
というかサイトを一通り見ても、やっぱり基礎をしっかりと説明してくれてるサイトはなかなか無いんですよね…
それに本なら気になった時にすぐ見る事ができますし、持ち運びもできます(サイトを印刷すればいいっていうツッコミはなしで(笑))
僕の場合C言語を勉強するというよりもゲームプログラミングの仕方を勉強しようと、最初から思ってたので「14歳から始めるわくわくC言語」という本を使いました(僕15歳ですけど…)
簡単なシューティングゲームを作りながら勉強出来たので結構わかりやすい方だと思います
一通り、中に書いてある内容を全部やるのにも一週間ぐらいしか掛かりませんでしたし
でもやっぱりポインタについてはあまり詳しくないので頑張るしかないですね…
あとは質問の内容には関係ありませんが、プログラミングを勉強するのに必要な事といえば、どんなに難しくてもくじけない確固たる意思ですかね…
よく、プログラミングは難しいから途中で挫折した、なんて話を聞きますけど最初から一つ一つしっかりと勉強すれば絶対わかるようになると思いますし
なので難しいと思っても根気よく頑張って下さい
それに、この掲示板の人達も優しい人ばかりなんでわからない事があってもすぐ教えてくれますしね
長々と書いてしまいすみません。
そして偉そうな事言ってるけど年上だったらどうしようとか思ってビクビクしてます
とりあえずフライングで謝っときます、すいません
初心者ですけど参考にして頂ければ光栄です
494ポイント を手に入れた。
|
|
|
|
Name: シューティング大好き ..ぴよぴよ(68ポイント)
Date: 2009/04/05(日) 13:57
No:31751
|
|
Title: ソースの2次配布
|
|
ブログの方に書いてしまったのですがこちらにも・・・
現在某動画の影響を受けてPSPにこちらのソースを移植しております。
とりあえず動くようにしたのですがDXライブラリPの完成度アップもかねて
私がいじったソースを共有してテストプログラムとして利用したいのですが
大丈夫でしょうか?
68ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) ..ウィザード(1,013,486ポイント)
Date: 2009/04/05(日) 14:10
No:31752
|
|
Title: Re:ソースの2次配布
|
|
PSPの件、こちらのサイトのプログラムを使用して頂きありがとうございます。
ソースの二次配布は元の所在がわかるようにして頂ければ問題ありません。
二次配布に二次配布が重なり誰がどうプログラムを書いたものなのかわからないコードになって
広がるということが無いようにだけして頂ければありがたいです。
105ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(76,335ポイント)
Date: 2009/04/05(日) 15:02
No:31754
|
|
Title: Re:ソースの2次配布
|
|
にしてもすごいですね。。
管理人さんのプログラムが移植できるということは・・・
関数も充実してきているってことですかね^^;
自分なんか途中で中断してますよ。PSPゲーム制作w
またちょっと再開してみようかなぁ・・・。
余談
管理人さんおかえりなさいですw
まだマン喫かな?^^;
124ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..ウィザード(1,013,537ポイント)
Date: 2009/04/05(日) 19:28
No:31770
|
|
Title: Re:ソースの2次配布
|
|
>>kazuoniさん
ただ今です、ありがとうございます^^;
留守の間色々と迷惑おかけしました;
「最近PSPで東方を」って話題がホットのようですね。
いや〜色んなところで東方が出来るもんですね〜^^
ネットはやっと開通しました。
でも平日はなかなかネットをする余裕がなさそうです・・;
54ポイント を手に入れた。
|
|
|
|
Name: nanasi ..ぴよぴよ(573ポイント)
Date: 2009/03/30(月) 19:18
No:31413
|
|
Title: 龍神録13章について
|
|
以前質問をあげていたものです
龍神録13章についてですが、確かにコンパイルすることはできたのですが、なぜか敵の弾が発射されません
弾の入っていないせいかとは思うのですが、完成品のところからその部分を引っ張ってくると、また「定義されてない関数です」と言われてしまいます
この場合、どうすればいいでしょうか?
2倍のポイントを手に入れた! 164ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) ..ウィザード(1,013,381ポイント)
Date: 2009/04/05(日) 10:32
No:31743
|
|
Title: Re:龍神録13章について
|
|
回答遅くなってごめんなさい。
13章までの通りに作業を進めてコンパイルに成功するのなら、
多分プログラムはあってるんじゃ無いかと思います。
弾が表示されないのは、弾の画像が無いからということは考えられませんか?
最近何故か正常にDLが完了しないという不具合があるので、画像ファイル部分がDL出来ていないのかもしれません。
datフォルダの弾のフォルダにきちんと読み込んでいるファイルが存在するか一度確認してみて下さい。
157ポイント を手に入れた。
|
|
|
|
Name: Huzzy ..ぴよぴよ(373ポイント)
Date: 2009/04/05(日) 11:50
No:31746
|
|
Title: 龍神録 13章にて;
|
|
初投稿のHuzzyと申します。
専門用語も殆ど判らないど素人で
至らない点ばかりですが、よろしくお願いします。
2ヶ月ほど前から此方のサイトを拝見し、感銘を受け
素人の身でありながらグラディウスを模したシューティングを
作ろうとヤキモキしながら製作しています。
そして龍神録の12章まではデバックも無事でき、HPに乗っている通りの
実行結果が表示できたのですが、
13章に入り、一通りの打ち込みも終わり、ZIPファイル13章のプログラムと
自分で作成したモノを比較し、言語や誤字脱字は直しました。
ですが、↓下記の12個のどう消していいか判りません。(コピペですが、すいません)
>shot.obj : error LNK2001: 外部シンボル ""void __cdecl shot_bullet_H000(int)" (?shot_bullet_H000@@YAXH@Z)" は未解決です。
1>DxUseCLib_d.lib(DxUseCLibOgg.obj) : error LNK2019: 未解決の外部シンボル _theora_packet_iskeyframe が関数 "int __cdecl TheoraDecode_InitializeStream(struct tagSTREAMDATASHREDTYPE2 *,int,int)" (?TheoraDecode_InitializeStream@@YAHPAUtagSTREAMDATASHREDTYPE2@@HH@Z) で参照されました。
↑似たようなエラーが9個
>D:\c++\mikudius\miku3\Debug\miku3.exe : fatal error LNK1120: 外部参照 11 が未解決です。
出来ましたら何かアドバイスを頂けたら幸いです;;
それでは、よろしくお願いします;;
373ポイント を手に入れた。
|
|
|
|
Name: fatens ..かけだし(2,010ポイント)
Date: 2009/04/05(日) 13:23
No:31750
|
|
Title: Re:龍神録 13章にて;
|
|
最初のエラーはshotH.cppを変更し忘れているからだと思います。
>似たようなエラーが9個
ttp://www.play21.jp/board/formz.cgi?action=res&resno=25960&page=&lognum=82&id=dixq&rln=26063
の No.26018 以降を見て下さい。
それでも直らなければ、DXライブラリを最新版にしてみて下さい。
119ポイント を手に入れた。
|
|
|
|
|
Name: Huzzy ..ぴよぴよ(468ポイント)
Date: 2009/04/05(日) 14:42
No:31753
|
|
Title: Re:龍神録 13章にて;
|
|
仰るとおりshotH.cppを変更し忘れていました;;
何とか表示することは出来ました
ありがとう御座います。
しかし今度は12章時と同じように敵が指定した動きを
行うだけで敵キャラが攻撃をしてこない状態になりました。
csvファイルの更新もZIP同様にしても攻撃を行いません。
やはりまだ、どこか繋ぎがうまく行ってないという事でしょうか?
95ポイント を手に入れた。
|
|
|
|
|
Name: Huzzy ..ぴよぴよ(536ポイント)
Date: 2009/04/05(日) 15:07
No:31755
| 解決!
|
Title: Re:龍神録 13章にて;
|
|
先ほどの疑問はmain.cppのswitch構文内に
shot_main();//ショットメイン
を入れ忘れていたみたいです。
どうもお手数かけました;;
68ポイント を手に入れた。
|
|
|
|
Name: けんたろうちゃん ..入門者(3,025ポイント)
Date: 2009/04/04(土) 20:18
No:31691
|
|
Title: アクションゲームの設計において、どのタイミングに画像ファイルをメモリに入れるべきか
|
|
現在、C++とDXライブラリを使用して、マリオやロックマンのようなアクションゲームを作成しています
アクションゲームでは場面によって様々な種類の敵やアイテムが出現しますね
今回の質問は、その「敵」や「アイテム」の画像をいつメモリに入れるべきかという質問です
龍神録プログラミングの館の方では「ステージの初めに、そのステージで使用する画像を全て読み込む」
という方法が使われています
それに対し、現在、自分が行おうとしている方法は以下のようです
//------------------------------------------
敵1が出現
↓
敵1クラスのコンストラクタで敵1の画像をメモリに読み込む
敵1が消滅
↓
敵1クラスのデストラクタで敵1の画像をメモリから削除する
//------------------------------------------------
この方法の利点は
・ステージごとに出現する敵に使用する画像を初めに読ませる必要がないため、
ステージの作成が非常に楽であること(どの敵を使用するか、あらかじめ決める必要がない)
予想される欠点としては
・いちいち敵出現イベントごとに、画像を読み込むため、速度が遅そう
・同じ種類の敵が出るとき、同じ画像をメモリに格納してしまい、余分にメモリを使用する
などがあると思われます
一体、どういった設計方法をとるべきでしょうか
ご教授おねがいします
ちなみに現在のクラス設計は以下のようです
//画像を読み込み、描画を行うクラス
class Graph{
protected:
int Grhandle[32] //格納されるイメージハンドルを示す変数
public:
load(char *FileName); //変数にグラフィックハンドルを保存する関数
del();//メモリの解放処理をする関数
draw();//描画
};
//敵、アイテムなどの抽象クラス
//これを継承させて、様々な敵やアイテムを作成する
class Object{
protected:
Graph graph;
public:
Object(){graph.load("画像.bmp");}//コンストラクタ(ここで画像読み込み)
~Object(){graph.del();}
run(); //敵の消滅判定とか移動とかの実行
};
注:これはイメージであって実際のコードは違います
620ポイント を手に入れた。
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(75,872ポイント)
Date: 2009/04/04(土) 20:37
No:31694
|
|
Title: Re:アクションゲームの設計において、どのタイミングに画像ファイルをメモリに入れるべきか
|
|
クラス設計は置いておいて・・・
自分はですが、ステージが始まる直前の「NOW LOADING」
のような時にでるであろう画像を読み込ませるが一番いいかと思います。
理由はけんたろうちゃんさんがおっしゃる通りです。
しかし、長所はそこにはないかのように思います。
ランダムに敵を出すなら、画像アドレスの入ったの配列から乱数で一つ取得すればことは足りるかと思います。
画像が数千などとなる場合はいろいろ考慮が必要かと思いますけど・・・。
190ポイント を落としてしまった。
|
|
|
|
|
Name: けんたろうちゃん ..入門者(3,067ポイント)
Date: 2009/04/04(土) 20:38
No:31695
|
|
Title: Re:アクションゲームの設計において、どのタイミングに画像ファイルをメモリに入れるべきか
|
|
yuさんおっしゃる方法がまさに龍神録プログラミングで使われている方法ですね
やはり処理速度が重要なゲームではそういう方法が良いのですかね?
42ポイント を手に入れた。
|
|
|
|
|
Name: yu [URL] ..上級者(24,295ポイント)
Date: 2009/04/04(土) 20:47
No:31696
|
|
Title: Re:アクションゲームの設計において、どのタイミングに画像ファイルをメモリに入れるべきか
|
|
すみません。orz
説明不足ですね;
>どの敵を使用するか、あらかじめ決める
これを自動で行うということです。
たとえば敵の種類が複数あって、敵の出現が10匹に設定されていたら
10回ループを使って種類を調べ、被らなかった種類の番号を記憶して
その番号の画像だけをステージの最初にロードすればいいかなと言うことです・・・。
でも、今簡単に考えたので欠点があるかもしれません。orz
75ポイント を手に入れた。
|
|
|
|
|
Name: けんたろうちゃん ..入門者(3,147ポイント)
Date: 2009/04/04(土) 20:50
No:31698
|
|
Title: Re:アクションゲームの設計において、どのタイミングに画像ファイルをメモリに入れるべきか
|
|
>>kazuoniさん
やはり、初めに使用する画像をメモリに読み込み、静的領域の変数にグラフィックハンドルを保存し、
その静的領域からの引数によって表示するという方法が良いですかね
80ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(13,721ポイント)
Date: 2009/04/04(土) 21:04
No:31700
|
|
Title: Re:アクションゲームの設計において、どのタイミングに画像ファイルをメモリに入れるべきか
|
|
yuさんが書かれている方法が最もベターかと思います。
特にアクションゲームではプレイ中のラグは
タブーですので最初に必要なデータを読み込んでおくほうが良いと思います。
yuさんの文章で感じは掴めると思うので途中で書くのやめました。
↓
パラメータ(体力、アイテム、使用イメージ 等 )と
出現データ( タイミング、座標、行動パターン 等 )の
データをそれぞれ用意します。
1、パラメータを読み込み
2、ステージ読み込み、
3、出現データを読み込み
4、出現データからそのステージで使用されている
キャラデータ&イメージをセットする
270ポイント を手に入れた。
|
|
|
|
|
Name: けんたろうちゃん ..入門者(3,501ポイント)
Date: 2009/04/04(土) 21:20
No:31704
|
|
Title: Re:アクションゲームの設計において、どのタイミングに画像ファイルをメモリに入れるべきか
|
|
はい、その方法で実現しようと思います
ところで、少し違う質問なのですが、答えてもらえたらうれしいです
@DXライブラリのLoadGraph関数でint型変数にハンドルを渡しますよね
その「ハンドル保存用int型変数にグラフィクハンドルが入っていない」ことを調べることはできるのでしょうか?
ADXライブラリのDeleteGraph関数でLoadDivGraph関数で保存されたハンドルGrHandle[]を解放する場合、
int hoge[5];
LoadDivGraph("ほげ.bmp", 5, 5, 1, 32, 32, hoge);
for(int i=0; i<5; i++) DeleteGraph( hoge[i] );
とするしかないのでしょうか?
これだと、あらかじめhogeに5つ入るということがわからないといけないという問題があります
STLを使って、制御するという方法は可能なのでしょうか?
316ポイント を手に入れた。
|
|
|
|
|
Name: fumi ..入門者(2,815ポイント)
Date: 2009/04/05(日) 00:19
No:31714
|
|
Title: Re:アクションゲームの設計において、どのタイミングに画像ファイルをメモリに入れるべきか
|
|
@については、
ghandle = DeleteGraph( ghandle );
としておけばghandleには0(又は-1)が入るはずなので、それをチェックすれば良いと思います。
Aについては、私も同じようなことで悩んだことがありますが、STLのマップで対処しました。
std::map<const char *, int> imageMap
const char*は文字列キー(ロードするファイル名と同じにしておけば楽?)、intはghが入ります。
ただ、STLは格納するオブジェクトの数が増えると結構重くなるので、読み込む画像が多いなら
十分な大きさの配列を確保した方が無難な気がします。
234ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(337,761ポイント)
Date: 2009/04/05(日) 01:25
No:31716
|
|
Title: Re:アクションゲームの設計において、どのタイミングに画像ファイルをメモリに入れるべきか
|
|
>2 DeleteGraph関数でLoadDivGraph関数で保存されたハンドルGrHandle[]を解放する場合
>〜とするしかないのでしょうか
配列を使うのなら、その配列の要素数を調べて forの条件文で使えばいいのではないでしょうか。
for(int i=0; i<sizeof(hoge)/sizeof(int); i++) DeleteGraph( hoge[i] );
まぁでもせっかく C++を使っているのですから、その配列は int型という生の値で扱うのではなく、
ハンドルの解放をデストラクタで行うテクスチャクラスにするのがベストかと思います。
□ fumiさん
>std::map<const char *, int> imageMap
その定義だと、使用上の制限としてどこかで文字列の実体を確保しておかなければ
ならなくなりませんか?
253ポイント を手に入れた。
|
|
|
|
|
Name: fumi ..入門者(2,920ポイント)
Date: 2009/04/05(日) 08:37
No:31733
|
|
Title: Re:アクションゲームの設計において、どのタイミングに画像ファイルをメモリに入れるべきか
|
|
>>Justyさん
状況にもよると思いますが、
std::map<const char *, int>::iterator it;
int gh;
it = imageMap.find( "文字列" );
gh = it->second;
といった感じで使っていたので、文字列は特に確保しておく必要はなかったと思います。
105ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(338,138ポイント)
Date: 2009/04/05(日) 11:06
No:31744
|
|
Title: Re:アクションゲームの設計において、どのタイミングに画像ファイルをメモリに入れるべきか
|
|
>状況にもよると思いますが
そうなんですが、たとえば
typedef std::map<const char *, int> ImageMapType;
ImageMapType imageMap;
void LoadSceneTexture()
{
for(int n=0; n<100; ++n)
{
char fileName[0x10];
std::sprintf(fileName, "%s%02d.bmp", "image", n);
int grp = ::LoadGraph(fileName);
if(grp != -1)
imageMap.insert(ImageMapType::value_type(fileName, grp));
}
}
のように挿入時に指定する名前がローカル変数だったりすると
関数を抜けた後は無効なポインタを保持することになるので、
使い方に制限があるのではないか、ということです。
(静的領域にとってしまえば問題はないですが)
377ポイント を手に入れた。
|
|
|
|
|
Name: けんたろうちゃん ..入門者(3,642ポイント)
Date: 2009/04/05(日) 12:23
No:31748
| 解決!
|
Title: Re:アクションゲームの設計において、どのタイミングに画像ファイルをメモリに入れるべきか
|
|
>>fumiさん
mapを使う方法ですか
つまり、findを使って、文字列キーに対応するハンドルintを得て描画するということですよね(勘違いだったらすいません)
でも、素人考えかも知れませんが、描画するごとにfindすると、すごく処理が遅くなりそうな気がするのですけど・・・
実際に作ったわけではないので、違うかもしれませんが
>>Justyさん
>まぁでもせっかく C++を使っているのですから、その配列は int型という生の値で扱うのではなく、
>ハンドルの解放をデストラクタで行うテクスチャクラスにするのがベストかと思います。
すいませんここが理解できませんでした^^;
おそらくDXライブラリを使用しないで、描画部分を自作したほうが良いということかな?
まだまだ、自分の実力が不足しているようですね
一応解決済みにしておきます
141ポイント を手に入れた。
|
|
|
|
|
Name: fumi ..入門者(3,040ポイント)
Date: 2009/04/05(日) 13:01
No:31749
|
|
Title: Re:アクションゲームの設計において、どのタイミングに画像ファイルをメモリに入れるべきか
|
|
解決になってるので、何か申し訳ないですが…
>>Justyさん
言われてみれば…その通りですね。
かなり危険なことをしていたことに気づかされましたorz
ご指摘ありがとうございます。
>>けんたろうちゃんさん
>描画するごとにfindすると、すごく処理が遅くなりそうな気がするのですけど
はい。やはり速度を気にするのであれば配列にしてしまうのが1番だと思います。
120ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(338,605ポイント)
Date: 2009/04/05(日) 16:48
No:31759
|
|
Title: Re:アクションゲームの設計において、どのタイミングに画像ファイルをメモリに入れるべきか
|
|
□ けんたろうちゃんさん
>おそらくDXライブラリを使用しないで、描画部分を自作したほうが良いということかな?
いえ、違います。
グラフィックハンドルを扱うクラスを作ります(仮に Textureクラスとしておきます)。
このクラスは int型のグラフィックハンドルを持ち、デストラクタでハンドルの解放を
行うようにします。
こういうクラスを作っておけば、 int hoge[5] だった配列は Texture hoge[5]
となり、解放そのものは Textureクラスが行うので明示的に DeleteGraph()を呼び出す
必要がなくなります。
□ fumiさん
>静的領域にとってしまえば問題はないですが
と書きましたが、見直したら問題大ありでした。
よく考えたら
imageMap.insert(ImageMapType::value_type("A", 0));
imageMap.find("A");
一つめの "A"と二つ目の "A"が同じポインタである保証もないんですよね。
467ポイント を手に入れた。
|
|
|
|
|
Name: けんたろうちゃん ..入門者(3,712ポイント)
Date: 2009/04/05(日) 19:00
No:31767
|
|
Title: Re:アクションゲームの設計において、どのタイミングに画像ファイルをメモリに入れるべきか
|
|
Textureクラスとはそういうことですか
まだまだ理解力が足りなくて、具体的なコードはかけませんが、少しだけ理解できたような気がします
70ポイント を手に入れた。
|
|
|
|
Name: 茄子 ..ぴよぴよ(61ポイント)
Date: 2009/04/05(日) 02:39
No:31725
|
|
Title: Macでもできますか
|
|
タイトルの通りですが、Macでもゲームを作る事は出来ますか?
もし出来るなら、どのようなソフトが必要ですか?
質問が多くてすいません
61ポイント を手に入れた。
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(76,211ポイント)
Date: 2009/04/05(日) 03:01
No:31727
|
|
Title: Re:Macでもできますか
|
|
開発環境を明らかにしないとなんとも言えませんが・・・
とにかくすぐに何が何でも!って場合にはツクール系購入をお勧めします。
もしプログラミング勉強がてらってことであれば
必要なのはコンパイラ+α(ライブラリ等)です。
ググればいろいろ出てきますが・・・
こんなの見つけました。
ttp://qa.asahi.com/qa2741922.html
150ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(13,488ポイント)
Date: 2009/04/05(日) 03:35
No:31729
|
|
Title: Re:Macでもできますか
|
|
JavaScript を使ったゲームに挑戦してみては如何でしょうか?
MacでC/C++言語を使いプログラム作成した場合、
WindowsプログラムがMacで動かないように
他のプラットフォームの人には遊んでもらえません。
( OSをエミュレートした場合を除く )
またMacの仕様を理解していないとお答えできない事も多いため、
一からMacベースのプログラムを覚えるのは難しいかと思います。
JavaScript であればプラットフォームを選ばない
インタプリタ言語ですのでインターネットが使える
環境下であれば動作します。
(バージョン問題はありますが割合します。)
情報サイトも多いのでやる気があれば何とかなると思います、
スクリプトを書くためのテキストエディタがあれば良いので
費用も掛かりません。
「JavaScript ゲーム」等でWeb検索すれば遊べるゲームが
あると思うので、どんなものが作れるか見てみると
いいかも。
233ポイント を落としてしまった。
|
|
|
|
|
Name: TKOZ ..上級者(20,377ポイント)
Date: 2009/04/05(日) 10:20
No:31740
|
|
Title: Re:Macでもできますか
|
|
昔のMacでの話ですが、
ハイパーカード(というのは、まだありますか?)で
プログラミングしてみるのはどうでしょうか?
他には、ObjectiveCというソフトが標準でついてた気がします。
2倍のポイントを手に入れた! 104ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(13,540ポイント)
Date: 2009/04/05(日) 15:23
No:31756
|
|
Title: Re:Macでもできますか
|
|
> いっそのこと、ActionScriptで作るというのはどうでしょう?
ActionScript いいですねぇ
有償ものしか無いと思いこんでて候補から外したんですが
無償ツールもありますね。ちょっとやりたいかもw
> ハイパーカード
ライセンス問題で今は付属させてないようです。
52ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..上級者(19,263ポイント)
Date: 2009/04/05(日) 17:41
No:31763
|
|
Title: Re:Macでもできますか
|
|
えっとJavaとかじゃ駄目なんですか?
Javaなら確かMacでもWindowsでもいけますよ。
# 無料の開発環境もあったような気が・・・(Eclipseとか)
12ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(338,659ポイント)
Date: 2009/04/05(日) 18:11
No:31766
|
|
Title: Re:Macでもできますか
|
|
Macと一口に言っても、バージョンがいろいろあるのですが、
今時の Macで、Windows/Mac両方で動くことにこだわらなければ、普通に Xcodeでいいと思います。
VisuaStudio同様に癖がありますが、無料ですし、多くの言語をサポートしており、
参考になる書籍も結構出ています。
Xcode - Wikipedia
ttp://ja.wikipedia.org/wiki/Xcode
54ポイント を手に入れた。
|
|
|
|
Name: 昴 ..入門者(2,546ポイント)
Date: 2009/04/04(土) 16:58
No:31678
|
|
Title: 文字列を格納する
|
|
こんにちは、いつもお世話になっています。
C言語は初心者でテキストを見ながら進めています。
WindowsのVistaを使っています。
今回は文字列の配列を2つ用意して、一方は入力用で、もう一方は入力した文字列と一致しなかったら、格納するプログラムを作ろうとしたのですが、エラー:左辺値が必要(st2[i] = st1;)とありました。どうしたらよいでしょうか?
#include <stdio.h>
#include <string.h>
int main(void)
{
char st1[100];
char st2[50][100];
int i, cnt = 0;
printf("文字列を入力してください:");
while ( scanf( "%s", st1 ) != EOF ) {
for ( i = 0; i < cnt; i++ ) {
if ( strcmp( st1, st2[i] ) == 0 ) {
printf("その文字列はすでに格納されています。\n");
break;
}
}
if ( i == cnt ) {
printf("その文字列はまだ格納されていません。\n");
st2[i] = st1;
cnt++;
}
printf("文字列を入力してください:");
}
for ( i = 0; i < cnt; i++ ){
printf( "\n[%d] : %s", i + 1, st2[i] );
}
return 0;
}
376ポイント を手に入れた。
|
|
|
|
Name: 昴 ..入門者(2,753ポイント)
Date: 2009/04/04(土) 17:55
No:31681
|
|
Title: Re:文字列を格納する
|
|
回答ありがとうございました。
st2[i] = st1;をstrcpy(st2[i],st1)と変更しました。
それぞれa,b,cと入力し実行したら、
[1]:a
[2]:b
[3]:c
となったのですが、into the wildと入力し実行を行ったところ、
その文字列はまだ格納されていません。
文字列を入力してください:その文字列はまだ格納されていません。
文字列を入力してください:その文字列はまだ格納されていません。
[1]:into
[2]:the
[3]wild
と表示されました。
これは、どうしてこのような結果になるのでしょうか?
また、どうしてst2[i]=st1は左辺値が必要となるのでしょうか?
207ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(137,874ポイント)
Date: 2009/04/04(土) 18:38
No:31683
|
|
Title: Re:文字列を格納する
|
|
> これは、どうしてこのような結果になるのでしょうか?
scanf() の仕様です。
空白またはそれに類する文字を入力した時点で、
第2引数に指定した領域(st1)への格納は打ち止めとなります。
into the wild<Enter>
と入力した場合、途中の空白(2個)と最後のEnterで
データを区切ります。
"into the wild"
という、途中に空白を含むデータがほしい場合は、
fgets() など別の関数を使う必要があります。
> また、どうしてst2[i]=st1は左辺値が必要となるのでしょうか?
st2[50][100]
という、いわゆる2次元配列を定義した時点で、
st2[0]〜st2[49]
の50個のポインタ値は決まってしまい、別の値に変更することはできません。
st2[i]
という、動かせない値(左辺に置けない値)に対して何かを代入しようとしたため、
「左辺値が必要」というコンパイルエラーが出ます。
284ポイント を手に入れた。
|
|
|
|
|
Name: 昴 ..入門者(2,865ポイント)
Date: 2009/04/05(日) 17:02
No:31760
| 解決!
|
Title: Re:文字列を格納する
|
|
回答ありがとうございます。
scanf()は空白を含む文字列は読み込めないのですね。
while ( gets( st1 ) == NULL )としたら、空白文字も読み込むことができました。
ありがとうございました。
2倍のポイントを手に入れた! 112ポイント を手に入れた。
|
|
|
|
Name: kerotan0820 ..入門者(3,409ポイント)
Date: 2009/04/02(木) 17:49
No:31600
|
|
Title: 画像を表示するプログラムがうまくいかない
|
|
"3・画像を表示する"がどうしてもうまくいきません。
プログラムをこぴぺしてデバックを行っているのでプログラムに誤りはないと思います。
ここまで僕が行ってきた設定などで多少このせいかな、というものが数点あるので上げたいと思います;
1、DxLib_VCフォルダ内の、"サンプルプログラム実行用フォルダ"の中の、"DxLib_VC2008_and_2005用.sln"を起動することができない
2、起動できなかった際に、気になって"DxLib_VC2005用.vcproj"をダブルクリックしたら変換だのなんだのと出てきたので変換を行ってみたところ、"DxLib_VC2008_and_2005用.sln"を起動できた。
サンプルプログラムのところの"DxLib_VC2008_and_2005用.sln"の立ち上げ方がいけなかったのかなとか思ったりしています。けど起動できないんです・・・、
VC++をサンプルプログラム実行用フォルダから立ち上げることに意味があるのでしょうか
起動できない原因として何が考えられるのかまったくわかりません。
以前このような質問をしたのですが、結局理由がわからず、PCの中で動作がぐじゃぐじゃになってしまいました
なので1から設定等をやり直し、点を打つプログラム、全画面でウィンドウを開く方法、小さなウィンドウを開く方法など問題なくクリアしてきたのですが、画像でやはり行き詰ります。
どうしても自分のやってる動作のどこに問題があるのかに気がつきたいです・・・。
わがままを言ってすみません。
もしよろしければ教えてください。お願いします。
153ポイント を手に入れた。
|
|
|
|
Name: SooA [URL] ..中級者(12,633ポイント)
Date: 2009/04/02(木) 18:07
No:31601
|
|
Title: Re:画像を表示するプログラムがうまくいかない
|
|
> "3・画像を表示する"がどうしてもうまくいきません。
どう上手くいかないのでしょう?
char.png を保存して「サンプルプログラム実行用フォルダ」に入れてますか?
29ポイント を手に入れた。
|
|
|
|
|
Name: kerotan0820 ..入門者(3,483ポイント)
Date: 2009/04/02(木) 18:09
No:31602
|
|
Title: Re:画像を表示するプログラムがうまくいかない
|
|
肝心なところが抜けてました^^;
黒いウィンドウが開くだけで画像が表示できないのです。
画像はちゃんとした拡張子(.png)でファイル名もミスはありません。
74ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(12,729ポイント)
Date: 2009/04/02(木) 18:41
No:31604
|
|
Title: Re:画像を表示するプログラムがうまくいかない
|
|
コンパイラは何を使ってますか?
デバッグ実行時のカレントフォルダに char.png を置く必要があります。
VC++2008 ならソリューションのあるフォルダ、
VC++6.0 5.0 の場合は初期状態では Debug か Release フォルダになります。
( 2005 は使ったことがないので判りません。)
96ポイント を手に入れた。
|
|
|
|
|
Name: kerotan0820 ..入門者(3,646ポイント)
Date: 2009/04/02(木) 19:11
No:31607
|
|
Title: Re:画像を表示するプログラムがうまくいかない
|
|
【Mist様】
Q.ちゃんと表示できない人は上記のページでその原因の調べ方を記載してくれていますが、その結果はどうでしたか?
A."プログラム'C:\Documents and Settings\ユーザー名\デスクトップ\test\Debug\test.exe'を開始できません。
指定されたファイルが見つかりません。"
というエラーメッセージが出ます。
今なぜかどのプログラムもエラーが起きます。プロジェクト作ったりする作業のどこかでミスしてるだけなのでしょうか。なんかわけがわからなくなってきたのですが、インストールしなおしたほうがいいのでしょうか。
【SooA様】
Q. コンパイラは何を使ってますか?
A. Visual C++2008 Explorer Editionです
デバッグ実行時のカレントフォルダに char.png を置く必要があります。
>>カレントフォルダとはどういう意味ですか?
VC++2008 ならソリューションのあるフォルダ、
>>ソリューションとは何ですか?
163ポイント を手に入れた。
|
|
|
|
|
Name: kerotan0820 ..入門者(3,754ポイント)
Date: 2009/04/05(日) 15:36
No:31757
|
|
Title: Re:画像を表示するプログラムがうまくいかない
|
|
いろいろとプログラムなどを試した末、理由がわかりました。
ただ画像の保存場所が悪かったみたいです。
プログラムのフォルダのところに保存してなかった、それだけでした。
ご迷惑をおかけしました。
108ポイント を手に入れた。
|
|
|
|
|