removing redundant interface "Visible"

Former-commit-id: 3ecfd08eef27d9035bcc98a4f2a6a2f4f89bab01
Former-commit-id: 08dad158f609d0aaf6f999ea17c120a966f1ada5
This commit is contained in:
Song Minjae
2016-11-14 12:23:39 +09:00
parent 4dd74381a8
commit 0b20869fa4
6 changed files with 39 additions and 40 deletions

View File

@@ -299,7 +299,7 @@ constructor() : BasicGameState() {
// draw actors // // draw actors //
///////////////// /////////////////
actorContainer.forEach { actor -> actorContainer.forEach { actor ->
if (actor is Visible && actor.inScreen() && actor !is Player) { // if echo and within screen if (actor is ActorWithBody && actor.inScreen() && actor !is Player) { // if echo and within screen
actor.drawBody(gc, actorsDrawFrameBuffer.graphics) actor.drawBody(gc, actorsDrawFrameBuffer.graphics)
} }
} }
@@ -327,7 +327,7 @@ constructor() : BasicGameState() {
// draw actor glows // // draw actor glows //
////////////////////// //////////////////////
actorContainer.forEach { actor -> actorContainer.forEach { actor ->
if (actor is Visible && actor.inScreen() && actor !is Player) { // if echo and within screen if (actor is ActorWithBody && actor.inScreen() && actor !is Player) { // if echo and within screen
actor.drawGlow(gc, actorsDrawFrameBuffer.graphics) actor.drawGlow(gc, actorsDrawFrameBuffer.graphics)
} }
} }
@@ -340,7 +340,7 @@ constructor() : BasicGameState() {
// draw reference ID if debugWindow is open // draw reference ID if debugWindow is open
if (debugWindow.isVisible) { if (debugWindow.isVisible) {
actorContainer.forEachIndexed { i, actor -> actorContainer.forEachIndexed { i, actor ->
if (actor is Visible) { if (actor is ActorWithBody) {
actorsDrawFrameBuffer.graphics.color = Color.white actorsDrawFrameBuffer.graphics.color = Color.white
actorsDrawFrameBuffer.graphics.font = Terrarum.fontSmallNumbers actorsDrawFrameBuffer.graphics.font = Terrarum.fontSmallNumbers
actorsDrawFrameBuffer.graphics.drawString( actorsDrawFrameBuffer.graphics.drawString(
@@ -463,7 +463,7 @@ constructor() : BasicGameState() {
while (i < actorContainerSize) { // loop through actorContainerInactive while (i < actorContainerSize) { // loop through actorContainerInactive
val actor = actorContainerInactive[i] val actor = actorContainerInactive[i]
val actorIndex = i val actorIndex = i
if (actor is Visible && actor.inUpdateRange()) { if (actor is ActorWithBody && actor.inUpdateRange()) {
addActor(actor) // duplicates are checked here addActor(actor) // duplicates are checked here
actorContainerInactive.removeAt(actorIndex) actorContainerInactive.removeAt(actorIndex)
actorContainerSize -= 1 actorContainerSize -= 1
@@ -491,7 +491,7 @@ constructor() : BasicGameState() {
i-- // array removed 1 elem, so we also decrement counter by 1 i-- // array removed 1 elem, so we also decrement counter by 1
} }
// inactivate distant actors // inactivate distant actors
else if (actor is Visible && !actor.inUpdateRange()) { else if (actor is ActorWithBody && !actor.inUpdateRange()) {
if (actor !is Projectile) { // if it's a projectile, just kill it. if (actor !is Projectile) { // if it's a projectile, just kill it.
actorContainerInactive.add(actor) // naïve add; duplicates are checked when the actor is re-activated actorContainerInactive.add(actor) // naïve add; duplicates are checked when the actor is re-activated
} }
@@ -533,14 +533,14 @@ constructor() : BasicGameState() {
fun Double.sqr() = this * this fun Double.sqr() = this * this
fun Int.sqr() = this * this fun Int.sqr() = this * this
private fun distToActorSqr(a: Visible, p: ActorWithBody): Double = private fun distToActorSqr(a: ActorWithBody, p: ActorWithBody): Double =
(a.hitbox.centeredX - p.hitbox.centeredX).sqr() + (a.hitbox.centeredY - p.hitbox.centeredY).sqr() (a.hitbox.centeredX - p.hitbox.centeredX).sqr() + (a.hitbox.centeredY - p.hitbox.centeredY).sqr()
/** whether the actor is within screen */ /** whether the actor is within screen */
private fun Visible.inScreen() = distToActorSqr(this, player) <= private fun ActorWithBody.inScreen() = distToActorSqr(this, player) <=
(Terrarum.WIDTH.plus(this.hitbox.width.div(2)).times(1 / Terrarum.ingame.screenZoom).sqr() + (Terrarum.WIDTH.plus(this.hitbox.width.div(2)).times(1 / Terrarum.ingame.screenZoom).sqr() +
Terrarum.HEIGHT.plus(this.hitbox.height.div(2)).times(1 / Terrarum.ingame.screenZoom).sqr()) Terrarum.HEIGHT.plus(this.hitbox.height.div(2)).times(1 / Terrarum.ingame.screenZoom).sqr())
/** whether the actor is within update range */ /** whether the actor is within update range */
private fun Visible.inUpdateRange() = distToActorSqr(this, player) <= ACTOR_UPDATE_RANGE.sqr() private fun ActorWithBody.inUpdateRange() = distToActorSqr(this, player) <= ACTOR_UPDATE_RANGE.sqr()
/** /**
* actorContainer extensions * actorContainer extensions
*/ */

View File

@@ -96,13 +96,13 @@ constructor(gamename: String) : StateBasedGame(gamename) {
gc.graphics.clear() // clean up any 'dust' in the buffer gc.graphics.clear() // clean up any 'dust' in the buffer
//addState(StateVTTest()) //addState(StateVTTest())
addState(StateTestingSandbox()) //addState(StateTestingSandbox())
//addState(StateSplash()) //addState(StateSplash())
//addState(StateMonitorCheck()) //addState(StateMonitorCheck())
//addState(StateFontTester()) //addState(StateFontTester())
//ingame = StateInGame() ingame = StateInGame()
//addState(ingame) addState(ingame)
} }
companion object { companion object {

View File

@@ -18,7 +18,7 @@ import org.newdawn.slick.Graphics
* *
* Created by minjaesong on 16-01-13. * Created by minjaesong on 16-01-13.
*/ */
open class ActorWithBody : Actor(), Visible { open class ActorWithBody : Actor() {
override var referenceID: Int = generateUniqueReferenceID() override var referenceID: Int = generateUniqueReferenceID()
override var actorValue: ActorValue = ActorValue() override var actorValue: ActorValue = ActorValue()
@@ -26,6 +26,8 @@ open class ActorWithBody : Actor(), Visible {
@Transient internal var sprite: SpriteAnimation? = null @Transient internal var sprite: SpriteAnimation? = null
@Transient internal var spriteGlow: SpriteAnimation? = null @Transient internal var spriteGlow: SpriteAnimation? = null
internal var drawMode: DrawMode = DrawMode.NORMAL
@Transient private val world: GameWorld = Terrarum.ingame.world @Transient private val world: GameWorld = Terrarum.ingame.world
var hitboxTranslateX: Double = 0.0// relative to spritePosX var hitboxTranslateX: Double = 0.0// relative to spritePosX
@@ -39,7 +41,7 @@ open class ActorWithBody : Actor(), Visible {
* * Unit: pixel * * Unit: pixel
* !! external class should not hitbox.set(); use setHitboxDimension() and setPosition() * !! external class should not hitbox.set(); use setHitboxDimension() and setPosition()
*/ */
override val hitbox = Hitbox(0.0, 0.0, 0.0, 0.0) // Hitbox is implemented using Double; val hitbox = Hitbox(0.0, 0.0, 0.0, 0.0) // Hitbox is implemented using Double;
@Transient val nextHitbox = Hitbox(0.0, 0.0, 0.0, 0.0) // 52 mantissas ought to be enough for anybody... @Transient val nextHitbox = Hitbox(0.0, 0.0, 0.0, 0.0) // 52 mantissas ought to be enough for anybody...
/** /**
@@ -898,7 +900,7 @@ open class ActorWithBody : Actor(), Visible {
private fun updateHitbox() = hitbox.reassign(nextHitbox) private fun updateHitbox() = hitbox.reassign(nextHitbox)
override fun drawGlow(gc: GameContainer, g: Graphics) { open fun drawGlow(gc: GameContainer, g: Graphics) {
if (isVisible && spriteGlow != null) { if (isVisible && spriteGlow != null) {
if (!sprite!!.flippedHorizontal()) { if (!sprite!!.flippedHorizontal()) {
spriteGlow!!.render(g, spriteGlow!!.render(g,
@@ -916,8 +918,14 @@ open class ActorWithBody : Actor(), Visible {
} }
} }
override fun drawBody(gc: GameContainer, g: Graphics) { open fun drawBody(gc: GameContainer, g: Graphics) {
if (isVisible && sprite != null) { if (isVisible && sprite != null) {
when (drawMode) {
DrawMode.NORMAL -> blendNormal()
DrawMode.MULTIPLY -> blendMul()
DrawMode.SCREEN -> blendScreen()
}
if (!sprite!!.flippedHorizontal()) { if (!sprite!!.flippedHorizontal()) {
sprite!!.render(g, sprite!!.render(g,
(hitbox.posX - hitboxTranslateX * scale).toFloat(), (hitbox.posX - hitboxTranslateX * scale).toFloat(),
@@ -934,11 +942,11 @@ open class ActorWithBody : Actor(), Visible {
} }
} }
override fun updateGlowSprite(gc: GameContainer, delta: Int) { open fun updateGlowSprite(gc: GameContainer, delta: Int) {
if (spriteGlow != null) spriteGlow!!.update(delta) if (spriteGlow != null) spriteGlow!!.update(delta)
} }
override fun updateBodySprite(gc: GameContainer, delta: Int) { open fun updateBodySprite(gc: GameContainer, delta: Int) {
if (sprite != null) sprite!!.update(delta) if (sprite != null) sprite!!.update(delta)
} }
@@ -1047,4 +1055,8 @@ fun absMax(left: Double, right: Double): Double {
} }
} }
fun Double.magnSqr() = if (this >= 0.0) this.sqr() else -this.sqr() fun Double.magnSqr() = if (this >= 0.0) this.sqr() else -this.sqr()
fun Double.sign() = if (this > 0.0) 1.0 else if (this < 0.0) -1.0 else 0.0 fun Double.sign() = if (this > 0.0) 1.0 else if (this < 0.0) -1.0 else 0.0
enum class DrawMode {
NORMAL, SCREEN, MULTIPLY
}

View File

@@ -1,19 +0,0 @@
package net.torvald.terrarum.gameactors
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
/**
* Created by minjaesong on 16-01-25.
*/
interface Visible {
val hitbox: Hitbox
fun drawBody(gc: GameContainer, g: Graphics)
fun updateBodySprite(gc: GameContainer, delta: Int)
fun drawGlow(gc: GameContainer, g: Graphics)
fun updateGlowSprite(gc: GameContainer, delta: Int)
}

View File

@@ -46,6 +46,12 @@ internal class AILuaAPI(g: Globals, actor: ActorWithBody) {
t["width"] = actor.hitbox.width t["width"] = actor.hitbox.width
t["height"] = actor.hitbox.height t["height"] = actor.hitbox.height
t["mass"] = actor.mass
t["collision_type"] = actor.collisionType
t["strength"] = actor.actorValue.getAsInt(AVKey.STRENGTH) ?: 0
val lumrgb: Int = actor.actorValue.getAsInt(AVKey.LUMINOSITY) ?: 0 val lumrgb: Int = actor.actorValue.getAsInt(AVKey.LUMINOSITY) ?: 0
val MUL_2 = LightmapRenderer.MUL_2 val MUL_2 = LightmapRenderer.MUL_2
val MUL = LightmapRenderer.MUL val MUL = LightmapRenderer.MUL
@@ -53,7 +59,7 @@ internal class AILuaAPI(g: Globals, actor: ActorWithBody) {
t["luminosity_rgb"] = lumrgb t["luminosity_rgb"] = lumrgb
t["luminosity"] = (lumrgb.div(MUL_2).and(CHMAX).times(3) + t["luminosity"] = (lumrgb.div(MUL_2).and(CHMAX).times(3) +
lumrgb.div(MUL).and(CHMAX).times(4) + lumrgb.div(MUL).and(CHMAX).times(4) +
lumrgb.and(1023)) / 8 lumrgb.and(1023)) / 8 // quick luminosity calculation
return t return t
} }

View File

@@ -6,7 +6,7 @@ import net.torvald.terrarum.tileproperties.TilePropCodex
import com.jme3.math.FastMath import com.jme3.math.FastMath
import net.torvald.colourutil.RGB import net.torvald.colourutil.RGB
import net.torvald.colourutil.CIELuvUtil.additiveLuv import net.torvald.colourutil.CIELuvUtil.additiveLuv
import net.torvald.terrarum.gameactors.Visible import net.torvald.terrarum.gameactors.ActorWithBody
import net.torvald.terrarum.tileproperties.TileNameCode import net.torvald.terrarum.tileproperties.TileNameCode
import net.torvald.terrarum.tileproperties.TilePropUtil import net.torvald.terrarum.tileproperties.TilePropUtil
import org.newdawn.slick.Color import org.newdawn.slick.Color
@@ -175,7 +175,7 @@ object LightmapRenderer {
// scan for luminous actors and store their lighting info to the lanterns // scan for luminous actors and store their lighting info to the lanterns
lanternMap.clear() lanternMap.clear()
Terrarum.ingame.actorContainer.forEach { it -> Terrarum.ingame.actorContainer.forEach { it ->
if (it is Luminous && it is Visible) { if (it is Luminous && it is ActorWithBody) {
// put lanterns to the area the luminantBox is occupying // put lanterns to the area the luminantBox is occupying
for (lightBox in it.lightBoxList) { for (lightBox in it.lightBoxList) {
val lightBoxX = it.hitbox.posX + lightBox.posX val lightBoxX = it.hitbox.posX + lightBox.posX