OSDN Git Service

doc added
[h58pcdgame/GameScriptCoreLibrary.git] / www / corelib / classes / EnemyCharacterClass.js
1 var EnemyCharacterClass = function(stage, args){
2         EnemyCharacterClass.base.apply(this, arguments);
3         
4         this.movingVelocity = 150;
5         
6         //メインキャラクターを追跡する場合はtrue
7         this.chasing = true;
8         //メインキャラクターを感知する範囲(原点距離がこれ以内の場合に追跡をする。)
9         this.chasingRange = 200;
10         this.fightingRange = 32;
11         this.chasingMode = 0;
12         this.lastCollidedTick = 0;
13         //他のキャラクターに与えるダメージの設定
14         this.touchDamage = 10;
15         this.damagePerTickBase = 60;
16         this.damagePerTickCount = this.damagePerTickBase;
17         this.damageLastTick = 0;
18         this.damaging = false;
19         //メインキャラクターから受けるダメージの設定
20         this.hurt = 10;
21         this.hurtPerTickBase = 60;
22         this.hurtPerTickCount = this.hurtPerTickBase;
23         this.hurtLastTick = 0;
24         this.hurting = false;
25         //
26         this.max_HP = 20;
27         this.HP = this.max_HP;
28         this.isWeaponed = false;
29 }.extend(OperatedCharacterClass, {
30         className: "EnemyCharacterClass",
31         tick : function()
32         {
33                 var main = this.ownerStage.userControlledCharacter;
34                 var distX = main.origin.x - this.origin.x - ((this.chasingMode == 0) ? this.fightingRange : -this.fightingRange);
35                 if(this.chasing && Math.abs(distX) <= this.chasingRange && Math.abs(this.origin.y - main.origin.y) <= this.chasingRange){
36                         //追跡処理
37                         if(distX > 0){
38                                 this.goRight();
39                                 if(this.chasingMode == 0){
40                                         this.chasingMode = 1;
41                                 }
42                         } else{
43                                 this.goLeft();
44                                 if(this.chasingMode == 1){
45                                         this.chasingMode = 0;
46                                 }
47                         }
48                         //攻撃処理
49                         if(this.isWeaponed){
50                                 this.fire();
51                         }
52                 }
53                 //メインキャラへのダメージ
54                 if(this.damaging){
55                         if(this.damagePerTickCount == this.damagePerTickBase){
56                                 main.damage(this.touchDamage);
57                                 this.damagePerTickCount--;
58                         } else{
59                                 this.damagePerTickCount--;
60                                 if(this.damagePerTickCount <= 0){
61                                         this.damagePerTickCount = this.damagePerTickBase;
62                                 }
63                         }
64                 }
65                 //自分自身のダメージ
66                 if(this.hurting){
67                         if(this.hurtPerTickCount == this.hurtPerTickBase){
68                                 this.damage(this.hurt);
69                                 this.hurtPerTickCount--;
70                         } else{
71                                 this.hurtPerTickCount--;
72                                 if(this.hurtPerTickCount <= 0){
73                                         this.hurtPerTickCount = this.hurtPerTickBase;
74                                 }
75                         }
76                 }
77                 if(this.lastCollidedTick + 10 < this.ownerStage.manager.tickCount){
78                         if(this.hurting){
79                                 //自分自身のダメージ無効
80                                 this.hurting = false;
81                         }
82                         if(this.damaging){
83                                 //キャラクターへのダメージ無効
84                                 this.damaging = false;
85                         }
86                 }
87                 //落下後の死亡処理
88                 if(this.origin.y > 1000)
89                 {
90                         this.ownerStage.removeStageObject(this);
91                 }
92                 
93                 EnemyCharacterClass.base.prototype.tick.apply(this);
94         },
95         damage: function(d){
96                 //自分自身へのダメージ
97                 this.HP -= d;
98                 if(this.HP <= 0){
99                         this.ownerStage.removeStageObject(this);
100                 }
101         },
102         objectAttacked : function(obj, obj_x, obj_y, direction)
103         {
104                 if(obj instanceof MainCharacterClass)
105                 {
106                         //メインキャラクターに衝突された
107                         //ダメージの開始・終了処理
108                         if(direction & CollideTop){
109                                 if(!this.hurting){
110                                         //自分自身のダメージ有効
111                                         this.hurting = true;
112                                         this.hurtPerTickCount = this.hurtPerTickBase;
113                                 }
114                         } else{
115                                 if(direction & (CollideLeft | CollideRight)){
116                                         if(!this.damaging){
117                                                 //メインキャラクタへのダメージ有効
118                                                 this.damaging = true;
119                                                 this.damagePerTickCount = this.damagePerTickBase;
120                                         }
121                                 }
122                         }
123                         this.lastCollidedTick = this.ownerStage.manager.tickCount;
124                 }
125         },
126         draw: function(x, y){
127                 if(this.hurt > 0)
128                 {
129                         EnemyCharacterClass.base.prototype.draw.apply(this, arguments);
130                         this.ownerStage.mainContext.save();
131                         //this.ownerStage.mainContext.fillStyle = "rgba(255,255,255,0.5)";
132                         //this.ownerStage.mainContext.strokeStyle = "rgba(0, 0, 0, 1)";
133                         //this.ownerStage.mainContext.font = "normal 12px sans-serif";
134                         //drawText(this.ownerStage.mainContext, this.HP, x, y - 20);
135                         
136                         
137                         var backColor = "gray";
138                         var thickness = 4;
139                         var barWidth = this.max_HP;
140                         if(barWidth < 16) barWidth = 16;
141                         var barPerHP = this.HP / this.max_HP;
142                         var color = "green";
143                         
144                         if(barPerHP < 0.2)
145                         {
146                                 var backColor = "red";
147                         }else if(barPerHP < 0.4)
148                         {
149                                 var backColor = "yellow";
150                         }
151                         
152                         this.ownerStage.mainContext.fillStyle = backColor;
153                         this.ownerStage.mainContext.fillRect(x + (this.size.x - barWidth) / 2, y - thickness, barWidth, thickness);
154                         this.ownerStage.mainContext.fillStyle = color;
155                         this.ownerStage.mainContext.fillRect(x + (this.size.x - barWidth) / 2, y - thickness, barWidth * barPerHP, thickness);
156                         
157                         this.ownerStage.mainContext.restore();
158                 }
159         },
160 });