はてなキーワード: ToPとは
当時は溢れ出る正義感と、ずっとつるむ友達はいない程度のコミュ力、そこそこの成績もあって
どんどん「まとめあげる」的な中間管理職的なことの難しさだとか、
色々言われるのにも疲れて正直「向いてないな」って思ってた。
でも学期ごとのそういったもののの選出は名前が上がり、向いてないと正直に言いつつも結局やることになるのがほとんどだった。
行事のための看板製作などは喜んで参加してたし、そうのには関わることはしたいと思ってた。
その流れで生徒会に立候補するのは、自分でもまっとうな理由だったと思っている。
だがしかし、そこには大きな壁があった。
生徒会は内申にしっかり書かれ、影響する。そのため、やりたがる人間が多かったのだ。
自分の中学校の生徒会選挙は1年任期。毎年3学期に1,2年が、投票する。
そこそこ付き合いのある同学年はともかく、何もしらない下級生、上級生から票が入ってる気がしなかった。
おそらく同学年からも入ってないとは思わないが決め手なるほどの支持を得られてなかったのだろう。その程度のコミュ力だった。
だがしかし、まだチャンスはあった。
その後に選出される議長は、ほぼ生徒会と同じ行動をし、行事に関われる。
幸い自分は何度も役職を任された経験上司会を何度も経験し、そこそこできている自覚はある。
しかもこれは
・必ず2年生から
で決められる。
他に枠はなくこれが最後のチャンス。だがしかしこれなら任されると思った。
…が、落ちた。
選ばれた子は友人だった。
だがしかし、その子は内申+αが目的で、本当にそういった仕事をしたかったのではないのは感じていた
生徒会長もよく知った中ではあったし、教師受けもよかった(実際、担当した教員から「この役職が向いてる、推薦する」とお墨付きももらっていた)。
だがしかし、自分が良くないと思ったことは曲げられないタイプで「扱いにくい」と感じられていることも自覚していた。
多分敗因はそこだろう。そう自覚しつつも非常に悲しく悔しかった。
それまで面倒を避けてたような要領の良い子が7~8割(もしかしたらそれ以上)が占め、
いままでコツコツとクラスや委員会の運営を支えて来たような子たちはほとんど落ちていった。
それからしばらく進みできる限り行事に関わるものに参加しつつ、結果受け入れて生活していた。
中学3年にもなると受験を意識し、更に「◯◯長」をしたがる人間が増えた。
郷土に関係することをテーマを分けて発表する、という内容だったのが、
他の希望者多数のテーマに組み込まれた。しかしそれでもやっぱりそのテーマをちゃんと学習したくて立候補した。
だがしかし、昨年までが何だったのかというくらい希望者多数となり、じゃんけんで負けた。
勝者は正直、同学年の支持がない子だった。
案の定、自分のやりたかったテーマは影が薄れ、忘れ去られ、それでもやることはやって着々と作業を進めていた。
そして発表時テーマの班長は決まっていながら、それとは別に発表の「監督」を複数人選出することになった。
もちろんこれは内申に影響しないし、監督になると発表する側にはなれない。
そして後半は発表に準備だけになるし、実質、監督が指揮を取ることになる。
「船頭多くして船山に登る」状態になるのには反対したが通らず、やはりそこで自分が担当することになった。
(今思えば、それまでの行動で求心力がなかった班長で進めるのを避けたかったのかとも疑っている)
発表側をやりたかった自分は不承不承、しかし決まったものは仕方ないと全力で発表に向けて走り回った。
発表側になった班長や、人員が不足したときいつのまにか発表側に回った同じ監督だった子を羨ましいと思いながら。
確か、小道具の場所を把握してないのは監督としてどうか、的なことだったかと思う(余談だが小道具係は別にいる)
些細なことだし苦笑いしてやり過ごしたが、これまでのことでパンク寸前だった自分にはだめ押しとなって
本番中誰も来ないところでうずくまってこっそり泣いた。
部長・副部長は生徒の投票を加味して「顧問が選ぶ」という方式だった。
当時の部活は「顧問VS部員」の構造があった。その結果、明らかに「顧問が付き合いやすい」
「票が入ってないわけではない」と強調していたが、密な付き合いのある部員間の話では
それが嘘でなくても1,2人いる?という票数であるのは皆察していた。
(ぶっちゃけ、得票数TOP3の子たちは顧問に不満は持ってなかったんだから
その結果、顧問が転属して居なくなると「部長・副部長VS部員」の対立構造に変わり、
部長、副部長が居づらい環境になり、不満を持つ子たちが言うことを聞かず、落ち込んでいってるのがわかった。
自分は比較的その子達と仲良かったのもあり、緩衝材として連絡する、仕切る、やきもきするという謎の構造ができていた。
正直この行動は部長たちの孤立を加速させ、良かったのかは自分でも疑問であったが、そうしないと団体行動も怪しい状況だったのだ。
結果、最初に話した議長/各種委員長でもあった2人は生徒会に入り浸り、ますます対立を深めていった。
これに関しては正直、仕方ないことだと思うし、それほど2人は追い詰められて居たと思う。
だが、生徒会室で仕事がなくても談笑した姿をみると自分が本気でやりたかったことを逃げ場にしていること、
その一方で自分がやりたくもないことばかりしている状況にがすごく虚しかった。
その気持を抱えながら部活動はやりとげた。
今でもこの一連の流れは思い出す。
まあ、その程度でなにやってるんだろう、明らかに貧乏くじじゃないか。
そして残念なことにこの正確、環境は今でも変わってない。
根本的な理由は「やりたがる」「でしゃばりたがる」正確と長年いじられ続ける容姿、
心意気をうまく伝えられないコミュ力、プレゼン力であり自業自得だ、と自覚している。
本気で「義」を理由に口を出ししても、「自己のため」と誤解されることも多々ある。
そこを変えないと…と思いつつも、「誰かがやらないといけないこと」をやり続けても「やりたいこと」がやれない思い出を愚痴らせてほしい
結構面倒
int blocks[100][100];
BOOL WriteBoxOLDBox() { int width = 24; HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 48)); for (int y = 0; y < 30; y++) { for (int x = 0; x < 8; x++) { if (blocks[y][x] == 0) { continue; } RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) - 1; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) - 1; ret = FillRect(hdc, &amp;Rect, hBrush); } } DeleteObject(hBrush); return FALSE; }
この辺は めんどくさくはあるけど みてわかってほしい
描画したWriteBoxとおなじ BOXが落ちた場所(BOXの有無)を保存しておく
ここがわかりにくいといえば わかりにくい
BOOL SaveBoxI() { blocks[y ][x] = 1; blocks[y+1][x] = 1; blocks[y+2][x] = 1; blocks[y+3][x] = 1; return TRUE; }
// WindowsProject7.cpp: アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include "WindowsProject7.h" #define MAX_LOADSTRING 100 // グローバル変数: HINSTANCE hInst; // 現在のインターフェイス WCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト WCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名 // このコード モジュールに含まれる関数の宣言を転送します: //ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); #include <list> class MyWindow; std::list< MyWindow *> windows; class MyWindow { public: HWND hWnd; MyWindow() :hWnd(NULL) { windows.push_back(this); } virtual ~MyWindow() { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { if (*it == this) { windows.erase(it); break; } } } static MyWindow * find(HWND key) { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { MyWindow *target = *it; if (target->hWnd == key) { return target; } } return NULL; } // // 関数: MyRegisterClass() // // 目的: ウィンドウ クラスを登録します。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7)); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&amp;wcex); } // // 関数: InitInstance(HINSTANCE, int) // // 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。 // // コメント: // // この関数で、グローバル変数でインスタンス ハンドルを保存し、 // メイン プログラム ウィンドウを作成および表示します。 // int blocks[100][100]; BOOL InitInstance() { hInst = hInstance; // グローバル変数にインスタンス処理を格納します。 ATOM c = MyRegisterClass(hInstance); x = 0; y = 0; boxType = 0; hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); for(int x = 0 ; x < 100 ; x++) { for (int y = 0; y < 100; y++) { blocks[y][x] = 0; } } if (!hWnd) { return FALSE; } return TRUE; } BOOL ShowWindow() { BOOL ret; ret = ::ShowWindow(hWnd, SW_SHOW); ::UpdateWindow(hWnd); return ret; } HINSTANCE hInstance; MSG msg; BOOL run; int x; int y; BOOL Main() { HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7)); run = true; int rc; // メイン メッセージ ループ: while (run) { DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL, 100 , QS_PAINT| QS_ALLEVENTS,0); if (obj <= WAIT_OBJECT_0) { while (PeekMessage(&amp;msg, NULL, 0, 0, PM_REMOVE)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;msg); } if (msg.message == WM_QUIT) { run = FALSE; } if (msg.message == WM_CLOSE) { run = FALSE; } } } else if (obj == WAIT_TIMEOUT) { y++; PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); this->OnPaint(ps); EndPaint(hWnd, &amp;ps); ::UpdateWindow(hWnd); RECT Rect2 = { 0,0,48*9,48 * 100 }; InvalidateRect(hWnd, &amp;Rect2, TRUE); } else if (obj == WAIT_FAILED) { rc = GetLastError(); } else { } } return TRUE; } int boxType; BOOL WriteBoxOLDBox() { int width = 24; HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 48)); for (int y = 0; y < 30; y++) { for (int x = 0; x < 8; x++) { if (blocks[y][x] == 0) { continue; } RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) - 1; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) - 1; ret = FillRect(hdc, &amp;Rect, hBrush); } } DeleteObject(hBrush); return FALSE; } BOOL WriteBox() { WriteBoxOLDBox(); switch (boxType) { case 0: return WriteBoxI(); case 1: return WriteBoxL(); case 2: return WriteBoxZ(); } return TRUE; } BOOL WriteBoxZ() { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); int width = 24; RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) - 1; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) - 1; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL WriteBoxL() { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 246 , 48)); int width = 24; RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) -1 ; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) -1; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL WriteBoxI() { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB( 246 , 48 , 48)); int width = 24; RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) - 1; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) - 1; ret = FillRect(hdc, &amp;Rect, hBrush); //Rect.left += width; //Rect.right += width; Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL SaveBoxI() { blocks[y ][x] = 1; blocks[y+1][x] = 1; blocks[y+2][x] = 1; blocks[y+3][x] = 1; return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;ps) { if (x > 8) { x = 0; } if (x <0) { x = 8; } if (y > 20) { switch (boxType) { case 0: SaveBoxI(); break; case 1: break; case 2: break; } y = 0; boxType++; if (boxType > 2) { boxType = 0; } } this->WriteBox(); return TRUE; } BOOL OnKey(WPARAM wParam) { if (wParam == VK_LEFT) { x++; } if (wParam == VK_RIGHT) { x--; } return TRUE; } }; int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: ここにコードを挿入してください。 // グローバル文字列を初期化しています。 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING); //MyRegisterClass(hInstance); MyWindow win; win.hInstance = hInstance; // アプリケーションの初期化を実行します: if (!win.InitInstance()) { return FALSE; } BOOL ret; win.ShowWindow(); ret = win.Main(); if (ret) { return 0; }else { return (int)win.msg.wParam; } } // // 関数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: メイン ウィンドウのメッセージを処理します。 // // WM_COMMAND - アプリケーション メニューの処理 // WM_PAINT - メイン ウィンドウの描画 // WM_DESTROY - 中止メッセージを表示して戻る // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // 選択されたメニューの解析: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_KEYDOWN: { MyWindow *target = MyWindow::find(hWnd); target->OnKey(wParam); } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // バージョン情報ボックスのメッセージ ハンドラーです。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
テトリス風
落ちてくるブロックの描き方
まずはブロックの種類は3種類
の違いをよく見比べて
自力で違いがわかれば
プログラマーにはなれるとおもう
とはいえ、コレを自力でわかるならもっと儲かる仕事あるとはおもうけどな
BOOL WriteBox() { switch (boxType) { case 0: return WriteBoxI(); case 1: return WriteBoxL(); case 2: return WriteBoxZ(); } }
// WindowsProject7.cpp: アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include "WindowsProject7.h" #define MAX_LOADSTRING 100 // グローバル変数: HINSTANCE hInst; // 現在のインターフェイス WCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト WCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名 // このコード モジュールに含まれる関数の宣言を転送します: //ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); #include <list> class MyWindow; std::list< MyWindow *> windows; class MyWindow { public: HWND hWnd; MyWindow() :hWnd(NULL) { windows.push_back(this); } virtual ~MyWindow() { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { if (*it == this) { windows.erase(it); break; } } } static MyWindow * find(HWND key) { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { MyWindow *target = *it; if (target->hWnd == key) { return target; } } return NULL; } // // 関数: MyRegisterClass() // // 目的: ウィンドウ クラスを登録します。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7)); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&amp;wcex); } // // 関数: InitInstance(HINSTANCE, int) // // 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。 // // コメント: // // この関数で、グローバル変数でインスタンス ハンドルを保存し、 // メイン プログラム ウィンドウを作成および表示します。 // BOOL InitInstance() { hInst = hInstance; // グローバル変数にインスタンス処理を格納します。 ATOM c = MyRegisterClass(hInstance); x = 0; y = 0; boxType = 0; hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); if (!hWnd) { return FALSE; } return TRUE; } BOOL ShowWindow() { BOOL ret; ret = ::ShowWindow(hWnd, SW_SHOW); ::UpdateWindow(hWnd); return ret; } HINSTANCE hInstance; MSG msg; BOOL run; int x; int y; BOOL Main() { HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7)); run = true; int rc; // メイン メッセージ ループ: while (run) { DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL, 100 , QS_PAINT| QS_ALLEVENTS,0); if (obj <= WAIT_OBJECT_0) { while (PeekMessage(&amp;msg, NULL, 0, 0, PM_REMOVE)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;msg); } if (msg.message == WM_QUIT) { run = FALSE; } if (msg.message == WM_CLOSE) { run = FALSE; } } } else if (obj == WAIT_TIMEOUT) { y++; PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); this->OnPaint(ps); EndPaint(hWnd, &amp;ps); ::UpdateWindow(hWnd); RECT Rect2 = { 0,0,48*9,48 * 8 }; InvalidateRect(hWnd, &amp;Rect2, TRUE); } else if (obj == WAIT_FAILED) { rc = GetLastError(); } else { } } return TRUE; } int boxType; BOOL WriteBox() { switch (boxType) { case 0: return WriteBoxI(); case 1: return WriteBoxL(); case 2: return WriteBoxZ(); } } BOOL WriteBoxZ() { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); int width = 24; RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) - 1; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) - 1; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL WriteBoxL() { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); int width = 24; RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) -1 ; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) -1; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL WriteBoxI() { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); int width = 24; RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) - 1; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) - 1; ret = FillRect(hdc, &amp;Rect, hBrush); //Rect.left += width; //Rect.right += width; Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;ps) { if (x > 8) { x = 0; } if (x <0) { x = 8; } if (y > 8) { y = 0; boxType++; if (boxType > 2) { boxType = 0; } } this->WriteBox(); return TRUE; } BOOL OnKey() { x++; return TRUE; } }; int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: ここにコードを挿入してください。 // グローバル文字列を初期化しています。 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING); //MyRegisterClass(hInstance); MyWindow win; win.hInstance = hInstance; // アプリケーションの初期化を実行します: if (!win.InitInstance()) { return FALSE; } BOOL ret; win.ShowWindow(); ret = win.Main(); if (ret) { return 0; }else { return (int)win.msg.wParam; } } // // 関数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: メイン ウィンドウのメッセージを処理します。 // // WM_COMMAND - アプリケーション メニューの処理 // WM_PAINT - メイン ウィンドウの描画 // WM_DESTROY - 中止メッセージを表示して戻る // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // 選択されたメニューの解析: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_KEYDOWN: { MyWindow *target = MyWindow::find(hWnd); target->OnKey(); } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // バージョン情報ボックスのメッセージ ハンドラーです。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
BOOL WriteBox() { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); int width = 24; RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) -1 ; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) -1; ret = FillRect(hdc, &amp;Rect, hBrush); //Rect.left += width; //Rect.right += width; Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;ps) { if (x > 8) { x = 0; } if (x <0) { x = 8; } if (y > 8) { y = 0; } this->WriteBox(); return TRUE; }
第何回だろうな
まだ、何を押してもブロックが右に移動するだけ(右端にいくと左にワープ)
// WindowsProject7.cpp: アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include "WindowsProject7.h" #define MAX_LOADSTRING 100 // グローバル変数: HINSTANCE hInst; // 現在のインターフェイス WCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト WCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名 // このコード モジュールに含まれる関数の宣言を転送します: //ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); #include <list> class MyWindow; std::list< MyWindow *> windows; class MyWindow { public: HWND hWnd; MyWindow() :hWnd(NULL) { windows.push_back(this); } virtual ~MyWindow() { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { if (*it == this) { windows.erase(it); break; } } } static MyWindow * find(HWND key) { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { MyWindow *target = *it; if (target->hWnd == key) { return target; } } return NULL; } // // 関数: MyRegisterClass() // // 目的: ウィンドウ クラスを登録します。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7)); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&amp;wcex); } // // 関数: InitInstance(HINSTANCE, int) // // 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。 // // コメント: // // この関数で、グローバル変数でインスタンス ハンドルを保存し、 // メイン プログラム ウィンドウを作成および表示します。 // BOOL InitInstance() { hInst = hInstance; // グローバル変数にインスタンス処理を格納します。 ATOM c = MyRegisterClass(hInstance); x = 0; y = 0; hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); if (!hWnd) { return FALSE; } return TRUE; } BOOL ShowWindow() { BOOL ret; ret = ::ShowWindow(hWnd, SW_SHOW); ::UpdateWindow(hWnd); return ret; } HINSTANCE hInstance; MSG msg; BOOL run; int x; int y; BOOL Main() { HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7)); run = true; int rc; // メイン メッセージ ループ: while (run) { DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL, 100 , QS_PAINT| QS_ALLEVENTS,0); if (obj <= WAIT_OBJECT_0) { while (PeekMessage(&amp;msg, NULL, 0, 0, PM_REMOVE)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;msg); } if (msg.message == WM_QUIT) { run = FALSE; } if (msg.message == WM_CLOSE) { run = FALSE; } } } else if (obj == WAIT_TIMEOUT) { y++; PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); this->OnPaint(ps); EndPaint(hWnd, &amp;ps); ::UpdateWindow(hWnd); RECT Rect2 = { 0,0,48*9,48 * 8 }; InvalidateRect(hWnd, &amp;Rect2, TRUE); } else if (obj == WAIT_FAILED) { rc = GetLastError(); } else { } } return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;ps) { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); RECT Rect = { 0,0,48,48 }; Rect.left = 48 * x; Rect.right = 48 * (x+1); Rect.top = 48 * y; Rect.bottom = 48 * (y+1); if (x > 8) { x = 0; } if (x <0) { x = 8; } if (y > 8) { y = 0; } BOOL ret = FillRect(ps.hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL OnKey() { x++; return TRUE; } }; int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: ここにコードを挿入してください。 // グローバル文字列を初期化しています。 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING); //MyRegisterClass(hInstance); MyWindow win; win.hInstance = hInstance; // アプリケーションの初期化を実行します: if (!win.InitInstance()) { return FALSE; } BOOL ret; win.ShowWindow(); ret = win.Main(); if (ret) { return 0; }else { return (int)win.msg.wParam; } } // // 関数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: メイン ウィンドウのメッセージを処理します。 // // WM_COMMAND - アプリケーション メニューの処理 // WM_PAINT - メイン ウィンドウの描画 // WM_DESTROY - 中止メッセージを表示して戻る // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // 選択されたメニューの解析: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_KEYDOWN: { MyWindow *target = MyWindow::find(hWnd); target->OnKey(); } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // バージョン情報ボックスのメッセージ ハンドラーです。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
描画部分の違い
変数 y をつかって
高さが8までで移動するように
yが変わると■のいちも変わるから
タイマーで呼び出されるたbに
下へ 下へと作画される
BOOL OnPaint(PAINTSTRUCT &amp;ps) { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); RECT Rect = { 0,0,48,48 }; Rect.top = 48 * y; Rect.bottom = 48 * (y+1); if (y > 8) { y = 0; } BOOL ret = FillRect(ps.hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; }
// WindowsProject7.cpp: アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include "WindowsProject7.h" #define MAX_LOADSTRING 100 // グローバル変数: HINSTANCE hInst; // 現在のインターフェイス WCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト WCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名 // このコード モジュールに含まれる関数の宣言を転送します: //ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); #include <list> class MyWindow; std::list< MyWindow *> windows; class MyWindow { public: HWND hWnd; MyWindow() :hWnd(NULL) { windows.push_back(this); } virtual ~MyWindow() { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { if (*it == this) { windows.erase(it); break; } } } static MyWindow * find(HWND key) { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { MyWindow *target = *it; if (target->hWnd == key) { return target; } } return NULL; } // // 関数: MyRegisterClass() // // 目的: ウィンドウ クラスを登録します。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7)); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&amp;wcex); } // // 関数: InitInstance(HINSTANCE, int) // // 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。 // // コメント: // // この関数で、グローバル変数でインスタンス ハンドルを保存し、 // メイン プログラム ウィンドウを作成および表示します。 // BOOL InitInstance() { hInst = hInstance; // グローバル変数にインスタンス処理を格納します。 ATOM c = MyRegisterClass(hInstance); y = 0; hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); if (!hWnd) { return FALSE; } return TRUE; } BOOL ShowWindow() { BOOL ret; ret = ::ShowWindow(hWnd, SW_SHOW); ::UpdateWindow(hWnd); return ret; } HINSTANCE hInstance; MSG msg; BOOL run; int y; BOOL Main() { HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7)); run = true; int rc; // メイン メッセージ ループ: while (run) { DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL, 100 , QS_PAINT| QS_ALLEVENTS,0); if (obj <= WAIT_OBJECT_0) { while (PeekMessage(&amp;msg, NULL, 0, 0, PM_REMOVE)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;msg); } if (msg.message == WM_QUIT) { run = FALSE; } if (msg.message == WM_CLOSE) { run = FALSE; } } } else if (obj == WAIT_TIMEOUT) { y++; PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); this->OnPaint(ps); EndPaint(hWnd, &amp;ps); ::UpdateWindow(hWnd); RECT Rect2 = { 0,0,48,48 * 8 }; InvalidateRect(hWnd, &amp;Rect2, TRUE); } else if (obj == WAIT_FAILED) { rc = GetLastError(); } else { } } return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;ps) { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); RECT Rect = { 0,0,48,48 }; Rect.top = 48 * y; Rect.bottom = 48 * (y+1); if (y > 8) { y = 0; } BOOL ret = FillRect(ps.hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } }; int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: ここにコードを挿入してください。 // グローバル文字列を初期化しています。 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING); //MyRegisterClass(hInstance); MyWindow win; win.hInstance = hInstance; // アプリケーションの初期化を実行します: if (!win.InitInstance()) { return FALSE; } BOOL ret; win.ShowWindow(); ret = win.Main(); if (ret) { return 0; }else { return (int)win.msg.wParam; } } // // 関数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: メイン ウィンドウのメッセージを処理します。 // // WM_COMMAND - アプリケーション メニューの処理 // WM_PAINT - メイン ウィンドウの描画 // WM_DESTROY - 中止メッセージを表示して戻る // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // 選択されたメニューの解析: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // バージョン情報ボックスのメッセージ ハンドラーです。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
日付 | 担当者 | URL |
---|---|---|
11/30(金) | 増田 | 明日から!!! |
12/01(土) | 増田 | そうだ 京都、行こう。 |
12/02(日) | 増田 | リフターツインpaのない家庭は悲惨だ。恐ろしい恐ろしい。 |
12/03(月) | 増田 | 京都はオーバーツーリズム? |
12/04(火) | 増田 | ルンバを使うのって手抜きじゃない? |
12/05(水) | 増田 | 「クックドゥ」って表記、変じゃない? |
12/06(木) | 増田 | 京都の歩道が狭い |
12/07(金) | 増田 | これもシュリンクフレーション? |
12/08(土) | 増田 | はてな、SEO弱くなった気がするんだけど。 |
12/09(日) | 増田 | プエルト・リコのような |
12/10(月) | 増田 | パナソニックのジェットタオル |
12/11(火) | 増田 | 車あずける→代車 ストーブあずける→代ストーブ? |
12/12(水) | 増田 | 「風邪でも、絶対に休めない あなたへ」 |
12/13(木) | 増田 | 午後ティーChaiがヌルい |
12/14(金) | 増田 | はてブTOPのおすすめカテゴリが「アドベント」 |
12/15(土) | 増田 | 週末は、ふるさと納税の広告ラッシュ |
12/16(日) | 増田 | サンタの味 |
12/17(月) | 増田 | 「期間限定 10g増量」 |
12/18(火) | 増田 | こんなルンバがほしい |
12/19(水) | 増田 | ♪エビバデ ワイモバーイル |
12/20(木) | 増田 | 膝で棒をへし折る |
12/21(金) | 増田 | 『けいおん!』の聖地巡礼いってきた |
12/22(土) | 増田 | ♪ベル打っても返事はなっしー だっしー |
12/23(日) | 増田 | 平成末期における外タレCM事情 |
12/24(月) | 増田 | 想像もできなかった未来 |
12/25(火) | 増田 | Adventうんたらかんたら |
12/26(水) | 増田 | Masuda Advent calendar 2018 |
12/27(木) | 増田 | 増田は餅つき終わった? |
12/28(金) | 増田 | 「プレミアム冷蔵庫」って何? |
12/29(土) | 増田 | 平成最後のカレンダー |
12/30(日) | 増田 | 風情ある京都の町並み |
12/31(月) | 増田 | 次元号の増田アドベントカレンダーで、また会いましょう |
文学ベスト100と検索すると、国内に限ってもいろいろなランキングが出てくる。英語圏では、ベスト100を選んだときどのような小説がランクインするのか、気になって調べてみた。
そうすると、日本と同様にたくさんの種類のランキングが出てくるが、これらをひとつひとつ紹介するのも退屈だ。
だから、それなりに信頼がありそうないくつかのランキングを選んで、それらにくり返し選出されている作品名をここに挙げてみたいと思う。
なにをもって信頼があるというのかは難しい問題だが、だいたい以下のような基準を満たしているランキングだけを取り上げることにした。
英語で検索しているからには、英語で書かれた小説が多くランクインするのは当然なのだが、英語圏に限らず、世界の文学を選出の対象にしていることを条件とした。なので英米文学オンリーとかなのは避けた。
2000年以降に発表された小説の割合が高すぎたり、「ハリー・ポッターシリーズ」のような、あまりにエンタメ寄りの小説を選出しているものは除外した。
「ハリー・ポッター」が文学かどうかは知らないが、それが文学ベスト100に選ばれているランキングが参考になるかというと、あまりならないんじゃないかな。
どのランキングにしても19世紀以降の西洋文学に偏りすぎなのだが、そこはもう仕方がない。
このような基準で選んだランキングは以下の4つ。検索すればソースはすぐ出てくると思う。
・ガーディアン誌による「The 100 greatest novels of all time」(いつ誌上に掲載されたのかはわからなかった)
・Goodreadsによる 「Top 100 Literary Novels of All Time」(国内でいうと読書メーターや読書ログみたいな位置づけのサイト。ユーザーが投票して選出している)
・Modern Library(アメリカの出版社)による「100 best novels」
・アメリカの文学者Daniel S. Burtによる「the Novel 100: A Ranking of the Greatest Novels of All Time」(同タイトルの書籍がある。Burtは英文学の講師をしていたらしい)
4つのランキングのうちすべてに選出された作品は、ナボコフの「ロリータ」と、ジョイスの「ユリシーズ」の2つだった。ロリータすごい。
4つのランキングのうち3つに選出されたのは、以下の28作品。
このうち22作品はすでに読んでいた。
けっこうそれっぽいタイトルが並んでいるように見えるが、日本ではほとんどなじみのない作家も中にはいる。ジョセフ・ヘラーとかフォード・マドックス・フォードとか。
フォードの「善良な軍人」が翻訳されているかはわからなかったが、これを除けばすべて翻訳で読むことができる。すばらしい。
ブコメの指摘から、フォードの"The Good Soldier"(上では「善良な軍人」と訳した)は、「かくも悲しい話を…」という邦題で翻訳されていることがわかった。ありがとう。
ウォール街、「#MeToo」時代の新ルール-とにかく女性を避けよ - Bloomberg
http://b.hatena.ne.jp/entry/s/www.bloomberg.co.jp/news/articles/2018-12-03/PJ5GIH6JTSEL01
話題のこの記事、前半の抜粋部分しか日本語訳されてないので前半しか見てない人が多いと思うけど、
後半に『アフターパーティー(飲み会での打ち合わせなど)をなくす』とか『ドアが開いたままのボスとのプライベートミーティングをする』『ミーティングに第三者を呼ぶ』などの対策が挙げられていて、
最後にContext Capital Partnersのロン・ビスカルディ最高経営責任者(CEO)の
「ゲス野郎にならなければいい話。 それほど難しいことではない」
また、『There’s a danger, too, for companies that fail to squash the isolating backlash and don’t take steps to have top managers be open about the issue and make it safe for everyone to discuss it, said Stephen Zweig, an employment attorney with FordHarrison.』とあるので、
me tooを恐れて女性を仕事から遠ざけてしまうことで、セクハラ訴訟から性差別訴訟に発展するだろうと書いてある。
単純に『Avoid Women at All Cost』ではコスト回避にならないという結論だ。
どうして前半しか訳されてないのか。
営業力のないワイ氏に舞い込む副業の仕事ってこういうのしかない
・レスポンシブWebデザインで、なんか1つTOPに動く絵があれば、凝っている必要はない
・WordPressでもhtmlベタ打ちのWEBサイトでもいい
・ドメイン取得などの作業も代行(ドメインやサーバー費用は請求可能)
・写真や画像のご用意頂けない。頂けても数枚かつ写真の画像のリサイズ/リデザイン(合成や色味調整)を無限に要求
・テキストをご用意頂けない>何度も要求すれば最終的にはくれるが・・・
・SEOを期待される>最終的にはホームページは看板や身分証明書であって広告と考えない方が良い。どうしてもなら別料金>有料ならじゃあいいや で、ご納得は頂けるが・・・
BTSの一連の件に関する記事やブコメを見ていて、この点が全然言及されてないのと、当の東方神起のファン達が他人事のように「残念」等のコメントをしてることに欺瞞を感じたので書く。
・結論
長くなるので先に書くと、今年の春頃から東方神起のファンが激烈なアンチ化してネトウヨに取り込まれ、東方神起のみならず、BTSはじめ他のK-POPアイドルも「反日」認定してはテレビ局やスポンサー企業へのクレームや電凸をしているという話です。
・流れ
(http://s.wowkorea.jp/news/read/210041/)
今年の4月に東方神起が韓国で発表した楽曲のMVの中の1シーンで、日本列島が消えた世界地図のCGが使用されていた。
このMVは4月3日0時にYouTube上にアップロードされたが、数時間でツイッター上で日本のファンから該当のシーンが指摘されたため、午前中に動画自体が非公開となり、16時に地図の部分を修正したものが再度公開された。
出来事だけ見れば、発覚から24時間以内に「映像制作会社のミス、事務所のチェック漏れ」と事務所が謝罪しているのだが、それまで東方神起とその日本のファン達は「東方神起だけは他の反日韓国芸能人たちとは違う!」と他のK-POPアイドルから切断し、特別視することでそのロイヤリティを高めていたため、日本のファン達は衝撃を受けた。
折り悪く、東方神起はその少し前にTwitter、Instagramの公式アカウントを開設していたため、本人達からのコメントが無いことにも失望する声が出始めた。
やがて「東方神起に対するモヤモヤとしたわだかまり」と日本のファンクラブの名称「ビギスト」を組み合わせ、一連の出来事に対する不満や不信感の表明として「モヤビギ」と自称するファン達が現れた(後に、ファンクラブを辞めたことを表明する「辞めビギ」も現れる)。
MVの騒動は日々韓国芸能人の「反日」行為をチェックしているネトウヨにも捕捉されていたため、これら「モヤビギ」を名乗るファン(元ファン)達の一部が、ネトウヨと合流してしまった。
東方神起のファン達は仲間内で東方神起に関連するツイートを片っ端から大量にRTしあって拡散する習性があったため、すぐに「#モヤビギ」や類似のハッシュタグに陰謀論めいた嫌韓ネタが混ざるようになった。
ネトウヨ化した元ファン達は東方神起のみならず、他の韓国芸能人やK-POPアイドルも盛んに「反日」認定を始め、「国交断絶」「日本での活動停止を要求します」とハッシュタグ荒らしを始める。
元は東方神起を見るために韓国の芸能情報もチェックしていた人達なので、その手の話題には詳しい(そして以前はそういう話題を見るたびに彼女たちは「東方神起はこういう反日行為を一切しない」と誇らしくなっていたのだ)。
また、東方神起のファンたちは、以前から彼らがCMに起用されたりテレビ番組に出演するたびに、企業に喜びや感謝の電話やメールをしたり反響の大きさで東方神起の人気ぶりを示そうと頑張っていたため、一昔前の2ちゃんの鬼女的な行動力があった。
それはアンチ活動でも発揮されることとなり、ネトウヨが呼びかけるまま関連企業へのクレームや電凸を行うようになる。
その流れの中で、現在K-POP界でも人気頂点にいる防弾少年団(BTS)の「原爆Tシャツ」などのネタも掘り起こされ、やがて「3.11に溺死を連想させるようなMVを発表」といった言いがかりまで始まり、それをまたネトウヨが拡散し、更にアンチ化したファンが拡散するというサイクルが生まれた。
※防弾少年団はデビュー当初は「ギャングスタラップ」を意識したイキったイメージで売り出しており、色々と配慮も欠けていたため、元々叩きネタが山程あった。
面倒臭くなってきたからここからは駆け足で行くけど、それから6月の日産スタジアム公演で「猿真似」騒動(https://news.nifty.com/article/entame/showbizd/12184-40791/)(https://matome.naver.jp/m/odai/2152891489182288101)や、「#セブンイレブンブロック事件」(https://togetter.com/li/1250859)が起きる。
「セブンイレブンブロック事件」のTogetterまとめは一瞬はてブTOPにも入っていたので覚えている人もいるかもしれないが、ここで「ネトウヨ」とあしらわれていたアカウント達は大半が上記の流れでアンチ化・日本を取り戻す戦士化した元東方神起ファンだったのである。
「セブンイレブンブロック事件」では、皆大好きくたびれはてこ氏などはてなでもお馴染みの左巻きっぽい面々が元ファンと対話を試みたが、多くのネトウヨがそうであるように、ネトウヨジャーゴンやハッシュタグを繰り返すゾンビと化した元ファンが聞き入れるはずもなく、「モヤビギ同士で話していただけなのに、突然パヨク集団にネットリンチされた!」と態度を硬化させるだけだった。
上記のTogetterやNAVERまとめに載っている多くのアカウントは現在も稼動していて、相変わらず東方神起やBTSや他の韓国芸能人やK-POPアイドルへのイチャモンを繰り返している。
ここ1年~半年でアダルトVRを取り巻く状況は大きく変わった。
具体的には、制作本数がここ半年で10倍以上に増え、リリースされる全アダルト作品のうちVR作品はすでに3割を超えている。
また、PCという母艦を必要としないスタンドアロン型の低価格なVRゴーグルが発売されたり、PS4という母艦が必要ではあるがPSVRが値下がりしたりと、ハードウェア面でも大きなモメンタムを持った流れになっている。
さて本稿では、無料アダルトVR動画の泉である「PornHub」をPSVRで楽しむ方法についてメモしておこうと思う。
ネットを探せばすぐに見つけられる程度のことしか書かないので、意欲的なVRユーザーにとっては旧聞に属することばかりになろうと思う。お許し願いたい。
4. LITTLSTARで再生する
目的の動画ページの動画の下、いいねボタンなどの並びに「VR」というタブがあるのでこれをクリックするとダウンロードボタンが下に現れる。
一番左の「VRビデオ ダウンロード」というボタンをクリックするとMP4ファイルのダウンロードが始まる。こんなに簡単でいいのかと思う。
ふつうのデータダウンロード同様に右クリックメニューが使えるので、DL先やファイル名をここで指定してもよい。
ただしVR動画は巨大なので(20分で1GBを超えるものもある)、まずは再生時間の短いものから試すとよいだろう。
PornHubのCDNはCDNといいつつスループットは悪く時間がかかるうえにちょいちょいエラーでDLが止まる。停止してすぐなら止まったところから再開できることもあるが、気づかず放置するとまた最初からやり直しとなるので注意されたい(セッション寿命を短く設定しているのだろう)。
PornHubプレミアム会員への登録は、さしあたり必要ない。
ダウンロード速度 → たいして速くならない
ハイクオリティ版ダウンロード可 → 解像度は同じ、ビットレートのみ倍。フリー版で十分
後述するPS4アプリ「LITTLSTAR」はファイル名でVR動画のタイプを判別するので、DLしてきた動画を実際にPCで再生してみて、タイプに応じたファイル名をつけてやる。
VR動画の画面レイアウトは右眼用・左眼用ふたつの映像を「上下に並べるタイプ」と「左右に並べるタイプ」の2種類あり、PornHub上の動画も2つが混在している。
上下に並べるタイプを「オーバーアンダー」と呼び、左右に並べるタイプを「サイドバイサイド」と呼ぶ。
さらに、録画範囲も、「全天球360度」をカバーしたものと、「上下左右180度(前半球)だけ」を写したものがあり、これも作品によってまちまちである。
つまりVR動画には「360度オーバーアンダー」「360度サイドバイサイド」「180度オーバーアンダー」「180度サイドバイサイド」の4種類があることになる。
もっとも、この中で「180度オーバーアンダー」は使われているのを見たことがない。
Googleの提唱するVR180というVR動画規格が180サイドバイサイドなので、今後はこれが主流になっていくだろう。
オーバーアンダー/サイドバイサイドは一目見ればわかるが、360度か180度かはよく見ないとわからない。わかりやすい判別ポイントは「壁」。室内で録画されている作品の場合(大半がそうだが)、壁が3面しか映っていなければ180度、4面の壁が映っていれば360度動画である。また、360度動画は画面の右端と左端がループしているのでこれも判別ポイントになるだろう。
ファイル名の末尾を以下のようにする。
タイプ | ファイル名 |
---|---|
360度オーバーアンダー | _ou.mp4 |
180度オーバーアンダー | _180_ou.mp4 |
360度サイドバイサイド | _sbs.mp4 |
180度サイドバイサイド | _180_sbs.mp4 |
たとえば「180度サイドバイサイド」の「ハラビロカマキリの産卵.mp4」は「ハラビロカマキリの産卵_180_sbs.mp4」となる。
「_180」がない限り360度と解釈されるので、自分がわかりやすいように「_360_ou」などと書くことは問題ない(判別には影響しない)。
また、_ou (over under) の代わりに _tb (top bottom)、_bt (bottom top)、_sbs (side by side) の代わりに _lr (left right)、_rl (right left) などと書いてもよいようだ。
リネームの済んだ動画ファイルをUSBメモリにコピーするが、フォルダが決まっている。
メモリのルートディレクトリ(一番浅いところ)に「LITTLSTAR」というフォルダを作り、その中にコピーする。リトルスターという名前だがスペルに「E」がないので注意。
LITTLSTARフォルダの中は階層化してもかまわないが、再生ソフト LITTLSTAR の一覧表示には反映しない(サブフォルダの中身も引き出されてフラットに一覧化される)。
コピーが済んだらUSBメモリをPS4のUSBスロットに装着しよう。
PlayStationStoreで「Littlstar VR Cinema」というアプリ(無料)をゲットする。
https://store.playstation.com/ja-jp/product/UP8821-CUSA06120_00-JPPS400000000001
起動するとメニューの一番右に「ライブラリ」という項目がある。ここを開くとUSBメモリの内容が一覧されているはずだ。
LITTLSTARは海外のアプリのせいか、決定が「×」、キャンセルが「○」で日本とは逆の操作体系となっているので慣れないうちはイラッとすると思う。
以上。