「Top」を含む日記 RSS

はてなキーワード: Topとは

2019-01-03

anond:20190103193157

結構面倒

過去ブロックを覚えておく領域

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, &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;
	}

anond:20190103184241

// 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(&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(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&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, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 100 };
				InvalidateRect(hWnd, &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, &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, &Rect, hBrush);


		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left += width;
		Rect.right += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &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, &Rect, hBrush);


		Rect.top    += width; 
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left   += width;
		Rect.right  += width;
		ret = FillRect(hdc, &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, &Rect, hBrush);


		//Rect.left   += width;
		//Rect.right  += width;
		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &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 &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, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &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;
}

anond:20190103170543

テトリス

落ちてくるブロックの描き方

わかりやす関数化してみた

まずはブロックの種類は3種類

 

WriteBoxLとWriteBoxIとWriteBoxZ

の違いをよく見比べて

自力で違いがわかれば

プログラマーにはなれるとおもう

とはいえ、コレを自力でわかるならもっと儲かる仕事あるとはおもうけどな

 

	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(&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(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&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, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 8 };
				InvalidateRect(hWnd, &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, &Rect, hBrush);


		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left += width;
		Rect.right += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &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, &Rect, hBrush);


		Rect.top    += width; 
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left   += width;
		Rect.right  += width;
		ret = FillRect(hdc, &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, &Rect, hBrush);


		//Rect.left   += width;
		//Rect.right  += width;
		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL OnPaint(PAINTSTRUCT &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, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &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;
}

anond:20190103155208

これで、ブロックを4つ書くからテトリス

	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, &Rect, hBrush);


		//Rect.left   += width;
		//Rect.right  += width;
		Rect.top    += width; 
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		if (x > 8) {
			x = 0;
		}
		if (x <0) {
			x = 8;
		}
		if (y > 8) {
			y = 0;
		}

		this->WriteBox();

		return TRUE;
	}


anond:20190101175055

テトリス風?プログラムに向けて

第何回だろうな

キー入力を追加した

まだ、何を押してもブロックが右に移動するだけ(右端にいくと左にワープ

タイマー自動落下

 

でもまぁ ここまでサンプルがあるとほぼテトリスは見えてきた

// 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(&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(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&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, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 8 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	BOOL OnPaint(PAINTSTRUCT &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, &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, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &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;
}

2019-01-01

anond:20190101174449

描画部分の違い

変数 y をつかって

高さが8までで移動するように

yが変わると■のいちも変わるから

タイマーで呼び出されるたbに

下へ 下へと作画される

から まぁ アニメーションに見える

8のところを16に変えれば もっと長いアニメーションになる

次はタイマー部分を説明

	BOOL OnPaint(PAINTSTRUCT &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, &Rect, hBrush);
		DeleteObject(hBrush);

		return TRUE;
	}

anond:20190101172100

タイマーを使ったアニメーションを付けた

// 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(&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(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&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, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48,48 * 8 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	BOOL OnPaint(PAINTSTRUCT &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, &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, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &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;
}

2018-12-26

[] Masuda Advent calendar 2018

日付担当者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(月)増田次元号の増田アドベントカレンダーで、また会いましょう

2018-12-16

世界文学ベスト100」の英米バージョンを調べてみた

文学ベスト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 ジョセフ・ヘラ
ドン・キホーテセルバンテス
失われた時を求めてプルースト
フィネガンズ・ウェイクジョイス
見えない人間ラルフエリソン
ジェイン・エアシャーロット・ブロンテ
白鯨メルヴィル
アメリカの息子 リチャード・ライト
ストローコンラッド
オン・ザ・ロードケルアック
百年の孤独ガルシアマルケス
カラマーゾフの兄弟ドストエフスキー
ライ麦畑でつかまえてサリンジャー
善良な軍人フォード
怒りの葡萄スタインベック
グレート・ギャツビーフィッツジェラルド
緋文字ホーソーン
響きと怒りフォークナー
ブリキの太鼓ギュンター・グラス
崩れゆく絆 チヌア・アチェ
灯台へヴァージニア・ウルフ
火山の下で マルコム・ラウリー
嵐が丘エミリー・ブロンテ


