ウォッチ | spin on the RITZ

ウォッチ

#include "DxLib.h"
#include <math.h>

#define MAX_Y 500
#define MAX_X 500

typedef struct tag_Point {
    int x;
    int y;
} Point;

int init_window();
void proc();
void draw_back();
void draw_triangle(Point p1, Point p2, Point p3);
int check(Point p1, Point p2, Point p3);
int isLeftDown();
int isRightDown();

///////////////////////////////////////////////
// main
///////////////////////////////////////////////
int WINAPI WinMain(
    HINSTANCE hIns, HINSTANCE hPIns, LPSTR cl, int ncs
) {
    if (init_window() == -1)
        return 1;
    proc();
    DxLib_End();
    return 0;
}

///////////////////////////////////////////////
// 初期化
///////////////////////////////////////////////
int init_window()
{
    ChangeWindowMode(TRUE);
    SetGraphMode(MAX_X, MAX_Y, 32) ;
    if (DxLib_Init() == -1)
        return -1;
    SetDrawScreen(DX_SCREEN_BACK);
    return 0;
}

///////////////////////////////////////////////
// 描画・位置計算など
///////////////////////////////////////////////
void proc()
{
    Point A, B, C, tmp;
    A.x = MAX_X/2;    A.y = MAX_Y/2;
    B.x = MAX_X/4;    B.y = MAX_Y/4;
    C.x = MAX_X/4*3;    C.y = MAX_Y/4;

    while (ProcessMessage() != -1) {
        ClsDrawScreen();
        draw_back();
        draw_triangle(A, B, C);
        if (isLeftDown()) {
            GetMousePoint(&tmp.x, &tmp.y);
            B.x = tmp.x;
            B.y = MAX_Y - tmp.y;
        }
        if (isRightDown()) {
            GetMousePoint(&tmp.x, &tmp.y);
            C.x = tmp.x;
            C.y = MAX_Y - tmp.y;
        }
        ScreenFlip();
    }
}

///////////////////////////////////////////////
// 背景
///////////////////////////////////////////////
void draw_back()
{
    DrawBox(0, 0, MAX_X, MAX_Y, GetColor(255,255,255), TRUE);
    DrawLine(0, MAX_Y/2, MAX_X, MAX_Y/2, GetColor(0,0,0));
    DrawLine(MAX_X/2, 0, MAX_X/2, MAX_Y, GetColor(0,0,0));
}

///////////////////////////////////////////////
// 三角形
///////////////////////////////////////////////
void draw_triangle(Point p1, Point p2, Point p3)
{
    int col;
    if (check(p1, p2, p3) == -1)
        col = GetColor(255,127,127);
    else
        col = GetColor(127,127,255);

    DrawTriangle(p1.x, MAX_Y-p1.y,
                 p2.x, MAX_Y-p2.y,
                 p3.x, MAX_Y-p3.y,
                 col, TRUE);
}

///////////////////////////////////////////////
// 半時計回りかどうか
///////////////////////////////////////////////
int check(Point p1, Point p2, Point p3)
{
    double r1, r2;
    double PI = 3.141592;
    r1 = atan2((p2.y-p1.y),(p2.x-p1.x));
    r2 = atan2((p3.y-p1.y),(p3.x-p1.x));

    if (r1 > 0 && r2 < 0) {
        if (r1-PI < r2)
            return 1;
        else
            return -1;
    } else if (r1 < 0 && r2 > 0) {
        if (r1+PI < r2)
            return 1;
        else
            return -1;
    }
    if (r1 > r2)
        return 1;
    return -1;
}

///////////////////////////////////////////////
// 左クリック処理
///////////////////////////////////////////////
int isLeftDown()
{
    static int flag = 0;

    if((GetMouseInput() & MOUSE_INPUT_LEFT) != 0)
        return 1;
    return 0;
/*
//クリックした時のみ更新
    if((GetMouseInput() & MOUSE_INPUT_LEFT) != 0) {
        if (flag == 0) {
            flag = 1;
            return 1;
        } else {
            return 0;
        }
    }
    flag = 0;
    return 0;
*/
}

///////////////////////////////////////////////
// 右クリック処理
///////////////////////////////////////////////
int isRightDown()
{
    static int flag = 0;

    if((GetMouseInput() & MOUSE_INPUT_RIGHT) != 0)
        return 1;
    return 0;
/*
//クリックした時のみ更新
    if((GetMouseInput() & MOUSE_INPUT_RIGHT) != 0) {
        if (flag == 0) {
            flag = 1;
            return 1;
        } else {
            return 0;
        }
    }
    flag = 0;
    return 0;
*/
}