2021-08-07 Godot Engine > 고양이와 icon의 충돌 판정 > (커서로 캐릭터 이동, 마우스로 캐릭터 이동, 충돌 판정)

12781 단어 Godot
작업 환경
Windows 10 Pro v21H1
Godot Engine v3.3.2.stable.official
프로세스 개요
  • 커서로 문자 이동
  • 스페이스바를 누르면서 가속
  • 마우스로 문자 이동
  • 충돌 판정
  • 충돌 후에도 유지되는 노드
  • 충돌 후 사라진 노드
  • 이루어지다
    문자
    EDGE로 그립니다.

    노드 레벨
    (왼쪽은 이름, 오른쪽은 노드 유형)
  • Node2D: Node2D
  • Player : KinematicBody2D > Player.첨부 gd
  • Sprite
  • CollisionShape2D
  • Enemy_always : KinematicBody2D
  • Enemy_sprite : Sprite
  • Collision_enemy : CollisionShape2D
  • Enemy_fadeAway : KinematicBody2D
  • Enemy_sprite : Sprite
  • Collision_enemy : CollisionShape2D
  • 시험을 준비하다
    거리에 따라 두 Enemy 객체와 충돌할지 여부를 결정합니다.
    Collision 레이어 설정
    아래 레이어에 지정
  • Player
    Player의 Collision.Layer
  • Enemy_always의 Collision.Mask
  • Enemy_fadeAway의 Collision.Mask
  • Enemy
  • Enemy_always의 Collision.Layer
  • Enemy_fadeAway의 Collision.Layer
  • 코드
    Player.gd
    extends KinematicBody2D
    
    var shift_right =  Vector2(32, 0) * 4
    var shift_left  = -Vector2(32, 0) * 4
    var shift_up    = -Vector2(0, 32) * 4
    var shift_down  =  Vector2(0, 32) * 4
    
    onready var enemyNode_always   = get_node("../Enemy_always")
    onready var enemyColl_always   = get_node("../Enemy_always/Collision_enemy")
    onready var enemyNode_fadeaway = get_node("../Enemy_fadeAway")
    onready var enemyColl_fadeaway = get_node("../Enemy_fadeAway/Collision_enemy")
    
    const CHARACTER_SIZE = 64  # 64 x 64
    const DISP_WIDTH = 1024
    const DISP_HEIGHT = 600
    
    func myMoveAndCollide(delta):
        if position.x < CHARACTER_SIZE / 2:
            position.x = CHARACTER_SIZE / 2
            return false
        if position.x > DISP_WIDTH:
            position.x = DISP_WIDTH
            return false
        if position.y < CHARACTER_SIZE / 2:
            position.y = CHARACTER_SIZE / 2
            return false
        if position.y > DISP_HEIGHT:
            position.y = DISP_HEIGHT
            return false
        return move_and_collide(delta)
    
    func hideEnemy():
        var dist = enemyNode_fadeaway.transform.origin.distance_to(position)
        print(dist)
        if dist > 100:  # not fadeaway Node
            return
        enemyNode_fadeaway.visible = false  # hide
        enemyColl_fadeaway.disabled = true  # disable collision
    
    func _process(delta):
        # acceleration
        var accel = 1.0
        var collide
        if Input.is_action_pressed("ui_accept"):
            accel = 2.0
        # movement
        if Input.is_action_pressed("ui_right"):
            collide = myMoveAndCollide(shift_right * delta * accel)
        if Input.is_action_pressed("ui_left"):
            collide = myMoveAndCollide(shift_left * delta * accel)
        if Input.is_action_pressed("ui_up"):
            collide = myMoveAndCollide(shift_up * delta * accel)
        if Input.is_action_pressed("ui_down"):
            collide = myMoveAndCollide(shift_down * delta * accel)
    
        if collide:
            hideEnemy()
            # for debug
            print("collide1,", collide)
    
    func _input(event):
        var collide
        if event is InputEventMouseButton:
            var moveShift = event.position - position
            moveShift = moveShift.normalized() * CHARACTER_SIZE / 2
            collide = myMoveAndCollide(moveShift)
        if collide:
            hideEnemy()
            # for debug
            print("collide2,", collide)
    
    
    실행 예
    시작할 때:

    오른쪽 icon 충돌 후:

    참고 자료
  • How to get the distance between a Kinematic and a Rigid body in 3D
  • Understanding node paths
  • [Godot] 콜린층과 마스크에 대해서.
  • 좋은 웹페이지 즐겨찾기