游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3960|回复: 13

向大家请教一个类模块编程设计的问题

[复制链接]

88

主题

1125

帖子

1136

积分

金牌会员

Rank: 6Rank: 6

积分
1136
QQ
发表于 2006-4-3 11:45:00 | 显示全部楼层 |阅读模式
如图 。
sf_200643114431.gif

88

主题

1125

帖子

1136

积分

金牌会员

Rank: 6Rank: 6

积分
1136
QQ
 楼主| 发表于 2006-4-3 11:48:00 | 显示全部楼层

Re:向大家请教一个类模块编程设计的问题

    现在我打算把最后整个角色封装成类 。  出现一个问题, 首先,我是把角色技能先定义成一个类模块的 ,假设现在总共有7项技能,  我能否在构造角色类模块时 ,把一个数组定义成技能类模块呢。  我是用类模块生成器去做的。  发现无法把属性以数组的形式去定义啊, 这样以来,技能模块岂不是无法嵌套到角色模块了。  请大家告诉我有什么好的办法。

20

主题

451

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
发表于 2006-4-3 16:10:00 | 显示全部楼层

Re:向大家请教一个类模块编程设计的问题

类里面套子类阿
你就在角色类里面套上技能类不就行了?

73

主题

612

帖子

618

积分

高级会员

Rank: 4

积分
618
发表于 2006-4-3 16:58:00 | 显示全部楼层

Re:向大家请教一个类模块编程设计的问题

vb不能实现就是继承,不过可以采用复制的方法

73

主题

612

帖子

618

积分

高级会员

Rank: 4

积分
618
发表于 2006-4-3 17:00:00 | 显示全部楼层

Re:向大家请教一个类模块编程设计的问题

类生成器无非就是创建Update Remove Add Item
其实就自己写就行了,用那个反而麻烦了点
在将对象放在集合中的时候,如果涉及到排序和快速取出,应该采用相应的排序算法,最好是用链表

20

主题

451

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
发表于 2006-4-3 17:12:00 | 显示全部楼层

Re:向大家请教一个类模块编程设计的问题

楼主用的vb6还是vb.net,我对vb6的类不是很熟悉,不过我知道如果是vb.net的话这个应该没问题的

187

主题

600

帖子

606

积分

高级会员

Rank: 4

积分
606
QQ
发表于 2006-4-5 00:17:00 | 显示全部楼层

Re:向大家请教一个类模块编程设计的问题

定义一个数据类型不就好了!没有必要一定用那个

88

主题

1125

帖子

1136

积分

金牌会员

Rank: 6Rank: 6

积分
1136
QQ
 楼主| 发表于 2006-4-5 10:13:00 | 显示全部楼层

Re:向大家请教一个类模块编程设计的问题

   请yinxiaodan 告诉我一下 使用集合的方法啊。  我这边一点资料都没有啊。

73

主题

612

帖子

618

积分

高级会员

Rank: 4

积分
618
发表于 2006-4-5 10:36:00 | 显示全部楼层

Re:向大家请教一个类模块编程设计的问题

宣三国程序中的一个类
'子弹集合类(clsShots)
'------------------------------------------------------------------------------------------------------------------------------
Option Explicit

Private Const mShotMax As Long = 10000

Private mShots(1 To mShotMax) As clsShot
Private mFreeList(1 To mShotMax) As Long
Private mFreeHeader As Long
Private mCount As Long

Private Sub Remove(ByVal i As Long)
    Debug.Assert ObjPtr(mShots(i)) > 0
    ' Debug.Assert mShots(i).Terminating = False
    mShots(i).Done
    Set mShots(i) = Nothing
    Debug.Assert ObjPtr(mShots(i)) = 0
    mFreeList(i) = mFreeHeader
    mFreeHeader = i
    mCount = mCount - 1
End Sub

