※cocos2d-xのバージョンによって異なるかもしれません。
1つのステージをクリアするごとにテーブルが更新され、
1つCellが追加されるようなテーブルを実装していた際に、
TableViewのTableの並び方を下から上に並べるように設定していました。
1 2 |
//テーブルの並び方を下から上に設定 _tableView->setVerticalFillOrder(TableView::VerticalFillOrder::BOTTOM_UP); |
これを実装した際に、問題が発生しました。
問題事象1
ステージをクリアするまでは_tableViewのセルは1つなのですが
_tableView全体のサイズは背景の画像とだいたい同じサイズに設定していた際に
Cellのない部分にタッチしても、タッチイベントが発生してしまう。
解決策1
「_tableView全体のサイズはCellのサイズ*Cellの数」として
ステージをクリアするごとに、この処理をリロードすることで解決
したのですが、リサイズする処理を実装したら以下の問題点が発生。
問題事象2
解決策1で_tableViewのサイズを変えた際に、setAnchorPointが有効にならない事象が発生。
setAnchorPoint(Vec2::ANCHOR_TOP_LEFT)を実施しても
リサイズするとなぜか左下となってしまう。
アンカーが左下の場合、並び方を下から上に並べるように設定しているため
どんどん上にセルが追加されてしまいます。
_tableView最大サイズまでCellが追加された状態なら問題ないのですが、
これだと初回プレイ時のCellの位置が、_tableViewの最下層となってしまい
見栄えがよくないです。
解決策2
背景画像のポジションからの差分で_tableViewの位置を指定。
以下無理やり書いた実際のソースです。
※アンカーポイントの設定が背景画像とTableViewで違うためかなり見辛いです
1 2 3 4 5 6 7 8 9 10 11 12 |
//_backTableSprite→背景画像 //visibleSize.height*.10→Cellの大きさ //table_count→テーブルの数 float tableX; tableX = _backTableSprite->getPositionX() - (_backTableSprite->getContentSize().width / 2); float tableY; tableY = _backTableSprite->getPositionY() + (_backTableSprite->getContentSize().height - (visibleSize.height*.10)*table_count) //設定 _tableView->setPosition(Vec2(tableX, tableY)); |
まとめ
プログラムというより、考え方を変えてなんとかしましたが
ソースが長くなってしまいました。
もっといい方法があったら誰か教えてください。