AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / 问题

Perguntas[godot](coding)

Martin Hope
Moustic_Bonjour
Asked: 2025-01-22 22:28:10 +0800 CST

Por que minha linha de coordenadas não termina onde o cursor está?

  • 5

Estou tentando fazer o fim de uma linha no cursor. Mas não funciona.

Com janela:
Com janela

Tela cheia:
Tela cheia

Como você pode ver, a linha azul não termina no cursor.

Aqui está meu código para isso:

extends Line2D

# Called when the node enters the scene tree for the first time.
func _ready() -> void:
    #gets parent's position
    var parent := get_parent()
    
    #sets 2 points for the line
    add_point(parent.position)
    add_point(parent.position)



# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
    #deletes last position (cursor position)
    remove_point(1)
    
    #calculates the new point position
    var mousePos := get_global_mouse_position() #gets mouse position
    var adjust   := get_viewport_rect().size    #gets screen
    var deltaPos  = mousePos - (adjust/2)       #Adjust the coordinate (Point's (0,0) is in the middle of the screen while cursor's is on the top left corner)
    add_point(Vector2(deltaPos))
    print(deltaPos, points[1])

A linha é uma criança de uma Área 2d Assim (que tem um sprite 2d como filho correspondente ao edifício em um quadrado. Aqui está toda a construção

Cada vez que a função '_process' é chamada, eu imprimo as coordenadas do mousse e as coordenadas do ponto final que devem estar no cursor. Você pode ver na imagem da janela que essas coordenadas são as mesmas

No começo a diferença era bem mais visível. Antes:

Antes

Isso ocorreu porque as coordenadas do mouse e do ponto não têm a mesma origem (canto superior esquerdo para o primeiro e centro da tela para o segundo).

godot
  • 1 respostas
  • 23 Views
Martin Hope
KuwinnLifestyle
Asked: 2024-12-31 20:26:32 +0800 CST

Como desabilito temporariamente a colisão física em um RigidBody no Godot?

  • 5

Sou novo no Stack Overflow e no Game Development, então desculpe se essa pergunta for estúpida. Atualmente, estou trabalhando em um jogo no godot onde um jogador pode atirar projéteis em inimigos (simplificação excessiva). No entanto, tenho o seguinte problema: o projétil surge dentro do modelo do jogador e então colide com o jogador que o atira e ricocheteia. Meu projétil usa o tipo RigidBody2D e o Player é um CharacterBody2D.

Eu tentei o seguinte:

Defina a máscara da camada de colisão para estar em uma camada diferente do player

Problema: O projétil deve ricochetear nas paredes e então deve ser capaz de atingir o jogador. Então, os dois precisam ter colisão.

Faça a primeira sugestão, mas habilite a camada de máscara após o primeiro salto de parede

Problema: Mais tarde, quero usar algo semelhante a mísseis guiados. O jogador pode atirar mísseis que seguem o mouse e então atingem os inimigos ou o jogador. Então, o projétil deve ser capaz de colidir com o jogador sem um salto na parede.

Faça a primeira sugestão, mas habilite a camada de máscara após x quantidade de milissegundos

Problema: Os projéteis têm velocidades diferentes e o jogador pode ter modelos de tamanhos diferentes, então eu gostaria de evitar algo assim.

Gere o projétil com um deslocamento para que ele comece fora da área de impacto do jogador

Problema: Eu tentei isso e não pareceu, especialmente com modelos de jogadores variados. Mas se não houver outra solução, essa provavelmente seria a melhor opção.

Basicamente, eu gostaria de desabilitar a colisão entre os dois, então ter o sinal body_exited disparado quando o projétil sai da hitbox do jogador e então reativar a colisão. O problema é que se eu desabilitar a colisão, o sinal body_exited não dispara porque não há colisão. Mas com a colisão habilitada, o projétil ricocheteia no jogador. Basicamente, o que eu quero é que não haja interação física entre os dois inicialmente, mas com detecção de colisão ativa. Qualquer ajuda seria apreciada. Além disso, como sou novo, conselhos de melhores práticas são muito apreciados. Se o que estou fazendo é considerado uma prática ruim, por favor me avise.

godot
  • 1 respostas
  • 32 Views
Martin Hope
Frasher Gray
Asked: 2024-12-13 11:47:51 +0800 CST

Função retomada 'beginRound()' após await, mas o script desapareceu. Erro Godot Await

  • 6

Estou enfrentando um erro ao awaitser acionado várias vezes dentro de um loop.

O que o código deve fazer é um loop por todos os impérios, dizendo a eles para fazerem seus turnos e então awaiting sua conclusão antes de acionar o próximo império. Isso funciona para o primeiro turno (o turno do jogador), mas quando uma IA tenta chamar endTurn(), eu recebo o erro:

E 0:01:08:0911   Map.gd:419 @ endTurn(): Resumed function 'beginRound()' after await, but script is gone.  
    At script: res://scripts/HostGameMenu.gd:197  
    <C++ Error>    Method/function failed. Returning: Variant()  
    <C++ Source>   modules/gdscript/gdscript_function.cpp:197 @ resume()  
    <Stack Trace>  Map.gd:419 @ endTurn()  
    Tribe.gd:221 @ takeTurn()  
    Map.gd:414 @ beginNewTurn()  
    HostGameMenu.gd:196 @ beginRound()  
    Map.gd:419 @ endTurn()  
    Map.gd:1912 @ endEmpireTurn()  

Funções do Script One:

func beginRound():
    for i in range(empireTurnOrder.size()):
        empireTurnIndex = i #the only purpose this serves is being able to easily access whose turn it is for debugging from outside the for loop
        gameMap.beginNewTurn.rpc(empireTurnOrder[empireTurnIndex]) #empireTurnOrder is a PackedStringArray
        await gameMap.beginNextTurn
    gameMap.endRound.rpc() #gameMap points to the node containing Script Two

Script Duas Funções:

signal beginNextTurn

@rpc("any_peer", "call_local", "reliable")
func beginNewTurn(nextEmpire: String) -> void:
    var empire = getEmpire(nextEmpire)
    if empire.playerId != -1 and empire.playerId != userEmpire.playerId: #check is only for multiplayer, which is not the case for my tests. userEmpire is a reference to the empire node (node of Script Three) that the player controls
        pass
    else:
        if empire.playerId == userEmpire.playerId:
            #UI edits, irrelevant
        empire.takeTurn() #empire points to the node(s) of Script Three

func endTurn():
    if not serverHandler.inServer or multiplayer.get_unique_id() == 1: #serverHandler points to the node of Script One. inServer will always be true for singleplayer, which I am testing
        print(is_instance_valid(serverHandler))
        emit_signal("beginNextTurn")

func endRound():
    if not serverHandler.inServer or multiplayer.get_unique_id() == 1:
        serverHandler.beginRound()

func endEmpireTurn(): #button is tied to this function
    #edits UI a little
    endTurn()

Script Três Funções:

func takeTurn():
    if playerId == -1:
        map.endTurn() #map points the node of Script Two
    else:
        #does nothing; button press will call endTurn for players

Saída impressa:


Verdadeiro Verdadeiro

Qualquer ajuda é bem-vinda. As únicas outras postagens que encontrei sobre esse erro eram de pessoas aguardando timers em _process()funções, e as respostas para essas perguntas não eram exatamente aplicáveis ​​à minha situação.

Editar:

Adicionei uma função ao Script One:

func turnEnded() -> void:
    print(empireTurnOrder[empireTurnIndex] + "'s turn is over.")

e conectou o beginNextTurnsinal a ele, e também imprimiu com sucesso/corretamente para ambas as emissões do sinal, mas o erro não mudou.

Edição 2:

Só por curiosidade para ver se funcionava, alterei duas funções, beginNewTurn e beginRound, assim:

@rpc("any_peer", "call_local", "reliable")
func beginNewTurn(nextEmpire: String) -> bool:
    var empire = getEmpire(nextEmpire)
    if empire.playerId != -1 and empire.playerId != userEmpire.playerId:
        pass
    else:
        if empire.playerId == userEmpire.playerId:
            loadedData.get_node("ImportantMenuHub/EndTurn").set_disabled(false)
            loadedData.get_node("ResourceHUD/RaiseAll").set_disabled(false)
        empire.takeTurn()
    await beginNextTurn
    return true

func beginRound():
    for i in range(empireTurnOrder.size()):
        empireTurnIndex = i
        await gameMap.beginNewTurn(empireTurnOrder[empireTurnIndex])
    gameMap.endRound.rpc()

E isso dá o erro "O parâmetro "função" é nulo" na emit_signal("beginNextTurn")linha. Agora, obviamente, eu quero que minha solução seja compatível com chamadas de função rpc, mas é muito estranho que o sinal se recuse a funcionar corretamente com beginRound()and beginNewTurn(). A saída para isso, a propósito, ainda é

A vez de
<império 1> acabou. A vez
de
<império 2> acabou.

godot
  • 1 respostas
  • 33 Views
Martin Hope
Limer GG
Asked: 2024-11-27 01:23:07 +0800 CST

Como fazer uma rotação suave de um objeto após o outro usando godot 4 e GDscript?

  • 5

Tenho um tanque na cena com uma torre anexada como um objeto filho. Também tenho uma câmera na cena que gira usando um script, preciso que a torre do tanque gire suavemente conforme a câmera gira.

Alguém tem alguma ideia de como girar suavemente a torre depois da câmera, para que quando o tanque girar, a torre permaneça no lugar (porque a câmera não gira)

Implementei algo semelhante, mas quando o tanque gira, a torre gira junto, mas como a câmera não gira neste momento, agora há espaço livre entre a rotação da câmera e da torre.

Árvore de cena do tanque: https://i.imgur.com/BgwBz0q.png (para fazer o nó da câmera independente do objeto pai, eu uso este código no script do nó da câmera)

func _ready():
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
set_as_top_level(true)

Rotação que preciso: https://youtu.be/23IdDtPB4t0

godot
  • 1 respostas
  • 29 Views
Martin Hope
SPONGEBOB RED YT channel
Asked: 2024-11-19 04:33:26 +0800 CST

(GODOT 4.3) como fazer para que o jogador que se move pelo mapa de blocos se mova para sempre quando uma tecla de seta é pressionada?

  • 5

(eu fiz um post parecido com esse, só que decidi mudar para o godot para poder tornar os jogos mais fáceis do que no flash, já que ele está desatualizado)

Eu criei um personagem que o jogador pode controlar e ele se move por meio de tiles e tilemap, eu quero fazer com que o jogador possa se mover para sempre quando uma tecla de seta for pressionada (e se mover na direção da tecla de seta) até que ele entre em um tile caminhável que esteja tocando em um tile não caminhável

você pode me dar alguma dica de como fazer isso, aqui está o código:

extends Sprite2D

class_name PacMan

@export var move_speed: float = 1



@onready var tile_map: TileMap = $"../TileMap"

@onready var sprite_2d: Sprite2D = $Sprite2D

@onready var animation_player: AnimationPlayer = $Sprite2D/AnimationPlayer


var is_moving = false

func _physics_process(delta: float) -> void:
    if is_moving == false:
        return
    if global_position == sprite_2d.global_position:
        is_moving = false
        return
    sprite_2d.global_position = sprite_2d.global_position.move_toward(global_position, move_speed)

func _ready() -> void:
    animation_player.play("chomping")

func _process(delta: float) -> void:
    if is_moving:
        return
    if Input.is_action_pressed("up"):
        rotation_degrees = 90
        move(Vector2.UP)
        is_moving = true
    elif Input.is_action_pressed("down"):
        rotation_degrees = 270
        move(Vector2.DOWN)
        is_moving = true
    elif Input.is_action_pressed("left"):
        rotation_degrees = 0
        move(Vector2.LEFT)
        is_moving = true
    elif Input.is_action_pressed("right"):
        rotation_degrees = 180
        move(Vector2.RIGHT)
        is_moving = true

func move(direction: Vector2):
    var current_tile: Vector2i = tile_map.local_to_map(global_position)
    var target_tile: Vector2i = Vector2i(
        current_tile.x + direction.x,
        current_tile.y + direction.y,
    )
    var tile_data: TileData = tile_map.get_cell_tile_data(0, target_tile)
    if tile_data.get_custom_data("walk_tiles") == false:
        return
    #Player movement
    is_moving = true
    global_position = tile_map.map_to_local(target_tile)
    sprite_2d.global_position = tile_map.map_to_local(current_tile)
godot
  • 1 respostas
  • 23 Views
Martin Hope
Sin nombre
Asked: 2024-10-05 02:14:21 +0800 CST

Chamada inválida. Função inexistente 'instantiate' na base 'GDScript'

  • 5

Ao iniciar o jogo, recebo este erro. Existe alguma maneira de resolver o problema?

extends Node2D

var coin = preload("res://coin.gd")

func _on_timer_timeout():
    var coinTemp = coin.instantiate()   
    var generator = RandomNumberGenerator.new()
    var genint = randi_range(50, 500)
    coinTemp.position = Vector2 (genint,560) 
    add_child(coinTemp)

Não consegui encontrar nenhuma informação sobre como resolver este problema

godot
  • 1 respostas
  • 15 Views
Martin Hope
M. R. M.
Asked: 2024-08-15 02:17:01 +0800 CST

Como calcular a posição, rotação e escala do Transform3D?

  • 5

Estou tentando imitar uma transformação 3D em um ambiente 2D e, portanto, estou tentando fazer sozinho a parte 3D dos cálculos

Para referência, usei um Node3D para verificar se meu método de cálculo está correto

func calc_transform_3d(position_3d:Vector3, rotation_3d:Vector3, scale_3d:Vector3 ) -> Transform3D:
    
    var transform_3d := Transform3D(
        Basis.from_euler(rotation_3d).scaled(scale_3d),
        position_3d
    )
    
    return transform_3d

func _ready():
    var node_3d:Node3D = $Node3D
    var custom_transform := calc_transform_3d(node_3d.position, node_3d.rotation, node_3d.scale)
    
    print(custom_transform == node_3d.transform) # returns false

Mas o calc_transform_3d()método fornece a saída errada (para sua informação, não é um erro de ponto flutuante que verifiquei)

Então , como calcular um Transform3D (semelhante a como um Node3D o calcula) dado apenas positione ?rotationscale

godot
  • 1 respostas
  • 15 Views
Martin Hope
Simas Burdenkovas
Asked: 2024-07-26 20:51:16 +0800 CST

Por que intersect_ray está dizendo que tenho muitos argumentos no godot 4.2.2?

  • 5

Sou iniciante em Godot, atualmente estou brincando com armas hitscan etc., e usandointersect_ray()

Ao tentar escrever código usando, Intersect_ray()continuo recebendo uma mensagem de erro "Muitos argumentos para a chamada "intersect_ray ()". Esperado no máximo 1, mas recebeu 2." não sei o que fiz de errado? Aqui está o código: var collision = bullet.intersect_ray(muzle.transform.origin, aimcast.get_collision_point

se ajudar, estou usando um tutorial: https://www.youtube.com/watch?v=4jbfIN4t83k&list=PLJJ-tyPiN1L_68DjYLfn7c1Yq8Kx6NWPw&index=7

godot
  • 1 respostas
  • 19 Views
Martin Hope
PIXEL
Asked: 2024-03-30 21:55:12 +0800 CST

O jogador congela em posição quando trocado por outro jogador

  • 5

Eu tenho código de caracteres:

extends CharacterBody3D
@onready var camera_mount = $camera_mount
@onready var animation_player = $visuals/mixamo_base/AnimationPlayer
@onready var visuals = $visuals
@onready var camera_3d = $camera_mount/Camera3D

@export var is_current:bool = true
@export var is_main = true
@export var SPEED = 5.0
@export var JUMP_VELOCITY = 4.5
@export var SENSIVITY = 0.05
var walk_speed = 3.0
var run_speed = 5.0
var is_running = false
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")

func _ready() -> void:
    if is_main:
        Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)

func _input(event):
    if is_main:
        if event is InputEventMouseMotion:
            rotate_y(deg_to_rad(-event.relative.x*SENSIVITY))
            visuals.rotate_y(deg_to_rad(event.relative.x*SENSIVITY))
            camera_mount.rotate_x(deg_to_rad(-event.relative.y*SENSIVITY))
            

        
func _physics_process(delta):
    if is_main:
        camera_3d.current = is_current

        if not is_on_floor():
            velocity.y -= gravity * delta
        if Input.is_action_pressed("run"):
            SPEED = run_speed
            is_running = true
        else:
            is_running = false
            SPEED = walk_speed
            

        if Input.is_action_just_pressed("ui_accept") and is_on_floor():
            velocity.y = JUMP_VELOCITY
            
        if Input.is_action_just_pressed("ui_cancel"):
            Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)


        var input_dir = Input.get_vector("move_left", "move_right", "move_forward", "move_back")
        
        var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
        if direction:
            if animation_player.current_animation != "walking" && is_running == false:
                animation_player.play("walking")
                
            if animation_player.current_animation != "running" && is_running:
                animation_player.play("running")
            
                
            visuals.look_at(position+direction)
                
            velocity.x = direction.x * SPEED
            velocity.z = direction.z * SPEED
        else:
            if animation_player.current_animation != "idle":
                animation_player.play("idle")
                
            velocity.x = move_toward(velocity.x, 0, SPEED)
            velocity.z = move_toward(velocity.z, 0, SPEED)
            
        camera_mount.rotation.x = clamp(camera_mount.rotation.x, 
            deg_to_rad(-90), 
            deg_to_rad(70)
        )

        move_and_slide()

