编写游戏更新器问题

Home Home
<< 1 2 3 >>
跳页: (共 3 页)
引用 | 编辑 n3ph223172
2011-08-08 21:18
楼主
推文 x0

访客只能看到部份内容,免费 加入会员



献花 x0
引用 | 编辑 史来姆
2011-08-08 22:22
1楼
  
这么烦会有人来答吗

献花 x0
引用 | 编辑 ebolaman
2011-08-08 22:51
2楼
  
下面是引用 史来姆 于 2011-08-08 22:22 发表的 : 到引言文
这么烦会有人来答吗

或许不久后就会有了。


话说我对 VB2010 很多控制项的操作还不是很熟悉

尤其这种,通常都是以图片来模拟操控项,看看有时候游戏的解析度没调好时,必须将滑鼠移动上面一点或下面一点才能取得焦点就知道

献花 x1
引用 | 编辑 ebolaman
2011-08-09 14:53
3楼
  
研究了一下 CSO 的启动器发现

他是以网页的形式来放置按钮等控制项

但是 HTML 有 onclick="external.Close" 的用法我就不知道 这要怎么和程式本身整合

目前用了一个很笨的方法,是让 a href 去连结 "Close", "Start", "Exit" 等字,让 程式中的 Web_Browser1_Navigated 触发并判断连结

但是之后还要用 WebBrowser1.GoBack()




至于读取条(Progress Bar) 的部分,只要把 图片延长,用个函数即可

其他部分都可以用 Image 来覆盖,这样能解决 WebBrowser 无法与 VB.Net 整合的问题 (或是另有其他办法?)



这是目前稍微模拟出来的介面,请参考








事实上是用两个 WebBrowser 当作主页面

程式码中的 绘图程序目前等于是没有作用的,假如以 Image 控制项去取代 WebBrowser 的话,只需把 wb_back 去除即可

底下的程式码的资源档是从 CSOLauncher 提取出来的文件,并稍加修改



复制程式
Public Class frm_main

    '---------- Local variables ----------

    'Files & Folders
    Dim dataDir As String = System.IO.Directory.GetCurrentDirectory & "\HTML\"

    'Status
    Dim stat_check_obj_ind As Integer
    Dim stat_wb_complete As Integer

    'Background
    Dim rndTyp As Integer

    'Graphics
    Dim srcRect, dstRect As Rectangle
    Dim g As Graphics

    '---------- Local objects ----------
    Dim WithEvents wb, wb_back As New WebBrowser



    Private Sub frm_main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        '----- Variables -----

        'Background
        Randomize()
        rndTyp = Rnd(1)

        'Graphics
        g = Me.CreateGraphics()

        'Status
        stat_wb_complete = 0

        '----- Form -----

        'Size
        Me.Size = New Size(704, 466)

        'Style
        Me.FormBorderStyle = 0
        Me.BackColor = Color.White

        '----- Sub -----

        AddHandler wb_back.Navigated, AddressOf local_event_wb_back_nav

        'Build objects
        local_build_obj()

    End Sub

    Private Sub frm_main_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        local_redraw_bg()
    End Sub

    Private Sub timer_check_obj_stat_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timer_check_obj_stat.Tick

        Dim flag As Boolean

        Select Case stat_check_obj_ind
            Case 1 'Web browser(Back)
                If wb_back.ReadyState = WebBrowserReadyState.Complete Then

                    wb.Navigate("http://tw.beanfun.com/cso/www/game_login.aspx")
                    local_new_objcheck(2)

                End If

            Case 2 'Web browser
                If wb.ReadyState = WebBrowserReadyState.Complete Then
                    wb.Visible = True : wb_back.Visible = True : flag = True
                    stat_wb_complete = 1
                    local_redraw_bg()
                End If

        End Select

        If flag Then timer_check_obj_stat.Enabled = False : stat_wb_complete = 0

    End Sub



    Private Sub local_redraw_bg()
        If stat_wb_complete = 0 Then Exit Sub

        Dim b As Bitmap

        b = IIf(rndTyp = 0, My.Resources.BG01, My.Resources.BG02)

        dstRect = Me.ClientRectangle
        srcRect = New Rectangle(New Point(0, 0), b.Size)

        g.DrawImage(b, dstRect, srcRect, GraphicsUnit.Pixel)

    End Sub

    Private Sub local_build_obj()

        Dim arrList As New List(Of Control)
        Dim arrSize As New List(Of Size)
        Dim arrPoint As New List(Of Point)
        Dim i As Integer

        arrList.Add(wb) : arrList.Add(wb_back)
        arrSize.Add(New Size(672, 240)) : arrSize.Add(New Size(688, 430))
        arrPoint.Add(New Point(8, 185)) : arrPoint.Add(New Point(0, 0))

        '--- Web browser ---
        For i = 0 To arrList.Count - 1
            arrList(i).Visible = False
            arrList(i).Parent = Me
            arrList(i).Size = arrSize(i)
            arrList(i).Location = arrPoint(i)
            wb.ScrollBarsEnabled = False : wb_back.ScrollBarsEnabled = False
        Next i

        wb_back.SendToBack()

        Dim tempPath As String = dataDir & "133.html"
        My.Computer.FileSystem.WriteAllText(tempPath, My.Resources._133, False)
        wb_back.Navigate("file://" & tempPath)
        local_new_objcheck(1)

    End Sub

    Private Sub local_new_objcheck(ByRef ind As Integer)
        stat_check_obj_ind = ind
        timer_check_obj_stat.Enabled = True
    End Sub

    Private Sub local_event_wb_back_nav()
        If stat_wb_complete <> 0 Then Exit Sub

        Dim flagDis As Boolean = True



        Select Case local_get_urlnav(wb_back.Url.ToString)
            Case "Start"
                wb_back.GoBack()

            Case "Exit"
                If MsgBox("更新作业进行中.请问要结束吗?", MsgBoxStyle.Exclamation + MsgBoxStyle.OkCancel, "CSOLauncher(Simulation)") = MsgBoxResult.Ok Then
                    End
                Else

                End If
            Case "Close"
                If MsgBox("更新作业进行中.请问要结束吗?", MsgBoxStyle.Exclamation + MsgBoxStyle.OkCancel, "CSOLauncher(Simulation)") = MsgBoxResult.Ok Then
                    End
                Else

                End If
            Case Else
                flagDis = False
        End Select


        If flagDis Then
            wb_back.GoBack()
        End If


    End Sub

    Private Function local_get_urlnav(ByRef url As String) As String

        Dim l As Long

        l = InStrRev(url, "/")
        local_get_urlnav = Mid(url, l + 1, Len(url) - l)

    End Function

