C ++ Builder中未知的类型名称“ Shape1”

时间:2018-11-26 20:52:33

标签: c++ class c++builder tetris

我正在尝试在C ++ Builder中创建俄罗斯方块克隆。我从上两节课开始。我已将它们写在.h文件中,并将其包含在我的.cpp文件中:

class Stage
{
protected:
    int Width;
    int Height;
public:

    Stage()
    {
        Width=300;
        Height=733;
    }

    Stage(int Width0,int Height0)
    {
        Width=Width0;
        Height=Height0;
    }
};

这是我的第一堂课,舞台。我不确定该课程应该包含什么内容,因此,如果您对我应该包含的内容有任何建议,我很高兴听到他们的声音。

class Tetromino : public Stage
{
protected:
    Tshape *Shape1;
public:
    Tetromino(Tshape *Shape1)
    {
        TetrisGame->Shape1->Width=33;
        TetrisGame->Shape1->Height=33;
        TetrisGame->Shape1->Brush->Color=clBlack;
        TetrisGame->Shape1->Left=10;
        TetrisGame->Shape1->Top=200;
    }

    void mLeft()
    {
        if(TetrisGame->Shape1->Left<=Widht)
            TetrisGame->Shape1->Left=TetrisGame->Shape1->Left+33;
    }

    void mRight()
    {
        if(TetrisGame->Shape1->Left>=Width)
            TetrisGame->Shape1->Left=TetrisGame->Shape1->Left-33;
    }

    void free_fall()
    {
        TetrisGame->PieceFallTime->Enabled=true;
    }
};

那是我的第二堂课,是零碎的课。

我知道那不是应该的。例如,我必须制作一个矩阵:

piece[4][4]=
    {(0,0,0,0),
     (0,0,0,0),
     (0,1,0,0),
     (1,1,1,0)}

但是我仍然不知道如何使用它。我认为我应该在1处放置一个形状,并创建我的作品,但是我不知道该怎么做。

现在,我正在尝试找出如何使形状下降并使用键盘向右或向左移动形状。我以前做过,但是没有上课。使用类有点复杂,我不明白。

我试图初始化对象Tetromino x(Shape1)(代码在form.cpp中),该对象的形式为Shape1。我认为这应该迫使表单中的Shape1使用我在课堂上编写的方法,对吧?

但是我遇到了这个错误:

  

[bcc32c错误] StartGame.cpp(110):未知类型名称'Shape1'

1 个答案:

答案 0 :(得分:0)

您忘记在构造函数中为位图使用new,因此您正在将bmp文件加载到尚未创建的位图对象中,从而导致访问冲突。您可以对tetrominos位图使用透明度...您只需要在目标画布上激活它即可(如Form1 ..在其属性中)。但是,我会将Tetrominos直接渲染到位图中而不是使用文件...您可以将位图用作屏幕缓冲区...

下面是简单的 BDS2006 C ++ / VCL俄罗斯方块示例在几年前的一次演讲中,我与我的学生一起编码,当时他们想编写游戏并投票给俄罗斯方块...(它很丑,但可以... )

preview

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "win_main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

// window
TForm1 *Form1;
// keyboard map
enum{
    _key_left =0,
    _key_right,
    _key_rot  ,
    _key_drop ,
    _keys
    };
int keys      [_keys];  // is key pressed ?
WORD keys_code[_keys];  // scan code

// back/double buffer
Graphics::TBitmap *bmp = new Graphics::TBitmap;
//  scoore,  position of falling tetromino,next shape
int score=0,px=0,py=0,novy_dielik=0;
// actual tetromino map
BYTE pm[4][4]=
    {
    0,0,1,0,
    0,1,1,0,
    0,0,1,0,
    0,0,1,0
    };

// game board size
const int map_xs=10;
const int map_ys=20;
BYTE map[map_xs][map_ys];
// tetrominos
BYTE shp[7*16]=
    {
    0,1,0,0,
    0,1,0,0,
    0,1,0,0,
    0,1,0,0,

    0,1,0,0,
    0,1,0,0,
    0,1,1,0,
    0,0,0,0,

    0,0,1,0,
    0,0,1,0,
    0,1,1,0,
    0,0,0,0,

    0,1,0,0,
    0,1,1,0,
    0,0,1,0,
    0,0,0,0,

    0,0,1,0,
    0,1,1,0,
    0,1,0,0,
    0,0,0,0,

    0,0,0,0,
    0,0,1,0,
    0,1,1,1,
    0,0,0,0,

    0,0,0,0,
    0,1,1,0,
    0,1,1,0,
    0,0,0,0
    };