このうち22作品はすでに読んでいた。

けっこうそれっぽいタイトルが並んでいるように見えるが、日本ではほとんどなじみのない作家も中にはいる。ジョセフ・ヘラーとかフォード・マドックス・フォードとか。

フォードの「善良な軍人」が翻訳されているかはわからなかったが、これを除けばすべて翻訳で読むことができる。すばらしい。

12/19追記

ブコメの指摘からフォードの"The Good Soldier"(上では「善良な軍人」と訳した)は、「かくも悲しい話を…」という邦題翻訳されていることがわかった。ありがとう

2018-12-14

[] はてブTOPおすすめカテゴリが「アドベント

「人気」と「新着」ダブり過ぎだろ。

枠余ってるなら俺も載せろや。

2018-12-05

「とにかく女性を避けよ」の記事、前半しか訳されていない

ウォール街、「#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』ではコスト回避にならないという結論だ。

どうして前半しか訳されてないのか。

訳者日本人が前半しか賛同できなかったのか、

それとも前半だけの方が日本人ウケる判断されたのか

何にせよ、日米の意識の違いというか、フェミニズム浸透の差を感じる。

どちらにせよブコメで騒いでる人たちは結論変わらないだろうけど

2018-12-01

ホームページ作成4万ってどう?

営業力のないワイ氏に舞い込む副業仕事ってこういうのしかない

ホームページ作成、この価格ならみんなやる?

自営業者副業頑張るマンなら小躍りしちゃう

なお、ワイ氏はいつもそれとなく逃げてる(お断り)

4万の作業内容

特に問題ないところ

レスポンシブWebデザインで、なんか1つTOPに動く絵があれば、凝っている必要はない

Twitterやその他SNSTOPページに表示

WordPressでもhtmlベタ打ちのWEBサイトでもいい

ドメイン取得などの作業も代行(ドメインサーバー費用請求可能)

継続性が見込める案件(年20数件程度の受注見込みあり)

ウンザリするところ

写真画像のご用意頂けない。頂けても数枚かつ写真画像リサイズ/リデザイン(合成や色味調整)を無限要求

テキストをご用意頂けない>何度も要求すれば最終的にはくれるが・・・

SEOを期待される>最終的にはホームページ看板身分証明書であって広告と考えない方が良い。どうしてもなら別料金>有料ならじゃあいいや で、ご納得は頂けるが・・・

2018-11-29

この人が絡むとプロジェクト炎上する

そういうのってあると思うけど

弊社の場合はそれが現場TOPだったりする

その人が来るまでは炎上なんてなかったのに

その人が来たとたんに絡んでるプロジェクト全て炎上してる

あーしんど

2018-11-19

防弾少年団騒動東方神起ファンネトウヨ化している件について

BTSの一連の件に関する記事ブコメを見ていて、この点が全然言及されてないのと、当の東方神起ファン達が他人事のように「残念」等のコメントをしてることに欺瞞を感じたので書く。

結論

長くなるので先に書くと、今年の春頃から東方神起ファンが激烈なアンチ化してネトウヨに取り込まれ東方神起のみならず、BTSはじめ他のK-POPアイドルも「反日認定してはテレビ局スポンサー企業へのクレーム電凸をしているという話です。

・流れ

事の発端は「地図消し」騒動である

