電子書籍の厳選無料作品が豊富!

画面上でボールを動かすプログラムですこれの下にラケットをかきボールを打ち返して反射させたいのですがいまいちうまくいきませんどなたかご教授ください
#define ID_TIMER 100 //タイマーの識別番号を100とする
#include <windows.h>
#include<stdlib.h>
#include <string.h>
#include <tchar.h>
#define ELLIPSE_SIZE 40 //ボールのサイズを40画素とする
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);/*関数のプロトタイプを宣言をしよう*/
TCHAR ClassName[]=_T("Yellow Ball Animation");//ウィンドクラス
TCHAR Caption[64]=_T("黄色のボールアニメーション");
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow) //windowsのメインエントリ
{
WNDCLASSEX wcex;//ウインドウクラスの構造体
HWND hWnd;//ウインドウハンドル
MSG msg;//メッセージ構造体

//ウィンドウクラス構造体を設定します。
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style=CS_HREDRAW | CS_VREDRAW;//
wcex.lpfnWndProc=(WNDPROC)WndProc;//ウィンドウプロージャの関数名
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.hIcon=LoadIcon(NULL, IDI_APPLICATION);
wcex.hCursor=LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+3);/*背景は黒色(+1 背景白色、+2 背景灰色)*/
wcex.lpszMenuName =NULL;
wcex.lpszClassName=_T("Ball-Anime");
wcex.hIconSm =LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wcex);//ウィンドクラスの登録
//ウインドウの作成
hWnd = CreateWindow(wcex.lpszClassName,//ウインドウクラス名
_T("ボールのアニメーション"),/*ウィンドウに表示されるタイトル
文字*/
WS_OVERLAPPEDWINDOW,//ウィンドウのスタイル
CW_USEDEFAULT,//水平位置
CW_USEDEFAULT,//垂直位置
400,//ウィンドウの幅
600,//ウィンドウ高さ
NULL,//親ウインドウ無し
NULL,//ウインドウメニュー無し
hInstance,//インスタンスハンドル
NULL);//WM_CREATE情報

//ウインドウの表示
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
//メッセージループ
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;//戻り値を返します。
}
LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
HBRUSH hBrush;
static POINT pt;//構造体POINNT(x,y)を使う
static BOOL xplus, yplus;
static int id, speed=3;

switch(msg){
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
SetTimer (hWnd, ID_TIMER,10,NULL);/*Timerを10ミリ毎秒に設定する*/

return 0;
case WM_TIMER:
if(xplus) pt.x+=speed;
else pt.x-=speed;
if(yplus)pt.y+=speed;
else pt.y-=speed;
GetClientRect(hWnd,&rect);/*クライアントのウィンドウサイズをシステムから得る*/
if(pt.x+ELLIPSE_SIZE > rect.right) xplus=FALSE;
else if(pt.x < 0) xplus=TRUE;
if(pt.y+ELLIPSE_SIZE >rect.bottom)yplus=FALSE;
else if(pt.y < 0)yplus=TRUE;
InvalidateRect(hWnd,NULL,TRUE);
return 0;
case WM_CLOSE:
id=MessageBox(hWnd,_T("終了しても良いですか"),
_T("終了確認"), MB_YESNO);
if(id ==IDYES)
DestroyWindow(hWnd);
break;//retrun 0でもOK
case WM_KEYDOWN:
if(wParam==VK_UP){
speed++;
if(speed>15)
speed=15;
}
if(wParam==VK_DOWN){
speed--;
if(speed<1)
speed =1;
}
wsprintf(Caption, _T("ボールの速度= %d"),
speed);
SetWindowText(hWnd,Caption);
break;//retrun 0でもOK
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
hBrush=CreateSolidBrush(RGB(255,255,0));/*黄色のブラシを作成する*/
SelectObject(hdc,hBrush);/*作成した黄色ブラシを使用する*/
Ellipse(hdc,pt.x,pt.y,
pt.x+ELLIPSE_SIZE, pt.y+ELLIPSE_SIZE);
DeleteObject(hBrush);
EndPaint(hWnd,&ps);
return 0;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}

A 回答 (1件)

なにが/どううまくいかんのか説明する気はないのかしら?

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!