Aldeia RPG

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Suporte ao desenvolvimento de jogos


2 participantes

    [E.O 2.0] MAPOBJ Implementação + Projétil animado

    Kotol
    Kotol
    Moderador Local
    Moderador Local


    Mensagens : 77
    Créditos : 16

    [E.O 2.0] MAPOBJ Implementação + Projétil animado Empty [E.O 2.0] MAPOBJ Implementação + Projétil animado

    Mensagem por Kotol Qua Abr 19, 2023 5:14 pm

    Bem haviam me pedido um projétil usando o sistema de animação da engine, no entanto esse sistema vem um pouco mais que quem sabe se eu tiver tempo, adiciono uns "add-on's" com objetos temporários no mapa, etc...(dá até pra brincar de fazer um SandBox se usar bem da lógica dos códigos..Inovação pro sistema de casa aí de jogadores, switch...)

    O que o sistema faz? 
    Projétil por animação. Mas melhorado, já que é uma variável (limitei a 30) de projéteis no mapa. O sistema atual que vi, deixa o projétil como recurso do "TempPlayer" , já eu criei um recurso em "MapObj" que como eu citei, dá pra expandir esse "MapObj" para objetos com duração de tempo, vida, que interage se movendo por matriz pré-definida ou por 'trigger' , até por "scriptStates".
    -Projétil é enviado ao jogador que entra no mapa;
    -Dono do projétil se sair do mapa enquanto seu projétil tem "range" ele é limpo;
    -Animações pelo cliente -> Ao invés de toda movimentação ser um "SendAnimation" consumindo o servidor, deixamos o check de posição/valores no servidor, e o cliente se vira com a animação (como se virava, mas agora sem exigir do servidor);
    -Tile Block = Limpar projétil e não deixar ultrapassar;
    -X/Y com jogador ou NPC = Ataque;

    Mas sem mais delongas, vamos ao tutorial que é bem rapidinho.

    Abra seu "Server.Vbp" e crie um módulo novo e o nomeie de "ModMapObj". Agora, dentro desse módulo, adicione isto:

    Spoiler:

    Agora em "ModGeneral" , na "Public Sub ClearGameData" , abaixo de:

    Código:
    Call SetStatus("Clearing animations...")

    Adicione isto:
    Código:
    Call SetStatus("Limpando Index dos projeteis do mapa...")
        Call ClearMapProjs


    Agora, em "ModServerLoop" na "Sub ServerLoop" , procure por esta parte:
    Código:
    ' HoT and DoT logic
                        For X = 1 To MAX_DOTS
                            HandleDoT_Player i, X
                            HandleHoT_Player i, X
                        Next

    Logo abaixo adicione isto:
    Código:
    For X = 1 To MAX_MAPS
                            'Check for projectile
                            If GetTotalMapProjs(X) Then
                                HandleMapProjectile X
                            End If
                        Next


    Agora, em "ModEnumerations" , na Enumeração "Public Enum ServerPackets" , antes de:
    Código:
    ' Make sure SMSG_COUNT is below everything else
        smsg_count
    End Enum

    Enumere com isso:
    Código:
    SMapProj


    Agora aqui é bem livre porque é onde você vai criar seu projétil, seja ele atrelado ao item ou ao seu ataque. Para liberdade eu atrelei ao ataque básico, então, em "ModHandleData" na "SubHandleAttack", procure por:
    Código:
    If MapNum <= 0 Or MapNum > MAX_MAPS Then Exit Sub
     (Ou seja o último check de 'Subscript' da packet recebida do cliente)

    E abaixo adicione isto:
    Código:
    'Testing
        CreateMapProj GetPlayerMap(Index), Index, 1, GetPlayerX(Index), GetPlayerY(Index), 4, GetPlayerDir(Index), 500

    Nesse caso vai criar um projétil:
    Animação Número: 1
    Range: 4
    Velocidade: 500ms = 0.5s por tile

    Agora vamos para o cliente. Abra-o também e crie um módulo novo de nome "ModMapObj" e dentro dele adicone isto:

    Spoiler:

    Agora, em "ModGamelogic' , na "Public Sub GameLoop" , abaixo de:
    Código:
     ' *** Start GameLoop ***
        Do While InGame
            Tick = GetTickCount                            ' Set the inital tick
            ElapsedTime = Tick - FrameTime                 ' Set the time difference for time-based movement
            FrameTime = Tick                               ' Set the time second loop time to the first.

    Adicione isto:
    Código:
    'Check for projectiles
            For i = 1 To MAX_MAP_PROJECTILES
                If MapObj.MapProjectile(i).ProjOwner > 0 Then
                    HandleMapProjectile
                End If
            Next


    Agora, em "ModHandleData", na "Public Sub InitMessages" , abaixo de:
    Código:
    HandleDataSub(SPartyVitals) = GetAddress(AddressOf HandlePartyVitals)

    Adicione isto:
    Código:
    HandleDataSub(SMapProj) = GetAddress(AddressOf HandleMapProj)

    E ainda em "ModHandleData" ao final, adicione isto:
    Código:
    Private Sub HandleMapProj(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddR As Long, ByVal ExtraVar As Long)
    Dim i As Long
    Dim Buffer As clsBuffer
        
        ' If debug mode, handle error then exit out
        If Options.Debug = 1 Then On Error GoTo errorhandler
        
        Set Buffer = New clsBuffer
        Buffer.WriteBytes Data()
        For i = 1 To MAX_MAP_PROJECTILES
             With MapObj.MapProjectile(i)
                 .ProjOwner = Buffer.ReadLong
                 .ProjAnim = Buffer.ReadLong
                 .ProjX = Buffer.ReadLong
                 .ProjY = Buffer.ReadLong
                 .ProjDir = Buffer.ReadLong
                 .ProjRange = Buffer.ReadLong
                 .ProjSpeed = Buffer.ReadLong
                 .ProjTimer = 0
                 If .ProjOwner > 0 Then
                    CreateMapProj .ProjOwner, .ProjAnim, .ProjX, .ProjY, .ProjRange, .ProjDir, .ProjSpeed
                 Else
                    EraseMapProj i
                 End If
             End With
         Next
        Set Buffer = Nothing
        
        ' Error handler
        Exit Sub
    errorhandler:
        HandleError "HandleMapProj", "modHandleData", Err.Number, Err.Description, Err.Source, Err.HelpContext
        Err.Clear
        Exit Sub
    End Sub

    Agora, em "ModEnumerations" , na enumeração "Public Enum ServerPackets" , antes de:
    Código:
    ' Make sure SMSG_COUNT is below everything else
        SMsg_count
    End Enum

    Adicione isto:
    Código:
    SMapProj

    E pronto! Agora você tem um sistema de projétil por animação mais dinâmico logicamente e mais aberto a novas possibilidades! Qualquer dúvida ou sugestão, pode mandar!

    Créditos
    Kotol 

    Valentine e Souza gostam desta mensagem

    avatar
    Souza
    Novato
    Novato


    Mensagens : 9
    Créditos : 0

    [E.O 2.0] MAPOBJ Implementação + Projétil animado Empty Re: [E.O 2.0] MAPOBJ Implementação + Projétil animado

    Mensagem por Souza Qui Abr 20, 2023 9:10 am

    Meu amigo, você é um anjo 😇
    Muito obrigado <3

    Kotol gosta desta mensagem


      Data/hora atual: Qua maio 29, 2024 9:26 am