End Class


本帖包含附件
档名: zip CSOLauncher_Simulation.rar   (2022-06-09 14:18 / 382 KB)   下载次数:61


献花 x1
引用 | 编辑 n3ph223172
2011-08-09 22:51
4楼
  
下面是引用 ebolaman 于 2011-08-09 14:53 发表的 : 到引言文
研究了一下 CSO 的启动器发现
他是以网页的形式来放置按钮等控制项
但是 HTML 有 onclick="external.Close" 的用法我就不知道 这要怎么和程式本身整合
目前用了一个很笨的方法,是让 a href 去连结 "Close", "Start", "Exit" 等字,让 程式中的 Web_Browser1_Navigated 触发并判断连结
但是之后还要用 WebBrowser1.GoBack()
.......

小弟想请问一下
为什么当checkbox没有打勾时
点击开始游戏,背景却一直改变?

献花 x0
引用 | 编辑 ebolaman
2011-08-09 23:12
5楼
  
下面是引用 n3ph223172 于 2011-08-09 22:51 发表的 : 到引言文
 
小弟想请问一下
为什么当checkbox没有打勾时
点击开始游戏,背景却一直改变?

其实你点的 开始游戏 并不是 Image ,而是 WebBrowser 里面的一个图片而已

因此我设定 点下去会连结到 "Start" ,虽然说 VB.NET 可以拦截 "点下去" 这个动作,但我不知道要如何 "取消这个动作"

因此接下来就会让 WebBrowser 连结到 "Start" 这个页面,也就当然地会找不到网页

因此我偷偷地加上一行 "wb_back.Goback()",让 WebBrowser 又连结回来 原本的页面



而这个 WebBrowser 读取的 HTML 码中,背景图片是在载入中就 随机决定的

因此才会不断切换


因此解决办法是,想办法找出 VB.NET 中能用 HTML 码控制外部的程序,我就看到 CSOLauncher 原本的程式的 HTML码中是用

<span class="BtClose"><a href="javascript:_null()" onclick="external.OnCancel()"> Close</a></span>
    <span class="BtGamestart_d"><a href="javascript:_null()" id="startGame">游戏结?</a></span>
    <span class="BtExit"><a href="javascript:_null()" id="exitGame" onclick="external.OnCancel()">赗?抰戬</a></span>

的用法,代表可以与 程式本身整合,拦截 "点下去" 时这个动作,然后再来触发 程式中程序


另外一个办法就是 不要用 Web Browser

改以 Image 这个控制项 来替代,好处是能正确地 拦截 "点下去" 这个动作,麻烦的是位置还要调整


我已经搜寻了很久,到目前为止还是找不到如何用 WebBrowser 来引发程式中的程序

只要能修改 HTML 码,让 WebBrowser 中的东西被点下时,VB程式中能判断是点下哪个,就好办了

献花 x1
引用 | 编辑 ebolaman
2011-08-10 09:12
6楼
  
关于 VB.NET 好像是 VB 2005 的前身,这我也搞不太清楚

总之大家都习惯把 VB 分为两阶段,一个是 古老的 VB6 另外一个就是 VB.NET

至于该称呼 VB.NET 还是 2005, 2008, 2010 这我就不知道





昨天又试了很多次,终于找到如何让 WebBrowser 中的图片被点下去时

VB 中可以一起被触发


先要用这两行来让 程序被触发时,可以一起触发自己设定的函数

不过这次作的更新器模拟只有用到 Navigating 被触发的时候

复制程式
        AddHandler wb_back.Navigating, AddressOf local_event_wb_back_nav
        AddHandler wb_back.Document.Click, AddressOf local_event_wb_back_click



然后在函数内可以用 wb_back.Document.GetElementById(Name) 来取得特定 ID 的物件

wb_back.Document.GetElementById(Name).GetAttribute(Attr) 则可以取得 属性,例如 Checkbox 勾了没

wb_back.Document.InvokeScript(Name, Obj) 则可以触发 网页中的 JavaScript,也能取得特定函数的值

wb_back.Document.ActiveElement.Name  则可以取得目前物件的名称




有了以上方法,我就写了第二版的 模拟CSO更新器



底下的程式码在 Form1 (frm_main)

Form1 :

