Rev 1546 |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.ComponentModel;
using BauzoidNET.parser;
using BauzoidNET.graphics.sprite;
using BauzoidNET.graphics;
using BauzoidNET.math;
using BurutaruEditor.view;
namespace BurutaruEditor
.file.enemies
{
public class CoreMechEnemySpawner
: EnemySpawner
{
public const float ENEMY_WIDTH
= 50;
public const float ENEMY_HEIGHT
= 2*ENEMY_WIDTH
;
public const float MOVE_SPEED
= 150;
//=================================================================================================================================
[Category
("Formation")]
public float MoveSpeed
{ get
; set
; }
[Category
("Formation")]
public float Phase1StartTime
{ get
; set
; }
private Vector2 mPhase1Direction
= new Vector2
();
[Category
("Formation")]
[TypeConverter
(typeof(ExpandableObjectConverter
))]
public Vector2 Phase1Direction
{ get
{ return mPhase1Direction
; } set
{ mPhase1Direction
= value
; } }
[Category
("Formation")]
public float Phase2StartTime
{ get
; set
; }
private Vector2 mPhase2Direction
= new Vector2
();
[Category
("Formation")]
[TypeConverter
(typeof(ExpandableObjectConverter
))]
public Vector2 Phase2Direction
{ get
{ return mPhase2Direction
; } set
{ mPhase2Direction
= value
; } }
//=================================================================================================================================
public CoreMechEnemySpawner
(Document doc,
string name
)
: base(doc, name
)
{
MoveSpeed
= MOVE_SPEED
;
Phase1StartTime
= 1
.3f
;
Phase1Direction
.set(-1
.0f, 1
.0f
);
Phase2StartTime
= 3
.0f
;
Phase2Direction
.set(-1
.0f,
-1
.0f
);
}
public override void Render
()
{
base.Render();
float triggerX
= SpawnTrigger
.x + Doc
.View.CurrentPosition.x;
float triggerY
= SpawnTrigger
.y + Doc
.View.CurrentPosition.y;
SpriteTransform t
= DocumentView
.Resources.CoreMechEnemySprite.getSpriteTransform();
t
.x = triggerX
+ SpawnPosition
.x;
t
.y = triggerY
+ SpawnPosition
.y;
t
.w = ENEMY_WIDTH
;
t
.h = ENEMY_HEIGHT
;
t
.centerPivot();
DocumentView
.Resources.CoreMechEnemySprite.getSpriteInstance().color.setFrom(mMultiplyColor
);
DocumentView
.Resources.CoreMechEnemySprite.getSpriteInstance().color.w = mMultiplyFactor
;
DocumentView
.Resources.CoreMechEnemySprite.getSpriteInstance().fogColor.setFrom(mLerpColor
);
DocumentView
.Resources.CoreMechEnemySprite.getSpriteInstance().fogColor.w = mLerpFactor
;
DocumentView
.Resources.CoreMechEnemySprite.render();
float w
= MainForm
.App.getGraphics().getFont().getTextWidth(this.Name, Document
.TEXT_SCALE);
MainForm
.App.getGraphics().getFont().drawTextDirect(this.Name, t
.x - w
/ 2, t
.y + ENEMY_HEIGHT
/ 2, Document
.TEXT_COLOR, Document
.TEXT_SCALE);
RenderUtil
.drawArrow(MainForm
.App.getGraphics(), triggerX, triggerY, t
.x, t
.y, ARROW_COLOR
);
}
public override void RenderSelected
(int selectedPart,
bool forHover
= false)
{
if (selectedPart
!= PART_SPAWN_POSITION
)
{
base.RenderSelected(selectedPart, forHover
);
}
float posX
= SpawnTrigger
.x + SpawnPosition
.x + Doc
.View.CurrentPosition.x;
float posY
= SpawnTrigger
.y + SpawnPosition
.y + Doc
.View.CurrentPosition.y;
float halfWidth
= ENEMY_WIDTH
/ 2 + DocumentView
.SELECTION_FRAME_OFFSET;
float halfHeight
= ENEMY_HEIGHT
/ 2 + DocumentView
.SELECTION_FRAME_OFFSET;
if (forHover
)
Doc
.View.RenderSelectionFrame(posX
- halfWidth, posY
- halfHeight, posX
+ halfWidth, posY
+ halfHeight, DocumentView
.SELECTION_FRAME_HOVER_ALPHA);
else
Doc
.View.RenderSelectionFrame(posX
- halfWidth, posY
- halfHeight, posX
+ halfWidth, posY
+ halfHeight
);
}
public override bool IsInside
(float x,
float y,
out int selectedPart
)
{
if (base.IsInside(x, y,
out selectedPart
))
return true;
float px
= SpawnTrigger
.x + SpawnPosition
.x + Doc
.View.CurrentPosition.x;
float py
= SpawnTrigger
.y + SpawnPosition
.y + Doc
.View.CurrentPosition.y;
if ((Math
.Abs(px
- x
) <= (ENEMY_WIDTH
/ 2)) && (Math
.Abs(py
- y
) < (ENEMY_HEIGHT
/ 2)))
{
selectedPart
= PART_SPAWN_POSITION
;
return true;
}
return false;
}
public override void MoveBy
(float dx,
float dy,
int selectedPart
)
{
if (selectedPart
== PART_SPAWN_POSITION
)
{
SpawnPosition
.x += (dx
/ Doc
.View.ZoomFactor);
SpawnPosition
.y += (dy
/ Doc
.View.ZoomFactor);
}
else
{
SpawnTrigger
.x += (dx
/ Doc
.View.ZoomFactor);
SpawnTrigger
.y += (dy
/ Doc
.View.ZoomFactor);
}
}
public override string GetPropertiesType
()
{
return "CoreMechEnemy";
}
public override void WriteData
(TextWriter tw
)
{
base.WriteData(tw
);
tw
.WriteLine("\tmoveSpeed " + MoveSpeed
+ ";");
tw
.WriteLine("\tstartPhase1 " + Phase1StartTime
+ ";");
tw
.WriteLine("\tdirectionPhase1 " + mPhase1Direction
.x + ", " + mPhase1Direction
.y + ";");
tw
.WriteLine("\tstartPhase2 " + Phase2StartTime
+ ";");
tw
.WriteLine("\tdirectionPhase2 " + mPhase2Direction
.x + ", " + mPhase2Direction
.y + ";");
}
public override void WriteData
(Serializer s
)
{
base.WriteData(s
);
s
.Write("moveSpeed"); s
.Write(MoveSpeed
);
s
.Write("startPhase1"); s
.Write(Phase1StartTime
);
s
.Write("directionPhase1"); s
.Write(mPhase1Direction
);
s
.Write("startPhase2"); s
.Write(Phase2StartTime
);
s
.Write("directionPhase2"); s
.Write(mPhase2Direction
);
}
public override bool ReadParameter
(Tokenizer t,
String id
)
{
if (id
.Equals("moveSpeed", StringComparison
.OrdinalIgnoreCase))
{
MoveSpeed
= t
.readNumber();
}
else if (id
.Equals("startPhase1", StringComparison
.OrdinalIgnoreCase))
{
Phase1StartTime
= t
.readNumber();
}
else if (id
.Equals("directionPhase1", StringComparison
.OrdinalIgnoreCase))
{
mPhase1Direction
= ParseUtil
.readVector2(t
);
}
else if (id
.Equals("startPhase2", StringComparison
.OrdinalIgnoreCase))
{
Phase2StartTime
= t
.readNumber();
}
else if (id
.Equals("directionPhase2", StringComparison
.OrdinalIgnoreCase))
{
mPhase2Direction
= ParseUtil
.readVector2(t
);
}
else
{
return base.ReadParameter(t, id
);
}
t
.readToken(";");
return true;
}
}
}