【问题标题】:my get_viewport().get_mouse_position() isn't working right godot GDscript我的 get_viewport().get_mouse_position() 不能正常工作 godot GDscript
【发布时间】:2021-07-26 17:09:21
【问题描述】:

我正在尝试制作一个 2d 平台游戏,您可以在其中生成一个对象并尝试在它落下之前在空中跳跃。

问题是当我尝试生成瓷砖时它不会生成光标在哪里 它为我不知道如何摆脱它的位置添加了一个相对值。

您会看到,当我尝试实例化一个场景时,它会考虑光标位置和视口值,但随后发生了一些事情,我发现对象生成得太远了。

see where is the cursor at and where did the tile spawn

, same thing here

, and here

-here is how I'm grouping the nodes and scenes-

这是我正在使用的脚本,它在 player1 场景中

extends KinematicBody2D
# 
var score : int = 0

export var speed : int = 200
export var jumpforce : int = 600
export var gravity : int = 800

onready var AB1 = preload("res://player1AB.tscn")

var vel :Vector2 = Vector2()

onready var sprite : Sprite = get_node("sprite_idile")
onready var ui : Node = get_node("/root/mainscene1/CanvasLayer/ui")
onready var audioplayer : Node = get_node("/root/mainscene1/Camera2D/audio_player")

func _physics_process(delta):
    vel.x = 0
    # movement inputs
    if Input.is_action_pressed("move_left"):
        vel.x -= speed

    if Input.is_action_pressed("move_right"):
        vel.x += speed

    # applying the velcoty
    vel = move_and_slide(vel,Vector2.UP)

    #apllying gravty
    vel.y += gravity * delta

    #jump input
    if Input.is_action_just_pressed("jump") and is_on_floor():
        vel.y -= jumpforce

    # where the sprite facing
        if vel.x < 0:
        sprite.flip_h = true
    if vel.x > 0:
        sprite.flip_h = false

    if Input.is_action_just_pressed("restart"):
        death()



func death ():
    get_tree().reload_current_scene()



func collect_coin (value):
    score += value
    ui.set_score_text(score)
    audioplayer.play_coin_sfx()


func _input(event):
    if event.is_action_pressed("click"):
        var ABT1 = AB1.instance()
        add_child(ABT1)
        var XN = null
        XN = get_viewport().get_mouse_position()  
        ABT1.position = XN

重要的东西

onready var AB1 = preload("res://player1AB.tscn")



func _input(event):
    if event.is_action_pressed("click"):
        var ABT1 = AB1.instance()
        add_child(ABT1)
        var XN = null
        XN = get_viewport().get_mouse_position()  
        ABT1.position = XN

Godot 表单中的同样问题,如果可能,请检查一下,以防有人在那里回答

https://godotforums.org/discussion/27007/my-get-viewport-get-mouse-position-isnt-working-right#latest

【问题讨论】:

    标签: godot gdscript


    【解决方案1】:

    如果您没有额外的视口

    我的第一直觉是获取get_global_mouse_position 并设置global_position。这样您就不必处理任何相对定位:

        ABT1.global_position = get_global_mouse_position() 
    

    或者,您可以检查事件是否为InputEventMouse,使用make_input_local 将其设为本地,并从中获取InputEventMouse.position

    func _input(event):
        if event is InputEventMouse and event.is_action_pressed("click"):
    
            var ABT1 = AB1.instance()
            add_child(ABT1)
    
            event = make_input_local(event)
            ABT1.position = event.position
    

    这种方法可以更容易地添加触摸支持,因为它不依赖于任何为您提供鼠标位置的函数。请参阅我对Holding screen touch in godot 的回答。


    如果你有额外的视口

    首先,确保将Viewport 放入ViewportContainer 中(否则它不会得到输入,请参阅_input not called for a node inside a Viewport)。然后我们可以使用ViewportContainer 来获取我们的坐标。

    类似这样的:

    func _input(event):
        if event is InputEventMouse and event.is_action_pressed("click"):
    
            var ABT1 = AB1.instance()
            add_child(ABT1)
    
            var container = find_parent("ViewportContainer") as ViewportContainer
            if container != null:
                event = container.make_input_local(event)
    
            event = make_input_local(event)
            ABT1.position = event.position
    

    请注意,我正在使用函数find_parent。它按Nodename 匹配,而不是按类型匹配。您可以尝试的另一种方法是使用get_viewport().get_parent()

    是的,无论拉伸模式如何,它都应该工作。

    【讨论】:

    • 真的谢谢你,你不仅帮助我解决了这个问题,还帮助我在将来将它移植到移动设备时解决了一个问题。我可以问你吗?这么多关于编程的信息是从哪里得到的,或者你是从哪里获得的?
    • @mhmoodalem 随时间累积。然而,我也不完全是自以为是。我学的是工程学,这灌输了一种解决问题的方法,我在这里应用了这种方法。如果您有问题,请为该问题创建一个项目。做一些研究,可以是阅读文档/示例/源代码,好的旧实验,或者问别人。然后你根据它进行原型设计和测试。根据需要重复。如果你找到了解决方案,你可以将它整合到你正在构建的任何东西中。如果你没有找到它,判断电话:继续尝试或解决它。学习在路上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    相关资源
    最近更新 更多