魔塔之拯救白娘子~我的第一个VB6+DX8做的小游戏源码~3鼠标键盘和手柄引擎

魔塔之拯救白娘子 完整工程下载地址:
xInput.cls 这个模块处理鼠标键盘和手柄的输入。

'impactX Game Engine
'本类模块用于处理鼠标键盘和手柄的输入
'使用本类模块必须遵守:
'你可以免费使用本引擎及代码
'使用本引擎后的责任由使用者承担
'你可以任意拷贝本引擎代码,但必须保证其完整性
'希望我能得到你使用本引擎制作出的程序
'Davy.xu sunicdavy@sina.com qq:20998333

Option Explicit
Dim di As DirectInput8
Dim DIDevice(0 To 4) As DirectInputDevice8 'DX输入设备
Dim diState As DIKEYBOARDSTATE '键盘按钮状态
Dim KeyState(255) As Integer
Dim JoyPadState(31) As Integer
Dim MouseState(3) As Integer
Dim m_hWnd As Long
''\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\鼠标\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Private Declare Function GetCursorPos Lib "USER32" (lpPoint As PointAPI) As Long
Private Declare Function showCursor Lib "USER32" Alias "ShowCursor" (ByVal bShow As Long) As Long
Private Declare Function GetKeyState Lib "USER32" (ByVal nVirtKey As Long) As Integer
Private Declare Function GetClientRect Lib "USER32" (ByVal hWnd As Long, lpRect As RECT) As Long
Private Declare Function ScreenToClient Lib "USER32" (ByVal hWnd As Long, lpPoint As PointAPI) As Long

Private Type PointAPI
    x As Long
    y As Long
End Type

Enum ENUM_XG_MOUSEBUTTON
    xgL_BUTTON = 1
    xgR_BUTTON = 2
    xgM_BUTTON = 3
End Enum

'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\手柄\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Enum ENUM_XG_PSBUTTON 'PS改制手柄的键盘码,其他手柄的可能会有些出入
    xgPadUP = 13
    xgPadDOWN = 15
    xgPadLEFT = 14
    xgPadRIGHT = 16
    xgPadBTN1 = 1
    xgPadBTN2 = 2
    xgPadBTN3 = 3
    xgPadBTN4 = 4
    xgPadL1 = 7
    xgPadL2 = 8
    xgPadR1 = 5
    xgPadR2 = 6
    xgPadSTART = 9
    xgPadSELECT = 10
End Enum
'DirectInput设备枚举,列出手柄及其他输入设备
Dim diDevEnum As DirectInputEnumDevices8
'手柄状态,可以获取Axis的参数
Dim JoyCaps(4) As DIDEVCAPS
'可用手柄的数量
Dim m_JoyPadNum As Integer



'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\DirectInput基础函数\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
'功能:初始化DirectInput
'参数:hWnd为窗体的句柄,若某窗口名称为Main,则可以获得Main.hWnd
Public Function InitDXInput(hWnd As Long) As Boolean
    On Error GoTo ErrH
    m_hWnd = hWnd
    Dim DX As New DirectX8
    Set di = DX.DirectInputCreate()
    If Err.Number <> 0 Then
        InitDXInput = False
        Debug.Print "Err [InitdxInput] DirectInput创建错误!"
        Exit Function
    End If
    '初始化键盘
    Set DIDevice(0) = di.CreateDevice("GUID_SysKeyboard") '创建键盘
    DIDevice(0).SetCommonDataFormat DIFORMAT_KEYBOARD
    DIDevice(0).SetCooperativeLevel hWnd, DISCL_BACKGROUND Or DISCL_NONEXCLUSIVE
    DIDevice(0).Acquire
    '初始化手柄
    Set diDevEnum = di.GetDIDevices(DI8DEVCLASS_GAMECTRL, DIEDFL_ATTACHEDONLY)
    m_JoyPadNum = CInt(diDevEnum.GetCount)
