Projectile - noonmaru/psychics GitHub Wiki

๊ฐœ์š”

์ง€์ •ํ•œ ์†๋„๋กœ ์ด๋™ํ•˜๋Š” ํˆฌ์‚ฌ์ฒด๋ฅผ ๋ฐœ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Tap์˜ FakeProjectile์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

์ง€์ •ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ํˆฌ์‚ฌ์ฒด๋ฅผ ๋ฐœ์‚ฌํ•˜๊ณ  ๋ถ€๋”ชํžŒ ์ ์—๊ฒŒ ํ”ผํ•ด๋ฅผ ์ž…ํžˆ๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

class MyAbility : ActiveAbility<AbilityConcept>() {
    override fun onCast(target: Any?) {
        val eyeLocation = esper.player.eyeLocation
        val projectile = MyProjectile()
        psychic.launchProjectile(eyeLocation, projectile) // ํˆฌ์‚ฌ์ฒด ๋ฐœ์‚ฌ
        projectile.velocity = eyeLocation.direction // ๋ณด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ 1.0์˜ ์†๋„ ์ ์šฉ
    }

    // ํˆฌ์‚ฌ์ฒด ํด๋ž˜์Šค
    private inner class MyProjectile : PsychicProjectile(200, concept.range) {
        override fun onMove(movement: Movement) {
            //์‹ค์ œ ๋ฐœ์‚ฌ์ฒด์˜ ์ด๋™

            // ํ‹ฑ๋งˆ๋‹ค y๋ฅผ ์กฐ๊ธˆ์”ฉ ์˜ฌ๋ผ๊ฐ€๊ฒŒ ์ˆ˜์ •
            movement.to.y += 0.1
        }

        override fun onTrail(trail: Trail) {
            // trail.velocity๋Š” ์›”๋“œ๊ฐ„ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ์›€์ง์ด์ง€ ์•Š์„๋•Œ null์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.
            trail.velocity?.let { velocity ->
                val from = trail.from

                val length = velocity.normalizeAndLength() // normalize and return length

                // ์ง์„  ๊ฒฝ๋กœ ๊ด€ํ†ต ๊ณ„์‚ฐ 
                from.world.rayTrace(
                        from,
                        velocity, // normalized
                        length,
                        FluidCollisionMode.NEVER,
                        true,
                        1.0, // ๋ฐœ์‚ฌ์ฒด ํฌ๊ธฐ
                        TargetFilter(esper.player) // Psychics ๊ธฐ๋ณธ ์ (hostile) ํ•„ํ„ฐ
                )?.let { rayTraceResult ->  // ๊ด€ํ†ต ๊ณ„์‚ฐ ๊ฒฐ๊ณผ 
                    val hitEntity = rayTraceResult.hitEntity

                    if (hitEntity is LivingEntity) { // auto check null
                        concept.damage?.let { damage -> // concept์— ์ •์˜๋œ damage ์‚ฌ์šฉ
                            hitEntity.psychicDamage(damage)
                        }
                    }

                    remove() // ๋ฐœ์‚ฌ์ฒด ์ œ๊ฑฐ
                }

                val to = trail.to
                to.world.spawnParticle(Particle.FIREWORKS_SPARK, to, 1) //ํŒŒํ‹ฐํด ์†Œํ™˜
            }
        }
    }
}

onMove ์™€ onTrail ํ•จ์ˆ˜์˜ ์ฐจ์ด

  • onMove ํ•จ์ˆ˜๋Š” ํˆฌ์‚ฌ์ฒด๊ฐ€ ์ด๋™์‹œ ์ด๋™๊ฒฝ๋กœ๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์„œ๋ฒ„ ๋‚ด ์‹ค์ œ ๋ฐœ์‚ฌ์ฒด์˜ ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

  • onTrail ํ•จ์ˆ˜๋Š” ๋ฐœ์‚ฌ์ฒด์˜ ์ด๋™์ด ์ผ์–ด๋‚œ ํ›„ 2 tick ๋’ค์˜ ์›€์ง์ž„์œผ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. (trail)

    • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ Entity ์›€์ง์ž„ ์ฐจ์ด๋Š” Entity์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ์›€์ง์ž„์„ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ์—์„œ ํ”„๋ ˆ์ž„ ๋ณด๊ฐ„์ด ์ผ์–ด๋‚˜ 2 tick์ •๋„์˜ ์ฐจ์ด๊ฐ€ ๋‚˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹ค์ œ ํŒ์ •์€ ํด๋ผ์ด์–ธํŠธ์— ์œ ๋ฆฌํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด 2 tick ๋’ค์— ํ˜ธ์ถœ๋˜๋Š” onTrail ํ•จ์ˆ˜ ๋‚ด์—์„œ ๊ณ„์‚ฐํ•˜๋Š”๊ฑธ ์ถ”์ฒœ๋ฆฝ๋‹ˆ๋‹ค.