わからん

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
宿題がわからん

わからん

#1

投稿記事 by 宿題がわからん » 14年前

ボールを画面で動かしラケットで反射させたいのですがラケットが表示されなくて反射もうまくいきません
ボールは動くようになったのですがどなたかご教授ください

コード:

#define ID_TIMER 100 //タイマーの識別番号を100とする
#include <windows.h>
#include<stdlib.h>
#include <string.h>
#include <tchar.h>
#define ELLIPSE_SIZE 40 //	ボールのサイズを40画素とする
#define ELLIPSE_SIZE 30 //ラケットのサイズを30画素とする

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);
					hdc=BeginPaint(hWnd,&ps);
					hBrush=CreateSolidBrush(RGB(255,255,0));/*黄色のブラシを作成する*/
				    SelectObject(hdc,hBrush);/*作成した黄色ブラシを使用する*/				
					Rect(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);
}

だんごさん
記事: 273
登録日時: 14年前

Re: わからん

#2

投稿記事 by だんごさん » 14年前

ソースはcodeタグで囲んで投稿しましょう。

見にくくて原因が見つかりにくくなる可能性があります
 Dango San

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: わからん

#3

投稿記事 by softya(ソフト屋) » 14年前

codeタグを付けさせて頂きましたが、インデントが出鱈目なのですごく読みづらいです。
インデントを修正してみてください。 http://dixq.net/board/board.html

それとコンパイルが通らないので、ちゃんと動くソースコードを添付して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

宿題がわからん

Re: わからん

#4

投稿記事 by 宿題がわからん » 14年前

申し訳ありまえせん
ちゃんと動くソースを下記に記載します
ラケットの表示とラケット反射からの計算の部分がうまくいきません。知恵をかりたいです
#define ID_TIMER 100 //タイマーの識別番号を100とする
#include <windows.h>
#include<stdlib.h>
#include <string.h>
#include <tchar.h>
#define ELLIPSE_SIZE 40 // ボールのサイズを40画素とする
#define ELLIPSE_SIZE 30 //ラケットのサイズを30画素とする

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);
hdc=BeginPaint(hWnd,&ps);
hBrush=CreateSolidBrush(RGB(255,255,0));/*黄色のブラシを作成する*/
SelectObject(hdc,hBrush);/*作成した黄色ブラシを使用する*/
(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);
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: わからん

#5

投稿記事 by softya(ソフト屋) » 14年前

codeタグを使ってもう一度投稿して下さい。

それと
#define ELLIPSE_SIZE 40 // ボールのサイズを40画素とする
#define ELLIPSE_SIZE 30 //ラケットのサイズを30画素とする
は違う名前にしないと意味がありません。
ボールとラケットをちゃんと名前で分けて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

宿題がわからん

Re: わからん

#6

投稿記事 by 宿題がわからん » 14年前

コード:

#define ID_TIMER 100 //タイマーの識別番号を100とする
#include <windows.h>[code=cpp]
#include<stdlib.h>
#include <string.h>
#include <tchar.h>
#define ELLIPSE_SIZE 40 // ボールのサイズを40画素とする
#define ELLIPSE_SIZE 30 //ラケットのサイズを30画素とする

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);
hdc=BeginPaint(hWnd,&ps);
hBrush=CreateSolidBrush(RGB(255,255,0));/*黄色のブラシを作成する*/
SelectObject(hdc,hBrush);/*作成した黄色ブラシを使用する*/
(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);
}[/code]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: わからん

#7

投稿記事 by softya(ソフト屋) » 14年前

次の点をお願いします。

・先に書いた点の修正。
それと
#define ELLIPSE_SIZE 40 // ボールのサイズを40画素とする
#define ELLIPSE_SIZE 30 //ラケットのサイズを30画素とする
は違う名前にしないと意味がありません。
ボールとラケットをちゃんと名前で分けて下さい。
ちなみに、ELLIPSEはだ円という意味なのでELLIPSE_SIZEはだ円のサイズと言う意味になります。

・インデントを正しくする。意味が分からないなら ここ。 http://uchan.net/w/index.php?mixcpp%2F% ... 5%B9%A5%C8

・ボールとラケットを制御・描画している部分にコメントとラケットの座標を管理している変数を説明して下さい。

ここの掲示板の方針はお手伝いをする事なので、修正は基本的にご本人が行って頂くことになります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: わからん

#8

投稿記事 by ISLe » 14年前

コード:

        wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+3);/*背景は黒色(+1 背景白色、+2 背景灰色)*/
検索したら同じように書かれているページが見付かりましたが何でこんなデタラメがまかり通っているのでしょうね。

ウィンドウクラスの背景ブラシに指定するときは+1するという仕様で
COLOR_WINDOW(5) はウィンドウの色
COLOR_WINDOWFRAME(6) はウィンドウフレームの色
COLOR_MENUTEXT(7) はメニューテキストの色
です。
つまりCOLOR_WINDOW+3というのは(COLOR_WINDOW+2)+1なのでメニューテキストの色を使うという指定です。
『ウィンドウの色とデザイン』で変更できるので色は固定ではありません。

黒のブラシはGetStockObject(BLACK_BRUSH)です。

あとWM_PAINTでデバイスコンテキストの選択ブラシを戻さないといけないような気がしますがこの場合は戻さなくても良かったかもしれません。

閉鎖

“C言語何でも質問掲示板” へ戻る