'    If diDevEnum.GetCount = 0 Then
'        Debug.Print "Warning [InitdxInput] 没有连接手柄"
'    End If
    Dim n As Integer
    If m_JoyPadNum > 4 Then m_JoyPadNum = 4
        For n = 1 To m_JoyPadNum
            Set DIDevice(n) = di.CreateDevice(diDevEnum.GetItem(n).GetGuidInstance)
            DIDevice(n).SetCommonDataFormat DIFORMAT_JOYSTICK
            DIDevice(n).SetCooperativeLevel hWnd, DISCL_BACKGROUND Or DISCL_NONEXCLUSIVE
            DIDevice(n).GetCapabilities JoyCaps(n)
'            Debug.Print "Pad:" & n
'            Debug.Print JoyCaps(n).lButtons
            DIDevice(n).SetEventNotification 0
            DIDevice(n).Acquire
        Next
    InitDXInput = True
    Exit Function
    
ErrH:
    InitDXInput = False
    Debug.Print "Err [InitdxInput] 初始化输入设备错误!"
End Function
'功能:卸载DirectInput
Public Sub UnloadDXInput()
    Dim i As Integer
    For i = 0 To 4
        If Not (DIDevice(i) Is Nothing) Then
            DIDevice(i).Unacquire
        End If
    Next i
    Set di = Nothing
End Sub
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\键盘相关函数\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
'功能:指定的键盘按键是否按下
'CONST_DIKEYFLAGS请查看DXSDK或者本引擎的说明
Public Function KeyInput(ByVal KeyCode As CONST_DIKEYFLAGS, Optional ByVal Once As Boolean = False) As Boolean
    If KeyCode < 0 Or KeyCode > 255 Then
        Debug.Print "Err [GetKeyInput] 输入键盘检测码不在范围内!"
        Exit Function
    End If
    DIDevice(0).GetDeviceStateKeyboard diState
    KeyInput = IIf(diState.Key(KeyCode) = 0, False, True)
    
    If KeyInput Then
        If KeyState(KeyCode) > 0 And Once Then
            KeyInput = False
        End If
        If KeyState(KeyCode) > 10000 Then KeyState(KeyCode) = 1
        KeyState(KeyCode) = KeyState(KeyCode) + 1
    Else
        KeyState(KeyCode) = 0
    End If
End Function

'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\手柄相关函数\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
'功能:获得可用的手柄个数
Public Function GetJoyPadNum() As Integer
    GetJoyPadNum = m_JoyPadNum
End Function
'功能:获得可用手柄按钮个数
'参数:手柄号(例如JoyPadNum=1 为1号手柄)
Public Function GetBtnNum(JoyPadNum As Integer) As Integer
    If JoyPadNum < 0 Or JoyPadNum > m_JoyPadNum Then Exit Function
    GetBtnNum = JoyCaps(JoyPadNum).lButtons
End Function

'功能:指定的按键码是否按下
'参数:手柄号(例如JoyPadNum=1 为1号手柄)
'       按钮:1~16
'注意:在Win2000以上可以调节手柄的Axis模式和Button模式
'       对于PS改制手柄 无论在Axis模式还是Button下本函数都会自动识别方向键

Public Function JoyInput(ByVal JoyPadNum As Integer, ByVal Button As ENUM_XG_PSBUTTON, Optional Once As Boolean) As Boolean
    Dim JoyState As DIJOYSTATE
    If m_JoyPadNum = 0 Then
        JoyInput = False
        'Debug.Print "Err:[Joyinput] 没有安装手柄"
        Exit Function
    End If
    If Button = 0 Then JoyInput = False: Exit Function
    Button = Button - 1 '纠正到WINDOWS里的按键码
    
    DIDevice(JoyPadNum).Poll
    DIDevice(JoyPadNum).GetDeviceStateJoystick JoyState
    
        If JoyState.Buttons(Button) = 0 Then
            JoyInput = False
        Else
            JoyInput = True
        End If
    'Axis模式下的号码对应
    Select Case Button
        Case 12
            If JoyState.y < 15000 Then JoyInput = True
        Case 14
            If JoyState.y > 50000 Then JoyInput = True
        Case 13
            If JoyState.x < 15000 Then JoyInput = True
        Case 15
            If JoyState.x > 50000 Then JoyInput = True
    End Select
    
    If JoyInput Then
        If JoyPadState(Button) > 0 And Once Then
            JoyInput = False
        End If
        JoyPadState(Button) = JoyPadState(Button) + 1
    Else
        JoyPadState(Button) = 0
    End If
