我想將2D精靈縮放爲與節點的碰撞框一樣大。如何在不重新縮放整個節點的情況下在Urho3D中縮放Sprite2D?
我只能用Node::SetScale
和一些手動縮放計算來做到這一點,但我寧願不使用這種方法做它,因爲它是錯綜複雜的,因爲我也必須考慮物理身體的比例因子。
但是,我找不到StaticSprite2D
類的SetScale
方法。
關鍵碼部分是:
#if 0
// Sprite and collision have the same size,
// like I want it, but I feel this is very convoluted.
auto rect = boxSprite->GetRectangle();
auto scaleX = PIXEL_SIZE * rect.Width();
auto scaleY = PIXEL_SIZE * rect.Height();
node->SetScale(Vector3(groundWidth/scaleX, groundHeight/scaleY, 0.0f));
shape->SetSize(Vector2(scaleX, scaleY));
#else
// Collision shape is correct, but the sprite is smaller
// so not what I want.
shape->SetSize(Vector2(groundWidth, groundHeight));
#endif
完整的可運行下面的代碼,用下面的樣板進行測試:https://github.com/cirosantilli/Urho3D-cheat/blob/8c785b38481aa5af48837c5bc3706e46f704ef37/scale_sprite.cpp和Urho3D @ 5e8a275:
#include <Urho3D/Core/CoreEvents.h>
#include <Urho3D/Core/Object.h>
#include <Urho3D/Engine/Application.h>
#include <Urho3D/Engine/Engine.h>
#include <Urho3D/Engine/EngineDefs.h>
#include <Urho3D/Graphics/Camera.h>
#include <Urho3D/Graphics/DebugRenderer.h>
#include <Urho3D/Graphics/Graphics.h>
#include <Urho3D/Graphics/Octree.h>
#include <Urho3D/Graphics/Renderer.h>
#include <Urho3D/Input/Input.h>
#include <Urho3D/Input/InputEvents.h>
#include <Urho3D/Physics/PhysicsEvents.h>
#include <Urho3D/Resource/ResourceCache.h>
#include <Urho3D/Scene/Scene.h>
#include <Urho3D/Scene/SceneEvents.h>
#include <Urho3D/Urho2D/CollisionBox2D.h>
#include <Urho3D/Urho2D/CollisionCircle2D.h>
#include <Urho3D/Urho2D/Drawable2D.h>
#include <Urho3D/Urho2D/PhysicsWorld2D.h>
#include <Urho3D/Urho2D/RigidBody2D.h>
#include <Urho3D/Urho2D/Sprite2D.h>
#include <Urho3D/Urho2D/StaticSprite2D.h>
using namespace Urho3D;
class Main : public Application {
URHO3D_OBJECT(Main, Application);
public:
Main(Context* context) : Application(context) {
}
virtual void Setup() override {
engineParameters_[EP_FULL_SCREEN] = false;
}
void Start() {
SubscribeToEvent(E_POSTRENDERUPDATE, URHO3D_HANDLER(Main, HandlePostRenderUpdate));
this->scene_ = new Scene(this->context_);
scene_->CreateComponent<Octree>();
scene_->CreateComponent<DebugRenderer>();
scene_->CreateComponent<PhysicsWorld2D>();
auto physicsWorld = scene_->GetComponent<PhysicsWorld2D>();
auto cameraNode_ = scene_->CreateChild("camera");
cameraNode_->SetPosition(Vector3(0.0f, 0.0f, -1.0f));
auto camera = cameraNode_->CreateComponent<Camera>();
camera->SetOrthographic(true);
camera->SetOrthoSize(4.0);
auto graphics = GetSubsystem<Graphics>();
auto renderer = GetSubsystem<Renderer>();
SharedPtr<Viewport> viewport(new Viewport(context_, scene_, cameraNode_->GetComponent<Camera>()));
renderer->SetViewport(0, viewport);
auto cache = GetSubsystem<ResourceCache>();
auto boxSprite = cache->GetResource<Sprite2D>("Urho2D/Box.png");
auto groundWidth = 2.0;
auto groundHeight = 2.0;
auto node = this->scene_->CreateChild("ground");
node->SetPosition(Vector3(0.0f, 0.0f, 0.0f));
node->CreateComponent<RigidBody2D>();
auto shape = node->CreateComponent<CollisionBox2D>();
#if 0
// Sprite and collision have the same size,
// like I want it, but I feel this is very convoluted.
auto rect = boxSprite->GetRectangle();
auto scaleX = PIXEL_SIZE * rect.Width();
auto scaleY = PIXEL_SIZE * rect.Height();
node->SetScale(Vector3(groundWidth/scaleX, groundHeight/scaleY, 0.0f));
shape->SetSize(Vector2(scaleX, scaleY));
#else
// Collision shape is correct, but the sprite is smaller
// so not what I want.
shape->SetSize(Vector2(groundWidth, groundHeight));
#endif
auto staticSprite = node->CreateComponent<StaticSprite2D>();
staticSprite->SetSprite(boxSprite);
}
void Stop() {}
private:
SharedPtr<Scene> scene_;
void HandlePostRenderUpdate(StringHash eventType, VariantMap& eventData) {
auto physicsWorld = this->scene_->GetComponent<PhysicsWorld2D>();
physicsWorld->DrawDebugGeometry();
}
};
URHO3D_DEFINE_APPLICATION_MAIN(Main);
有趣的是,存在用於Sprite
一個SetScale
類,就像我在示例中看到的那樣,它用於3D場景中的UI。
超集:在2D任意着色器:
- https://discourse.urho3d.io/t/2d-lights-shaders-glow-shadows/251
- https://github.com/urho3d/Urho3D/issues/462