diff --git a/GameEngine/resources/GameEngineTest.model b/GameEngine/resources/GameEngineTest.model index 3199a45..9d48131 100644 --- a/GameEngine/resources/GameEngineTest.model +++ b/GameEngine/resources/GameEngineTest.model @@ -91,17 +91,18 @@ native channel SceneUpdateEvent { out scene.time(time:Long,updateEvent(dt:Long)) = (time+dt) } -channel RotateEnemy(eid:Str) { - in enemies.{eid:Str}.transform.rotation(curRot:Json,rotateEnemy(nextRot)) = nextRot - out enemies.{eid:Str}.transform.rotation(curRot:Json,rotateEnemy(nextRot)) = nextRot -} -channel MoveEnemy(eid:Str) { - in enemies.{eid:Str}.transform.position(curPos:Json,moveEnemy(nextPos)) = nextPos - out scene.entities.{eid:Str}.transform.position(curPos:Json,moveEnemy(nextPos)) = nextPos -} native channel TimerEvent(tid:Str) { out timers.{tid:Str}.count(count:Long,tick()) = (count+1) } +channel ClearTimer { + out timers(timers:Map,clearTimer(tid:Str)) = delete(timers,tid) +} +channel StartTimer { + out timers(timers:Map,startTimer(tid:Str,interval:Long)) = insert(timers,tid,{ + "count": 0, + "interval": interval +}) +} channel UpdateCameraPosition { out scene.camera.transform.position(curPos:Json,updateCameraPosition(x:Double,y:Double,z:Double)) = { "x": x, @@ -109,6 +110,19 @@ "z": z } } +native channel EntityPositionUpdate(eid:Str) { + in scene.entities.{eid:Str}.transform.position(curPos:Json,updatePosition(nextPos.x,nextPos.y,nextPos.z)) = nextPos +} +channel MoveEnemy(eid:Str) { + in enemies.{eid:Str}.transform.position(curPos:Json,moveEnemy(nextPos)) = nextPos + out scene.entities.{eid:Str}.transform.position(curPos:Json,moveEnemy(nextPos)) = nextPos +} +native channel CameraProjectionUpdate { + in scene.camera.projection(curProj:Json,updateProjection(curProj,nextProj)) = nextProj +} +native channel CameraScaleUpdate { + in scene.camera.transform.scale(curScale:Json,updateScale(nextScale.x,nextScale.y,nextScale.z)) = nextScale +} native channel EntitySpriteUpdate(eid:Str) { in scene.entities.{eid:Str}.mesh(curMesh:Json,updateSprite(spritePath:Str)) = { "sprite": spritePath, @@ -122,15 +136,15 @@ in enemies.{eid:Str}.transform.rotation(curRot:Json,rotateEnemy(nextRot)) = nextRot out enemies.{eid:Str}.transform.rotation(curRot:Json,rotateEnemy(nextRot)) = nextRot } -native channel EntityPositionUpdate(eid:Str) { - in scene.entities.{eid:Str}.transform.position(curPos:Json,updatePosition(nextPos.x,nextPos.y,nextPos.z)) = nextPos +channel UpdateEnemy(tid:Str, eid:Str) { + in timers.{tid:Str}.count(curCount:Long,updateEnemy(type,speed)) = nextCount + ref enemies.{eid:Str}.move.speed(speed:Float,updateEnemy(type,speed)) + ref enemies.{eid:Str}.move.type(type:Str,updateEnemy(type,speed)) + out enemies.{eid:Str}.transform.position(curPos:Json,updateEnemy(type,speed)) = { + "x": curPos.x, + "y": (curPos.y+speed), + "z": curPos.z } -channel MoveEnemy(eid:Str) { - in enemies.{eid:Str}.transform.position(curPos:Json,moveEnemy(nextPos)) = nextPos - out scene.entities.{eid:Str}.transform.position(curPos:Json,moveEnemy(nextPos)) = nextPos -} -native channel CameraProjectionUpdate { - in scene.camera.projection(curProj:Json,updateProjection(curProj,nextProj)) = nextProj } native channel TimersUpdated { in timers(curTimers:Map,update(curTimers,nextTimers)) = nextTimers @@ -141,9 +155,6 @@ native channel SceneUpdate { in scene(curSc:Json,update(curSc,nextSc)) = nextSc } -native channel CameraScaleUpdate { - in scene.camera.transform.scale(curScale:Json,updateScale(nextScale.x,nextScale.y,nextScale.z)) = nextScale -} native channel EntityRotationUpdate(eid:Str) { in scene.entities.{eid:Str}.transform.rotation(curRot:Json,updateRotation(nextRot.x,nextRot.y,nextRot.z)) = nextRot } diff --git a/GameEngine/src/main/java/gameEngine/GameEngineModelFileGenerator.java b/GameEngine/src/main/java/gameEngine/GameEngineModelFileGenerator.java index a057283..e48e5dd 100644 --- a/GameEngine/src/main/java/gameEngine/GameEngineModelFileGenerator.java +++ b/GameEngine/src/main/java/gameEngine/GameEngineModelFileGenerator.java @@ -16,9 +16,13 @@ import simulator.SystemState; import simulator.interfaces.timers.TimerService; +import javax.xml.crypto.Data; import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; public class GameEngineModelFileGenerator { private DataTransferModel model; @@ -90,8 +94,8 @@ addNativeChannel( new DataTransferChannel("SceneUpdateEvent"), - new ChannelDefinition( - ChannelDefinition.ChannelType.In, + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.Out, scene_time, "time: Long", "updateEvent(dt: Long)", @@ -101,8 +105,8 @@ addNativeChannel( new DataTransferChannel("SceneUpdate"), - new ChannelDefinition( - ChannelDefinition.ChannelType.Out, + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.In, scene, "curSc: Json", "update(curSc, nextSc)", @@ -112,8 +116,8 @@ addNativeChannel( new DataTransferChannel("CameraPositionUpdate"), - new ChannelDefinition( - ChannelDefinition.ChannelType.Out, + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.In, scene_camera_transform_position, "curPos: Json", "updatePosition(nextPos.x, nextPos.y, nextPos.z)", @@ -123,8 +127,8 @@ addNativeChannel( new DataTransferChannel("CameraRotationUpdate"), - new ChannelDefinition( - ChannelDefinition.ChannelType.Out, + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.In, scene_camera_transform_rotation, "curRot: Json", "updateRotation(nextRot.x, nextRot.y, nextRot.z)", @@ -134,8 +138,8 @@ addNativeChannel( new DataTransferChannel("CameraScaleUpdate"), - new ChannelDefinition( - ChannelDefinition.ChannelType.Out, + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.In, scene_camera_transform_scale, "curScale: Json", "updateScale(nextScale.x, nextScale.y, nextScale.z)", @@ -145,8 +149,8 @@ addNativeChannel( new DataTransferChannel("CameraProjectionUpdate"), - new ChannelDefinition( - ChannelDefinition.ChannelType.Out, + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.In, scene_camera_projection, "curProj: Json", "updateProjection(curProj, nextProj)", @@ -156,8 +160,8 @@ addNativeChannel( new DataTransferChannel("EntityPositionUpdate", new Variable("eid", DataConstraintModel.typeString)), - new ChannelDefinition( - ChannelDefinition.ChannelType.Out, + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.In, entity_transform_position, "curPos: Json", "updatePosition(nextPos.x, nextPos.y, nextPos.z)", @@ -167,8 +171,8 @@ addNativeChannel( new DataTransferChannel("EntityRotationUpdate", new Variable("eid", DataConstraintModel.typeString)), - new ChannelDefinition( - ChannelDefinition.ChannelType.Out, + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.In, entity_transform_rotation, "curRot: Json", "updateRotation(nextRot.x, nextRot.y, nextRot.z)", @@ -178,8 +182,8 @@ addNativeChannel( new DataTransferChannel("EntityScaleUpdate", new Variable("eid", DataConstraintModel.typeString)), - new ChannelDefinition( - ChannelDefinition.ChannelType.Out, + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.In, entity_transform_scale, "curScale: Json", "updateScale(nextScale.x, nextScale.y, nextScale.z)", @@ -189,8 +193,8 @@ addNativeChannel( new DataTransferChannel("EntitySpriteUpdate", new Variable("eid", DataConstraintModel.typeString)), - new ChannelDefinition( - ChannelDefinition.ChannelType.Out, + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.In, entity_mesh, "curMesh: Json", "updateSprite(spritePath: Str)", @@ -200,8 +204,8 @@ addNativeChannel( new DataTransferChannel("KeyEvent", new Variable("kno", DataConstraintModel.typeInt)), - new ChannelDefinition( - ChannelDefinition.ChannelType.In, + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.Out, key_state, "curState: Int", "keyEvent(nextState)", @@ -211,8 +215,8 @@ addNativeChannel( new DataTransferChannel("TimersUpdated"), - new ChannelDefinition( - ChannelDefinition.ChannelType.Out, + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.In, timers, "curTimers: Map", "update(curTimers, nextTimers)", @@ -222,8 +226,8 @@ addNativeChannel( new DataTransferChannel("TimerEvent", new Variable("tid", DataConstraintModel.typeString)), - new ChannelDefinition( - ChannelDefinition.ChannelType.In, + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.Out, timer_count, "count: Long", "tick()", @@ -233,8 +237,8 @@ addChannel( new DataTransferChannel("UpdateCameraPosition"), - new ChannelDefinition( - ChannelDefinition.ChannelType.In, + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.Out, scene_camera_transform_position, "curPos: Json", "updateCameraPosition(x: Double, y: Double, z: Double)", @@ -243,14 +247,14 @@ addChannel( new DataTransferChannel("MoveEnemy", new Variable("eid", DataConstraintModel.typeString)), - new ChannelDefinition( - ChannelDefinition.ChannelType.Out, + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.In, enemy_transform_position, "curPos: Json", "moveEnemy(nextPos)", "nextPos"), - new ChannelDefinition( - ChannelDefinition.ChannelType.In, + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.Out, entity_transform_position, "curPos: Json", "moveEnemy(nextPos)", @@ -259,20 +263,68 @@ addChannel( new DataTransferChannel("RotateEnemy", new Variable("eid", DataConstraintModel.typeString)), - new ChannelDefinition( - ChannelDefinition.ChannelType.Out, + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.In, enemy_transform_rotation, "curRot: Json", "rotateEnemy(nextRot)", "nextRot"), - new ChannelDefinition( - ChannelDefinition.ChannelType.In, + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.Out, enemy_transform_rotation, "curRot: Json", "rotateEnemy(nextRot)", "nextRot") ); + addChannel( + new DataTransferChannel("UpdateEnemy", Arrays.asList( + new Variable("tid", DataConstraintModel.typeString), + new Variable("eid", DataConstraintModel.typeString))), + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.In, + timer_count, + "curCount: Long", + "updateEnemy(type, speed)", + "nextCount"), + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.Ref, + enemy_move_type, + "type: Str", + "updateEnemy(type, speed)"), + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.Ref, + enemy_move_speed, + "speed: Float", + "updateEnemy(type, speed)"), + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.Out, + enemy_transform_position, + "curPos: Json", + "updateEnemy(type, speed)", + "{\"x\": curPos.x, \"y\": curPos.y + speed, \"z\": curPos.z}") + ); + + addChannel( + new DataTransferChannel("StartTimer"), + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.Out, + timers, + "timers: Map", + "startTimer(tid: Str, interval: Long)", + "insert(timers, tid, {\"interval\": interval, \"count\": 0})") + ); + + addChannel( + new DataTransferChannel("ClearTimer"), + new ChannelMemberDefinition( + ChannelMemberDefinition.ChannelMemberType.Out, + timers, + "timers: Map", + "clearTimer(tid: Str)", + "delete(timers, tid)") + ); + if (stream.hasNext()) stream.next(); @@ -402,32 +454,38 @@ } } - public DataTransferChannel addNativeChannel(DataTransferChannel dataTransferChannel, ChannelDefinition... definitions) throws ExpectedRightBracket, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { + public DataTransferChannel addNativeChannel(DataTransferChannel dataTransferChannel, ChannelMemberDefinition... definitions) throws ExpectedRightBracket, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { dataTransferChannel.setNative(true); return addChannel(dataTransferChannel, definitions); } - public DataTransferChannel addChannel(DataTransferChannel dataTransferChannel, ChannelDefinition... definitions) + public DataTransferChannel addChannel(DataTransferChannel dataTransferChannel, ChannelMemberDefinition... definitions) throws ExpectedRightBracket, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { DataTransferChannel channel = dataTransferChannel; + boolean hasInputChannel = false; - for (ChannelDefinition def : definitions) { - ChannelMember member = addChannelMember(stream, parser, def.path, def.curStateName, def.messageName, def.nextStateName); - if (def.channelType == ChannelDefinition.ChannelType.Out) { - channel.addChannelMemberAsInput(member); - model.addChannel(channel); - } else if (def.channelType == ChannelDefinition.ChannelType.In) { + for (ChannelMemberDefinition def : definitions) { + if (def.channelType == ChannelMemberDefinition.ChannelMemberType.Out) { + ChannelMember member = addChannelMember(stream, parser, def.path, def.curStateName, def.messageName, def.nextStateName); channel.addChannelMemberAsOutput(member); - model.addInputChannel(channel); - } else if (def.channelType == ChannelDefinition.ChannelType.Ref){ + } else if (def.channelType == ChannelMemberDefinition.ChannelMemberType.In) { + ChannelMember member = addChannelMember(stream, parser, def.path, def.curStateName, def.messageName, def.nextStateName); + channel.addChannelMemberAsInput(member); + hasInputChannel = true; + } else if (def.channelType == ChannelMemberDefinition.ChannelMemberType.Ref){ + ChannelMember member = addChannelMember(stream, parser, def.path, def.curStateName, def.messageName); channel.addChannelMemberAsReference(member); - model.addChannel(channel); } } + if(hasInputChannel) model.addChannel(channel); + else model.addInputChannel(channel); + return channel; } + //inが一つでもあればInputChannel + private ChannelMember addChannelMember(TokenStream stream, Parser parser, ResourcePath path, String curStateName, String messageName, String nextStateName) throws ExpectedRightBracket, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { ChannelMember member = new ChannelMember(path); stream.addLine(curStateName); @@ -442,16 +500,27 @@ return member; } + private ChannelMember addChannelMember(TokenStream stream, Parser parser, ResourcePath path, String curStateName, String messageName) throws ExpectedRightBracket, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { + ChannelMember member = new ChannelMember(path); + stream.addLine(curStateName); + Expression curState = parser.parseTerm(stream, model); + stream.addLine(messageName); + Expression message = parser.parseTerm(stream, model); + member.getStateTransition().setCurStateExpression(curState); + member.getStateTransition().setMessageExpression(message); + return member; + } - public class ChannelDefinition { - public enum ChannelType{In, Out, Ref} - public final ChannelType channelType; + + public class ChannelMemberDefinition { + public enum ChannelMemberType {In, Out, Ref} + public final ChannelMemberType channelType; public final ResourcePath path; public final String curStateName; public final String messageName; - public final String nextStateName; + public String nextStateName; - public ChannelDefinition(ChannelType channelType, ResourcePath path ,String curStateName, String messageName, String nextStateName) { + public ChannelMemberDefinition(ChannelMemberType channelType, ResourcePath path , String curStateName, String messageName, String nextStateName) { this.path = path; this.channelType = channelType; this.curStateName = curStateName; @@ -459,6 +528,13 @@ this.nextStateName = nextStateName; } + public ChannelMemberDefinition(ChannelMemberType channelType, ResourcePath path , String curStateName, String messageName) { + this.path = path; + this.channelType = channelType; + this.curStateName = curStateName; + this.messageName = messageName; + } + } }