End Function
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\鼠标相关函数\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

'功能:返回鼠标X坐标
Public Function MouseX() As Long
    Dim t As PointAPI
    Dim Client As RECT
    GetCursorPos t
    GetClientRect m_hWnd, Client
    ScreenToClient m_hWnd, t
    MouseX = t.x
    If t.x < Client.Left Then MouseX = 0
    If t.x > Client.Right Then MouseX = Client.Right
    
End Function
'功能:返回鼠标Y坐标
Public Function MouseY() As Long
    Dim t As PointAPI
    Dim Client As RECT
    GetCursorPos t
    GetClientRect m_hWnd, Client
    ScreenToClient m_hWnd, t
    MouseY = t.y
    If t.y < Client.Top Then MouseY = 0
    If t.y > Client.Bottom Then MouseY = Client.Bottom
End Function
'功能:隐藏鼠标
Public Sub HideMouse()
    Do: Loop Until showCursor(0) < 0
End Sub
'功能:显示鼠标
Public Sub ShowMouse()
    Do: Loop Until showCursor(1) > 0
End Sub
'功能:指定的鼠标按钮是否按下
'参数:由ENUM_XG_MOUSEBUTTON给出常用的鼠标按钮定义
Public Function MouseKey(ByVal KeyCode As ENUM_XG_MOUSEBUTTON, Optional ByVal Once As Boolean) As Boolean
    MouseKey = False
    Select Case KeyCode
        Case xgL_BUTTON '左键按下
            If (GetKeyState(vbKeyLButton) And &H8000) Then
                MouseKey = True
            Else
                MouseKey = False
            End If
        Case xgR_BUTTON '右键按下
            If (GetKeyState(vbKeyRButton) And &H8000) Then
                MouseKey = True
            Else
                MouseKey = False
            End If
        Case xgM_BUTTON '中间滚轮按下
            If (GetKeyState(vbKeyMButton) And &H8000) Then
               MouseKey = True
            Else
                MouseKey = False
            End If
    End Select
    
    If MouseKey Then
        If MouseState(KeyCode) > 0 And Once Then
            MouseKey = False
        End If
        MouseState(KeyCode) = MouseState(KeyCode) + 1
    Else
        MouseState(KeyCode) = 0
    End If
    If MouseState(KeyCode) > 10000 Then MouseState(KeyCode) = 1
