图片跟随鼠标移动(期间鼠标不释放)以及释放鼠标(图片)时刻鼠标位置

-每个时刻获取鼠标在视口的位置(一个2D的坐标),然后把图片放到这个位置
-为什么这两个要分开写呢,因为我用的这个方法设置每个时刻图片位置的时候是不会涉及到鼠标在世界中的位置的,也就是说无法获取到图片跟随鼠标移动时刻的鼠标在世界中的位置。所以只要图片还在跟随鼠标,那么鼠标位置就是空的,默认赋值(0,0,0)。所以只能释放图片后再去获取鼠标位置。
-这个方法我感觉比较笨。。。

图片跟随鼠标移动

一、蓝图中的实现方法

我是在Widget蓝图的Tick中写的,实现很简单,只需要调用”Get Mouse Position On Viewport”和”Set Render Translation”。如图:

这里写图片描述

每一个Tick都去检测,如果要让图片跟随鼠标移动,就把图片以及鼠标位置作为参数传给”Set Render Translation”

·蓝图还是很智能的 -_- ,c++就没这么简单了。。

二、c++中的实现方法

我是在蓝图中画的widget,又在c++中进行调用,所以传参确实好麻烦。。。

1.首先在.h文件中声明需要的变量以及函数

    UPROPERTY(BlueprintReadWrite)
        bool BClickPlanter;     //图片是否要跟随鼠标移动,通过蓝图赋值(因为我的触发事件点击某个按钮)

    UPROPERTY(EditDefaultsOnly,BlueprintReadWrite)
        UImage* PlanterPicture;//要移动的图片,通过蓝图赋值

    UFUNCTION(BlueprintCallable)    //图片跟随鼠标移动实现函数,蓝图可调
        void PictureFollowMouse(bool BClickPlanterRef, UImage* PlanterPictureRef);

2.在.cpp文件中添加头文件:

#include "Kismet/GameplayStatics.h"
#include "Image.h"
#include "WidgetLayoutLibrary.h"

3.函数定义:

void AMyPlayerController::PictureFollowMouse(bool BClickPlanterRef, UImage* PlanterPictureRef)
{
    BClickPlanter = BClickPlanterRef;
    PlanterPicture = PlanterPictureRef;
    if (BClickPlanter&&PlanterPicture)
    {
        UWidgetLayoutLibrary *myWidget = Cast<UWidgetLayoutLibrary>(UGameplayStatics::GetGameInstance(GetWorld()));
        FVector2D mouseposofview = myWidget->GetMousePositionOnViewport(GetWorld());
        PlanterPictureRef->SetRenderTranslation(mouseposofview);
    }
}

4.Event Tick中的调用:

PictureFollowMouse(BClickPlanter, PlanterPicture);

5.与蓝图传参,每当点击按钮之后,就将要移动的图片传给c++:

图片跟随鼠标移动(期间鼠标不释放)以及释放鼠标(图片)时刻鼠标位置_第1张图片

6.可以设置松开鼠标时将图片放回原位置,不再跟随鼠标。思路就是在蓝图中”On Release” Button 的时候传一个bool变量以及图片信息给c++,然后把图片位置设为原位置

图片跟随鼠标移动(期间鼠标不释放)以及释放鼠标(图片)时刻鼠标位置_第2张图片

void AMyPlayerController::PictureBack(bool BClickPlanterRef, UImage * PlanterPictureRef)
{
    BClickPlanter = BClickPlanterRef;
    PlanterPicture = PlanterPictureRef;
    if (!BClickPlanter&&PlanterPicture) //如果松开鼠标并且图片还跟着鼠标
    {
        PlanterPictureRef->SetRenderTranslation(FVector2D(0,0));//放回原地(我是屏幕左上角,自己选位置)
    }
}

三、我这个写法挺麻烦,不过也能参考。。。

获取释放鼠标时刻鼠标的位置

不是很清楚为什么,但是如果在释放时刻获取位置的话,位置是空,可能和上面的写法有关系,所以我把这两个内容写到了一起。

具体获取方法在之前的文章《获取鼠标在世界中的位置》中写过了,这里只是想强调释放时刻获取到的值是不可用的,必须再经过两次Tick才能获取到正确位置!!!

怎么再经过两次Tick呢?开动脑筋吧~

你可能感兴趣的:(ue4)