2015-04-22 60 views
0

我剛加入這個了不起的社區,爲一個非常惱人的問題得到了答案。 我正在試圖用FLTK創建一個五連勝的遊戲。目前,我正在爲其井號版本打井。 所以我的問題是: 我從許多按鈕創建一個板。對於tic tac腳趾,該板僅有9個按鈕。但對於連續五個,它是15 * 15,所以它是225個按鈕。真正的問題在我必須定義所有回調函數時開始。那麼有沒有一種方法可以讓它們都只有一個回調函數?我可以爲按鈕分配一個值,以便回調函數在調用回調時知道哪個按鈕被按下了? 非常感謝你的人誰讀它:)C++ FLTK(具有相同回調函數的更多按鈕)

編輯

於是,我就往前走一步,並保存所有的指針指向按鈕在載體中。

vector <Fl_Button *> pointerVec; 


/////////the button grid for the board /////// 
     int counter = 0; 
     int width = 50, height = 50; 
     int rowmax = 15, colmax = 15; 

     for (int rr = 0; rr < 3; ++rr) { 
      for (int cc = 0; cc < 3; ++cc) { 


      Fl_Button* bgrid = new Fl_Button(cc * width+80, rr * height+80, width - 5, width - 5); 
      int rowcol = counter; 

      pointerVec.push_back(bgrid); //save pointers to the buttons 


      bgrid->callback(_playerMove_cb, (void*) rowcol); 

      counter++; 
      } 
     } 

//////// 

//then I tried to pass the vector to a callback function by reference 

getAi->callback(getAI_cb, (void*)&pointerVec); 


/////// 
    static void getAI_cb(Fl_Widget *w, void *client) { 

    vector<Fl_Button*> &v = *reinterpret_cast<vector<Fl_Button*> *>(client); 

    // i wanted to do this // 

    v[1]->color(FL_RED); 


} 

因此,當我這樣做,程序崩潰。我打印出2個向量的內存地址,它們位於不同的地址。 有什麼我做錯了嗎? 我想這樣做的原因是因爲我想爲電腦播放器移動的按鈕着色。

+0

回調的第一個參數是Widget,第二個參數是void *。如果您將userdata存儲在按鈕中,則回調可以提取此數據以確定它是哪個按鈕。讓我們知道你是否需要一個例子。 – cup

+0

你好,謝謝你的回覆。如果你不介意你能給我一個小例子嗎?非常感謝你 – firax

+0

重新編輯:它看起來像是在某處發生了腐敗。 w的地址與getAI相同嗎?如果不是,那麼別的東西就是調用例程。 – cup

回答

0

就是這樣。你可以傳遞任何參數。只要確保它不是短暫的,否則當回調得到它時,它可能會在整個堆棧或堆中走完。

#include <stdlib.h> 
#include <stdio.h> 
#include <FL/Fl.H> 
#include <FL/Fl_Window.H> 
#include <FL/Fl_Button.H> 
#include <sstream> 
#include <iostream> 
#include <string> 
#include <list> 

void ButtonCB(Fl_Widget* w, void* client) 
{ 
    int rowcol = (int)client; 
    int row = rowcol >> 8; 
    int col = rowcol & 255; 
    std::cout << "row " << row << " col " << col << std::endl; 
} 
void CloseCB(Fl_Widget* w, void* client) 
{ 
    std::cout << "The end" << std::endl; 
    exit (0); 

} 

int main(int argc, char ** argv) 
{ 
    int width = 60, height = 25; 
    int rowmax = 5, colmax = 5; 
    std::list<std::string> tags; 

    Fl_Window *window = new Fl_Window(colmax * width + 20, rowmax * height + 20); 

    for (int rr = 0; rr < rowmax; ++rr) 
    { 
     for (int cc = 0; cc < colmax; ++cc) 
     { 
      std::ostringstream lab; 
      lab << "R" << rr << "C" << cc; 
      // Need to keep the strings otherwise we get blank labels 
      tags.push_back(lab.str()); 
      Fl_Button* b = new Fl_Button(cc * width + 10, rr * height + 10, width - 5, height - 5, tags.back().c_str()); 
      int rowcol = rr << 8 | cc; 
      b->callback(ButtonCB, (void*) rowcol); 
     } 
    } 
    window->end(); 
    window->callback(CloseCB, 0); 
    window->show(argc,argv); 
    return Fl::run(); 
} 
+0

我試圖用你的例子再進一步,如果你有時間可以看看它嗎?我編輯了主帖。謝謝:) – firax

相關問題