End Function






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Directx8.0 SDK : 坦克战 v2.0 基本操作: A/菜单操作: 菜单选择:W、S 或 上、下方向键 菜单确定:回车 B/游戏操作: 方向控制:W、A、S、D或方向键 发射子弹:空格 暂停游戏:回车 退出到菜单:ESC 版本升级说明: 1.可以暂停游戏了。 2.使用DirectxSound提升了声音品质,解决了老版本不能混音的缺点。 3.添加了敌方的AI,敌人撞墙后会搜寻追踪玩家。 4.物品增加到6个,玩家和敌人都可以吃到随机出现的物品。 5.关卡增加到了十关。 6.增加了地图编辑器,可以自己编辑地图和运行。 7.重写了爆炸的即时粒子系统,模拟爆炸时弹片的飞旋效果。 游戏物品说明: 1.钢盔:可以暂时不损血(除却被炸弹炸到)。 2.坦克:可以增加1点血。 3.时钟:暂时冻结坦克的移动。 4.星型:增加子弹和坦克移动速度(累计的)。 5.炸弹:随机轰炸地图的任意地点,被炸到的话,对方损失1点血。 6.船: 可以过河。 补充: 每关开始将重设坦克属性,但玩家坦克的血将不补充。 代码说明: 1.重新编写了代码。 2.编程语言:使用VC++6.0 + Directx8.0 SDK。 3.用DirectxDraw实现基本绘图,用DirectxInput 实现游戏基本操作 4.首次学习并使用DirectxSound组件实现了混音效果。 5.尝试封装了Directx的这三个重要组件。 5.本人为非专业编程人员,代码难免有的地方比较乱和不规范,望大家多多谅解! 问题: 1.游戏在不同的机器上运行会有不同的速度。如何让游戏在不同的机器上都有相对稳定的运行速度呢? 2.坦克爆炸时,一些坦克会暂时不显示,不能解决. 3.我方和对方坦克的碰撞检测是个难题,主要是测到碰撞后坦克倒退时有时会退出边界或穿墙而引起错误。所以去除了。
### 回答1: CocosCreator是一款功能强大的游戏开发引擎,而魔塔游戏源码则是指使用CocosCreator开发的一款魔塔游戏源代码。 CocosCreator魔塔游戏源码通常包含游戏的各个模块,包括角色控制、战斗系统、地图生成以及游戏UI等。在这个源码中,开发者可以看到一套完整的魔塔游戏框架和逻辑。 角色控制是魔塔游戏源码中的重要部分。开发者可以看到玩家角色的移动、攻击以及技能释放等代码。通过阅读源码,开发者可以了解到游戏角色的行为逻辑,比如怪物移动的规则、装备系统的实现等。 另外,战斗系统是魔塔游戏源码中的关键内容。开发者可以通过查看源码,了解到游戏的攻击和防御计算方式、技能释放和效果表现等细节。这对于学习游戏战斗系统的设计与实现非常有帮助。 地图生成也是源码中的一个重要模块。通过阅读源码,开发者可以了解到地图生成的算法、随机事件的处理、宝箱、商店等游戏元素的放置和生成等细节。 游戏的UI设计也是魔塔游戏源码中不可缺少的一部分。开发者可以通过查看源码,了解到游戏UI的布局、按钮点击事件的处理、弹窗的实现等细节。 总之,通过研究CocosCreator魔塔游戏源码,开发者可以学习到游戏开发中常用的算法和设计思路,同时也可以培养自己的开发能力和创造力。在学习和借鉴源码的基础上,开发者还可以根据自身需求进行二次开发和优化,创作出属于自己的魔塔游戏作品。 ### 回答2: CocosCreator魔塔游戏源码是指使用CocosCreator开发的魔塔游戏的程序代码。CocosCreator是一款基于Javascript的游戏开发引擎,通过它可以轻松创建多平台的游戏魔塔游戏源码通常包含了游戏的一些基本组成部分,如场景、角色、道具、怪物等。它们通过CocosCreator的节点和组件系统进行组织和管理。在源码中,开发者可以了解到游戏的逻辑、界面设计以及各个功能模块的实现方式。 通过使用CocosCreator魔塔游戏源码,开发者可以学习到如何实现一个完整的魔塔游戏。他们可以了解到游戏场景的搭建,通过编辑器创建地图和设置场景元素。他们可以学习到如何处理游戏角色的移动、攻击和受伤等操作,并实现相应的动画效果。另外,他们还可以了解到如何处理游戏道具的使用和怪物的生成与AI行为等。 魔塔游戏源码可以帮助开发者迅速上手游戏开发,节省大量的开发时间。通过对源码的学习和理解,开发者可以根据自己的需要进行二次开发和扩展,实现独具创意的魔塔游戏。 ### 回答3: CocosCreator魔塔游戏源码是基于CocosCreator游戏引擎开发的一种魔塔游戏的代码。魔塔游戏是一种以策略和冒险为主题的角色扮演游戏,玩家需要在迷宫中探索、寻找宝物、打败敌人,最终达到最深层并击败最终BOSS。 CocosCreator魔塔游戏源码包含了游戏的基本逻辑、界面设计、角色控制、敌人AI、道具系统等各个方面的代码实现。通过阅读源码,我们可以了解到游戏是如何实现地图的生成与呈现、角色的移动和战斗、敌人的行为规则、道具的获取和使用等功能。同时,源码还提供了一些基本的游戏美术资源,如角色、地图瓷砖、敌人等,可以用于快速搭建游戏。 在实际使用源码的时候,我们可以根据自己的需求进行修改和扩展,比如添加新的关卡、设计新的敌人、增加新的道具等。同时,我们也可以根据源码学习到CocosCreator游戏开发的一些基本技巧与规范,例如场景管理、碰撞检测、UI设计等。 总之,CocosCreator魔塔游戏源码是一个可以让我们了解和学习魔塔游戏开发的实际案例,可以通过对源码的学习和修改,快速搭建自己的游戏项目,并且还可以帮助我们掌握CocosCreator游戏引擎的使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gosub60

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值