巨巨们帮个忙吧,一个游戏的一部分,有点问题

WZ22HAO 2014-10-28 01:10:43
就是按左右一段时间之后,板子会变成白色,上面的砖块也会变样子
还有怎么把Init()函数放到function.cpp内
求巨巨帮忙看下问题在哪,顺便求建议代码格式和规范
//-------------------------------
// brick.cpp
//
// Just a Game
//
// Date: 10.27 2014
// Author: Dreamtale
//-------------------------------
#include <windows.h>
#include "func.h"

Board board;
Brick brick[3][20];

void Init()
{
int i, j;
for(j=0; j<3; j++)
{
for(i=0; i<20-2*j; i++)
{
brick[j][i].Setxy(35 + 30*(i+j), 120-20*j);
}
}
board.Setxy(320, 475);
}


LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("BrickWin") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground= (HBRUSH) GetStockObject (GRAY_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName= szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox ( NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow( szAppName, // window class name
TEXT ("Brick"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
655, // initial x size
517, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, SW_SHOWNORMAL) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
switch (message)
{
case WM_CREATE:
Init();
return 0 ;
case WM_PAINT:
int i,j;
hdc = BeginPaint(hwnd, &ps);
board.Draw(hdc);
for(j=0; j<3; j++)
{
for(i=0; i<20-2*j; i++)
{
brick[j][i].Draw(hdc);
}
}
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_KEYDOWN:
switch(wParam)
{
case VK_LEFT:
if(board.Getx() > 50)
{
board.Setxy(board.Getx()-10, board.Gety()) ;
board.MoveDirection(-1);
}
break;
case VK_RIGHT:
if(board.Getx() < 590)
{
board.Setxy(board.Getx()+10, board.Gety()) ;
board.MoveDirection(1);
}
break;
case VK_ESCAPE:
SendMessage(hwnd, WM_CLOSE, 0, 0) ;
break;
}
InvalidateRect(hwnd,NULL,FALSE) ;
return 0;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}


//-------------------------------
// func.h
//
// class board, brick
//
// Date: 10.27 2014
// Author: Dreamtale
//-------------------------------
#include <iostream>
#include <windows.h>

using namespace std;

class Board
{
public:
void Draw(HDC hdc);
void Setxy(int X, int Y) {x=X; y=Y;}
int Getx() { return x; }
int Gety() { return y; }
void MoveDirection(int DIR) { dir = DIR; } //left:-1 right:1
int GetDir() { return dir; }
private:
int x, y, dir;
} ;

class Brick
{
public:
void Draw(HDC hdc);
void Setxy(int X, int Y) { x = X; y = Y; }
int Getx() { return x; }
int Gety() { return y; }
private:
int x, y;
} ;


//-------------------------------
// function.cpp
//
// function
//
// Date: 10.27 2014
// Author: Dreamtale
//-------------------------------
#include "func.h"

void Brick::Draw(HDC hdc)
{
HBRUSH hBrush;
hBrush = CreateSolidBrush(RGB(131, 72, 37)) ;
SelectObject(hdc, GetStockObject(BLACK_PEN)) ;
SelectObject(hdc, hBrush);
Rectangle(hdc, x-15, y-10, x+15, y+10) ;
}

void Board::Draw(HDC hdc)
{
HBRUSH hBrush;
hBrush = CreateSolidBrush(RGB(131, 72, 37)) ;
SelectObject(hdc, GetStockObject(NULL_PEN)) ;
SelectObject(hdc, hBrush);
Rectangle(hdc, x-50, y-5, x+50, y+5) ;
if(dir == -1)
{
SelectObject(hdc, GetStockObject(GRAY_BRUSH)) ;
Rectangle(hdc, x+50, y-5, x+61, y+5) ;
dir = 0;
}
if(dir == 1)
{
SelectObject(hdc, GetStockObject(GRAY_BRUSH)) ;
Rectangle(hdc, x-50, y-5, x-61, y+5) ;
dir = 0;
}
}
...全文
114 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
WZ22HAO 2014-10-30
  • 打赏
  • 举报
回复
引用 9 楼 q408384053 的回复:
CreateSolidBrush,要把创建的画刷给删了,你一直按着左键或右键,每次调用InvalidataRect,重绘界面,就会创建一个Brush,你加上DeleteObject试试。
好了,谢谢啦
窗外蓝天 2014-10-29
  • 打赏
  • 举报
回复
CreateSolidBrush,要把创建的画刷给删了,你一直按着左键或右键,每次调用InvalidataRect,重绘界面,就会创建一个Brush,你加上DeleteObject试试。
WZ22HAO 2014-10-29
  • 打赏
  • 举报
回复
引用 4 楼 xyz1991xyz 的回复:
看得出是打砖块,但是问题表达得不够清楚
问题在7楼说了,求帮助
WZ22HAO 2014-10-29
  • 打赏
  • 举报
回复
引用 5 楼 lovesmiles 的回复:
天啊,你想做什么游戏?你遇到了什么问题?
想做一个打砖块的游戏,现在做了一部分,问题:左右键控制板子移动,但是按住左右键一会之后就会出现我一楼的图那个情况
WZ22HAO 2014-10-29
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
单步执行到消息循环哪里就一直循环,然后不知道怎么办了,看代码也没啥问题啊,我没用过白色画刷,但是板子会变白
勤奋的小游侠 2014-10-29
  • 打赏
  • 举报
回复
天啊,你想做什么游戏?你遇到了什么问题?
xyz1991xyz 2014-10-29
  • 打赏
  • 举报
回复
看得出是打砖块,但是问题表达得不够清楚
Bob66666 2014-10-29
  • 打赏
  • 举报
回复
难道你是要做 俄罗斯方块 ???
赵4老师 2014-10-29
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
WZ22HAO 2014-10-29
  • 打赏
  • 举报
回复
为啥子没人帮帮我
这是运行一段时间之后的图

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