复制程式
Public Class frm_main

    '---------- Local structures ----------
    Structure struc_prg
        Dim pack As Collection
        Dim curInd As Long
        Dim accum_total, accum_max As Long

        Dim cur_val, cur_max As Long
        Dim total_val, total_max As Long
    End Structure

    '---------- Local variables ----------

    'Files & Folders
    Dim dataDir As String = System.IO.Directory.GetCurrentDirectory & "\HTML\"

    'Status
    Dim stat_check_obj_ind As Integer
    Dim stat_wb_complete As Integer

    'Progress
    Dim prg As struc_prg

    '---------- Local objects ----------
    Dim WithEvents wb_back As New WebBrowser



    Private Sub frm_main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim i, i2 As Integer

        '----- Variables -----

        'Status
        stat_wb_complete = 0

        'Size : Pack (@@@ Test @@@)
        prg.pack = New Collection
        Dim arrPack(,) = {{"Server Info", 100, "伺服器讯息"}, {"Map", 3000, "地图档"}, {"Amxx", 888, "插件平台"}, {"Plugin", 1999, "插件"}}
        For i = 0 To arrPack.GetUpperBound(0)
            For i2 = 0 To arrPack.GetUpperBound(1)
                prg.pack.Add(arrPack(i, i2))
            Next
        Next

        For i = 1 To prg.pack.Count / 3
            prg.accum_max += prg.pack.Item(i * 3 - 1)
        Next

        prg.curInd = 0

        '----- Form -----

        'Size
        Me.Size = New Size(704, 466)

        'Style
        Me.FormBorderStyle = 0
        Me.BackColor = Color.White

        '----- Sub -----

        'Build objects
        local_build_obj()

    End Sub

    Private Sub timer_check_obj_stat_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timer_check_obj_stat.Tick

        Dim flag As Boolean

        Select Case stat_check_obj_ind
            Case 1 'Web browser(Back)
                If wb_back.ReadyState = WebBrowserReadyState.Complete Then
                    flag = True
                    wb_back.Visible = True
                    stat_wb_complete = 1

                    local_new_pack() 'Test @@@

                End If
        End Select

        If flag Then timer_check_obj_stat.Enabled = False

    End Sub

    Private Sub timer_simul_prg_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timer_simul_prg.Tick
        'Test @@@

        Dim objArr(1) As Object

        Randomize()
        prg.cur_val += (Fix(50 * Rnd()) + 30)

        If prg.cur_val >= prg.pack.Item(prg.curInd * 3 - 1) Then
            prg.accum_total += prg.pack.Item(prg.curInd * 3 - 1)

            timer_simul_prg.Enabled = False
            local_new_pack()
            Exit Sub
        End If

        Randomize()
        timer_simul_prg.Interval = IIf(Fix(10 * Rnd()) = 0, 500, Fix(50 * Rnd()) + 1)

        'Set current progress
        objArr(0) = CObj(prg.cur_val) 'Value
        objArr(1) = CObj(prg.cur_max) 'Max

        local_wb_callScript("SetCurrentProgress", objArr)

        'Status
        objArr(0) = CObj(prg.pack.Item(prg.curInd * 3 - 2) & " 安装中...(" & prg.cur_val & "/" & prg.cur_max & ")") 'Value

        local_wb_callScript("SetStatusText", objArr)


    End Sub



    Private Sub local_build_obj()

        Dim arrList As New List(Of Control)
        Dim arrSize As New List(Of Size)
        Dim arrPoint As New List(Of Point)
        Dim i As Integer

        arrList.Add(wb_back)
        arrSize.Add(New Size(688, 430))
        arrPoint.Add(New Point(0, 0))

        '--- Web browser ---
        For i = 0 To arrList.Count - 1
            arrList(i).Visible = False
            arrList(i).Parent = Me
            arrList(i).Size = arrSize(i)
            arrList(i).Location = arrPoint(i)
            wb_back.ScrollBarsEnabled = False
            'wb_back.ScriptErrorsSuppressed = True
        Next i

        'Write files
        Dim tempPath As String = dataDir & "133.html"
        My.Computer.FileSystem.WriteAllText(tempPath, My.Resources._133, False)

        'Navigate URL
        wb_back.Navigate("file://" & tempPath)
        local_new_objcheck(1)

        'Add handler
        AddHandler wb_back.Navigating, AddressOf local_event_wb_back_nav
        AddHandler wb_back.Document.Click, AddressOf local_event_wb_back_click

    End Sub

    Private Sub local_new_objcheck(ByRef ind As Integer)
        stat_check_obj_ind = ind
        timer_check_obj_stat.Enabled = True
    End Sub

    Private Sub local_event_wb_back_nav()
        If stat_wb_complete = 0 Then Exit Sub

        Select Case wb_back.Document.ActiveElement.Id
            Case "startGame"
                If wb_back.Document.GetElementById("agreement").GetAttribute("checked") = True Then
                    If wb_back.Document.InvokeScript("get_CanStart") = 1 Then
                        MsgBox("Game started.", MsgBoxStyle.Information, "Test")
                        End
                    End If
                End If
            Case "exitGame"
                If wb_back.Document.InvokeScript("get_CanStart") = 0 Then
                    If MsgBox("更新作业进行中.请问要结束吗?", MsgBoxStyle.Exclamation + MsgBoxStyle.OkCancel, "CSOLauncher(Simulation)") = MsgBoxResult.Ok Then
                        End
                    End If
                Else
                    End
                End If
            Case "closeGame"
                If wb_back.Document.InvokeScript("get_CanStart") = 0 Then
                    If MsgBox("更新作业进行中.请问要结束吗?", MsgBoxStyle.Exclamation + MsgBoxStyle.OkCancel, "CSOLauncher(Simulation)") = MsgBoxResult.Ok Then
                        End
                    End If
                Else
                    End
                End If
        End Select

    End Sub

    Private Sub local_event_wb_back_click()

        Select Case wb_back.Document.ActiveElement.Name
            Case ""
            Case "agreement"

        End Select

    End Sub

    Private Sub local_renew_finishprg()
        local_wb_callScript("OnAllDone", Nothing)
    End Sub

    Private Sub local_wb_callScript(ByRef s As String, ByRef objArr As Object)
        wb_back.Document.InvokeScript(s, objArr)
    End Sub


    Private Sub local_new_pack() 'Test @@@
        If prg.curInd = prg.pack.Count / 3 Then local_renew_finishprg() : Exit Sub

        Dim ObjArr(1) As Object

        prg.curInd += 1

        'Status
        ObjArr(0) = CObj("正在安装" & prg.pack.Item(prg.curInd * 3) & "...")
        local_wb_callScript("SetStatusText", ObjArr)

        prg.cur_val = 0
        prg.cur_max = prg.pack.Item(prg.curInd * 3 - 1)

        'Reset total progress
        ObjArr(0) = CObj(prg.accum_total)
        ObjArr(1) = CObj(prg.accum_max)
        local_wb_callScript("SetTotalProgress", ObjArr)

        'Reset current progress
        ObjArr(0) = CObj(0)
        ObjArr(1) = CObj(prg.cur_max)
        local_wb_callScript("SetCurrentProgress", ObjArr)

        timer_simul_prg.Enabled = True

    End Sub


End Class


必须加入 Timer : timer_check_obj_stat (Interval = 100, Enabled=0) , timer_simul_prg (Interval = 1000, Enabled=0)

必须加入 Resource : _133 (Files)

必须在程式执行资料夹放上 HTML资料夹(可以从底下的附件中找到)



Resource : _133 如下,其中被我修改了一点点