//---------------------------------------------------------------------------
// tetromino colision test
//---------------------------------------------------------------------------
int step()
    {
    int i,j,x,y;
    for (i=0;i<4;i++)
     for (j=0;j<4;j++)
      if (pm[i][j]!=0)
        {
        x=px+j;
        y=py+i;
        if (x<0)          return 1;
        if (x>=map_xs)    return 1;
        if (y<0)          return 1;
        if (y>=map_ys)    return 1;
        if (map[x][y]!=0) return 1;
        }
    return 0;
    }
//---------------------------------------------------------------------------
// render game
//---------------------------------------------------------------------------
void draw()
    {
    // clear screen
    bmp->Canvas->Brush->Color=clBlack;
    bmp->Canvas->FillRect(TRect(0,0,bmp->Width,bmp->Height));

    // [game board]
    int x,y,a,i,j,adr;
    x=bmp->Width/(map_xs+4+3);
    y=bmp->Height/(map_ys+2);
    if (x<y) a=x; else a=y;

    // border
    x=a; y=a;
    bmp->Canvas->Pen->Color=clBlue;
    bmp->Canvas->Pen->Width=a>>1;
    bmp->Canvas->Rectangle(x,y,x+(map_xs*a),y+(map_ys*a));
    bmp->Canvas->Pen->Width=1;

    // game board
    for (j=0;j<map_ys;j++)
        {
        for (i=0;i<map_xs;i++)
            {
            // set color from map
            if (map[i][j]==0) bmp->Canvas->Brush->Color=clBlack;
            else              bmp->Canvas->Brush->Color=clAqua;
            // grid cell
            bmp->Canvas->FillRect(TRect(x,y,x+a,y+a));
            x+=a;       // posun sa o policko vpravo
            }
        x-=map_xs*a;    // vrat sa vlavo
        y+=a;           // posun sa o policko dole
        }
    y-=map_ys*a;        // vrat sa hore

    // falling tetromino
    x+=px*a;
    y+=py*a;
    for (j=0;j<4;j++)
        {
        for (i=0;i<4;i++)
            {
            // cell
            if (pm[j][i]!=0)
                {
                bmp->Canvas->Brush->Color=clGreen;
                bmp->Canvas->FillRect(TRect(x,y,x+a,y+a));
                }
            x+=a;       // posun sa o policko vpravo
            }
        x-=4*a;         // vrat sa vlavo
        y+=a;           // posun sa o policko dole
        }
    y-=4*a;             // vrat sa hore
    x-=px*a;
    y-=py*a;

    x+=(map_xs+1)*a;    // posun sa na pravy stlpec

    // score:
    bmp->Canvas->Font->Color=clWhite;
    bmp->Canvas->Brush->Color=clBlack;
    bmp->Canvas->TextOutA(x,y,AnsiString().sprintf("Score: %i",score));
    y+=a+a;

    // border
    bmp->Canvas->Pen->Color=clBlue;
    bmp->Canvas->Pen->Width=a>>1;
    bmp->Canvas->Rectangle(x,y,x+(4*a),y+(4*a));
    bmp->Canvas->Pen->Width=1;

    adr=16*novy_dielik;
    for (j=0;j<4;j++)
        {
        for (i=0;i<4;i++)
            {
            // set color from map
            if (shp[adr]==0) bmp->Canvas->Brush->Color=clBlack;
            else             bmp->Canvas->Brush->Color=clAqua;
            // nakresli stvorcek
            bmp->Canvas->FillRect(TRect(x,y,x+a,y+a));
            x+=a;       // go right
            adr++;
            }
        x-=4*a;         // return left
        y+=a;           // go down
        }
    y-=4*a;             // return up

    Form1->Canvas->Draw(0,0,bmp);
    }
//--- konstruktor okna ------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
    {
    keys_code[_key_left ]='O';
    keys_code[_key_right]='P';
    keys_code[_key_rot  ]='Q';
    keys_code[_key_drop ]='A';

    // new game
    novy_dielik=rand()%7;       // new tetromino
    px=(map_xs>>1)-2;           // position top/middle
    py=0;
    int adr=16*novy_dielik;
    for (int j=0;j<4;j++)       // copy it to pm
     for (int i=0;i<4;i++)
        {
        pm[j][i]=shp[adr];
        adr++;
        }
    for (int j=0;j<map_ys;j++)  // clear map
     for (int i=0;i<map_xs;i++)
      map[i][j]=0;
    novy_dielik=rand()%7;
    }
//--- resize event ----------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
    {
    bmp->Width=ClientWidth;
    bmp->Height=ClientHeight;
    draw(); // force redraw
    }
//--- redraw event ----------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
    {
    draw();
    }
