BayGUIリライト[4]

Bayside2005-05-24


とりあえずお約束のメガデモを動かしてみました。noiz2bgというアプリで、MONAにも移植されています。思ったより遅かったです。体感5倍といったのは嘘でした。ごめんなさい。

#ifdef SDL
static unsigned int sdl_timer_callback
(unsigned int interval, void* param) {
    SDL_Event event;
    SDL_RemoveTimer(globalTimerID);
    event.type = SDL_USEREVENT;
    return SDL_PushEvent(&event);
}
#endif

/** クラス宣言 */
class GNoiz2bg : public Frame, WindowListener {
private:
    int scene_count, scene;
    unsigned char* pbuf;

public:
    /** コンストラクタ */
    GNoiz2bg(const char* title) {
        logprintf("%s:%s:%d\n", __FILE__, __FUNCTION__, __LINE__);
        setBounds(50, 50, SCREEN_W + 12, SCREEN_H + 28);
        this->title = new String(title);
        this->pbuf = (unsigned char *)malloc(SCREEN_W * SCREEN_H * 4);
        initBackground();
        setStageBackground(1);
        this->scene = 1;
        this->scene_count = FPS * 10;
        addWindowListener(this);
    }

    /** デストラクタ */
    virtual ~GNoiz2bg() {
        logprintf("%s:%s:%d\n", __FILE__, __FUNCTION__, __LINE__);
        free(pbuf);
    }

    virtual void windowActivated(WindowEvent* e)
    {
        logprintf("%s:%s:%d\n", __FILE__, __FUNCTION__, __LINE__);
    }
    
    virtual void windowClosed(WindowEvent* e)
    {
        logprintf("%s:%s:%d\n", __FILE__, __FUNCTION__, __LINE__);
    }
    
    virtual void windowDeactivated(WindowEvent* e)
    {
        logprintf("%s:%s:%d\n", __FILE__, __FUNCTION__, __LINE__);
    }
    
    virtual void windowOpened(WindowEvent* e)
    {
        printf("%s:%s:%d\n", __FILE__, __FUNCTION__, __LINE__);
        #ifdef SDL
        globalTimerID = SDL_AddTimer(1, sdl_timer_callback, (void*)1);
        #endif
    }
    
    /** イベントハンドラ */
    virtual void processEvent(AWTEvent* event) {
        //if (event->getID() == WindowEvent::WINDOW_OPENED) {
            //Frame::processEvent(event);
            moveBackground();
            drawBackground(this->pbuf);
            for (int y = 0; y < SCREEN_H; y++) {
                for (int x = 0; x < SCREEN_W; x++) {
                    unsigned char *p = &pbuf[(x + y * SCREEN_W) * 4];
                    this->image->setPixel(x + 6, y + 22, *((unsigned int*)p));
                }
            }
            update();
            scene_count--;
            if(scene_count <= 0){
                scene       = (scene + 1) % 6;
                scene_count = FPS * 20;
                setStageBackground(scene);
            }
            #ifdef SDL
            globalTimerID = SDL_AddTimer(1, sdl_timer_callback, (void*)1);
            #endif
        //}
    }
};

#ifdef MONA
int MonaMain(List<char*>* pekoe)
#else
int main(int argc, char *argv[])
#endif
{
    _P<GNoiz2bg> noiz = new GNoiz2bg("noiz2bg for GUI");
    noiz->run();
    return 0;
}