(http://s.wowkorea.jp/news/read/210041/)

今年の4月東方神起韓国で発表した楽曲MVの中の1シーンで、日本列島が消えた世界地図CG使用されていた。

このMV4月3日0時にYouTube上にアップロードされたが、数時間ツイッター上で日本ファンから該当のシーンが指摘されたため、午前中に動画自体が非公開となり、16時に地図の部分を修正したものが再度公開された。

出来事だけ見れば、発覚から24時間以内に「映像制作会社ミス事務所のチェック漏れ」と事務所謝罪しているのだが、それまで東方神起とその日本ファン達は「東方神起だけは他の反日韓国芸能人たちとは違う!」と他のK-POPアイドルから切断し、特別視することでそのロイヤリティを高めていたため、日本ファン達は衝撃を受けた。

折り悪く、東方神起はその少し前にTwitterInstagram公式アカウントを開設していたため、本人達からコメントが無いことにも失望する声が出始めた。

やがて「東方神起に対するモヤモヤとしたわだかまり」と日本ファンクラブの名称「ビギスト」を組み合わせ、一連の出来事に対する不満や不信感の表明として「モヤビギ」と自称するファン達が現れた(後に、ファンクラブを辞めたことを表明する「辞めビギ」も現れる)。

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にも入っていたので覚えている人もいるかもしれないが、ここで「ネトウヨ」とあしらわれていたアカウント達は大半が上記の流れでアンチ化・日本を取り戻す戦士化した元東方神起ファンだったのである

セブンイレブンブロック事件」では、皆大好きくたびれはてこ氏などはてなでもお馴染みの左巻きっぽい面々が元ファン対話を試みたが、多くのネトウヨがそうであるように、ネトウヨジャーゴンハッシュタグを繰り返すゾンビと化した元ファンが聞き入れるはずもなく、「モヤビギ同士で話していただけなのに、突然パヨク集団ネットリンチされた!」と態度を硬化させるだけだった。

上記TogetterNAVERまとめに載っている多くのアカウント現在も稼動していて、相変わらず東方神起BTSや他の韓国芸能人K-POPアイドルへのイチャモンを繰り返している。

2018-11-18

PornHubのVR動画PSVRで見る方法

はじめに

ここ1年~半年アダルトVRを取り巻く状況は大きく変わった。

具体的には、制作本数がここ半年10倍以上に増え、リリースされる全アダルト作品のうちVR作品はすでに3割を超えている。

また、PCという母艦必要としないスタンドアロン型の低価格VRゴーグルが発売されたり、PS4という母艦必要ではあるがPSVRが値下がりしたりと、ハードウェア面でも大きなモメンタムを持った流れになっている。

さて本稿では、無料アダルトVR動画の泉である「PornHub」をPSVRで楽しむ方法についてメモしておこうと思う。

ネットを探せばすぐに見つけられる程度のことしか書かないので、意欲的なVRユーザーにとっては旧聞に属することばかりになろうと思う。お許し願いたい。

流れ

1. PornHubから動画DLする

2. 画面レイアウトに応じてリネームする

3. USBメモリコピーする

4. LITTLSTARで再生する

1. PornHubから動画DLする

目的動画ページの動画の下、いいねボタンなどの並びに「VR」というタブがあるのでこれをクリックするとダウンロードボタンが下に現れる。

一番左の「VRビデオ ダウンロード」というボタンクリックするとMP4ファイルダウンロードが始まる。こんなに簡単でいいのかと思う。

ふつうデータダウンロード同様に右クリックメニューが使えるので、DL先やファイル名をここで指定してもよい。

ただしVR動画は巨大なので(20分で1GBを超えるものもある)、まずは再生時間の短いものから試すとよいだろう。

PornHubのCDNCDNといいつつスループットは悪く時間がかかるうえにちょいちょいエラーDLが止まる。停止してすぐなら止まったところから再開できることもあるが、気づかず放置するとまた最初からやり直しとなるので注意されたい(セッション寿命を短く設定しているのだろう)。

PornHubプレミアム会員への登録は、さしあたり必要ない。

ダウンロード速度 → たいして速くならない

ハイクオリティダウンロード可 → 解像度は同じ、ビットレートのみ倍。フリー版で十分

会員限定コンテンツ → たいしたことない

広告が出ない → まあ、出ないに越したことないけども

2. 画面レイアウトに応じてリネームする

後述する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) などと書いてもよいようだ。

(失礼、ここでうっかり投稿してしまった。追記する)

3. USBメモリコピーする


リネームの済んだ動画ファイルUSBメモリコピーするが、フォルダが決まっている。

メモリのルートディレクトリ(一番浅いところ)に「LITTLSTAR」というフォルダを作り、その中にコピーする。リトルスターという名前だがスペルに「E」がないので注意。

