在Windows C ++程序中绘制骰子?

时间:2012-04-09 23:43:29

标签: c++ windows winapi gdi

我们刚开始用C ++学习Windows编程。我们必须在屏幕上制作一个有4个模具的程序,当用户按下“SpaceBar”时,模具滚动或模具上的点数随机变化。我们的教授向我们提供了很多信息,所以我只是在寻找一些方向。

现在,我在屏幕上绘制了4个方块,使用Rectangle()函数。

Rectangle(hDC,30,100,130,200);
Rectangle(hDC,180,100,280,200);
Rectangle(hDC,330,100,430,200); 
Rectangle(hDC,480,100,580,200);  

我的问题是1)我将如何在这些“正方形”上绘制点,而不是在“屏幕”上绘制点。因此,如果我将模具向上移动,则点与方块一起移动,并且不会仅仅停留在屏幕上。 2.)当按下空格键时,我怎样才能使这些点随机变化(模拟它们已被滚动)? 只是寻找一些方向,谢谢。

3 个答案:

答案 0 :(得分:1)

1)
您仍然需要在屏幕上绘制它们,但是您可以构建程序以将点作为方块的一部分来实现。

void moveSquare()
{
    //change square position
    //change dots positions the same as you changed the square
}

2)
您可以使用WM_KEYDOWNWM_KEYUP消息或WM_CHAR消息捕获窗口中的按键。只需启动一个链条,在按下空格时可以改变模具上应该出现的点数(SetTimer可能很方便),让WM_PAINT做点画的工作(或调用一些东西)计算点的位置,让WM_PAINT遍历需要绘制的每个点。

void OnSpacePressed()
{
    //start changing dots every so often, handled elsewhere
    //maybe check if finished rolling before doing so
}

void calculateDotPositions()
{
    switch (numberOfDots) {...} //hint: use the square as a reference point
}

void OnPaint()
{ 
    //paint each sqaure
    //paint each dot in the correct position, which should be updated with square
}

void OnChangeDots()
{
    //change number of dots
    //also start a new change to happen later if not done rolling
}

对于绘制点,请使用Warren P的参考链接。

答案 1 :(得分:1)

另一种方法是在内存中创建位图或图片。一个用于模具的6个面中的每一个。这里的目标是将位图复制到屏幕,而不是每次都重绘它们。研究“位图”和“bitblt”。

答案 2 :(得分:0)

你应该制作一个在原点绘制骰子的例程,用给定的坐标偏移。我不熟悉你正在使用的特定库,所以我不知道hDC是什么,但它看起来应该如下所示。

void drawDie(HDC hDC, int xCoord, int yCoord, int dieValue)
{
    Rectangle(hDC, -50 + xCoord, -50 + yCoord, 50 + xCoord, 50 + yCoord);

    // draw some number of circles specified by dieValue at appropriate coordinates
    // translated by xCoord and yCoord arguments
}

如果你想让它们改变,你可以重新绘制之前的骰子。