E o script responsável por mudar o personagem do jogo através de um botão:

extends Node3D

@onready var player_1 = $"../Player1"
@onready var player_2 = $"../Player2"

func _physics_process(_delta):
    if Input.is_action_just_pressed("switch_player"):
        if player_1.is_main:
            player_1.is_main = false
            player_2.is_main = true
            player_2.is_current = true
            player_1.animation_player.play("idle")
        else:
            player_1.is_main = true
            player_2.is_main = false
            player_1.is_current = true
            player_2.animation_player.play("idle")

O problema é que se você mudar de jogador enquanto aquele para quem você estava jogando antes está no ar, ele congela nesta posição. Como posso fazer com que, assim que troco de jogador, aquele em que joguei antes caia no chão, ou seja, comece a sucumbir às leis da física?

godot
  • 1 respostas
  • 22 Views
Martin Hope
Willien
Asked: 2024-03-09 01:48:04 +0800 CST

Variável global não sendo atualizada fora do script global

  • 5

Sim, a bola está entrando (e saindo) da área2D quando inicio o jogo

Sim global.gd, é um script carregado automaticamente

No global eu tenho uma grande área2d que detecta se um corpo entrou. var chase_balldentro do global estão sendo atualizados mas no Global.chase_ballé sempre falso (o valor padrão)

Originalmente o area2D estava dentro do nó inimigo mas eu quero que o area2D seja fixado na cena principal, não se movendo junto com o inimigo

global.gd:

extends Node2D

var chase_ball = false

func _process(delta):
        print(chase_ball)

func _on_ball_detector_body_entered(body):
    chase_ball = true

func _on_ball_detector_body_exited(body):
    chase_ball = false

saída:

true
false
true
false
(same loop as above)

inimigo.gd:

func _process(delta):
    print(Global.chase_ball)

saída:

false
false
false
false
(same loop as above)

O resultado esperado é Global.chase_ballatualizar de acordo com ofunc _on_ball_detector_body_entered/exited(body):

godot
  • 1 respostas
  • 21 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve