柵・塀については、とりあえずこんな感じで コアのコードを変更していただきたいのですがいかがでしょう? プラグイン読み込み&設置用のコードは外部モジュールで作成中。 Index: World.cs =================================================================== RCS file: /cvsroot/freetrain/FreeTrain/core/world/World.cs,v retrieving revision 1.57 diff -u -r1.57 World.cs --- World.cs 10 May 2003 17:17:21 -0000 1.57 +++ World.cs 30 Jun 2003 12:01:59 -0000 @@ -312,6 +312,15 @@ #endregion public override void draw( DrawContext dc, Point pt, int heightCutDiff ) {} + + protected override void drawFrontFence(DrawContext display, Point pt) {} + + protected override void drawBehindFence(DrawContext display, Point pt) {} + + public override void setFence( Direction d, Fence f ) {} + + public override Fence getFence( Direction d ) { return null; } + } /// <summary> *****CVS はコード 1 で終了しました***** cvs diff World.cs Voxel.cs (ディレクトリ C:\Project\FreeTrain\FreeTrain\core\world\ 内) Index: World.cs =================================================================== RCS file: /cvsroot/freetrain/FreeTrain/core/world/World.cs,v retrieving revision 1.57 diff -u -r1.57 World.cs --- World.cs 10 May 2003 17:17:21 -0000 1.57 +++ World.cs 30 Jun 2003 14:51:09 -0000 @@ -312,6 +312,15 @@ #endregion public override void draw( DrawContext dc, Point pt, int heightCutDiff ) {} + + protected override void drawFrontFence(DrawContext display, Point pt) {} + + protected override void drawBehindFence(DrawContext display, Point pt) {} + + public override void setFence( Direction d, Fence f ) {} + + public override Fence getFence( Direction d ) { return null; } + } /// <summary> Index: Voxel.cs =================================================================== RCS file: /cvsroot/freetrain/FreeTrain/core/world/Voxel.cs,v retrieving revision 1.12 diff -u -r1.12 Voxel.cs --- Voxel.cs 4 May 2003 17:57:35 -0000 1.12 +++ Voxel.cs 30 Jun 2003 14:51:09 -0000 @@ -2,6 +2,7 @@ using System.Diagnostics; using System.Drawing; using org.kohsuke.directdraw; +using freetrain.framework.graphics; namespace freetrain.world { @@ -15,6 +16,7 @@ public abstract class Voxel { public abstract Location location { get; } + protected bool showFence = true; /// <summary> /// Draws this voxel @@ -29,6 +31,28 @@ /// </param> public abstract void draw( DrawContext display, Point pt, int heightCutDiff ); + public void drawVoxel( DrawContext display, Point pt, int heightCutDiff ) + { + if( showFence ) + { + // draw behind fence + drawBehindFence(display, pt); + draw( display, pt, heightCutDiff ); + drawFrontFence(display, pt); + //draw front fence + } + else + draw( display, pt, heightCutDiff ); + } + + public abstract void setFence( Direction d, Fence f ); + + public abstract Fence getFence( Direction d ); + + protected abstract void drawFrontFence(DrawContext display, Point pt); + + protected abstract void drawBehindFence(DrawContext display, Point pt); + /// <summary> /// Processes a mouse click. /// </summary> @@ -76,7 +100,10 @@ [Serializable] public abstract class AbstractVoxelImpl : Voxel { - protected AbstractVoxelImpl( int x, int y, int z ) : this(new Location(x,y,z)) { + protected Fence[] fence = new Fence[4]; + + protected AbstractVoxelImpl( int x, int y, int z ) : this(new Location(x,y,z)) + { } protected AbstractVoxelImpl( Location _loc) { @@ -87,6 +114,40 @@ private readonly Location loc; public override Location location { get { return loc; } } + + protected override void drawFrontFence(DrawContext display, Point pt) + { + Fence f; + f =fence[(Direction.SOUTH).index/2]; + if(f!=null) + f.drawFence( display.surface,pt,Direction.SOUTH ); + f =fence[(Direction.WEST).index/2]; + if(f!=null) + f.drawFence( display.surface,pt,Direction.WEST ); + } + + protected override void drawBehindFence(DrawContext display, Point pt) + { + Fence f; + f =fence[(Direction.NORTH).index/2]; + if(f!=null) + f.drawFence( display.surface,pt,Direction.NORTH ); + f =fence[(Direction.EAST).index/2]; + if(f!=null) + f.drawFence( display.surface,pt,Direction.EAST ); + } + + public override void setFence( Direction d, Fence f ) + { + fence[d.index/2] = f; + } + + public override Fence getFence( Direction d ) + { + return fence[d.index/2]; + + } + } @@ -107,5 +168,19 @@ /// false if directly below the ground. /// </param> bool drawGround( bool above ); + } + + /// <summary> + /// The interface called when the fence should be drawn. + /// </summary> + public interface Fence + { + /// <summary> + /// called when the fehce should be drawn. + /// </summary> + /// <param name="d">one of the 4 directions (N,E,W,S)</param> + void drawFence( Surface surface, Point pt, Direction d ); + + string fence_id { get; } } } Index: QuarterViewDrawer.cs =================================================================== RCS file: /cvsroot/freetrain/FreeTrain/core/views/QuarterViewDrawer.cs,v retrieving revision 1.7 diff -u -r1.7 QuarterViewDrawer.cs --- QuarterViewDrawer.cs 26 Jan 2003 17:26:19 -0000 1.7 +++ QuarterViewDrawer.cs 30 Jun 2003 14:52:28 -0000 @@ -337,7 +337,7 @@ } if(voxel!=null) - voxel.draw( drawContext, pt, noHeightCut?-1:(Z-z) ); + voxel.drawVoxel( drawContext, pt, noHeightCut?-1:(Z-z) ); if(overlay!=null) overlay.drawVoxel( this, drawContext, world.toXYZ(h,v,z), pt ); } _______________________________________________ FreeTrain-general mailing list FreeTrain-general@lists.sourceforge.jp http://lists.sourceforge.jp/mailman/listinfo/freetrain-general