//몬스터가 추적하기 //モンスターの追跡処理 static Program.Monster_Data MoveTo(float mx, float my, float px, float py, Program.Monster_Data mon) { if (mx < px) { mon.stat.x += 0.02f; if (my < py) { mon.stat.y += 0.02f; } else { mon.stat.y -= 0.02f; } } else { mon.stat.x -= 0.02f; if (my < py) { mon.stat.y += 0.02f; } else { mon.stat.y -= 0.02f; } } return(mon); }
//데이터베이스에서 몬스터 정보 불러오기 //データベースからモンスター情報をロード public void getMonsterDB() { try { //Sample Monster string[] mon_names = { "Mon1", "Mon2" }; for (int i = 0; i < mon_names.Length; i++) { myConnection.Open(); Program.Monster_Data mon = new Program.Monster_Data(); string sql = "SELECT * FROM monsterstat WHERE Monster_ID = '" + mon_names[i] + "'"; Console.WriteLine(sql); MySqlCommand cmd = new MySqlCommand(sql, myConnection); MySqlDataReader rdr = cmd.ExecuteReader(); //データをロード while (rdr.Read()) { mon.ID_name = (string)rdr[0]; mon.HP = (int)rdr[1]; mon.stat.x = (float)rdr[2]; mon.stat.y = (float)rdr[3]; mon.stat.anime = (string)rdr[4]; mon.angle = (float)rdr[5]; mon.target_name = ""; } rdr.Close(); myConnection.Close(); Console.WriteLine(mon.ID_name + " , " + mon.HP + " , " + mon.stat.x + " , " + mon.stat.y + " , " + mon.stat.anime + " , " + mon.angle); //리스트에 추가 //リストに追加 Program.monsterList.Add(mon); } Console.WriteLine("MonList Count : " + Program.monsterList.Count); } catch (Exception e) { Console.WriteLine(" DB error : " + e.Message); } }
//몬스터 인식범위에 충돌하면 해당 클라이언트 정보를 반환 //モンスターの認識範囲へ衝突すると該当クライアント情報を返す public static void start(Program.Monster_Data mon, int index) { float mx = mon.stat.x; float my = mon.stat.y; int HP = mon.HP; Program.Client_Data player; for (int i = 0; i < Program.clientList.Count; i++) { player = Program.clientList.ToArray()[i]; float px = player.stat.x; float py = player.stat.y; //플레이어와 몬스터 사이의 거리 계산 //プレイヤーとモンスターとの間の距離を算出 double distance = Math.Sqrt((mx - px) * (mx - px) + (my - py) * (my - py)); if ((mon.target_name == "") || mon.target_name == player.ID_name) { //움직이지 않고 공격 //動かずに攻撃 if (mon.HP > 0 && distance <= 1) { //공격하는 애니메이션 메세지를 각 클라이언트에 전송 //攻撃するアニメのメッセージを各クライアントへ送信。 mon.stat.anime = "ATTACK"; } //몬스터를 중심으로 원 영역의 인식범위에 플레이어가 들어간 경우 //モンスターを中心として円領域の認識範囲にプレイヤーが入った場合の処理。 else if (mon.HP > 0 && distance <= 10) { //Console.WriteLine("몬스터 인식범위에 충돌됨!"); //몬스터의 타겟을 해당 플레이어로 설정. //モンスターのターゲットを該当プレイヤーとして設定。 mon.target_name = player.ID_name; //몬스터를 이동 //モンスターの移動 mon = MoveTo(mx, my, px, py, mon); mon.stat.anime = "MOVE"; } else { mon.stat.anime = "IDLE"; mon.target_name = ""; } } string mon_msg = "MONSTER$"; mon_msg = (mon_msg + "" + mon.ID_name + "#" + mon.stat.x + "#" + mon.stat.y + "#" + mon.stat.anime + "#" + mon.HP); //현재 몬스터 정보를 접속한 모든 플레이어에게 전송 //現在のモンスターの情報を接続した全てのプレイヤーに送信。 Program.monsterList.RemoveAt(index); Program.monsterList.Insert(index, mon); /* * Console.WriteLine("monster : " + mon_msg+", Target :"+mon.target_name); * Console.WriteLine("player id = " + player.ID_name + ", x = " + player.stat.x+" , y = "+player.stat.y); * Console.WriteLine("계산된 거리 : " + distance); */ Program.TcpMultiCast(mon_msg); } }