LITTLSTARフォルダの中は階層化してもかまわないが、再生ソフト LITTLSTAR の一覧表示には反映しない(サブフォルダの中身も引き出されてフラットに一覧化される)。

コピーが済んだらUSBメモリPS4USBスロットに装着しよう。

4. LITTLSTARで再生する


PlayStationStoreで「Littlstar VR Cinema」というアプリ無料)をゲットする。

https://store.playstation.com/ja-jp/product/UP8821-CUSA06120_00-JPPS400000000001

起動するとメニューの一番右に「ライブラリ」という項目がある。ここを開くとUSBメモリの内容が一覧されているはずだ。

LITTLSTARは海外アプリのせいか、決定が「×」、キャンセルが「○」で日本とは逆の操作体系となっているので慣れないうちはイラッとすると思う。

以上。

本日以降この項は更新しない。2018年11月18日現在情報である

2018-11-17

anond:20181117012937

フィジカル問題だと思ってるよ

結局、対人間って見た目とボディアクションだから。どんな小賢しいこと言ってもね

なので、フィジカルで劣りながら一代で海外でそこそこの企業を作り上げたヤツや

見た目が完全にアジア大手企業TOPに登り詰めたヤツは

化け物か?!と思っているよ

こちとら同民族間でも苦労しているのにって思ってる

二足歩行しか共通点いね

2018-10-10

anond:20181010114010

うん、だからさ、

大学進学率が低いのにさらに下げようとするからさ。

事実誤認です、加えて卒業率もTOPレベルです

ただ世界TOPレベルだろうがまだまだあげて良いと思ってるし

貧困家庭の進学(2020年の380万の上限は意味不明だが)
Fランみたいな大卒を作らない土壌(質)、
25歳以上の進学率及び地方格差を埋めるためのネット大学の充実

これらはやって良いと思うマジで

2018-10-09

萌え絵には性的ニュアンスがある ← 有って当たり前だろクソボケ

http://blog.c71.jp/?p=3064


この現象って面白いよな

・誰かがポルノでないものキズナアイ)をポルノだと騒ぎ出す

ポルノ定義についてクソくだらないキリスト教純潔主義が叫ばれる

・その議論のなかで、エロいエロくないの話も当然される

問題提起と称してエロゲの話がされる

エロゲで萌え絵が使われてエロ消費されてんだから萌え絵エロを含むと話を進める

 これにはゆらぎ荘なんかのエロ消費が多くを占める作品も含まれよう

ドヤ顔オタクエロ消費してる萌え絵エロくないとか言ってて支離滅裂揶揄

この話からスポイルされてるもの

キズナアイエロいとして、それはポルノなのか?

はじるすとゆらぎ荘とキズナアイを並べて、「みんなえろい」と宣言して、キズナアイ18禁にすべきか?

・ちがうというなら、その度合を無視して、ただただ性的だと宣言することの意図絶対にクサイ印象操作

エロ消費されてるものポルノであるなら、BLでの消費含め世の中の大抵の表現ポルノとなること

ポルノ自粛されるべきと叫ばれているか反論したのに、エロ否定するオタクダセェみたいな印象操作をしてること


ちなみに、TOPブコメ

萌え絵(がいやならオタク向け絵)は、不快に思われるリスク比較的高い表現形態コミケ袋を隠して持ち歩こうと啓蒙アニメ絵を貼った車を痛車と呼んできたオタクが急にわかんないふりすんの本当に不思議

この阿呆も、18禁コンテンツセーラームーンの違いに気が向いていない

セーラームーンオタク向け絵wでは無いとするなら、顔や体や衣装含め、どこからオタク向け絵wなのか説明するべきだが、絶対にできない(断言)

2018-10-08

増田togetter汚染されたホッテントリーw

半分埋まってるw

流石に多すぎw

うぜーw


追記

よく見たらはてぶTOP全部埋まってるやんw

↓こんな感じw

togetter

togetter

togetter

増田

増田

増田

増田

増田

広告


google並みにくそやんw

アーカイブ ヘルプ
ログイン ユーザー登録
ようこそ ゲスト さん