Public Function Add(ByVal sType As String, _
        ByVal nPositionX As Long, _
        ByVal nPositionY As Long, _
        ByVal nTargetX As Long, _
        ByVal nTargetY As Long, _
        ByVal InitV As Single, _
        ByVal Acc As Single, _
        ByVal Ztop As Single, _
        Optional ByVal IsEffect As Boolean = False, _
        Optional ByVal Power As Long = 0, _
        Optional ByVal HotSprCount As Long = -1, _
        Optional ByVal ParentSpr_ID As Long = -1, _
        Optional ByVal ObjSpr_ID As Long = -1, _
        Optional ByVal IsFrameLoop As Boolean = False, _
        Optional ByRef useobj As GamUserObj = Nothing, _
        Optional ByVal ShotType As Long, _
        Optional ByVal AlaphaVal As Integer = 0, _
        Optional ByVal AlaphaValEnd As Long = 0, _
        Optional ByVal IsFollowSpr As Boolean = False) As clsShot
    Dim i As Long
    Dim WAVEVOLUME As Integer

    If mFreeHeader > 0 Then
        i = mFreeHeader
        mFreeHeader = mFreeList(mFreeHeader)
    Else ' 无空间可分配
        Exit Function
    End If
   
    Debug.Assert ObjPtr(mShots(i)) = 0
    Set mShots(i) = New clsShot
    mCount = mCount + 1
   
    With mShots(i)
        .ID = i
        Set .useobj = useobj
        .ParentSpr_ID = ParentSpr_ID
        .ObjSpr_ID = ObjSpr_ID
        .Power = Power
        .IsEffect = IsEffect Or (ParentSpr_ID = -1)
        .HotSprCount = HotSprCount
        .AlaphaVal = AlaphaVal
        .ShotType = ShotType
        '---------------------------
        '以下并非重复,跟踪有用
        '---------------------------
        .InitV = InitV
        .Acc = Acc
        .Ztop = Ztop
        .Frame_Time = GetTickCount
        .nTargetX = nTargetX
        .nTargetY = nTargetY
        .PositionX = nPositionX
        .PositionY = nPositionY
        .ln.Init nPositionX, nPositionY, nTargetX, nTargetY, InitV, Acc, Ztop
        .SetSurfaceName sType
        .ln_MaxStep = .ln.MaxStep
        ' Debug.Assert .ln_MaxStep > 0
    End With
   
    If SoundPresent Then
        '------------------------------------
        '这里是以玩家为听众,离玩家越远声音越小
        '------------------------------------
        WAVEVOLUME = 150 - (Abs(User_Me.Map_X - nPositionX) + Abs(User_Me.Map_Y - nPositionY)) * 100 \ ScreenX
        If IsEffect = False Then
            If useobj.ShotType = 3 Then
                '闪电
                WAVEVOLUME = 300 - (Abs(User_Me.Map_X - nPositionX) + Abs(User_Me.Map_Y - nPositionY)) * 100 \ ScreenX
            End If
        End If
        If WAVEVOLUME > 0 Then
            Sounds.Add sType, WAVEVOLUME
        End If
    End If
   
    Set Add = mShots(i)
End Function

Public Property Get Item(i As Long) As clsShot
    Set Item = mShots(i)
End Property

Public Property Get Count() As Long
    Count = mCount
End Property

Public Sub Update() '数据更新
    Dim i As Long
    Dim Shot As clsShot
   
    For i = 1 To mShotMax
        Set Shot = mShots(i)
        If ObjPtr(Shot) > 0 Then
            If Shot.Terminating Then
                Remove i
            Else
                Shot.Update
            End If
        End If
    Next
End Sub

Public Sub Render() '显示
    Dim i As Long
    Dim Shot As clsShot
   
    For i = 1 To mShotMax
        Set Shot = mShots(i)
        If ObjPtr(Shot) > 0 Then
            If Shot.Terminating Then
                Remove i
            Else
                Shot.Render
            End If
        End If
    Next
End Sub

Public Sub Clear() '类初始化
    Dim i As Long

    For i = 1 To mShotMax
        If ObjPtr(mShots(i)) > 0 Then
            If mShots(i).Terminating = False Then
                mShots(i).Done
            End If
            Set mShots(i) = Nothing
            Debug.Assert ObjPtr(mShots(i)) = 0
        End If
    Next
    For i = 1 To mShotMax - 1
        mFreeList(i) = i + 1
    Next i
    mFreeList(mShotMax) = 0
    mFreeHeader = 1
    mCount = 0
End Sub

Private Sub Class_Initialize()
    Dim i As Long
   
    For i = 1 To mShotMax - 1
        mFreeList(i) = i + 1
    Next i
    mFreeList(mShotMax) = 0
    mFreeHeader = 1
    mCount = 0
End Sub

Private Sub Class_Terminate()
    Clear
End Sub
'------------------------------------------------------------------------------------------------------------------------------

'子弹类(clsShot)
Private   ID                 As Long                               '在数组中的位置

88

主题

1125

帖子

1136

积分

金牌会员

Rank: 6Rank: 6

积分
1136
QQ
 楼主| 发表于 2006-4-6 10:58:00 | 显示全部楼层

Re:向大家请教一个类模块编程设计的问题

    呵呵,先道个谢.

再问一下, 如果在类中进行嵌套调用的时候 ,则 ,必须要定义,可是多个类之间的定义可否在一个模块中定义呢?  然后就可以在类模块之间调用其它类模块的属性了?
还有就是 如果嵌套使用类, 那么给该类中属性赋值的语句应该写在哪呢?
   另外就是既然把技能集合写成一个集合类 ,那么在外部需要调用技能的数据时 ,通常需要利用技能的名称来查找技能所在集合中的排序号 , 这个过程竟然无法写了.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 04:09

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表