/*------------------------------------------------------------------------- * 街名描画 * 上陸地点も含む * ---------------------------------------------------------------------------*/ private void draw_cityname_proc(Vector2 offset, LoopXImage image) { if (m_lib.setting.map_icon == MapIcon.Big) { // 大きいアイコン foreach (GvoWorldInfo.Info i in m_world.NoSeas) { Vector2 p = image.GlobalPos2LocalPos(transform.ToVector2(i.position), offset); if (i.IconRect != null) { m_lib.device.sprites.AddDrawSprites(new Vector3(p.X, p.Y, 0.3f), i.IconRect); } if (m_lib.setting.map_draw_names == MapDrawNames.Hide) { continue; } if (i.NameRect == null) { continue; } p.X += i.StringOffset1.X; p.Y += i.StringOffset1.Y; m_lib.device.sprites.AddDrawSprites(new Vector3(p.X, p.Y, 0.3f), i.NameRect); } } else { // 小さいアイコン foreach (GvoWorldInfo.Info i in m_world.NoSeas) { Vector2 p = image.GlobalPos2LocalPos(transform.ToVector2(i.position), offset); if (i.SmallIconRect != null) { m_lib.device.sprites.AddDrawSprites(new Vector3(p.X, p.Y, 0.3f), i.SmallIconRect); } if (m_lib.setting.map_draw_names == MapDrawNames.Hide) { continue; } if (i.NameRect == null) { continue; } p.X += i.StringOffset2.X; p.Y += i.StringOffset2.Y; m_lib.device.sprites.AddDrawSprites(new Vector3(p.X, p.Y, 0.3f), i.NameRect); } } }
private void draw_namerects(Vector2 offset, LoopXImage image, hittest_list list) { foreach (GvoWorldInfo.Info i in list) { if (i.NameRect == null) { continue; } Vector2 p = image.GlobalPos2LocalPos(transform.ToVector2(i.position), offset); if (m_lib.setting.map_icon == MapIcon.Big) { // 대 아이콘 p.X += i.StringOffset1.X; p.Y += i.StringOffset1.Y; } else { // 소 아이콘 p.X += i.StringOffset2.X; p.Y += i.StringOffset2.Y; } m_lib.device.sprites.AddDrawSpritesNC(new Vector3(p.X, p.Y, 0.3f), i.NameRect, i.angle, -1); } }
/*------------------------------------------------------------------------- * 線描画 * 1000刻みでの線となる * ---------------------------------------------------------------------------*/ static public void DrawLines(gvt_lib lib) { lib.loop_image.EnumDrawCallBack(new LoopXImage.DrawHandler(draw_lines_proc), 0); // 縦方向は1回の描画でよい LoopXImage image = lib.loop_image; Vector2 size = image.Device.client_size; Vector2 offset = image.GetDrawOffset(); int index = 0; for (float y = 0; y < def.GAME_HEIGHT; y += 1000, index++) { // 地図座標に変換 Vector2 pos0 = transform.game_pos2_map_pos(new Vector2(0, y), image); Vector2 pos = image.GlobalPos2LocalPos(pos0, offset); if (pos.Y < 0) { continue; } if (pos.Y >= size.Y) { continue; } image.Device.DrawLine(new Vector3(0, pos.Y, 0.79f), new Vector2(size.X, pos.Y), Color.FromArgb(128, 0, 0, 0).ToArgb()); } }
/*------------------------------------------------------------------------- * 海域名描画 * ---------------------------------------------------------------------------*/ private void draw_seaname_proc(Vector2 offset, LoopXImage image) { d3d_sprite_rects.rect _rect = m_lib.seainfonameimage.GetWindArrowIcon(); int color1 = (m_world.Season.now_season == gvo_season.season.summer)? -1: (96 << (8 * 3)) | 0x00ffffff; int color2 = (m_world.Season.now_season == gvo_season.season.winter)? -1: (96 << (8 * 3)) | 0x00ffffff; int index = 0; foreach (GvoWorldInfo.Info i in m_world.Seas) { Vector2 p = image.GlobalPos2LocalPos(transform.ToVector2(i.position), offset); // 海域名 m_lib.device.sprites.AddDrawSprites(new Vector3(p.X - 6, p.Y, 0.3f), m_lib.seainfonameimage.GetRect(index)); index++; // 風向き描画 if (i.SeaInfo == null) { continue; } p.X += i.SeaInfo.WindPos.X - i.position.X; p.Y += i.SeaInfo.WindPos.Y - i.position.Y; m_lib.device.sprites.AddDrawSpritesNC(new Vector3(p.X - 6, p.Y, 0.3f), _rect, i.SeaInfo.SummerAngle, color1); m_lib.device.sprites.AddDrawSpritesNC(new Vector3(p.X + 6, p.Y, 0.3f), _rect, i.SeaInfo.WinterAngle, color2); } }
private void draw_cityicon2_proc(Vector2 offset, LoopXImage image) { if (m_lib.setting.map_icon == MapIcon.Hide) { return; } foreach (GvoWorldInfo.Info i in m_world.Cities) { Vector2 p = image.GlobalPos2LocalPos(transform.ToVector2(i.position), offset); // 조합(2)이나 주점아가씨(1)가 존재하지 않을 경우 스킵 if ((i.Sakaba & 2) != 2 && (i.Sakaba & 1) != 1) { continue; } // 카리브 영지인 경우 스킵 if (i.AllianceType == GvoWorldInfo.AllianceType.Territory && (i.CulturalSphere == GvoWorldInfo.CulturalSphere.Caribbean || i.CulturalSphere == GvoWorldInfo.CulturalSphere.EastLatinAmerica)) { continue; } m_lib.device.sprites.AddDrawSprites(new Vector3(p.X, p.Y, 0.3f), i.SmallIconRect); } }
private void draw_seaicon_proc(Vector2 offset, LoopXImage image) { if (m_lib.setting.map_draw_names == MapDrawNames.Hide) { return; } d3d_sprite_rects.rect _rect = m_lib.icons.GetIcon(icons.icon_index.wind_arrow); int index = 0; foreach (GvoWorldInfo.Info i in m_world.Seas) { // 풍향그리기 if (i.SeaInfo == null) { continue; } Vector2 p = image.GlobalPos2LocalPos(transform.ToVector2(i.position), offset); if (m_world.Season.now_season == gvo_season.season.summer) { m_lib.device.sprites.AddDrawSpritesNC(new Vector3(p.X - 3 - 1, p.Y + 3 + 1, 0.3f), _rect, i.SeaInfo.SummerAngle, -1); } else { m_lib.device.sprites.AddDrawSpritesNC(new Vector3(p.X - 3 - 1, p.Y + 3 + 1, 0.3f), _rect, i.SeaInfo.WinterAngle, -1); } index++; } }
/*------------------------------------------------------------------------- * 선그리기 * 100단위の선となる * ---------------------------------------------------------------------------*/ static public void DrawLines100(gvt_lib lib) { lib.loop_image.EnumDrawCallBack(new LoopXImage.DrawHandler(draw_lines100_proc), 0); // 세로방향は1회の그리기でよい LoopXImage image = lib.loop_image; Vector2 size = image.Device.client_size; Vector2 offset = image.GetDrawOffset(); int index = 0; for (float y = 0; y < def.GAME_HEIGHT; y += 100, index++) { // 지도좌표に변환 Vector2 pos0 = transform.game_pos2_map_pos(new Vector2(0, y), image); Vector2 pos = image.GlobalPos2LocalPos(pos0, offset); if (index >= 10) { index = 0; } if (pos.Y < 0) { continue; } if (pos.Y >= size.Y) { continue; } int color = (index == 0)? Color.FromArgb(128, 0, 0, 0).ToArgb(): Color.FromArgb(128, 128, 128, 128).ToArgb(); image.Device.DrawLine(new Vector3(0, pos.Y, 0.79f), new Vector2(size.X, pos.Y), color); } }
/*------------------------------------------------------------------------- * 위도, 경도그리기 * ---------------------------------------------------------------------------*/ static private void draw_points_proc(Vector2 offset, LoopXImage image) { d3d_systemfont font = image.Device.systemfont; Vector2 size = image.Device.client_size; for (float x = 0; x < def.GAME_WIDTH; x += 1000) { Vector2 pos0 = transform.game_pos2_map_pos(new Vector2(x, 0), image); Vector2 pos = image.GlobalPos2LocalPos(pos0, offset); Rectangle rect = font.MeasureText(x.ToString()); if (pos.X + (rect.Width + 4) < 0) { continue; } if (pos.X >= size.X) { continue; } image.Device.DrawFillRect(new Vector3(pos.X - (rect.Width / 2) - 3, 0, 0.1f), new Vector2(rect.Width + 2 * 2, rect.Height), Color.FromArgb(220, 100, 100, 100).ToArgb()); font.DrawTextC(x.ToString(), (int)pos.X, 0, Color.White); } }
/*------------------------------------------------------------------------- * 선그리기 * ---------------------------------------------------------------------------*/ static private void draw_lines100_proc(Vector2 offset, LoopXImage image) { Vector2 size = image.Device.client_size; int index = 0; for (float x = 0; x < def.GAME_WIDTH; x += 100, index++) { // 지도좌표に변환 Vector2 pos0 = transform.game_pos2_map_pos(new Vector2(x, 0), image); Vector2 pos = image.GlobalPos2LocalPos(pos0, offset); if (index >= 10) { index = 0; } if (pos.X < 0) { continue; } if (pos.X >= size.X) { continue; } int color = (index == 0)? Color.FromArgb(128, 0, 0, 0).ToArgb(): Color.FromArgb(128, 128, 128, 128).ToArgb(); image.Device.DrawLine(new Vector3(pos.X, 0, 0.79f), new Vector2(pos.X, size.Y), color); } }
/*------------------------------------------------------------------------- * 描画 角度 * ---------------------------------------------------------------------------*/ private void draw_angle_proc(Vector2 offset, LoopXImage image) { List <ShareShip> list = ShareList; m_lib.device.line.Width = 1; m_lib.device.line.Antialias = m_lib.setting.enable_line_antialias; m_lib.device.line.Pattern = -1; m_lib.device.line.PatternScale = 1.0f; m_lib.device.line.Begin(); foreach (ShareRoutes.ShareShip s in list) { if (s.Position.X < 0) { continue; } if (s.Position.Y < 0) { continue; } if (s.AngleVector.LengthSq() < 0.5f) { continue; } // 地図座標に変換 Vector2 pos0 = transform.game_pos2_map_pos(new Vector2(s.Position.X, s.Position.Y), image); Vector2 pos = image.GlobalPos2LocalPos(pos0, offset); // クランプ if (pos.X + ANGLE_LINE_LENGTH < 0) { continue; } if (pos.X - ANGLE_LINE_LENGTH >= image.Device.client_size.X) { continue; } if (pos.Y + ANGLE_LINE_LENGTH < 0) { continue; } if (pos.Y - ANGLE_LINE_LENGTH >= image.Device.client_size.Y) { continue; } Vector2[] points = new Vector2[2]; points[0] = pos; points[1] = pos + (s.AngleVector * ANGLE_LINE_LENGTH); m_lib.device.line.Draw(points, Color.FromArgb(200, 64, 64, 64)); } m_lib.device.line.End(); }
/*------------------------------------------------------------------------- * 해역명그리기 * ---------------------------------------------------------------------------*/ private void draw_seaname_proc(Vector2 offset, LoopXImage image) { if (m_lib.setting.map_draw_names == MapDrawNames.Hide) { return; } int index = 0; foreach (GvoWorldInfo.Info i in m_world.Seas) { Vector2 p = image.GlobalPos2LocalPos(transform.ToVector2(i.position), offset); // 해역명 m_lib.device.sprites.AddDrawSpritesNC(new Vector3(p.X + 3, p.Y, 0.3f), m_lib.nameTexture.getRect(i.Name), i.angle, -1); index++; } }
/*------------------------------------------------------------------------- * 描画 名前 * ---------------------------------------------------------------------------*/ private void draw_name_proc(Vector2 offset, LoopXImage image) { List <ShareShipListBB> list = ShareListBB; D3dBB2d.CullingRect crect = new D3dBB2d.CullingRect(image.Device.client_size); d3d_textured_font font = m_lib.device.textured_font; foreach (ShareShipListBB bb in list) { // バウンディングボックスで画面外かどうか調べる if (bb.IsCulling(offset, image.ImageScale, crect)) { continue; } foreach (ShareRoutes.ShareShip s in bb.List) { if (s.Position.X < 0) { continue; } if (s.Position.Y < 0) { continue; } // 地図座標に変換 Vector2 pos0 = transform.game_pos2_map_pos(new Vector2(s.Position.X, s.Position.Y), image); Vector2 pos = image.GlobalPos2LocalPos(pos0, offset); // 名前 Rectangle rect = font.MeasureText(s.Name, Color.Black); rect.Width += 4; rect.Height += 4; int halh_x = rect.Width / 2; Vector3 p = new Vector3(pos.X - halh_x - 2, pos.Y - 3, 0.31f); Vector2 size = new Vector2(rect.Width, rect.Height); m_lib.device.DrawFillRect(p, size, Color.FromArgb(128, 255, 255, 255).ToArgb()); m_lib.device.DrawLineRect(p, size, Color.Gray.ToArgb()); font.DrawTextC(s.Name, new Vector3(pos.X, pos.Y + 1, 0.31f), Color.Black); } } }
/*------------------------------------------------------------------------- * 그리기 * ---------------------------------------------------------------------------*/ private void draw_proc(Vector2 offset, LoopXImage image) { float size = image.ImageScale; if (size < 0.5) { size = 0.5f; } else if (size > 1) { size = 1; } Vector2 scale = new Vector2(size, size); // 목적지용 size *= 1.5f; Vector2 scale2 = new Vector2(size, size); foreach (data p in m_datas) { int index = (int)p.type; if (index < 0) { index = 0; } if (index > (int)map_mark_type.icon11) { index = (int)map_mark_type.icon11; } if (!is_draw(index)) { continue; } Vector2 v = image.GlobalPos2LocalPos(new Vector2(p.position.X, p.position.Y), offset); Vector3 pos = new Vector3(v.X, v.Y, 0.5f); m_lib.device.sprites.AddDrawSprites(pos, m_lib.icons.GetIcon(icons.icon_index.memo_icon_0 + index), (index == (int)map_mark_type.icon11)? scale2: scale, Color.White.ToArgb()); } }
/*------------------------------------------------------------------------- * 그리기 * ---------------------------------------------------------------------------*/ public void Draw(Vector2 offset, LoopXImage image, int color) { if (IsCreate) { // マスクから作った텍스쳐あり Draw(new Vector3(offset.X, offset.Y, 0.79f), image.ImageScale, color); } else { // 単純な矩形 // マスクを作らない분텍스쳐容량を削る Vector2 pos0 = m_pos; Vector2 pos = image.GlobalPos2LocalPos(pos0, offset); Vector2 size = m_size; size.X -= 1; size.Y -= 1; size *= image.ImageScale; // 화면외컬링 if (pos.X + size.X < 0) { return; } if (pos.Y + size.Y < 0) { return; } Vector2 csize = image.Device.client_size; if (pos.X >= csize.X) { return; } if (pos.Y >= csize.Y) { return; } image.Device.DrawFillRect(new Vector3(pos.X, pos.Y, 0.79f), size, color); } }
/*------------------------------------------------------------------------- * 自分の船を描く * ---------------------------------------------------------------------------*/ private void draw_myship_proc(Vector2 offset, LoopXImage image) { // 地図座標に変換 Vector2 pos = image.GlobalPos2LocalPos(transform.game_pos2_map_pos(transform.ToVector2(m_pos), m_lib.loop_image), offset); // 角度 draw_angle_line_all(pos, image); m_lib.device.sprites.BeginDrawSprites(m_lib.icons.texture); // 到達予想位置 int color = -1; if (m_lib.setting.draw_setting_myship_expect_pos) { if (draw_expect_pos(pos, m_db.SpeedCalculator.speed_map)) { color = Color.FromArgb(160, 255, 255, 255).ToArgb(); } } // 自分の船位置 m_lib.device.sprites.AddDrawSpritesNC(new Vector3(pos.X, pos.Y, 0.3f + 0.001f), m_lib.icons.GetIcon(icons.icon_index.myship), color); m_lib.device.sprites.EndDrawSprites(); }
private void draw_iconrects(Vector2 offset, LoopXImage image, hittest_list list) { foreach (GvoWorldInfo.Info i in list) { Vector2 p = image.GlobalPos2LocalPos(transform.ToVector2(i.position), offset); d3d_sprite_rects.rect refRect; if (m_lib.setting.map_icon == MapIcon.Big) { // 대 아이콘 refRect = i.IconRect; } else { refRect = i.SmallIconRect; } if (refRect != null) { m_lib.device.sprites.AddDrawSprites(new Vector3(p.X, p.Y, 0.3f), refRect); } } }
/*------------------------------------------------------------------------- * 描画 * ---------------------------------------------------------------------------*/ private void draw_proc(Vector2 offset, LoopXImage image) { List <ShareShipListBB> list = ShareListBB; D3dBB2d.CullingRect rect = new D3dBB2d.CullingRect(image.Device.client_size); foreach (ShareShipListBB bb in list) { // バウンディングボックスで画面外かどうか調べる if (bb.IsCulling(offset, image.ImageScale, rect)) { continue; } #if DRAW_POPUPS_BOUNDINGBOX d3d_bb2d.Draw(bb.bb, image.device, 0.5f, offset, image.scale, Color.Red.ToArgb()); #endif foreach (ShareRoutes.ShareShip s in bb.List) { if (s.Position.X < 0) { continue; } if (s.Position.Y < 0) { continue; } // 地図座標に変換 Vector2 pos0 = transform.game_pos2_map_pos(transform.ToVector2(s.Position), image); Vector2 pos = image.GlobalPos2LocalPos(pos0, offset); // 船 icons.icon_index index = (s.State == State.in_the_sea)? icons.icon_index.myship: icons.icon_index.share_city; m_lib.device.sprites.AddDrawSprites(new Vector3(pos.X, pos.Y, 0.31f), m_lib.icons.GetIcon(index)); } } }
private void draw_cityname2_proc(Vector2 offset, LoopXImage image) { if (m_lib.setting.map_draw_names == MapDrawNames.Hide) { return; } foreach (GvoWorldInfo.Info i in m_world.Cities) { if (i.NameRect == null) { continue; } // 조합(2)이나 주점아가씨(1)가 존재하지 않을 경우 스킵 if ((i.Sakaba & 2) != 2 && (i.Sakaba & 1) != 1) { continue; } // 카리브 영지인 경우 스킵 if (i.AllianceType == GvoWorldInfo.AllianceType.Territory && (i.CulturalSphere == GvoWorldInfo.CulturalSphere.Caribbean || i.CulturalSphere == GvoWorldInfo.CulturalSphere.EastLatinAmerica)) { continue; } Vector2 p = image.GlobalPos2LocalPos(transform.ToVector2(i.position), offset); // 소 아이콘 p.X += i.StringOffset2.X; p.Y += i.StringOffset2.Y; m_lib.device.sprites.AddDrawSpritesNC(new Vector3(p.X, p.Y, 0.3f), i.NameRect, i.angle, -1); } }