1 :
デフォルトの名無しさん :
02/02/03 08:57 自作ソースを他人に評価してもらうスレ 言語フリー
ずさ
3 :
デフォルトの名無しさん :02/02/03 08:59
2ズサー
MsgBox "Hello, World"
これは何点ですか #include <stdio.h> #include <math.h> double l;main(_,o,O){return putchar((_--+22&&_+44&&main(_,-43,_),_&&o)?(main(-43,++o,O),((l=(o+21)/sqrt(3-O*22-O*O),l*l<4&&(fabs(((time(0)-607728)%2551443)/405859.-4.7+acos(l/2))<1.57))[" #"])):10);}
#include <stdio.h> int O,o,i;char*I="";main(l){O&=l&1?*I:~*I,*I++||(l=2*getchar(),i+=O>8 ?o:O?0:o+1,o=O>9,O=-1,I="t8B~pq`",l>0)?main(l/2):printf("%d\n",--i);}
その手のソースをひけらかしたいだけなら トリッキーなコードスレにでも逝け
>>5-6 難解Cプログラミングコンテストのコピペ
ファイルの行数を取得する関数ですが何か? int GetLineNumber(const char *FileName) { ifstream fin(FileName); char chTemp[255]; int nLine = 0; while (!fin.eof()) { fin.getline(chTemp, 255); nLine++; } return nLine; }
>>9 んじゃ漏れも
#include<stdio.h>
unsigned flines( const char* file ){
FILE* fp:
unsigned lines = 0;
int temp;
if( fp = fopen( file, "r" ) ){
++lines;
while( ( temp = fgetc( fp ) ) != EOF )
if( temp == '\n' ) lines++;
fclose(fp);
}
return lines;
}
#include <stdio.h> puts("hello,world");
14 :
デフォルトの名無しさん :02/02/03 10:34
(define (count-lines port) (let ((char (read-char port))) (cond ((eof-object? char) 0) ((char=? char #\newline) (+ 1 (count-lines port))) (else (count-lines port))))) (call-with-input-file ".emacs.el" count-lines) => 95
じゃあこれはどうよ // 文字列 Text の中に Key が存在するか確認する. // 存在する場合は 1 を,存在しない場合は 0 を返す. bool PatternMatching(const char *Text, const char *Key) { char *pText; int nTextChar = strlen(Text); int nKeyChar = strlen(Key); for (pText = Text; pText <= Text + nTextChar - nKeyChar; pText++) { if (strncmp(pText, Key, nKeyChar) == 0) { return 1; } } return 0; }
>14 >(+ 1 (count-lines port))) 末尾再帰になってないよ
引数を表示&カウントするプログラムですが何か? int main(int argc,char *argv[]) { int a=argc; if((argv++,argc) > 1) while(argc-- != 0) puts(*argv++); printf("引数 %dコ\n",--a); getchar(); return 0; }
#include <stdio.h> #include <string.h> typedef int boolean; #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif /* !TRUE */ boolean string_match (string, pattern) const char *string; const char *pattern; { if (*string == '\0') return FALSE; else if (strlen (string) < strlen (pattern)) return FALSE; else if (!strncmp (string, pattern, strlen (pattern))) return TRUE; else return string_match (string + 1, pattern); }
熱狂的信者のRubyソースきぼんぬ
センスねーな
22 :
デフォルトの名無しさん :02/02/03 11:02
qsort :: Ord(a) => [a] -> [a] qsort [] = [] qsort (x:xs) = qsort [a|a<-xs,a<=x] ++ [x] ++ qsort [a|a<-xs,a>x]
無茶苦茶に。 def flines(filename): def count(list): if (list == []): return 0 else: return 1 + count(list[1:]) return count(open(filename, "r").readlines()) - 1
↑パル?
26 :
デフォルトの名無しさん :02/02/03 11:20
#!/usr/bin/perl foreach (1 .. 1000) { print "1000ゲット!"; } exit;
# 動作効率なんて無視、無視さぁ
import sys
def print_args():
arg = sys.argv[1:]
count_args = 1
while(arg != []):
print str(count_args) + "番目:" + arg[0]
arg = arg[1:]
count_args += 1
print "引数は全部で", str(count_args), "だったお。"
>>24 pyです。
28 :
デフォルトの名無しさん :02/02/03 11:21
cmd play "v15t90@1d4.d4d8d4.f4e8e4d8d4c+8d4."
最後の2行は無視してお願い
30 :
デフォルトの名無しさん :02/02/03 11:22
definition let n; func Fib (n) -> Nat means :: PRE_FF:def 1 ex fib being Function of NAT, [:NAT, NAT:] st it = (fib.n)`1 & fib.0 = [0,1] & for n being Nat, x being Element of [: NAT, NAT :] st x = fib.n holds fib.(n+1) = [ x`2, x`1 + x`2 ]; end;
32 :
デフォルトの名無しさん :02/02/03 11:25
>>15 bool PatternMatching(const char* text, const char* key)
{
return strstr(text, key) != NULL;
}
33 :
デフォルトの名無しさん :02/02/03 11:27
TALK "omaera iteyosi"
34 :
デフォルトの名無しさん :02/02/03 11:30
Cに関して言うなら、 用意されてる関数は使わず、できるだけ自前のロジックで勝負する方向で やんないと、小細工大会みたいになってつまんなくなるです。
35 :
デフォルトの名無しさん :02/02/03 11:33
XOR A , B XOR B , A XOR A , B
36 :
デフォルトの名無しさん :02/02/03 11:42
#error "重大なエラーが発生。詳しくは
>>100 を参照\n"
そんなに続かないんで。。
38 :
デフォルトの名無しさん :02/02/03 11:50
人工知能のプログラム。 unsigned int Cond = 1; //初期状態 while(Cond != 0){ Cond = Ai_start(); Cond += Ai(); Cond += Ai_end(); }
おれたちの愛を定義しろ
42 :
デフォルトの名無しさん :02/02/03 12:42
#define LOVE NULL
愛はNULLか。 LOVE >> SEX さらにシフト演算
例えば土くれの「くれ」と、ささくれの「くれ」が同一の語かどうかを判別するアルゴリズム(VB用)を発明。 If Right$("土くれ",2) = Right$("ささくれ",2) Then Msgbox("同一です")
初心者投稿歓迎
>>15 // 文字列 Text の中に Key が存在するか確認する.
// 存在する場合は 1 を,存在しない場合は 0 を返す.
bool PatternMatching(const char *Text, const char *Key)
{
return( strstr(Text, Key) != NULL ? 1 : 0);
}
関数名は小文字で始めてくれ
>>48 もっともだ
この関数の存在自体忘れてた
鬱だ死のう
関数名は動詞から始めることにしよう 大文字小文字はどっちでもいいんじゃない?
C言語らしく行くなら全部小文字だ!動詞で始めるのは同意。 bool match_pattern(constt char* text, const char* key)
つーか、固定文字列でpatternってのは羊頭狗肉だろ。
54 :
デフォルトの名無しさん :02/02/23 01:36
Microsoft 大文字から。 Java 小文字から。 両方とも基本的に関数名に"_"を使わない。
「変数の数」っていう変数はなんて書く?織れは nArg なんだけど 小文字しか使わない人っって argument_number なの? arg_num?
arg_num かな。arg_count とか。
↑Perl2Exeでコンバートしてあります。
まず初めにargcありき、神はargcと共にあり。
>>55 number_of_arguments だろ ? argument_number じゃ、引数の番号だよ。
↑確かにそうだけど名前長すぎて面倒じゃん
int nargs; /* Number of arguments */ って書いておけば?
63 :
デフォルトの名無しさん :02/02/24 20:41
変数名なんてのはbakaとかhogeとかhageで十分なんだよ(DQN
>>63 昔、for文で回すカウンタをunkoとかomankoとか使って怒られた。
>>64 お前か...あの時とどめを刺しとくべきだった
int argc; // c int nNumberOfArguments; // MS int numberOfArguments; // java,c# int timpo; // 64
無限ループは while("回れ") でおながいします。
循環
ばかやろこのやろうめ
>>68 文字列が0番に割り当てられることは無いの?
>>71 俺は68じゃないけど、ポインタなんだからNULLが来るわきゃない。
#define APL_TITLE"stg.ver0.10" #include "hmm.as" DIINIT if stat=0 :end ; HSPウィンドウ/バッファID #define MAIN_SCR_ID0 #define CHIP_BUF_ID2 ; サーフェイスID #define PRIMARY_SUR_ID0 #define CHIP_SUR_ID1 ; フリップ時のウェイト #define FLIP_WAIT1092267;1/60 (65536*1000/60=1092266.666) ;#define FLIP_WAIT0;全力疾走 #define CHR_MAX5000 ; 補助モジュールの読み込み #include "m_AMspaceFillStr.as" ; プラグイン定義ファイルの読み込み #include "AMddrawD.as" ; プラグイン補助モジュールの読み込み #include "m_AMddrawDSupport.as" #define m_ec m_AMddrawErrorCheck ;#define m_ec pos ;----------------------- ; プラグインのバージョンチェックと動作モード選択 dim para, 7 dup sx, para.0 dup sy, para.1 dup bpp, para.2 dup windowMode, para.3 dup direct3DMode, para.4 dup fpsMode, para.5 dup tripleBuffer, para.6 sx = 512; スクリーンサイズX sy = 384; スクリーンサイズY bpp = 16; ビット深度 windowMode =AMDDRAW_WINDOWMODE_FULLSCREEN; AMDDRAW_WINDOWMODE_WINDOW_WITH_COLOR_CHANGE; ウィンドウモード direct3DMode = AMDDRAW_SELECTD3DMODE_AUTO; Direct3D使用モード fpsMode = AMDDRAW_FPS_DRAW | AMDDRAW_FPS_EDGE_DRAW; フレームレート表示モード tripleBuffer = 0; トリプルバッファ
;----------------------- ; パラメータチェック ; [スクリプト内容がsx,syやbppに依存する場合は、ここでチェックする] ;----------------------- ; AMddraw.hpiとプライマリサーフェイスの初期化 m_AMddrawInitialize para, APL_TITLE, MAIN_SCR_ID, 2, CHR_MAX : m_ec onexit *exit ;----------------------- ; 画像の用意 buffer CHIP_BUF_ID, 512, 512, picload "n.bmp",1,0,0 picload "l1.bmp",1,65,0 picload "r1.bmp",1,129,0 picload "vn.bmp",1,193,0 picload "vl1.bmp",1,257,0 picload "vr1.bmp",1,321,0 picload "tama1.bmp",1,385,0 ;----------------------- ; オフスクリーンサーフェイスの用意 memoryType = AMDDRAW_SURFACE_FLAG_AUTO_MEMORY_USE : m_ec memoryType = memoryType | AMDDRAW_SURFACE_FLAG_TEXTURE : m_ec AMdCreateOffscreenSurface CHIP_SUR_ID, 512, 512, memoryType : m_ec ;----------------------- ; 画像の転送 AMdHSPToSurface 512, 512 : m_ec
;----------------------- ; チップの登録 AMdCreateChip 0, 64, 64 : m_ec dim hitArea, 4 : m_ec hitArea = 0, 0, 64, 64 : m_ec AMdSetChipHitArea hitArea, 0 : m_ec AMdSetPosition 65,0 AMdCreateChip 1, 64, 64 : m_ec AMdSetChipHitArea hitArea, 1 AMdSetPosition 129,0 AMdCreateChip 2, 64, 64 : m_ec AMdSetChipHitArea hitArea, 2 AMdSetPosition 193,0 AMdCreateChip 3, 64, 64 : m_ec AMdSetChipHitArea hitArea, 3 AMdSetPosition 257,0 AMdCreateChip 4, 64, 64 : m_ec AMdSetChipHitArea hitArea, 4 AMdSetPosition 321,0 AMdCreateChip 5, 64, 64 : m_ec AMdSetChipHitArea hitArea, 5 AMdSetPosition 385,0 AMdCreateChip 6, 16, 16 : m_ec dim hitArea2, 4 : m_ec hitArea2 = 4, 0, 11, 12 : m_ec AMdSetChipHitArea hitArea2, 6 ;----------------------- ; サーフェイスの準備 AMdSelectSurface PRIMARY_SUR_ID : m_ec black = 0 : AMdGetColorCode black, 0, 0, 0 : m_ec blue = 0 : AMdGetColorCode blue, 0, 0, 255 : m_ec white = 0 : AMdGetColorCode white, 255, 255, 255 : m_ec
; 透過色無効 AMdSelectSurface CHIP_SUR_ID : m_ec AMdSetTransparentColor AMDDRAW_TRANSCOLOR_SOURCE , white, white : m_ec AMdSelectSurface PRIMARY_SUR_ID : m_ec AMdSetTransparentColor AMDDRAW_TRANSCOLOR_DEST , white, white : m_ec AMdClearSurface black, AMDDRAW_CLEAR_FLAG_CLEAR : m_ec ; アルファブレンド無効 AMdSetRenderState D3DRENDERSTATE_ALPHABLENDENABLE, 0 : m_ec AMdSetRenderColor 255, 255, 255, 0 : m_ec ;----------------------- ; キャラクタ使用の準備 dim c_f, CHR_MAX : AMdSetCharacterVariable c_f, 0 : m_ec ; キャラクタフラグ dim c_x, CHR_MAX : AMdSetCharacterVariable c_x, 1 : m_ec ; キャラクタx座標 dim c_y, CHR_MAX : AMdSetCharacterVariable c_y, 2 : m_ec ; キャラクタy座標 dim c_x0, CHR_MAX : AMdSetCharacterVariable c_x0, 3 : m_ec ; 有効範囲left dim c_y0, CHR_MAX : AMdSetCharacterVariable c_y0, 4 : m_ec ; 有効範囲top dim c_x1, CHR_MAX : AMdSetCharacterVariable c_x1, 5 : m_ec ; 有効範囲right dim c_y1, CHR_MAX : AMdSetCharacterVariable c_y1, 6 : m_ec ; 有効範囲bottom dim c_c, CHR_MAX : AMdSetCharacterVariable c_c, 7 : m_ec ; チップNo. dim c_m, CHR_MAX : AMdSetCharacterVariable c_m, 8 : m_ec ; 移動フラグ dim c_ap, CHR_MAX : AMdSetCharacterVariable c_ap, 9 : m_ec ; 外見フラグ dim c_bl, CHR_MAX : AMdSetCharacterVariable c_bl, 10 : m_ec ; 点滅カウンタ dim c_dc, CHR_MAX : AMdSetCharacterVariable c_dc, 11 : m_ec ; 自動消滅カウンタ dim c_vx, CHR_MAX : AMdSetCharacterVariable c_vx, 12 : m_ec ; 平行移動速度x dim c_vy, CHR_MAX : AMdSetCharacterVariable c_vy, 13 : m_ec ; 平行移動速度y dim c_ax, CHR_MAX : AMdSetCharacterVariable c_ax, 14 : m_ec ; 平行移動加速度x dim c_ay, CHR_MAX : AMdSetCharacterVariable c_ay, 15 : m_ec ; 平行移動加速度y dim c_rpv, CHR_MAX : AMdSetCharacterVariable c_rpv, 16 : m_ec ; 回転移動速度 dim c_rt, CHR_MAX : AMdSetCharacterVariable c_rt, 17 : m_ec ; 角度 dim c_rv, CHR_MAX : AMdSetCharacterVariable c_rv, 18 : m_ec ; 角速度 dim c_ra, CHR_MAX : AMdSetCharacterVariable c_ra, 19 : m_ec ; 角加速度 dim c_ex, CHR_MAX : AMdSetCharacterVariable c_ex, 20 : m_ec ; 拡大縮小率x 256で1倍 dim c_ey, CHR_MAX : AMdSetCharacterVariable c_ey, 21 : m_ec ; 拡大縮小率y 256で1倍 dim c_aim, CHR_MAX : AMdSetCharacterVariable c_aim, 22 : m_ec ; 追尾移動キャラクタNo. dim c_aimv,CHR_MAX : AMdSetCharacterVariable c_aimv,23 : m_ec ; 追尾速度 dim c_al, CHR_MAX : AMdSetCharacterVariable c_al, 24 : m_ec ; アルファ値 dim c_an, CHR_MAX : AMdSetCharacterVariable c_an, 25 : m_ec ; アニメーションパターンNo. dim c_rta, CHR_MAX : AMdSetCharacterVariable c_rta, 26 : m_ec ; 外見回転角度 dim c_rcR, CHR_MAX : AMdSetCharacterVariable c_rcR, 27 : m_ec ; RenderColor R dim c_rcG, CHR_MAX : AMdSetCharacterVariable c_rcG, 28 : m_ec ; RenderColor G dim c_rcB, CHR_MAX : AMdSetCharacterVariable c_rcB, 29 : m_ec ; RenderColor B dim c_rcA, CHR_MAX : AMdSetCharacterVariable c_rcA, 30 : m_ec ; RenderColor AlphaEnable dim c_rst1,CHR_MAX : AMdSetCharacterVariable c_rst1,31 : m_ec ; RenderState type (1) dim c_rsv1,CHR_MAX : AMdSetCharacterVariable c_rsv1,32 : m_ec ; RenderState value (1) dim c_rst2,CHR_MAX : AMdSetCharacterVariable c_rst2,33 : m_ec ; RenderState type (2) dim c_rsv2,CHR_MAX : AMdSetCharacterVariable c_rsv2,34 : m_ec ; RenderState value (2) dim c_rspR,CHR_MAX : AMdSetCharacterVariable c_rsv2,35 : m_ec ; RenderSpecular R dim c_rspG,CHR_MAX : AMdSetCharacterVariable c_rsv2,36 : m_ec ; RenderSpecular G dim c_rspB,CHR_MAX : AMdSetCharacterVariable c_rsv2,37 : m_ec ; RenderSpecular B dim c_rspc,CHR_MAX : AMdSetCharacterVariable c_rsv2,38 : m_ec ; RenderSpecular
;----------------------- ; 描画の準備 AMdCreateCharacter 0, 0, 200, 200 c_ap.0 =AMDDRAW_CHR_APPARENT_SHOW : m_ec c_ex.0 = 255 c_ey.0 = 255 dup nx, c_x.0 dup ny, c_y.0 AMdCreateCharacter 1, 3, 100, 100 c_ap.1 =AMDDRAW_CHR_APPARENT_SHOW c_ex.1 = 255 c_ey.1 = 255 dup vx, c_x.1 dup vy, c_y.1 ;----------------------- ; メインループ c = blue *mainLoop c = blue c_c.0=0 c_c.1=3 stick i, 15 : if i & 128 : goto *exit DIGETJOYSTATE joy ,0 if joy&64 { if joy&4 : vx=vx-2 : c_c.1=4 : else : if joy&8 : vx=vx+2 : c_c.1=5 if joy&1 : vy=vy-2 : else : if joy&2 : vy=vy+2 goto *draw } if joy&4 : nx-- : c_c.0=1 : else : if joy&8 : nx++ : c_c.0=2 if joy&1 : ny-- : else : if joy&2 : ny++ ;自機操作 if joy&16 { if time>20 { AMdFindCharacter space, 0or6, 0, 100 : m_ec if space!-1 { AMdCreateCharacter space, 6, nx+7, ny-10 : m_ec c_m.space=AMDDRAW_CHR_MOVE_PARALLEL | AMDDRAW_CHR_MOVE_RANGE : m_ec c_vy.space=-3000 : m_ec c_c.space=6 : m_ec c_f=16 AMdFindCharacter space, 0or6, 0, 100 : m_ec AMdCreateCharacter space, 6, nx-7, ny-10 : m_ec c_m.space=AMDDRAW_CHR_MOVE_PARALLEL | AMDDRAW_CHR_MOVE_RANGE : m_ec c_vy.space=-3000 : m_ec c_c.space=6 : m_ec c_f=16 } time=0 } }
*draw time++ if time=9 { AMdFindCharacter space, 0or6, 0, 100 : m_ec AMdCreateCharacter space, 6, nx+7, ny-10 : m_ec c_m.space=AMDDRAW_CHR_MOVE_PARALLEL | AMDDRAW_CHR_MOVE_RANGE : m_ec c_vy.space=-3000 : m_ec c_c.space=6 : m_ec c_f=16 AMdFindCharacter space, 0or6, 0, 100 : m_ec AMdCreateCharacter space, 6, nx-7, ny-10 : m_ec c_m.space=AMDDRAW_CHR_MOVE_PARALLEL | AMDDRAW_CHR_MOVE_RANGE : m_ec c_vy.space=-3000 : m_ec c_c.space=6 : m_ec c_f=16 } ; キャラクタ表示 AMdPutCharacter 0, 6 : m_ec AMdPutChip 5, 200, 100 hit=1 AMdHitTest hit, 16, 0, 5000 if hit>1 :c=white ; 画面の更新 AMdUpdateScreen 10, AMDDRAW_CLEAR_FLAG_CLEAR, c : m_ec goto *mainLoop *exit AMdExit end
このソースだとエラが出てしまうんだが、 さっぱり解決できん(汗) 誰かへるぷみ~ HSP(プログラム言語)+AMDDRAW(ダイレクトXプラグイン)
>>72 NULLのビットパターンはゼロだけじゃないよ・・・
FAQにどっかの変なプラットフォームはそうだとあった
>>80 そういうプラットフォームなら有効な文字列のアドレスがNULLの
ビットパターンになるわけない
どっちにしろ問題ないことくらい常識で分かれ
痔ってつらいね。
ぢ です。
--------------しゅうりょぉ----------
85 :
wkitty.cpp(1) :02/09/12 01:40
/* * wkitty.cpp : No Mouth CAT *Version 0.12002.09.11by anonymous * * このプログラムは PDS です。作者は匿名です。 * 口の無い猫がぐるぐる回りながら画面を飛び回ります。この猫は No Mouth CAT です。 * くれぐれもハ○ーキ○ィと呼ばないでください。サ○リオにしかられます。 * X11 の ico みたいなプログラムが作りたくて、win32 プログラミングの学習で作りました。 * 作者はソースのみ公開します。 * フリーで手に入る Borland C++ でコンパイルする事を前提にしています。 * bcc32 -W wkitty としてコンパイルしてください。 * 他にも WIN32SDK をサポートした C++ ならたいがい通ると思います。 * * 掲示板でソース投稿する事を前提にしてるので、テキストにできないリソースは付いてません。 * アイコンぐらいはコンパイルする人が付けてやってください。 * アイコンエディタで wkitty.ico というのを作ったら、wkitty.rc というファイル名で * IDI_ICONICONDISCARDABLE"wkitty.ico" * という内容のファイルを作って、コンパイルの後に * brc32 wkitty.rc を実行するとアイコンが付きます。(Borland C++ の場合) * * 無保証です。匿名の PDS なので、誰がどう手を加えて何をしようが勝手です。 * コンパイルした実行ファイルも含めて、改造、転載、雑誌掲載、フリーソフトライブラリへの * 登録等、作者に断り無く行ってください。 * * どなたかちらつきを無くす方法を考えてください。 * * ちょっと改造するとアソパソマソやギコ猫ぐらいは回せると思います。 */
86 :
wkitty.cpp(2) :02/09/12 01:42
#include <windows.h> #include <math.h> LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);//ウィンドウ関数 LPCSTR ClassName="Skelton";//ウィンドウクラス名 HINSTANCE hInstance;//インスタンスハンドル //顔面パーツの色・中心座標・大きさ定義(楕円球) typedef struct { unsigned int r; unsigned int g; unsigned int b;// 色 double x; double y; double z;// 中心座標 double w; double h; double d; } DAENKYUU;// 幅・高さ・奥行き DAENKYUU ObjFace = { 255,255,255, 0,0,0, 74,60,60 }; DAENKYUU ObjREar = { 255,255,255, -25,20,0, 20,30,12 }; DAENKYUU ObjLEar = { 255,255,255, -ObjREar.x,ObjREar.y,ObjREar.z, ObjREar.w,ObjREar.h,ObjREar.d }; DAENKYUU ObjNose = { 255,255,0, 0,-11,29, 8,4,4 }; DAENKYUU ObjREye = { 0,0,0, -20,-6,24, 4,6,4 }; DAENKYUU ObjLEye = { 0,0,0, -ObjREye.x,ObjREye.y,ObjREye.z, ObjREye.w,ObjREye.h,ObjREye.d }; DAENKYUU ObjRibbon1 = { 255,0,0, 17,20,10, 14,14,10 }; DAENKYUU ObjRibbon2 = { 255,0,0, 8,25,8, 16,20,10 }; DAENKYUU ObjRibbon3 = { 255,0,0, 26,15,12, 16,20,10 }; DAENKYUU *Obj[9] = { &ObjREar, &ObjLEar, &ObjFace, &ObjNose, &ObjREye, &ObjLEye, &ObjRibbon2, &ObjRibbon3, &ObjRibbon1 };
87 :
wkitty.cpp(3) :02/09/12 01:43
//おひげの座標定義(直線) typedef struct { double x1; double y1; double z1; double x2; double y2; double z2; } HIGE; HIGE Hige1 = { 29,-1,21, 40,-1,21 }; HIGE Hige2 = { 28,-8,20, 39,-12,20 }; HIGE Hige3 = { 25,-15,18, 37,-23,18 }; HIGE Hige4 = { -Hige1.x1, Hige1.y1, Hige1.z1, -Hige1.x2, Hige1.y2, Hige1.z2 }; HIGE Hige5 = { -Hige2.x1, Hige2.y1, Hige2.z1, -Hige2.x2, Hige2.y2, Hige2.z2 }; HIGE Hige6 = { -Hige3.x1, Hige3.y1, Hige3.z1, -Hige3.x2, Hige3.y2, Hige3.z2 }; HIGE *Hige[6] = { &Hige1, &Hige2, &Hige3, &Hige4, &Hige5, &Hige6 }; // 描画サイズ #define OBJSIZEX 80 #define OBJSIZEY 65 // 移動距離 #define DX 1 #define DY 1 // グローバル変数の初期化 int windowsizex = 300; int windowsizey = 200; int xx = windowsizex / 2; int yy = windowsizey / 2;
88 :
wkitty.cpp(4) :02/09/12 01:44
// main 関数 int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode) { HWND hWnd;//ウィンドウハンドル MSG msg;//メッセージ WNDCLASSEX wc;//ウィンドウクラス hInstance = hThisInst;//グローバル化 //ウィンドウクラス定義 wc.hInstance = hInstance;//インスタンス wc.lpszClassName = ClassName;//クラス名 wc.lpfnWndProc = WindowProc;//ウィンドウ関数名 wc.style = 0;//クラススタイル wc.cbSize = sizeof(WNDCLASSEX);//構造体サイズ wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //アイコンハンドル wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO);//スモールアイコン wc.hCursor = LoadCursor(NULL, IDC_ARROW);//マウスポインタ wc.lpszMenuName = NULL;//メニュー(なし) wc.cbClsExtra = 0;//クラス拡張情報 wc.cbWndExtra = 0;//ウィンドウ拡張情報 wc.hbrBackground = (HBRUSH) COLOR_WINDOW;//ウィンドウの背景色 if(!RegisterClassEx(&wc)) return 0;//ウィンドウクラス登録
89 :
wkitty.cpp(5) :02/09/12 01:45
//ウィンドウ生成 hWnd = CreateWindow( ClassName,//ウィンドウクラス名 "Wkitty : No Mouth CAT",//ウィンドウ名 WS_OVERLAPPEDWINDOW,//ウィンドウ属性 CW_USEDEFAULT,//ウィンドウ表示位置(X) CW_USEDEFAULT,//ウィンドウ表示位置(Y) windowsizex,//ウィンドウサイズ(X) windowsizey,//ウィンドウサイズ(Y) HWND_DESKTOP,//親ウィンドウハンドル NULL,// hInstance,//インスタンスハンドル NULL// ); //ウィンドウ表示 ShowWindow(hWnd, nWinMode);//ウィンドウ表示モード UpdateWindow(hWnd);//ウインドウ更新 //メッセージループ while(GetMessage(&msg, NULL, 0, 0)){//メッセージを取得(吸い上げ) TranslateMessage(&msg);// DispatchMessage(&msg);//メッセージを各ウィンドウに送る } return msg.wParam;//プログラム終了 }
90 :
wkitty.cpp(6) :02/09/12 01:45
// OnPaint 再描画処理 (WM_PAINTメッセージ) LRESULT CALLBACK OnPaint(HWND hWnd) { const double PI = 3.141592654; static int dx = DX;// 移動距離 X static int dy = DY;// 移動距離 Y static int rot = 0;// 回転角度 int i;// 汎用ループ変数 unsigned int red, green, blue;// ブラシ描画色 enum objtype { LINE, DAEN };// 物体の属性 struct { objtype t; double z; int n; } zb[15], tz;// 簡易 Z バッファ double rad, sinrad, cosrad, xc, xw, wc, ds, theta;// 座標演算用変数 int x1, x2, y1, y2;// 描画時の画面内座標 HDC hDC;// デバイスコンテキスト HBRUSH hBrushOld;// 旧ブラシ保存用 HBRUSH hBrush[9];// 楕円を描画するブラシ HPEN hPenOld;// ペン・ハンドル PAINTSTRUCT ps;// PAINTSTRUCT構造体 hDC = BeginPaint(hWnd, &ps);// 描画開始 hPenOld = (HPEN)SelectObject(hDC, GetStockObject(BLACK_PEN));// 黒ペン選択 hBrushOld = (HBRUSH)SelectObject(hDC, GetStockObject(WHITE_BRUSH));// 白ブラシ選択 // 角度とその三角関数。 rad = 2 * PI * rot / 360; sinrad = sin( rad ); cosrad = cos( rad );
91 :
wkitty.cpp(7) :02/09/12 01:46
// 描画中心位置を決定する xx += dx; if ( xx <= OBJSIZEX / 2 ) { dx = DX; xx = OBJSIZEX / 2; } if ( xx >= windowsizex - OBJSIZEX / 2 ) { dx = -DX; xx = windowsizex - OBJSIZEX / 2; } yy += dy; if ( yy <= OBJSIZEY / 2 ) { dy = DY; yy = OBJSIZEY / 2; } if ( yy >= windowsizey - OBJSIZEY / 2 ) { dy = -DY; yy = windowsizey - OBJSIZEY / 2; }
92 :
wkitty.cpp(8) :02/09/12 01:47
// 描画オブジェクトのセンター位置を Z バッファに入れる for ( i = 0; i < 9; ++i ) {// 楕円球オブジェクトの深さ zb[i].t = DAEN; zb[i].n = i; // 中心座標を回転変換 zb[i].z = (*Obj[i]).x * sinrad + (*Obj[i]).z * cosrad; } for ( i = 9; i < 15; ++i ) {// 直線オブジェクトの深さ int j = i - 9; zb[i].t = LINE; zb[i].n = j; // 中心座標を回転変換 zb[i].z = ( (*Hige[j]).x1 * sinrad + (*Hige[j]).z1 * cosrad + (*Hige[j]).x2 * sinrad + (*Hige[j]).z2 * cosrad ) / 2; }
93 :
wkitty.cpp(9) :02/09/12 01:50
// zb[].z をキーに zb[] をバブルソートする int j, k; k = 14; while ( k >= 0 ) { j = -1; for ( i = 1; i <= k; i++ ) { if ( zb[i-1].z > zb[i].z ) { j = i - 1; tz.t = zb[j].t; zb[j].t = zb[i].t; zb[i].t = tz.t; tz.z = zb[j].z; zb[j].z = zb[i].z; zb[i].z = tz.z; tz.n = zb[j].n; zb[j].n = zb[i].n; zb[i].n = tz.n; } } k = j; }
94 :
wkitty.cpp(10) :02/09/12 01:51
// Z軸が深い順にオブジェクトを描画する(かなりいいかげんな隠面処理方法) for ( i = 0; i < 15; ++i ) { switch ( zb[i].t ) { case DAEN: red = (*Obj[zb[i].n]).r;// 色を取得してブラシ作成 green = (*Obj[zb[i].n]).g; blue = (*Obj[zb[i].n]).b; hBrush[zb[i].n] = CreateSolidBrush(RGB(red, green, blue)); SelectObject(hDC, hBrush[zb[i].n]); // 回転変換 xc = cosrad * (*Obj[zb[i].n]).x - sinrad * (*Obj[zb[i].n]).z; // 回転した楕円の X 軸投影座標を求める theta = atan( - (*Obj[zb[i].n]).d * sinrad / (*Obj[zb[i].n]).w / cosrad ); wc = cos( theta ) * (*Obj[zb[i].n]).w / 2; ds = sin( theta ) * (*Obj[zb[i].n]).d / 2; xw = sqrt( wc * wc + ds * ds); // 楕円の描画 x1 = xc - xw + xx; x2 = xc + xw + xx; y1 = yy - (*Obj[zb[i].n]).y - (*Obj[zb[i].n]).h / 2; y2 = yy - (*Obj[zb[i].n]).y + (*Obj[zb[i].n]).h / 2; Ellipse(hDC, x1, y1, x2, y2 ); break;
95 :
wkitty.cpp(11) :02/09/12 01:52
case LINE: // 回転変換 x1 = cosrad * (*Hige[zb[i].n]).x1 - sinrad * (*Hige[zb[i].n]).z1 + xx; x2 = cosrad * (*Hige[zb[i].n]).x2 - sinrad * (*Hige[zb[i].n]).z2 + xx; y1 = yy - (*Hige[zb[i].n]).y1; y2 = yy - (*Hige[zb[i].n]).y2; // 直線を描く MoveToEx( hDC, x1, y1, NULL ); LineTo( hDC, x2, y2 ); break; } } SelectObject(hDC, hBrushOld);// ブラシを元に戻す SelectObject(hDC, hPenOld);// ペンを元に戻す for ( i = 0; i < 9; ++i ) { DeleteObject(hBrush[i]);// ブラシ削除 } EndPaint(hWnd, &ps);// 描画終了 ++rot;// 回転角度更新 if ( rot >= 360 ) rot = 0; return 0L; }
96 :
wkitty.cpp(12)LAST :02/09/12 01:53
// ウィンドウ関数 LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wP, LPARAM lP) { switch(uMsg){ case WM_DESTROY:// ウィンドウ終了通知 MessageBox( hWnd, "wkitty(No Mouth CAT) is PDS. Programed by anonymous. Ver.0.1 2002.09.11", "No Mouth CAT", MB_OK ); PostQuitMessage(0);// プログラム終了メッセージ送信 return 0L;// イベント処理終了 case WM_PAINT: return OnPaint( hWnd );// 描画処理ルーチン case WM_SIZE:// ウィンドウサイズ変更時 windowsizex = LOWORD( lP );// 横のサイズ取り出し windowsizey = HIWORD( lP );// 縦のサイズ取り出し if ( xx + OBJSIZEX / 2 >= windowsizex ) xx = windowsizex - OBJSIZEX / 2; if ( yy + OBJSIZEY / 2 >= windowsizey ) yy = windowsizey - OBJSIZEY / 2; return 0L; #ifdef DEBUG case WM_LBUTTONDOWN:// デバッグ用。マウス左クリックで描画 OnPaint( hWnd ); InvalidateRect( hWnd, NULL, TRUE ); #endif default: #ifndef DEBUG// デバッグでないときはデフォルトで描画 OnPaint( hWnd ); InvalidateRect( hWnd, NULL, TRUE ); #endif return DefWindowProc(hWnd, uMsg, wP, lP);//標準メッセージ処理 } return 0L;//イベント処理終了 }
>>85 これ、ダブルバッファリングになってる?ダブルバッファリング使えばちらつきはある程度押えれる。
あと、無駄な領域まで描画するのは止めた方がいい。
wkitty.cpp とりあえずVC++で通ることだけは確認したぞ。警告は若干出てるけど。
すげーな、これだけなのに思いっきりそれらしく見える
101 :
デフォルトの名無しさん :02/09/12 02:30
wkitty.cpp の投稿者です。 インデントが駄目になる事は覚悟してたけど、スペーシングに TAB を使うのは 掲示板投稿ではまずいと今気がつきました。 detab しとくべきだった。 コーディングでいちばん苦労した点は回転変換した楕円の投影座標の式を出すのに、 三角関数の微分という数学らしい事をひさびさにやった事です。
>>10 んじゃ漏れも
int GetLineNumber(const char* FileName)
{
ifstream fin(FileName);
fin.unsetf(ios::skipws);
return count(istream_iterator<char>(fin), istream_iterator<char>(), '\n');
}
あ、countは#include<algorithm>のね。
あげ
105 :
wkitty.c(1) :02/09/14 04:47
/* wkitty.c : No Mouth CAT Version 0.2 2002.09.14 by anonymous */ #include <windows.h> #include <math.h> #define EN 9 struct{int r;int g;int b;double x;double y;double z;double w;double h;double d;}el[EN]={ {255,255,255,0,0,0,74,60,60},{255,255,255,-25,20,0,20,30,12},{255,255,255,25,20,0,20,30,12}, {255,255,0,0,-11,29,8,4,4},{0,0,0,-20,-6,24,4,6,4},{ 0,0,0,20,-6,24,4,6,4}, {255,0,0,17,20,10,14,14,10},{255,0,0,8,25,8,16,20,10},{255,0,0,26,15,12,16,20,10}}; #define LN 6 struct{double x1;double y1;double z1;double x2;double y2;double z2;}li[LN]={ {29,-1,21,40,-1,21},{28,-8,20,39,-12,20},{25,-15,18,37,-23,18}, {-29,-1,21,-40,-1,21},{-28,-8,20,-39,-12,20},{-25,-15,18,-37,-23,18}}; #define SIZEX 80 #define UPY 36 #define LOY 31 #define DX 1 #define DY 1 LPCSTR CN="Wkitty";int wx=300,wy=200,xx=150,yy=100;
106 :
wkitty.c(2) :02/09/14 04:49
/* 描画関数 */ LRESULT CALLBACK OnPaint(HWND hWnd){ const double PI=3.14159;static int dx=DX,dy=DY,d=0;int i,j,k,x1,x2,y1,y2; enum ot{LI,EL};struct{enum ot t;double z;int n;}s[15],u; double rd,sr,cr,xc,xw,wc,ds,th;HDC hDC;HBRUSH hBOld,hB[9];HPEN hPenOld;PAINTSTRUCT ps; hDC=BeginPaint(hWnd, &ps);hPenOld=(HPEN)SelectObject(hDC,GetStockObject(BLACK_PEN)); hBOld=(HBRUSH)SelectObject(hDC,GetStockObject(WHITE_BRUSH)); rd=2*PI*d/360;sr=sin(rd);cr=cos(rd); xx+=dx;if(xx<=SIZEX/2){dx=DX;xx=SIZEX/2;}if(xx>=wx-SIZEX/2){dx=-DX;xx=wx-SIZEX/2;} yy+=dy;if(yy<=UPY){dy=DY;yy=UPY;}if(yy>=wy-LOY){dy=-DY;yy=wy-LOY;} for(i=0;i<EN;++i){s[i].t=EL;s[i].n=i;s[i].z=el[i].x*sr+el[i].z*cr;} for(i=EN;i<EN+LN;++i){j=i-EN;s[i].t=LI;s[i].n=j;s[i].z=(li[j].x1*sr+li[j].z1*cr+li[j].x2*sr+li[j].z2*cr)/2;} k=EN+LN-1;while(k>=0){j=-1;for(i=1;i<=k;i++){if(s[i-1].z>s[i].z){j=i-1;u.t=s[j].t;s[j].t=s[i].t; s[i].t=u.t;u.z=s[j].z;s[j].z=s[i].z;s[i].z=u.z;u.n=s[j].n;s[j].n=s[i].n;s[i].n=u.n;}}k=j;} for(i=0;i<EN+LN;++i){switch(s[i].t){ case EL:hB[s[i].n]=CreateSolidBrush(RGB(el[s[i].n].r,el[s[i].n].g,el[s[i].n].b)); SelectObject(hDC,hB[s[i].n]);xc=cr*el[s[i].n].x-sr*el[s[i].n].z;th=atan(-el[s[i].n].d*sr/el[s[i].n].w/cr); wc=cos(th)*el[s[i].n].w/2;ds=sin(th)*el[s[i].n].d/2;xw=sqrt(wc*wc+ds*ds); x1=xc-xw+xx;x2=xc+xw+xx;y1=yy-el[s[i].n].y-el[s[i].n].h/2;y2=yy-el[s[i].n].y+el[s[i].n].h/2; Ellipse(hDC,x1,y1,x2,y2);break; case LI:x1=cr*li[s[i].n].x1-sr*li[s[i].n].z1+xx;x2=cr*li[s[i].n].x2-sr*li[s[i].n].z2+xx; y1=yy-li[s[i].n].y1;y2=yy-li[s[i].n].y2;MoveToEx(hDC,x1,y1,NULL);LineTo(hDC,x2,y2);break;}} SelectObject(hDC,hBOld);SelectObject(hDC,hPenOld); for(i=0;i<EN;++i)DeleteObject(hB[i]);EndPaint(hWnd,&ps);++d;if(d>=360)d=0;return 0L;}
107 :
wkitty.c(3) :02/09/14 04:50
/* WndProc 関数 */ LRESULT CALLBACK WP(HWND hWnd,UINT uMsg,WPARAM wP,LPARAM lP){ switch(uMsg){ case WM_DESTROY: MessageBox(hWnd,"Wkitty(No Mouth CAT) is PDS by anonymous. Ver.0.2 2002.09.14",CN,MB_OK); PostQuitMessage(0);break; case WM_PAINT: return OnPaint(hWnd); case WM_SIZE: wx=LOWORD(lP);wy=HIWORD(lP);if(xx+SIZEX/2>=wx)xx=wx-SIZEX/2;if(yy+LOY>=wy)yy=wy-LOY;break; #ifdef DEBUG case WM_LBUTTONDOWN:OnPaint(hWnd);InvalidateRect(hWnd,NULL,TRUE);break; #endif default: #ifndef DEBUG OnPaint(hWnd);InvalidateRect(hWnd,NULL,TRUE); #endif return DefWindowProc(hWnd,uMsg,wP,lP); }return 0L;}
108 :
wkitty.c(4) :02/09/14 04:50
/* WinMain 関数 */ int WINAPI WinMain(HINSTANCE I,HINSTANCE hPI,LPSTR lCL,int n){ HWND h;MSG m;WNDCLASS w;w.hInstance=I;w.lpszClassName=CN;w.lpfnWndProc=WP;w.style=0; w.hIcon=LoadIcon(NULL,IDI_APPLICATION);w.hCursor=LoadCursor(NULL,IDC_ARROW); w.lpszMenuName=NULL;w.cbClsExtra=w.cbWndExtra=0;w.hbrBackground=(HBRUSH)COLOR_WINDOW; if(!RegisterClass(&w))return 0; h=CreateWindow(CN,CN,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,wx,wy,NULL,NULL,I,NULL); ShowWindow(h,n);UpdateWindow(h); while(GetMessage(&m,NULL,0,0)){TranslateMessage(&m);DispatchMessage(&m);}return m.wParam;}
109 :
wkitty :02/09/14 04:54
バージョンアップ、といっても機能的には変わっていない。 C言語としてコンパイルできるようにした。 掲示板投稿を考慮してソースを圧縮したスタイルにした。 分割数は12から4に減ったが読みにくさ激増。
他人に評価してもらいたいのなら、読みやすくすることをお勧めします
>>111 そうでしたか
自分は公の場でソースを公開する上で、それぐらいの礼儀があっても
いいのではと思いまして
大変失礼しました
>>112 >掲示板投稿を考慮してソースを圧縮したスタイルにした。
が見えないのか。
自分でindent等を使って整形すればいいでしょう。
というか、大して変わってないんだからわざわざここに貼るな どうしても見てもらいたきゃあぷろだにでも上げろ
>>111 も読み易い部類だとか言っておいて一言も評価コメントはなしか?
案外、冷たいなあ
まあ、おれは読まん(w
116 :
wkitty :02/09/14 09:34
匿名PDSをソースで公開する事が第一の目的です。 自力でコンパイルできて icon ぐらいは付けられる閲覧者が 比較的多いと思われる 2ch のプログラム板を公開場所に選びました。 読んで評価していただかなくとも、コンパイルして実行してみて 笑ってもらえたら私としては目的達成です。 受け狙いのジョークソフトですから。 Version 0.1 はコメント入ってて TAB でインデントされてたんですが、 掲示板投稿するとTAB はスペーシングされないし、12分割でめげました。 匿名にするつもりじゃなかったら、自分のホームページにアップしますが、 閲覧者が少ないから誰も見てくれない(悲)。
ジョークソフトでオープンソース シュールな wkitty 応援age
コメント・・・・うーん 描画データは頑張ったね。 Invalidateを毎回させてるのはどうかなあ、 SetTimerして WM_TIMER で Invalidateにするほうが ダブルバッファにしないなら Invalidateで キャラの最小矩形で消去した方がチラツキが少し減るとか まあ普通のコメントしか出来ないなあ
121 :
wkitty :02/09/15 01:35
いくつか試した事。 1.キャラの最小矩形で InvalidateRect : 他のウィンドウに重なってそこにキャラ が入った時に再描画が止まった。 2.ダブルバッファ : まだ win32 プログラミングに慣れてないのでポカやってる かもしれないが、試したところ、マウスをウィンドウ上でグリグリやると 描画されなかった。 120 で指摘されてるように SetTimer して WM_TIMER で InvalidateRect する のが正解と思うのですが、遅いマシンでどれぐらいのタイマー値までついてくる かがわからないのでまだ試してません。 最終的には決め打ちで適当なタイマー値に設定してやる事になると思います。 ところでプログラム名が wkitty になっているのは、X11 移植版に xkitty という名を付けるつもりなので、そうなってます。 X のプログラミングもマスターしてないんでいつになるかはわかりませんが。
122 :
wkitty :02/09/15 23:55
>>106 ポカミスの修正。
3行目 enum ot{LI,EL};struct{enum ot t;double z;int n;}s[15],u;
の s[15] は s[EN+LN] とすべきです。
4行目 double rd,sr,cr,xc,xw,wc,ds,th;HDC hDC;HBRUSH hBOld,hB[9];HPEN hPenOld;PAINTSTRUCT ps;
の hB[9] は hB[EN] とすべきです。
123 :
C言語暦ンヶ月 :02/09/16 20:52
124 :
wkitty.c(3)をいじってみる :02/09/17 01:00
>>107 SetTimer を使ってみたらかなり遅くなったので、default: でペイントして
WM_TIMER でInvalidateRectしてみたが、これは考えていた動きじゃない。
ウィンドウ上でマウスをグリグリした時だけ早く動く。
SetTimer したらメッセージループがタイマー値か他のイベントが入ってこないと
回ってくれないみたいだ。
/* WndProc 関数 */ LRESULT CALLBACK WP(HWND hWnd,UINT uMsg,WPARAM wP,LPARAM lP){
//RECT r;r.left=xx-SIZEX/2-DX-4;r.top=yy-UPY-DY;r.right=xx+SIZEX/2+DX+4;r.bottom=yy+LOY+DY;
switch(uMsg){
#ifndef DEBUG
#define IDTIMER 10000
case WM_CREATE: SetTimer(hWnd,IDTIMER,10,NULL);break;
case WM_TIMER: if (wP==IDTIMER)InvalidateRect(hWnd,NULL,TRUE);break;
#endif
case WM_DESTROY:
MessageBox(hWnd,"Wkitty(No Mouth CAT) is PDS by anonymous. Ver.0.3 2002.09.16",CN,MB_OK);
PostQuitMessage(0);break;
case WM_PAINT: return OnPaint(hWnd);
case WM_SIZE:
wx=LOWORD(lP);wy=HIWORD(lP);if(xx+SIZEX/2>=wx)xx=wx-SIZEX/2;if(yy+LOY>=wy)yy=wy-LOY;break;
#ifdef DEBUG
case WM_LBUTTONDOWN:OnPaint(hWnd);InvalidateRect(hWnd,&r,TRUE);break;
#endif
default:
#ifndef DEBUG
OnPaint(hWnd);
#endif
return DefWindowProc(hWnd,uMsg,wP,lP);
}return 0L;}
>>123 いや、これは単なるグラフィックスでGUIではないだろ・・
126 :
C言語暦ンヶ月 :02/09/17 15:58
>>125 オレにとってはDOSプロンプトでないだけでGUIなのですw
すみません、素で知りませんでした…。
やっぱりグラフィックスだのGUIだのは、
猫でもで一通り勉強してから改造したりして遊ぶものですかね。
まだCをある程度使える -> C++ -> SDKだのと道のりは遠いです。
ところでwkittyさんのやつは、
円柱とかも作れますよね?
昨
昨…ってなんだーーー!?
らt
らt…ってなんだーーー!?
>>126 GUIはシステム(OSやライブラリ等)によっても大分違いますが、
CやC++は覚えておくと、大体どこへいっても役に立ちます。
きっちり理解してから先へ進むのがよいでしょう。
2~3ヶ月もあれば、大抵のことはできるようになると思います。
グラフィックはAPI,MSCなどを使うよりも
目的別のラッパーライブラリを使う方が便利といえば便利です。
(フリーのゲーム用ライブラリとかです)
131 :
C言語暦ンヶ月 :02/09/17 19:36
>>127 ワラタw
>>130 がむばってみます。
とりあえず、ハ○ーキ○oのやつをしぃに改造しているのですが、
構造体の数を変更
defineの数を変更した時点でコンパイルしても
「不正な処理」がでて開けなかった。
折れって素質無いのかもw
132 :
デフォルトの名無しさん :02/09/17 19:39
i++より、 ++iのほうが速いんですか?
わざわざ考えるほどには違わない。
同じではないということ?
>>132 >>135 もそうだけど,iの型によっても変わる。
(ちょっとスレ違いだが)iがSTLの(でかめの)イテレータだった場合は ++i の方が断然速い。
137 :
デフォルトの名無しさん :02/09/17 20:05
i+1 i+i
138 :
C言語暦ンヶ月 :02/09/17 20:18
>>137 2 * i よりは i + iの方が速そうですね。
>>136 ということは、 i++でも++i でも変わらないときは
とりあえず ++i にしといたほうがお得ということですか?
C言語以外(Perlとか)ではどうなんだろう。。
>>138 基本的に ++i の方が値を保存しておく必要がないので速い。
ただし最適化によって変わるので一概に言えない。まあ++iの方が良いってことさね。
ちょっとずれるが,Perlは
if (EXPR) {
hoge;
}
よりも
hoge if (EXPR);
の方が速い。
140 :
C言語暦ンヶ月 :02/09/17 21:28
/* 長くて申し訳ありません */ /* (・∀・) ( ・∀) ( ・) ( ) (・ ) (∀・ ) (・∀・) !! */ #define EN 5 //顔面パーツ.色・中心座標・大きさ定義(楕円球) struct{ int r, g, b; // RGB=色 double x, y, z; // 中心座標 double w, h, d; // 幅,高さ,奥行き }el[EN]={ /* 赤 緑 青 x y z 幅 高 奥 */ {255,255,255, 0, 0, 0,74,60,60}, {255,255,255,-25,20, 0,20,30,12}, {255,255,255, 25,20, 0,20,30,12}, { 0, 0, 0,-20,-6,24, 4, 6, 4}, { 0, 0, 0, 20,-6,24, 4, 6, 4} }; #define LN 3 //ひげの座標定義(直線) struct{ double x1, y1, z1; double x2, y2, z2; }li[LN]={ /* 始点 x y z 終点 x y z */ { 0,-20,25, 15,10,25}, { 0,-20,25,-15,10,25}, {-10, 0,25, 10, 0,25} };
141 :
デフォルトの名無しさん :02/09/17 22:16
>>140 耳が ∩ じゃないか。 ∧ じゃないとw
>>141 そだね。耳が∩じゃ家猫じゃなくて山猫になってしまう。
あの描画ルーチンはあんまり汎用性ないです。 正立した楕円球と直線しか考えてないです。 アソパソマソぐらいはモデリングデータの変更だけで回ると思います。 ギコ猫の耳を回すために、楕円錐の struct 配列を三角形の Polygon で描画するルーチンと、 耳の付け根を顔面の楕円より先に描画しないようにソートの開始・終了位置を工夫する 方法は考えてありますが、kitty のちらつきを無くして安定して早く回す方が優先 だったので、次からその解決版をアプします。(毎度長くてごめん)
144 :
wkitty.c(1)完成版 :02/09/18 00:13
/* wkitty.c : No Mouth CAT Version 0.4 2002.09.17 by anonymous */ #include <windows.h> #include <math.h> #define EN 9 struct{int r;int g;int b;double x;double y;double z;double w;double h;double d;}el[EN]={ {255,255,255,0,0,0,74,60,60},{255,255,255,-25,20,0,20,30,12},{255,255,255,25,20,0,20,30,12}, {255,255,0,0,-11,29,8,4,4},{0,0,0,-20,-6,24,4,6,4},{ 0,0,0,20,-6,24,4,6,4}, {255,0,0,17,20,10,14,14,10},{255,0,0,8,25,8,16,20,10},{255,0,0,26,15,12,16,20,10}}; #define LN 6 struct{double x1;double y1;double z1;double x2;double y2;double z2;}li[LN]={ {29,-1,21,40,-1,21},{28,-8,20,39,-12,20},{25,-15,18,37,-23,18}, {-29,-1,21,-40,-1,21},{-28,-8,20,-39,-12,20},{-25,-15,18,-37,-23,18}}; #define SIZEX 92 #define UPY 36 #define LOY 31 #define DX 1 #define DY 1 #define SIZEY (UPY+LOY) LPCSTR CN="Wkitty";int wx=300,wy=200,xx=150,yy=100,dx=DX,dy=DY;HDC hDC,hmDC;PAINTSTRUCT ps;HBITMAP hBit;
145 :
wkitty.c(2)完成版 :02/09/18 00:14
/* 描画関数 */ LRESULT CALLBACK OnPaint(HWND hWnd){const double PI=3.14159;static int d=0;int i,j,k; enum ot{LI,EL};struct{enum ot t;double z;int n;}s[EN+LN],u;double rd,sr,cr,xc,xw,wc,ds,th; HBRUSH hBOld,hB[EN];HPEN hPenOld; hDC=BeginPaint(hWnd, &ps);hPenOld=(HPEN)SelectObject(hmDC,GetStockObject(BLACK_PEN)); hBOld=(HBRUSH)SelectObject(hmDC,GetStockObject(LTGRAY_BRUSH));PatBlt(hmDC,0,0,SIZEX,SIZEY,PATCOPY); rd=2*PI*d/360;sr=sin(rd);cr=cos(rd); for(i=0;i<EN;++i){s[i].t=EL;s[i].n=i;s[i].z=el[i].x*sr+el[i].z*cr;} for(i=EN;i<EN+LN;++i){j=i-EN;s[i].t=LI;s[i].n=j;s[i].z=(li[j].x1*sr+li[j].z1*cr+li[j].x2*sr+li[j].z2*cr)/2;} k=EN+LN-1;while(k>=0){j=-1;for(i=1;i<=k;i++){if(s[i-1].z>s[i].z){j=i-1;u.t=s[j].t;s[j].t=s[i].t; s[i].t=u.t;u.z=s[j].z;s[j].z=s[i].z;s[i].z=u.z;u.n=s[j].n;s[j].n=s[i].n;s[i].n=u.n;}}k=j;} for(i=0;i<EN+LN;++i){switch(s[i].t){ case EL:hB[s[i].n]=CreateSolidBrush(RGB(el[s[i].n].r,el[s[i].n].g,el[s[i].n].b)); SelectObject(hmDC,hB[s[i].n]);xc=cr*el[s[i].n].x-sr*el[s[i].n].z;th=atan(-el[s[i].n].d*sr/el[s[i].n].w/cr); wc=cos(th)*el[s[i].n].w/2;ds=sin(th)*el[s[i].n].d/2;xw=sqrt(wc*wc+ds*ds); Ellipse(hmDC,xc-xw+SIZEX/2,UPY-el[s[i].n].y-el[s[i].n].h/2,xc+xw+SIZEX/2,UPY-el[s[i].n].y+el[s[i].n].h/2);break; case LI: MoveToEx(hmDC,cr*li[s[i].n].x1-sr*li[s[i].n].z1+SIZEX/2,UPY-li[s[i].n].y1,NULL); LineTo(hmDC,cr*li[s[i].n].x2-sr*li[s[i].n].z2+SIZEX/2,UPY-li[s[i].n].y2);break;}} SelectObject(hmDC,hBOld);SelectObject(hmDC,hPenOld); for(i=0;i<EN;++i)DeleteObject(hB[i]);EndPaint(hWnd,&ps);++d;if(d>=360)d=0;return 0L;}
146 :
wkitty.c(3)完成版 :02/09/18 00:15
/* WndProc 関数 */ LRESULT CALLBACK WP(HWND hWnd,UINT uMsg,WPARAM wP,LPARAM lP){ int i; switch(uMsg){case WM_CREATE: #ifndef DEBUG #define IDTIMER 10000 SetTimer(hWnd,IDTIMER,10,NULL); #endif hDC=GetDC(hWnd);hmDC=CreateCompatibleDC(hDC);hBit=CreateCompatibleBitmap(hDC,SIZEX,SIZEY);SelectObject(hmDC,hBit); SelectObject(hmDC,GetStockObject(LTGRAY_BRUSH));PatBlt(hmDC,0,0,SIZEX,SIZEY,PATCOPY);ReleaseDC(hWnd,hDC);break; case WM_DESTROY: DeleteDC(hmDC);DeleteObject(hBit); MessageBox(hWnd,"Wkitty(No Mouth CAT) is PDS by anonymous. Ver.0.4 2002.09.17",CN,MB_OK);PostQuitMessage(0);break; case WM_PAINT: OnPaint(hWnd);BitBlt(hDC,xx-SIZEX/2,yy-UPY,SIZEX,SIZEY,hmDC,0,0,SRCCOPY);break; case WM_SIZE: wx=LOWORD(lP);wy=HIWORD(lP);if(xx+SIZEX/2>=wx)xx=wx-SIZEX/2;if(yy+LOY>=wy)yy=wy-LOY;break; #ifdef DEBUG case WM_LBUTTONDOWN: #else case WM_TIMER: for(i=0;i<50;++i){ #endif xx+=dx;if(xx<=SIZEX/2){dx=DX;xx=SIZEX/2;}if(xx>=wx-SIZEX/2){dx=-DX;xx=wx-SIZEX/2;} yy+=dy;if(yy<=UPY){dy=DY;yy=UPY;}if(yy>=wy-LOY){dy=-DY;yy=wy-LOY;} OnPaint(hWnd);BitBlt(hDC,xx-SIZEX/2,yy-UPY,SIZEX,SIZEY,hmDC,0,0,SRCCOPY); #ifndef DEBUG } #endif break; default: return DefWindowProc(hWnd,uMsg,wP,lP);}return 0L;}
147 :
wkitty.c(4)完成版 :02/09/18 00:16
/* WinMain 関数 */ int WINAPI WinMain(HINSTANCE I,HINSTANCE hPI,LPSTR lCL,int n){ HWND h;MSG m;WNDCLASS w;w.hInstance=I;w.lpszClassName=CN;w.lpfnWndProc=WP;w.style=0; w.hIcon=LoadIcon(NULL,IDI_APPLICATION);w.hCursor=LoadCursor(NULL,IDC_ARROW); w.lpszMenuName=NULL;w.cbClsExtra=w.cbWndExtra=0;w.hbrBackground=(HBRUSH)COLOR_WINDOW; if(!RegisterClass(&w))return 0; h=CreateWindow(CN,CN,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,wx,wy,NULL,NULL,I,NULL); ShowWindow(h,n);UpdateWindow(h); while(GetMessage(&m,NULL,0,0)){TranslateMessage(&m);DispatchMessage(&m);}return m.wParam;}
148 :
wkitty :02/09/18 00:22
SetTimer と WM_Timer は、54msec 以下のタイマー値を与えても 意味が無く、 WM_Timer で一回だけ描画すると遅くなります。 default で描画するとイベントキューにイベントが入る都度描画するので、 マウスグリグリで描画が早くなりました。 結局、WM_TIMER で50回描画する事にしました。 ビットマップバッファに描いてBitBltする事でちらつきを押さえました。
151 :
デフォルトの名無しさん :02/09/18 21:19
ちらつきどころか、 なにも表示されなくなりました>wkitty.c ver0.4
>151 うーむ、ビットマップバッファとメインウィンドウのデバイスコンテキスト の扱いにあまり自信がないけど、こう書いたらうちの Win Me では動きました。 OSもしくはグラフィックドライバに癖あるんでしょうか。 参考にしてるおソースでは GetDC BitBlt ReleaseDC の順で処理されてるけど、 これはそうなってない。 もいっかい検討します。
/* 描画関数 */ LRESULT CALLBACK OnPaint(void){const double PI=3.14159;static int d=0;int i,j,k; enum ot{LI,EL};struct{enum ot t;double z;int n;}s[EN+LN],u;double rd,sr,cr,xc,xw,wc,ds,th; HBRUSH hBOld,hB[EN];HPEN hPenOld; hPenOld=(HPEN)SelectObject(hmDC,GetStockObject(BLACK_PEN)); hBOld=(HBRUSH)SelectObject(hmDC,GetStockObject(LTGRAY_BRUSH));PatBlt(hmDC,0,0,SIZEX,SIZEY,PATCOPY); rd=2*PI*d/360;sr=sin(rd);cr=cos(rd); for(i=0;i<EN;++i){s[i].t=EL;s[i].n=i;s[i].z=el[i].x*sr+el[i].z*cr;} for(i=EN;i<EN+LN;++i){j=i-EN;s[i].t=LI;s[i].n=j;s[i].z=(li[j].x1*sr+li[j].z1*cr+li[j].x2*sr+li[j].z2*cr)/2;} k=EN+LN-1;while(k>=0){j=-1;for(i=1;i<=k;i++){if(s[i-1].z>s[i].z){j=i-1;u.t=s[j].t;s[j].t=s[i].t; s[i].t=u.t;u.z=s[j].z;s[j].z=s[i].z;s[i].z=u.z;u.n=s[j].n;s[j].n=s[i].n;s[i].n=u.n;}}k=j;} for(i=0;i<EN+LN;++i){switch(s[i].t){ case EL:hB[s[i].n]=CreateSolidBrush(RGB(el[s[i].n].r,el[s[i].n].g,el[s[i].n].b)); SelectObject(hmDC,hB[s[i].n]);xc=cr*el[s[i].n].x-sr*el[s[i].n].z;th=atan(-el[s[i].n].d*sr/el[s[i].n].w/cr); wc=cos(th)*el[s[i].n].w/2;ds=sin(th)*el[s[i].n].d/2;xw=sqrt(wc*wc+ds*ds); Ellipse(hmDC,xc-xw+SIZEX/2,UPY-el[s[i].n].y-el[s[i].n].h/2,xc+xw+SIZEX/2,UPY-el[s[i].n].y+el[s[i].n].h/2);break; case LI: MoveToEx(hmDC,cr*li[s[i].n].x1-sr*li[s[i].n].z1+SIZEX/2,UPY-li[s[i].n].y1,NULL); LineTo(hmDC,cr*li[s[i].n].x2-sr*li[s[i].n].z2+SIZEX/2,UPY-li[s[i].n].y2);break;}} SelectObject(hmDC,hBOld);SelectObject(hmDC,hPenOld); for(i=0;i<EN;++i)DeleteObject(hB[i]); ++d;if(d>=360)d=0;return 0L;}
/* WndProc 関数 */ LRESULT CALLBACK WP(HWND hWnd,UINT uMsg,WPARAM wP,LPARAM lP){ int i; switch(uMsg){case WM_CREATE: #ifndef DEBUG #define IDTIMER 10000 SetTimer(hWnd,IDTIMER,10,NULL); #endif hDC=GetDC(hWnd);hmDC=CreateCompatibleDC(hDC);hBit=CreateCompatibleBitmap(hDC,SIZEX,SIZEY);SelectObject(hmDC,hBit); SelectObject(hmDC,GetStockObject(LTGRAY_BRUSH));PatBlt(hmDC,0,0,SIZEX,SIZEY,PATCOPY);ReleaseDC(hWnd,hDC);break; case WM_DESTROY: DeleteDC(hmDC);DeleteObject(hBit); MessageBox(hWnd,"Wkitty(No Mouth CAT) is PDS by anonymous. Ver.0.5 2002.09.18",CN,MB_OK);PostQuitMessage(0);break; case WM_PAINT: OnPaint();BeginPaint(hWnd,&ps);BitBlt(ps.hdc,xx-SIZEX/2,yy-UPY,SIZEX,SIZEY,hmDC,0,0,SRCCOPY);EndPaint(hWnd,&ps);break; case WM_SIZE: wx=LOWORD(lP);wy=HIWORD(lP);if(xx+SIZEX/2>=wx)xx=wx-SIZEX/2;if(yy+LOY>=wy)yy=wy-LOY;break; #ifdef DEBUG case WM_LBUTTONDOWN: #else case WM_TIMER: for(i=0;i<50;++i){ #endif xx+=dx;if(xx<=SIZEX/2){dx=DX;xx=SIZEX/2;}if(xx>=wx-SIZEX/2){dx=-DX;xx=wx-SIZEX/2;} yy+=dy;if(yy<=UPY){dy=DY;yy=UPY;}if(yy>=wy-LOY){dy=-DY;yy=wy-LOY;} OnPaint();hDC=GetDC(hWnd);BitBlt(hDC,xx-SIZEX/2,yy-UPY,SIZEX,SIZEY,hmDC,0,0,SRCCOPY);ReleaseDC(hWnd,hDC); #ifndef DEBUG } #endif break; default: return DefWindowProc(hWnd,uMsg,wP,lP);}return 0L;}
どうも PAINTSTRUCT やデバイスコンテキストの初期化、再取得などの手順を いまいち理解していなくて、参考にしているおソースを参考に修正してみました。 これで描画できるでしょうか?
いやだからどうしてお前はソースをどっかにまとめてうpしないんだと小一時間
>>156 このスレがソース垂れ流しも可能なオナニースレだからでしょう。
>>156 昔は NetNews という BASE64 でソース添付して PDS 公開する場があった。
今はどこのプロバイダも帯域浪費して S/N 比が悪く、不毛な議論が多くて
恩恵を受けるユーザが多いか少ないか判らない NNTP をサービスしたがらない。
俺の入ってるプロバイダもニュースサーバ立ってない。
で、ま、今の俺にとっては S/N 比の点と無秩序な所と閲覧者の数の多さの点で
2ch が NetNews の代わりかな、と。
どっかにまとめてうpしても見てくれる人が少ないんで。
このスレがソース垂れ流し可能なオナニースレだからってのも正解です。
>>158 fjやめてrec.*/alt.*に移行しろ
161 :
デフォルトの名無しさん :02/09/19 21:28
おれは
>>160 はかちゅ非対応だし、
ログにとって持ち歩く(w こともできんので、
ここに張ってほしいわ。
まあここに貼ったって見てくれる人は少ないことに 変わりないと思うが。
ごめん、スレ違だ
sage
Scheme !
最後の2行は無視してお願い
痔ってつらいね。
お、俺も…(-_-)
ばかやろこのやろうめ
VB.NET 最強!!