//--- falling timer ---------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    py++;
    if (step()) // tetromino hit the ground?
        {
        py--;
        int i,j,x,y,adr,e;      // copy it to map
        for (j=0;j<4;j++)
         for (i=0;i<4;i++)
          if (pm[j][i])
            {
            x=px+i;
            y=py+j;
            map[x][y]=1;
            }
        px=(map_xs>>1)-2;       // new tetromino top/middle position
        py=0;
        adr=16*novy_dielik;
        for (j=0;j<4;j++)       // copy it to pm
         for (i=0;i<4;i++)
            {
            pm[j][i]=shp[adr];
            adr++;
            }

         // map full line test
        int dscore=0;
        for (j=map_ys-1;j>=0;j--)
            {
            e=1;
            for (i=0;i<map_xs;i++)
             if (map[i][j]==0)
                {
                e=0;
                break;
                }
            if (e)
                {
                dscore<<=1;
                dscore+=100;
                e=j;
                for (j=e-1;j>=0;j--)
                 for (i=0;i<map_xs;i++)
                  map[i][j+1]=map[i][j];
                j=e+1;
                draw();
                Sleep(200);
                }
            }
        score+=dscore;

        if (step()) // end game? (no new tetromino)
            {
            int q;
            q=bmp->Canvas->Font->Height;
            bmp->Canvas->Font->Height=40;
            bmp->Canvas->Font->Color=clRed;
            bmp->Canvas->Brush->Style=bsClear;
            AnsiString s="Game over";
            bmp->Canvas->TextOutA(
                (bmp->Width-bmp->Canvas->TextWidth(s))>>1,
                (bmp->Height-bmp->Canvas->TextHeight(s))>>1,s);
            bmp->Canvas->Brush->Style=bsSolid;
            bmp->Canvas->Font->Height=q;
            Form1->Canvas->Draw(0,0,bmp);
            Sleep(1000);

            // new game
            novy_dielik=rand()%7;       // new tetromino
            px=(map_xs>>1)-2;           // top/middle
            py=0;
            int adr=16*novy_dielik;
            for (int j=0;j<4;j++)       // copy it to pm
             for (int i=0;i<4;i++)
                {
                pm[j][i]=shp[adr];
                adr++;
                }
            for (int j=0;j<map_ys;j++)  // clear board
             for (int i=0;i<map_xs;i++)
              map[i][j]=0;
            novy_dielik=rand()%7;
            }
        novy_dielik=rand()%7;           // random next tetromino 0-6
        }
    draw();
    }
//--- keyboard timer --------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)
    {
    int e=0;
    if (keys[_key_left ]!=0)
        {
        px--; if (step()) px++; else e=1;
        }
    if (keys[_key_right]!=0)
        {
        px++; if (step()) px--; else e=1;
        }
    if (keys[_key_rot  ]!=0)
        {
        int i,j;
        BYTE ori[4][4];
        for (j=0;j<4;j++) for (i=0;i<4;i++) ori[i][j]=pm[i][j];
        for (j=0;j<4;j++) for (i=0;i<4;i++) pm[3-j][i]=ori[i][j];
        if (step()) for (j=0;j<4;j++) for (i=0;i<4;i++) pm[i][j]=ori[i][j];
        else e=1;
        }
    if (keys[_key_drop ]!=0)
        {
        py++; if (step()) py--; else e=1;
        }
    if (e) draw();
    }
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
    {
    Caption=Key;
    for (int i=0;i<_keys;i++)   // test all keys
     if (Key==keys_code[i])     // if match
      keys[i]=1;                // set it as pressed
    }
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
    {
    for (int i=0;i<_keys;i++)   // test all keys
     if (Key==keys_code[i])     // if match
      keys[i]=0;                // set it as released
    }
//---------------------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
    {
    for (int i=0;i<_keys;i++)   // set all keys
      keys[i]=0;                // as released
    }
//---------------------------------------------------------------------------
---------------------------------------

它是一个带有两个计时器的表单应用程序

Form


Timer1是250ms
Timer2是80ms

如果要使用我的,必须:

  1. 创建空表格应用
  2. 在其上放置2个计时器并设置间隔
  3. 创建我的代码正在使用的所有事件
  4. 复制事件和游戏代码以更正地点

但是您应该更多地使用它作为提示,以显示游戏体系结构。我知道它很丑陋而且没有上课(那些 OOP 尚不具备能力的学生,我们一起编写了游戏代码,因此在所有部分上都达成了共识,目的是保持这一简单性……)

因此bmp就像屏幕后退缓冲区(以避免闪烁)一样,是通过O P Q A键进行控制的。一个定时器控制下降的动画/模拟,另一个控制键盘。渲染是通过使用 VCL 封装的 GDI bmp ...

完成的

有关更多信息,请参见:

相关问题