Resource : _133 :

复制程式
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;" />
<title>Counter-Strike Online</title>
<style>
body {
  background-color : gray;
    margin : 0;
    padding : 0;
    font:12px Tahoma,Dotum,络遗,Gulim,Verdana,sans-serif,serif;
}
.FrameBody {background-color: transparent}

img {border:0;}

#Wrapper01 {position:relative;width:688px;height:430px;background:url(bg01.jpg) no-repeat;}
#Wrapper02 {position:relative;width:688px;height:430px;background:url(bg02.jpg) no-repeat;}

  #NoticeFrame {position:absolute; left:8; top:185; width:671px; height:236px; z-index:3}

    #Install {position:absolute;top:145px;left:8px;width:671px;height:44px;}
        #BarTotalDiv {width:671px;height:6px;margin:0 0 0 0px;}
        #BarNowDiv {width:671px;height:6px;margin:5px 0 0 0px;}
        #InstallTxt {margin:6px 0 0 0;color:#FFFFFF;}
        #InstallTxt #InstallTxtPer {font-weight:bold;color:#C2B49A;float:right}
        
    .BtClose {position:absolute; left:673; top:6; width:13px; height:14px; z-index:3} 
    .BtClose a {width:13;height:14px;text-indent:-9000px;display:block;}
    #Wrapper01 .BtClose {background:url(close_n.jpg) no-repeat;}
    #Wrapper02 .BtClose {background:url(close_n.jpg) no-repeat;}
    
    .BtGamestart {position:absolute; left:419px; top:115; width:154px; height:28px; z-index:1} 
    .BtGamestart a {width:154px;height:28px;text-indent:-9000px;display:block;}
    .BtGamestart a:hover {width:154px;height:28px;text-indent:-9000px;display:block;}

    .BtGamestart_d {position:absolute; left:419px; top:115; width:154px; height:28px; z-index:1} 
    .BtGamestart_d a {width:154px;height:28px;text-indent:-9000px;display:block;}
    .BtGamestart_d a:hover {width:154px;height:28px;text-indent:-9000px;display:block;}

    #Wrapper01 .BtGamestart_d {background:url(start_d.jpg) no-repeat;}
    #Wrapper02 .BtGamestart_d {background:url(start_d.jpg) no-repeat;}
    
    #Wrapper01 .BtGamestart {background:url(start_n.jpg) no-repeat;}
    #Wrapper02 .BtGamestart {background:url(start_n.jpg) no-repeat;}
    #Wrapper01 .BtGamestart a:hover{background:url(start_o.jpg) no-repeat;}
    #Wrapper02 .BtGamestart a:hover{background:url(start_o.jpg) no-repeat;}
    
    .BtExit {position:absolute; left:585; top:115; width:93px; height:28px; z-index:2} 
    .BtExit a {width:93px;height:28px;text-indent:-9000px;display:block;}
    .BtExit a:hover {width:93;height:28;text-indent:-9000px;display:block;}
    #Wrapper01 .BtExit {background:url(exit_n.jpg) no-repeat;}
    #Wrapper02 .BtExit {background:url(exit_o.jpg) no-repeat;}

    .UserInfo{position:absolute;left:427px;top:63px;color:#c9f3ff;font:14px;} 
</style>
<script language="javascript">
<!--

var CanStart;

function SetNoticeUrl(url)
{
    document.getElementById("NoticeFrame").src = url;
    //alert(NoticeFrame.src);
}

function _onGameStart()
{
    
}

function get_CanStart()
{
    return CanStart
}

function _null() {}

function OnAllDone()
{
    var e = document.getElementById("startGame");

    if(agreement.checked)
    {
       e.parentElement.className = "BtGamestart";
       e.onclick = _onGameStart;
    }

    CanStart=1

    SetCurrentProgress(1, 1);
    SetTotalProgress(1, 1);

    lblStatus.innerText = "";
    InstallTxtPer.innerText = "更新完成,请点选开始游戏按扭";
    //external.FlashWindow();
}

function checkAgreement()
{
   if(agreement.checked)
   {
      var barTotal = document.getElementById("barTotal");

      if(barTotal.width == 671)
      {
         var sb = document.getElementById("startGame");
         sb.parentElement.className = "BtGamestart";
         sb.onclick = _onGameStart;
      } 
   }
   else
   {
      var e = document.getElementById("startGame");
      e.parentElement.className = "BtGamestart_d";
      e.onclick = _null;      
   }
}

function SetTotalProgress(cur, total)
{
    //lblTotal.innerText = cur.toString() + "/" + total.toString();
    var lblTotal = document.getElementById("InstallTxtPer");
    if (lblTotal != null)
    {
        lblTotal.innerText = "进度 " + Math.round((cur/total * 100.0)) + "%";
    }
    var barTotal = document.getElementById("barTotal");
    if (barTotal != null)
    {
        barTotal.width = (cur/total) * barTotal.parentElement.offsetWidth;
    }
}

function SetCurrentProgress(cur, total)
{
    barCurrent.width = cur/total * barCurrent.parentElement.offsetWidth;
}

var g_output = "";
function Output(s)
{
    g_output += s + "<br>";
}
function SetStatusText(name)
{g_output
    //lblCurrent.innerText = name + " (" + cur + "/" + total + ")";
    lblStatus.innerText = name;
    //barCurrent.width = 0;
}
// -->
</script>
</head>

<body oncontextmenu="return false" onselectstart="return false;">
<script language="javascript">
<!--
var tag = '<div id="{0}">'
document.write(tag.replace('{0}', Math.random() < 0.5 ? 'Wrapper01' : 'Wrapper02'));
//-->
</script>
    <div id="Install">

        <div id="BarTotalDiv"><img id="barTotal" src="bar_total.gif" width="0%" height="6"></div>
        <div id="BarNowDiv"><img id="barCurrent" src="bar_now.gif" width="0%" height="6"></div>
        <div id="InstallTxt"><span id="InstallTxtPer">进度 0%</span><span id="lblStatus">Now Downloading...</span></div>
    </div>
    
    <span class="BtClose"><a href="javascript:_null()" id="closeGame">Close</a></span>
    <span class="BtGamestart_d"><a href="javascript:_null()" id="startGame">Start</a></span>
    <span class="BtExit"><a href="javascript:_null()" id="exitGame">Exit</a></span>
    <span class="UserInfo"><a href="http://tw.beanfun.com/cso/support_06.aspx" target="_blank">[游戏服务合约书]</a></span>
    <span style="position:absolute;right:30px;top:63px;color:#ffffff;font:14px;"><input name="agreement" type="checkbox" value="0" onClick="checkAgreement()">我已阅读并同意</span>
    <span style="position:absolute;right:30px;top:83px;color:#b4b4b4;">我已阅读并同意游戏服务合约书</span>
    
    <iframe src="http://tw.beanfun.com/cso/www/game_login.aspx" id="NoticeFrame" frameborder="0" width="100%" height="100%"  marginwidth="0" marginheight="0" scrolling="no" allowtransparency="true"></iframe>
    
</body>
</html>




可以下载看看,我已经把 进度列 等全部模拟完成

接下来你只要去修改 操控进度列的函数(在程式中),就能轻易达到更新的效果


不过这全拜 CSO 更新器是以 "HTML" 方式来执行所赐,所以在程式中,其实只用了一个 WebBrowser 而已

那些 Image 全部都是在 WebBrowser 里面,因此位置、大小、触发程序 都已经被 HTML码设定好了

VB程式中只需要 拦截触发,呼叫函数,还有判断函数的值就行了,那些进度列的样式都已经被设定好了,真方便


现在已经几乎与 CSO 更新器一模一样,只差进度列更新时不太一样









CSOLauncher_Simulation 程式下载:

本帖包含附件
档名: zip CSOLauncher_Simulation.rar   (2022-06-09 14:18 / 221 KB)   下载次数:32


献花 x1
引用 | 编辑 n3ph223172
2011-08-10 12:59
7楼
  
下面是引用 ebolaman 于 2011-08-10 09:12 发表的 第二版 游戏更新器 模拟: 到引言文
关于 VB.NET 好像是 VB 2005 的前身,这我也搞不太清楚
总之大家都习惯把 VB 分为两阶段,一个是 古老的 VB6 另外一个就是 VB.NET
至于该称呼 VB.NET 还是 2005, 2008, 2010 这我就不知道



.......

感谢大大详细的指导,在送上500元。
但您提到的"现在已经几乎与 CSO 更新器一模一样,只差进度列更新时不太一样"
哪里不一样呢?
另外由于本人是个VB新手
因此大大提到的"必须加入 Timer : timer_check_obj_stat (Interval = 100, Enabled=0) , timer_simul_prg (Interval = 1000, Enabled=0)"
小弟不晓得加在哪里…
而若依照大大的form底下的代码:
会有以下错误:
复制程式
错误 1 Handles 子句需要 WithEvents 变数,该变数定义于包含型别或它的一种基底型别中。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 70 111 WindowsApplication1
错误 2 'timer_check_obj_stat' 未宣告。由于其保护层级,可能无法对其进行存取。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 86 22 WindowsApplication1
错误 3 Handles 子句需要 WithEvents 变数,该变数定义于包含型别或它的一种基底型别中。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 90 106 WindowsApplication1
错误 4 'timer_simul_prg' 未宣告。由于其保护层级,可能无法对其进行存取。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 101 13 WindowsApplication1
错误 5 'timer_simul_prg' 未宣告。由于其保护层级,可能无法对其进行存取。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 107 9 WindowsApplication1
错误 6 'timer_check_obj_stat' 未宣告。由于其保护层级,可能无法对其进行存取。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 162 9 WindowsApplication1
错误 7 'timer_simul_prg' 未宣告。由于其保护层级,可能无法对其进行存取。 C:\Users\Chiu\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 239 9 WindowsApplication1


献花 x0
引用 | 编辑 ebolaman
2011-08-10 13:51
8楼
  
下面是引用 n3ph223172 于 2011-08-10 12:59 发表的 Re:第二版 游戏更新器 模拟: 到引言文
 
感谢大大详细的指导,在送上500元。
但您提到的"现在已经几乎与 CSO 更新器一模一样,只差进度列更新时不太一样"
哪里不一样呢?

介面已经完全一样

就是更新时的文字 "档案下载中..." "更新中" "解压缩中..." 等文字不太一样


复制程式
Dim arrPack(,) = {{"Server Info", 100, "伺服器讯息"}, {"Map", 3000, "地图档"}, {"Amxx", 888, "插件平台"}, {"Plugin", 1999, "插件"}}

上面的模拟器我是用了这样子 去稍微模拟

进度列是 用 Timer 去跑的,所以并不是真正的下载并安装,还要改成你说的 FTP 下载

那些下载时说明的文字,就得要自己去打

你可以看看 CSOLauncher.exe 的资源档的 String 部分,大概分为 下载、解压缩、安装、验证 四个部分而已




还有,要操控 WebBrowser 中的进度列与状态文字,用以下方法达成 (都能在上面回覆中的程式码找到)

复制程式
        'Set total progress
        ObjArr(0) = CObj(prg.accum_total) '蓝色杆子的 目前数值
        ObjArr(1) = CObj(prg.accum_max) '蓝色杆子的 总数值
        local_wb_callScript("SetTotalProgress", ObjArr)

        'Set current progress
        ObjArr(0) = CObj(prg.cur_val) '灰色杆子的 目前数值
        ObjArr(1) = CObj(prg.cur_max) '灰色杆子的 总数值
        local_wb_callScript("SetCurrentProgress", ObjArr)

        'Set status
        ObjArr(0) = CObj("Installing...") '状态文字
        local_wb_callScript("SetStatusText", objArr)


献花 x1
引用 | 编辑 ebolaman
2011-08-10 14:00
9楼
  
直接给你 VB 2010 专案吧

本帖包含附件
档名: zip CSO_Launcher_Simulation_(Include_VB_Project).rar   (2022-06-09 14:18 / 795 KB)  
| Filetype : RAR | CRC-32 : C02338D7
下载次数:24


献花 x0
引用 | 编辑 n3ph223172
2011-08-10 16:52
10楼
  
 
下面是引用 ebolaman 于 2011-08-10 14:00 发表的 : 到引言文
直接给你 VB 2010 专案吧

再次感谢,开来看之后,发现原来我是少加入东西表情
        'Navigate URL
        wb_back.Navigate("file://" & tempPath)
        local_new_objcheck(1)
上面所指的file://是不是下载更新档案的路径?
另外再次请教,关于档案判断方面
此专案内装也写入吗?
当FTP空间有此档案,则检查用户自身电脑是否拥有该档案以及大小是否正确
如果有该档案,则检查大小。
如果没有该档案,则下载。
如果皆符合,直接略过。

献花 x0
引用 | 编辑 ebolaman
2011-08-10 17:14
11楼
  
这个 file:// 是连结到 WebBrowser 所使用的连结

你会发现 有一个资料夹 HTML,没错,WebBrowser 的网址是连到那个资料夹里的 133.html

并非 档案下载


复制程式
 'Write files
        Dim tempPath As String = dataDir & "133.html"
        My.Computer.FileSystem.WriteAllText(tempPath, My.Resources._133, False)

        'Navigate URL
        wb_back.Navigate("file://" & tempPath)
        local_new_objcheck(1)
[/pre]


关于 档案判断、FTP 下载 的部分,我完全没做

你看到的进度列都是模拟出来的,所以还要再加上去 连上网路下载档案的功能,现在只是 介面 的部分完成而已


关于 FTP 下载的部分,这里有几篇可以参考:

http://tw.myblog.yahoo.com/jw!t7pzMwuaAwLmvvVP5J4M/article?mid=2596

http://social.msdn.microsoft.com/Forums/en-US/vblanguage/thread/63796964-f88a-40cf-91eb-08e71e98fa83/

http://www.codeproject.com/KB/IP/FtpClient.aspx?fid=225949&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=201


很抱歉我也是初学而已,对于 VB2010 种种的类型、宣告,还不是很熟悉

不过既然网路上范例与教学那么多,只要研究一下应该是能做出来的

献花 x0
引用 | 编辑 n3ph223172
2011-08-10 17:17
12楼
  
下面是引用 ebolaman 于 2011-08-10 17:14 发表的 : 到引言文
这个 file:// 是连结到 WebBrowser 所使用的连结
你会发现 有一个资料夹 HTML,没错,WebBrowser 的网址是连到那个资料夹里的 133.html
并非 档案下载

[code]
.......

哦,原来阿。
        Dim arrPack(,) = {{"Server Info", 100, "伺服器讯息"}, {"Map", 3000, "地图档"}, {"Amxx", 888, "插件平台"}, {"Plugin", 1999, "插件"}}
那请问当中的
{{"Server Info", 100, "伺服器讯息"}, {"Map", 3000, "地图档"}, {"Amxx", 888, "插件平台"}, {"Plugin", 1999, "插件"}}
里面3引号分别指的是?

献花 x0
引用 | 编辑 ebolaman
2011-08-10 17:51
13楼
  
下面是引用 n3ph223172 于 2011-08-10 17:17 发表的 : 到引言文
 
哦,原来阿。
        Dim arrPack(,) = {{"Server Info", 100, "伺服器讯息"}, {"Map", 3000, "地图档"}, {"Amxx", 888, "插件平台"}, {"Plugin", 1999, "插件"}}
那请问当中的
{{"Server Info", 100, "伺服器讯息"}, {"Map", 3000, "地图档"}, {"Amxx", 888, "插件平台"}, {"Plugin", 1999, "插件"}}
里面3引号分别指的是?


Server Info, Map, Amxx, Plugin 是更新时所采用的 ID,就像身分证一样,让 更新程式知道即将要更新什么
如果有来自 FTP 直接指示要更新哪个位置、哪个档案 这样更好

100, 3000, 888, 1999 是要更新的大小,当然是我乱打的

伺服器讯息, 地图档, 插件平台, 插件 是更新时要显示的 状态文字



当然最好的作法是,不要用这个阵列的方法,而是将更新的目录储存在 FTP 上,这样万一更新资料有变动,就不用再编辑 这个游戏更新器,而是更新 FTP 上的更新目录

献花 x0
引用 | 编辑 n3ph223172
2011-08-10 21:51
14楼
  
下面是引用 ebolaman 于 2011-08-10 17:51 发表的 : 到引言文



Server Info, Map, Amxx, Plugin 是更新时所采用的 ID,就像身分证一样,让 更新程式知道即将要更新什么
如果有来自 FTP 直接指示要更新哪个位置、哪个档案 这样更好

100, 3000, 888, 1999 是要更新的大小,当然是我乱打的

伺服器讯息, 地图档, 插件平台, 插件 是更新时要显示的 状态文字



当然最好的作法是,不要用这个阵列的方法,而是将更新的目录储存在 FTP 上,这样万一更新资料有变动,就不用再编辑 这个游戏更新器,而是更新 FTP 上的更新目录

感谢详细解说。
基本上小弟就是想以这种方法更新。

小弟希望不是(xxxx/xxxx),而是XXXKB/s。
另外大大您的FTP文章小弟参考过了,小弟对于FTP这个是懂非懂。
有听朋友说FTP只能下载单档,是真的吗?
小弟找到资料:http://ycc.tsu.edu.tw/S1/UpDownFile.htm
也是看的不怎么懂…
总觉得跟小弟要弄的方法不一样?

献花 x0
引用 | 编辑 ebolaman
2011-08-10 22:32
15楼
  
下面是引用 n3ph223172 于 2011-08-10 21:51 发表的 : 到引言文
 
感谢详细解说。
基本上小弟就是想以这种方法更新。
[attachment=768812]
小弟希望不是(xxxx/xxxx),而是XXXKB/s。
另外大大您的FTP文章小弟参考过了,小弟对于FTP这个是懂非懂。
有听朋友说FTP只能下载单档,是真的吗?
小弟找到资料:http://ycc.tsu.edu.tw/S1/UpDownFile.htm
也是看的不怎么懂…
总觉得跟小弟要弄的方法不一样?


FTP 反正也只是不同地方的档案,最难的就是 "如何取得档案",之后判断档案、判断要不要更新、档案大小、状态列文字 等都是很简单的


抱歉我对 FTP 也是 完全不懂~

不过你可以给我 FTP 的网址,我来做看看

也请提供 状态文字 要如何显示(我看 CSO 的启动器的状态文字是分为 下载、解压缩、安装 大概这三阶段,要做 XXXKB/s 应该是 OK),档案要如何更新,FTP 帐密(可以创一个暂时测试用的)等更详细的资讯。


还有我觉得更好的是以 Hash Code 来决定档案是否要更新,如果单纯判断 档案大小,尤其是档案特别小,更新的时候却又刚刚好档案大小没变,会造成没有更新的错误,而 Hash Code 就没这个问题

献花 x1
引用 | 编辑 n3ph223172
2011-08-10 23:33
16楼
  
对不起!您没有登入,请先登入论坛


献花 x0
引用 | 编辑 ebolaman
2011-08-11 21:43
17楼
  
好了,下载档案、检查 Md5、解压缩、复制档案、呼叫游戏、检查重复程序 的功能都已经做好


GIF 动画展示:





其中 ICSharpCode.SharpZipLib.dll,  MySharpZip.dll  这两个 DLL 我没办法把他弄到 EXE 本身里面,所以只好与 Launcher 放在同一个资料夹

预设的 FTP 是连线到 ftp://192.168.2.104 ,可以用你所提供的网页中介绍的软体 PCMan's FTP Server 来模拟本机的 FTP 下载,程式码中可以修改

预设的 FTP 逾时是一分钟,网页逾时是半分钟,可以调整




至于 FTP 上的资料夹,必须先建立个 CS_Update 资料夹,然后在底下置放一个索引文件 Index.txt

接着在 CS_Update 资料夹下就可以放置 cstrike 资料夹 (允许子资料夹),之后就能放更新的文件

但更新的文件必须全部是 zip 压缩档,并与原来档名一样(例如 cstrike.exe -> cstrike.exe.zip)


例如,档案分配如下 (我设定本机的 FTP 指向 Desktop\TempFTP\  ):

复制程式
Index.txt    Desktop\TempFTP\CS_Update\Index.txt
mp.dll.zip    Desktop\TempFTP\CS_Update\cstrike\mp.dll.zip
temp.zip    Desktop\TempFTP\CS_Update\cstrike\temp.zip
test.zip    Desktop\TempFTP\CS_Update\cstrike\test.zip


index.txt 的内容:

复制程式
[Update]
"\cstrike\temp" 23677 MD5MD5MD5MD5MD5MD5MD5MD5MD5MD5MD
"\cstrike\mp.dll" 548 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
"\cstrike\test" 17760 715BD382F69BF50C6A4B3A05080AC3A4

[Remove]
"Test"

index.txt 的 [Update] 底下的,一开始是 档案路径,接着是 "压缩档" 的档案大小,再来是 "解压缩后档案" 的 Md5,三个项目以空白键分开,档案路径必须被双引号夹起来

"压缩档" 的档案大小 是为了 显示进度列,"解压缩后档案" 的 Md5 是为了检查是否要更新


推荐的 Hash Codes 产生器/读取器:

HashMyFiles  (其他还有 HashCalc, HashX, Hash Codes, Arpoon Checksum, ExactFile 等 Hash/Checksum 的免费软体)





而更新的过程:

(1) 下载 Index.txt 知道更新的目录 (索引清单)

(2) 开始检查已经存在档案的 Md5 并与索引清单对比,不相符的下载ZIP档案 (下载到 %Temp%\ 中)

(3) 全部下载完后解压缩 (在 %Temp%\ 中)

(4) 复制档案(会覆盖)到Launcher 本身资料夹底下的资料夹 (包含子资料夹)

(5) 删除档案 (只删除 index.txt [Remove] 标头底下提供的清单,这个设计到时候可能不需要,只是为了客户端 档案简洁之用 (例:把旧的档案删除))


采用 ZIP 压缩档好处是能节省 下载时间,如果你觉得一个档案一个档案 压缩成 ZIP 档案很烦

可以用免费软体  ArcThemAll 把选取的档案一次 每个都加入到 个别的 ZIP 档案

而新的资料我改存到 %Temp% 中,你可以在程式执行中在 %Temp% 下找到 CSOLnchr_Simu_XXX 的资料夹 (会在 Launcher 关闭时被删除)




还有,我刚刚执行似乎有发现一个 BUG,就是 Launcher 本身可以重复启动

其他功能请自行修改,我已经帮你完成几乎所有部分了




CSOLauncher Simulation  VB 2010 专案下载:

Sorry this attachment is not available for download right now.

献花 x1
引用 | 编辑 ebolaman
2011-08-11 22:20
18楼
  
关于 禁止Launcher 重复执行

请将 frm_main.vb 中的  Sub :  local_check_existExe 修改成

复制程式
    Private Sub local_check_existExe()

        'Check current process
        If (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length > 1) Then Me.Close() : Exit Sub

        'Check game process
        If Process.GetProcessesByName(cFile.get_filename_major(exe.gameExe)).Length <> 0 Then local_show_errDlg("Err_exist_gameExe", exe.gameExe)

    End Sub


就可以防止重复执行程式了 (但不能防止 同时间 启动) (P.S. 还有另外一种 Mutex 的方法)

献花 x1
引用 | 编辑 n3ph223172
2011-08-11 22:39
19楼
  
下面是引用 ebolaman 于 2011-08-11 22:20 发表的 : 到引言文
关于 禁止Launcher 重复执行
请将 frm_main.vb 中的  Sub :  local_check_existExe 修改成
[code]
    Private Sub local_check_existExe()
        'Check current process
.......

原来如此,小弟了解了。
想必这份源码一定能让小弟进步许多^^!

献花 x0
引用 | 编辑 ebolaman
2011-08-11 22:46
20楼
  
下面是引用 n3ph223172 于 2011-08-11 22:39 发表的 : 到引言文
 
原来如此,小弟了解了。
想必这份源码一定能让小弟进步许多^^!

没想到一个启动器竟会如此难做

写这个专案也让我自身进步不少,毕竟我以前都是在写 VB6,很少碰 VB2010

这才发现 VB 2010 有很多很棒的设计,例如档案处理部分用 My.Computer.FileSystem 底下的东西就能一行搞定


不过要做出那种  "复制中...剩余 几%"  还是要回归基本的 buffer 读取,而这个 Launcher 我没这么做,都是用一行搞定

缺点就是没办法用进度列来表示,档案太大还会造成 视窗无回应

献花 x0
引用 | 编辑 n3ph223172
2011-08-11 22:50
21楼
  
下面是引用 ebolaman 于 2011-08-11 22:46 发表的 : 到引言文


没想到一个启动器竟会如此难做

写这个专案也让我自身进步不少,毕竟我以前都是在写 VB6,很少碰 VB2010

这才发现 VB 2010 有很多很棒的设计,例如档案处理部分用 My.Computer.FileSystem 底下的东西就能一行搞定


不过要做出那种  "复制中...剩余 几%"  还是要回归基本的 buffer 读取,而这个 Launcher 我没这么做,都是用一行搞定

缺点就是没办法用进度列来表示,档案太大还会造成 视窗无回应

小弟也有意愿想碰VB6。
毕竟写出来的东西不用配备高。
像2010写出来的就得.NET 4.0..
许多朋友都没到这么高呢。

献花 x0
引用 | 编辑 n3ph223172
2011-08-12 01:37
22楼
  
小弟请问下,若打包成rar可以下载吗?

献花 x0
引用 | 编辑 ebolaman
2011-08-12 08:37
23楼
  
下面是引用 n3ph223172 于 2011-08-12 01:37 发表的 : 到引言文
小弟请问下,若打包成rar可以下载吗?

似乎已经有很多人做好了,有直接呼叫 RAR 来解压缩的:

http://www.kodyaz.com/articles/how-to-unrar-rar-files-using-vb.net-extract-code.aspx


有用本身的 Class 来解压缩的:

http://www.vbforums.com/showthread.php?t=530685



改成 RAR 的话可以,但是程式码必须修改

献花 x0
引用 | 编辑 ebolaman
2011-08-12 12:43
24楼
  
这次改成了呼叫 WinRAR 来解压缩

缺点是,不知道没装 WinRAR 的人能不能解压缩,不过应该都会有吧,不然当初怎么下载游戏的

另外原本需要的两个 DLL 现在也不用了



另外我还做了一个小程式,叫作 Find And RAR

把这个小程式放在 FTP 目录下,然后执行,就能将每个档案,分别 压缩起来 (RAR型式,且包含副档名)

可以方便 FTP伺服端 档案的操作

本帖包含附件
档名: zip CSOLauncher_Simulation.rar   (2022-06-09 14:18 / 1007 KB)  
CSOLauncher Simulation V3
下载次数:17 需要威望:70

本帖包含附件
档名: zip Find_and_RAR.rar   (2022-06-09 14:18 / 47 KB)  
Find and RAR
下载次数:11


献花 x1
引用 | 编辑 n3ph223172
2011-08-12 23:48
25楼
  
下面是引用 ebolaman 于 2011-08-12 12:43 发表的 CSOLauncher Simulation 第三版: 到引言文
这次改成了呼叫 WinRAR 来解压缩

缺点是,不知道没装 WinRAR 的人能不能解压缩,不过应该都会有吧,不然当初怎么下载游戏的

另外原本需要的两个 DLL 现在也不用了



另外我还做了一个小程式,叫作 Find And RAR

把这个小程式放在 FTP 目录下,然后执行,就能将每个档案,分别 压缩起来 (RAR型式,且包含副档名)

可以方便 FTP伺服端 档案的操作

真的太感谢了,小弟真的第一次遇到像大大这么热心也这么用心的人。
小弟再试试第三版在向大大反应!^^

献花 x0
引用 | 编辑 n3ph223172
2011-08-13 01:21
26楼
  
小弟测试后,却发生这样的问题…
小弟不明哪里作错了…


献花 x0
引用 | 编辑 ebolaman
2011-08-13 09:10
27楼
  
下面是引用 n3ph223172 于 2011-08-13 01:21 发表的 : 到引言文
小弟测试后,却发生这样的问题…
小弟不明哪里作错了…
[attachment=769144]

有可能是 FTP连线出错 (位址不正确、帐密不正确,有的帐号必须加入 @XXXX)

或是找不到 FTP端 的档案 (Index.txt 内容错误)



如何侦错:

在 [Class] >> cls_net.vb >> Function ftp_download

最底下的  Err_1:  下加上  MsgBox(Err.Description)


改成这样,然后再执行一次

复制程式
Err_1:
        MsgBox(Err.Description)
        Return Err.Number



P.S. 我明天到下礼拜天都会不在,到时候可能要你自己研究一下了..

献花 x0
引用 | 编辑 n3ph223172
2011-08-13 13:00
28楼
  
下面是引用 ebolaman 于 2011-08-13 09:10 发表的 : 到引言文


有可能是 FTP连线出错 (位址不正确、帐密不正确,有的帐号必须加入 @XXXX)

或是找不到 FTP端 的档案 (Index.txt 内容错误)



如何侦错:

在 [Class] >> cls_net.vb >> Function ftp_download

最底下的  Err_1:  下加上  MsgBox(Err.Description)


改成这样,然后再执行一次

复制程式
 
Err_1: 
        MsgBox(Err.Description) 
        Return Err.Number 


P.S. 我明天到下礼拜天都会不在,到时候可能要你自己研究一下了..

测试后:

请问是要连同TempFTP资料夹放进去,还是放CS_Update进去即可?
小弟仅将大大您的源码资料夹内附的测试档案上传至FTP空间。
所有东西并未修改过
包含Index.txt
但同时小弟觉得大大填的MD5码怪怪的,是不是跟无法取得的问题是不是相连的?

献花 x0
引用 | 编辑 n3ph223172
2011-08-13 13:43
29楼
  
解决了
小弟请另外一位朋友协助,后来是"I"ndex.txt档名的问题

献花 x0
<< 1 2 3 >>
跳页: (共 3 页)