对子类对象的数组进行动画处理

Animating an array of child class objects

本文关键字:动画 处理 数组 子类 对象      更新时间:2023-10-16

>我正在尝试创建一个父类"形状",其中包含子类"圆形","三角形","矩形"。父类保存 x pos、y pos 和填充颜色或所有"形状",然后每个子类保存特定于该形状的信息。有人介意查看我的代码并了解为什么在尝试设置对象数组中的半径时出现错误"形状没有成员'setRadius'"......

附言现在我只有子类"圆圈",直到我让它工作。然后我将添加其他两个类。

另外,如果有人在我的代码中看到任何其他错误,我将不胜感激。

提前致谢

#include <allegro.h>
#include <cstdlib>
using namespace std;
#define scrX 640
#define scrY 400
#define WHITE makecol(255,255,255)
#define GRAY makecol(60,60,60)
#define BLUE makecol(17,30,214)
int random(int low, int high);
const int numCircles = random(1,50);
class Shape{
    public:
        Shape(){x = scrX / 2; y = scrY / 2; fill = WHITE;}
    protected:
        int x, y, fill;    
};
class Circle : public Shape{
    public:
        Circle(){radius = 0;}
        Circle(int r){radius = r;}
        void setRadius(int r){radius = r;}
    protected:
        int radius;
};
int main() 
{   
    // Program Initialization
    allegro_init();
    install_keyboard();
    set_color_depth(32);
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, scrX, scrY, 0, 0);
    // Create and clear the buffer for initial use
    BITMAP *buffer = create_bitmap(scrX, scrY);
    clear_to_color(buffer, GRAY);
    // Set title and create label text in window
    set_window_title("Bouncing Balls Ver 1.0");
    textout_ex(buffer, font, "Bouncing Balls Ver 1.0", 10, 20, WHITE, GRAY);
    // Draw a background box
    rectfill(buffer, 50, 50, scrX-50, scrY-50, BLUE);
    // Create circles
    Shape **GCir;
    GCir = new Shape *[numCircles];
    for(int i=0;i<numCircles;i++){
        GCir[i] = new Circle;
        GCir[i]->setRadius(random(1,25)); // THIS IS THE ERROR        
    }
    while(!key[KEY_ESC]){
    blit(buffer, screen, 0, 0, 0, 0, scrX, scrY);
    }
    destroy_bitmap(buffer);
    return 0;
}
END_OF_MAIN();
int random(int low, int high)
{
    return rand() % (high - low) + low;
}

GCir[i]的类型是Shape*Shape类没有setRadius方法,Circle有。因此,要么在将Circle对象分配给GCir[i]之前调用setRadius,要么只是使用适当的半径构造CircleGCir[i] = new Circle(random(1,25));

锤子修复:

GCir[i]->setRadius(random(1,25));

应改为

((Circle*)GCir[i])->setRadius(random(1,25));

更深层次的问题:

你需要基类上的虚拟析构函数

更好的方法是在 Circle 类构造函数中获取半径。然后使用 Shape::d raw() 作为虚拟函数来指定形状绘制,或者实现 Shape::getType() 并在正确转换后使用开关大小写来确定绘图逻辑。

编译器

说。您有一个形状数组,您尝试在其上调用 setRadius,该数组仅为圆形定义。只能调用形状方法,而不能将 Shape poonter 强制转换为圆形。