cocos 2 dxでの曲線引張りおよび曲線接続多点
3547 ワード
まず図を描きます.この効果です.
この効果を達成する最初の難点は、画像をカーブパスで伸ばし、固定されたポイントにパスしてカーブを描くことです.
幸いなことにアルゴリズムを書いてくれた人がいましたhttp://discuss.cocos2d-x.org/...あ、ありがとうございました.
中のcppファイルとhファイルをダウンロードしてプロジェクトに入れればいいのですが、次はどうやって中の例を押しますか.
その中でpathはstd::vectorで、曲線を盛るために伝えなければならない点で、10は曲線の円滑さと理解することができて、brick.jpgはあなたが伸ばす原図で、作者はネット上からかき集めた図はみんなに分かち合います
画像の画素の長さと幅は2の倍数で、さもなくば間違いを報告することに注意します
上の例を押すと、曲線が目的の点を通り抜けていないことがわかります.これはアンカーの問題です.曲線の位置とアンカーを再設定すればいいです.
このようにして、世界座標で直接曲線を生成することができます.これまで曲線は静的でしたが、まずhファイルに何かを設定する方法を見てみましょう.
cppファイル:
使用法は:1.touchイベントに記録する_touchPoint 2.ドットからアルファベットの追加が検出されたときにaddLinePointを実行して曲線の描画を開始する3.アルファベット座標を削除する必要があるときにdeletePoint 4を実行ユーザが手を放すことを検出したときにremoveTouchLineを実行して描画を終了する
作者はちょうどcococos 2 dxとc++を游んで半月、きっと书くのが周到でない地方があって、もしあなたはもっと良い考えがあるならば多く私と交流してください
この効果を達成する最初の難点は、画像をカーブパスで伸ばし、固定されたポイントにパスしてカーブを描くことです.
幸いなことにアルゴリズムを書いてくれた人がいましたhttp://discuss.cocos2d-x.org/...あ、ありがとうございました.
中のcppファイルとhファイルをダウンロードしてプロジェクトに入れればいいのですが、次はどうやって中の例を押しますか.
if(auto spline = TexturedSpline::create(path, 10, "brick.jpg")
{
addChild(spline);
spline->setPosition(center);
}
その中でpathはstd::vectorで、曲線を盛るために伝えなければならない点で、10は曲線の円滑さと理解することができて、brick.jpgはあなたが伸ばす原図で、作者はネット上からかき集めた図はみんなに分かち合います
画像の画素の長さと幅は2の倍数で、さもなくば間違いを報告することに注意します
上の例を押すと、曲線が目的の点を通り抜けていないことがわかります.これはアンカーの問題です.曲線の位置とアンカーを再設定すればいいです.
_touchLine->setPosition(Vec2(0, 0));
_touchLine->setAnchorPoint(Vec2(0, 0));
このようにして、世界座標で直接曲線を生成することができます.これまで曲線は静的でしたが、まずhファイルに何かを設定する方法を見てみましょう.
virtual void draw(cocos2d::Renderer *renderer, const cocos2d::Mat4 &transform, uint32_t flags);
void onDraw(const cocos2d::Mat4 &transform, bool transformUpdated);
cocos2d::CustomCommand _customCommand;
// cocos2dx 3.x draw
bool _makeLine; //
std::vector _pointArray; // sprite
Vec2 _touchPoint; // touch
TexturedSpline* _touchLine; //
void addLinePoint(Vec2 point); //
void deletePoint(); //
void removeTouchLine(); //
cppファイル:
void GameScene::addLinePoint(Vec2 point)
{
// path , ,
if (_pointArray.size() < 4) {
_pointArray.push_back(point);
_pointArray.push_back(point);
_pointArray.push_back(point);
}
_pointArray.push_back(point);
_makeLine = true;
}
void GameScene::deletePoint()
{
_pointArray.pop_back();
if (_pointArray.size() < 4) {
_makeLine = false;
}
}
void GameScene::removeTouchLine()
{
_pointArray.clear();
_makeLine = false;
}
void GameScene::draw(cocos2d::Renderer *renderer, const cocos2d::Mat4 &transform, uint32_t flags)
{
_customCommand.init(zOrderLetters);
_customCommand.func = CC_CALLBACK_0(GameScene::onDraw, this, transform, flags);
renderer->addCommand(&_customCommand);
}
void GameScene::onDraw(const cocos2d::Mat4 &transform, bool transformUpdated)
{
Director *director = Director::getInstance();
director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, transform);
if (_touchLine != NULL) {
this->removeChild(_touchLine);
_touchLine = NULL;
}
if (_makeLine) {
std::vector path;
path.insert(path.end(), _pointArray.begin(), _pointArray.end());
path.push_back(_touchPoint);
// , +
_touchLine = TexturedSpline::create(path, 50, "line.png");
this->addChild(_touchLine,2);
_touchLine->setPosition(Vec2(0, 0));
_touchLine->setAnchorPoint(Vec2(0, 0));
}
director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
}
使用法は:1.touchイベントに記録する_touchPoint 2.ドットからアルファベットの追加が検出されたときにaddLinePointを実行して曲線の描画を開始する3.アルファベット座標を削除する必要があるときにdeletePoint 4を実行ユーザが手を放すことを検出したときにremoveTouchLineを実行して描画を終了する
作者はちょうどcococos 2 dxとc++を游んで半月、きっと书くのが周到でない地方があって、もしあなたはもっと良い考えがあるならば多く私と交流してください