Ir ao conteúdo
  • Cadastre-se

Cambalinho

Membro Pleno
  • Posts

    942
  • Cadastrado em

  • Última visita

posts postados por Cambalinho

  1. eis o meu actual código:

    void DrawRays()
    {
        int MapX =floor(PlayerPosX);
        int MapY=floor(PlayerPosY);
        while(LevelMap0[MapY][MapX]!=1)
        {
            MapX+=floor(cos(PlayerRadians)*1);
            MapY+=floor(sin(PlayerRadians)*1);
        };
        DrawLine(floor(PlayerPosX),floor(PlayerPosY),floor(MapX*32),floor(MapY*32),RGB(0,255,0));
    }

    eu somo 1 a 1 quadrado, consoante o Radiano do player, mas cada quadrado tem 32 por 32..

    alguém, no Youtube, ao mostrar 1 algoritmo DDA, disse que era o mesmo... yah.. right.

    eu posso ter o pseu-codigo errado, mas o raciocionio está correcto?

    • Curtir 1
  2. tem razão.. eu resolvi isso e muito mais.. verdade algumas classes\funções estavam repetidas e nem me tinha apercebido....

    agora tenho alguns avisos que não consigo resolver:

    1)

    hwnd = CreateWindowEx(0, classname, strCaption.c_str(),WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
                                      CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, parent, NULL, mod, this);

    tive de usar '0' para evitar 1 aviso.. e não posso usar 'NULL'.

     

    2)

    if (inst->clrBackColor==-1)

    'clrBackColor' é 1 objeto de:

    typeredef(COLORREF color);

    o '-1' é transparente... se calhar deveria outro tipo de variável.

     

    • Curtir 1
  3. como usar as opções do Linker no Code Blocks?

    eu tenho 1 class que usa o operador '='(overloading operators) e Lambdas.
    eis como compila:

    Citação

     

    "

    -------------- Clean: Debug in classcontrols (compiler: GNU GCC Compiler)---------------

    Cleaned "classcontrols - Debug"

    -------------- Build: Debug in classcontrols (compiler: GNU GCC Compiler)---------------

    g++.exe -Wall -g  -c C:\Users\Utilizador\Documents\CodeBlocks\classcontrols\main.cpp -o obj\Debug\main.o
    g++.exe  -o bin\Debug\classcontrols.exe obj\Debug\main.o  -lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32  -lgdi32 -luser32 -lkernel32 -lcomctl32 "..\..\..\..\..\Program Files\CodeBlocks\mingw32\i686-w64-mingw32\lib\libmsimg32.a" "..\..\..\..\..\Program Files\CodeBlocks\mingw32\i686-w64-mingw32\lib\libwinmm.a" "..\..\..\..\..\Program Files\CodeBlocks\mingw32\i686-w64-mingw32\lib\libgdiplus.a" "..\..\..\..\..\Program Files\CodeBlocks\mingw32\i686-w64-mingw32\lib\libgdi32.a" "C:\Program Files (x86)\CodeBlocks\MinGW\i686-w64-mingw32\lib\libbgi.a" -mwindows
    In file included from C:\Users\Utilizador\Documents\CodeBlocks\classcontrols\main.cpp:1:
    C:\Users\Utilizador\Documents\CodeBlocks\classcontrols\cambalinho.h: In static member function 'static LRESULT label::WndProcLabel(HWND, UINT, WPARAM, LPARAM)':
    C:\Users\Utilizador\Documents\CodeBlocks\classcontrols\cambalinho.h:2077:43: warning: comparison of integer expressions of different signedness: 'color' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
                         if (inst->clrBackColor==-1)
                             ~~~~~~~~~~~~~~~~~~^~~~
    C:\Users\Utilizador\Documents\CodeBlocks\classcontrols\cambalinho.h: In member function 'void form::setParent(HWND)':
    C:\Users\Utilizador\Documents\CodeBlocks\classcontrols\cambalinho.h:2949:118: warning: passing NULL to non-pointer argument 1 of 'HWND__* CreateWindowExA(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID)' [-Wconversion-null]
                                       CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, parent, NULL, mod, this);
                                                                                                                          ^
    C:\Users\Utilizador\Documents\CodeBlocks\classcontrols\cambalinho.h: In static member function 'static LRESULT form::WndProcForm(HWND, UINT, WPARAM, LPARAM)':
    C:\Users\Utilizador\Documents\CodeBlocks\classcontrols\cambalinho.h:2994:24: warning: unused variable 'KeyDownCount' [-Wunused-variable]
                 static int KeyDownCount=0;
                            ^~~~~~~~~~~~
    C:\Users\Utilizador\Documents\CodeBlocks\classcontrols\main.cpp: At global scope:
    C:\Users\Utilizador\Documents\CodeBlocks\classcontrols\main.cpp:9:14: error: redefinition of 'std::__cxx11::wstring towstring(const string&)'
     std::wstring towstring(const std::string& v)
                  ^~~~~~~~~
    In file included from C:\Users\Utilizador\Documents\CodeBlocks\classcontrols\main.cpp:1:
    C:\Users\Utilizador\Documents\CodeBlocks\classcontrols\cambalinho.h:359:14: note: 'std::__cxx11::wstring towstring(const string&)' previously defined here
     std::wstring towstring(const std::string& v)"

     

    isto foi retirado do 'Build Log'. como vê tenho imensos erros, mas sei que é do compilador ou opções do Linker.

    eu criei a classe, por isso funcionou na criação, mas após reinstalar o Code Blocks, perdi tudo... ao menos tenho a classe 😉

    • Curtir 1
  4. finalmente consegui resolver, mas notei alguns erros nos links\tutorials e no youtube:
    1 - a libraria é para o CodeBlocks 32 bits, o 64 dá esse erro!!!!;

    2 - a libraria\headers são na pasta(baixei o CodeBlocks 32 bits com o compilador mingw 32 bits: 

    "C:\Program Files (x86)\CodeBlocks\MinGW\i686-w64-mingw32\include"

    e

    "C:\Program Files (x86)\CodeBlocks\MinGW\i686-w64-mingw32\lib" 

    e não na:

    "C:\Program Files (x86)\CodeBlocks\MinGW\lib"

    e não na:

    "C:\Program Files (x86)\CodeBlocks\MinGW\include"

    demorei imenso reparar nisto tudo 😞

    muito obrigado por tudo amigo.

    • Curtir 1
  5. eu uso o CodeBlocks para programar C\C++.

    queria usar o Graphics.h. eu baixei 2 ficheiros headers e a libraria... mas podem não ser os compativeis.

    adicionei a libraria e este comandos\opções do linker:

    "-lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32"

    mas, ao compilar, obtenho 1 erro: "ld.exe||cannot find -lbgi|"

    porque este erro? como o corrigir? será da compatibilidade da libraria?

    • Curtir 1
  6. eis a função para criar DIB's:

    Private Declare Function CreateDIBSection Lib "gdi32.dll" (ByVal hdc As Long, ByRef pBitmapInfo As Any, ByVal un As Long, ByRef lplpVoid As Long, ByVal handle As Long, ByVal dw As Long) As Long

    eis como uso:

    hBitmap = CreateDIBSection(hdc, bmpInfoHeader, BI_RGB, bmpPtr(0), 0, 0)

    isto funciona, mas o 'bmpPtr' não fica como ponteiro.

    como transformo o 'bmpPtr' em ponteiro e altero os valores?

    e sim o VB6 permite usar ponteiros: http://www.thevbzone.com/ em ' VB SECRETS'

  7. eis a função do RayCasting:
     

    Private Sub RayCasting()
        Dim StartAngle As Double
        Dim EndAngle As Double
        Dim IncrementAngle As Double
        Dim Distance As Double
        Dim RayX As Double
        Dim RayY As Double
        Dim RayAngle As Double
        Dim RayActualX As Double
        Dim RayActualY As Double
        Dim Wall As Integer
        Dim IncrementPixel As Double
        Dim IncrementStepSin As Double
        Dim IncrementStepCos As Double
        Dim AlturaLinha As Double
        Dim CorrecaoVisao As Double
        
        
        'Obter a posição inicial dos Raios com a posição do jogador:
        RayX = PlayerX
        RayY = PlayerY
        
        'o ângulo do meio tem de ser o ângulo do jogador
        StartAngle = PlayerAngle - DegreeToRadians(60 / 2)
        IncrementAngle = PlayerRotation / 10
        Distance = 0
        IncrementPixel = 2
        
        Dim RayCount As Long
        
        Picture1.Cls
        RayAngle = StartAngle
        For RayCount = 0 To CamWidth / 10 Step 1
            Distance = 0
            AlturaLinha = 0
            Wall = 0
            RayActualX = PlayerX
            RayActualY = PlayerY
            IncrementStepSin = Sin(RayAngle) * IncrementPixel
            IncrementStepCos = Cos(RayAngle) * IncrementPixel
            Do While (Wall = 0)
                Wall = LevelMap(Floor(RayActualY / MapResolution))(Floor(RayActualX / MapResolution))
                If (Wall <> 0) Then Exit Do
                RayActualX = RayActualX + IncrementStepCos
                RayActualY = RayActualY + IncrementStepSin
                Distance = Distance + 1
            Loop
            
            AlturaLinha = Floor(CamHalfHeight / Distance * MapResolution)
            
            DrawLine Picture1, RayCount, 0, RayCount, CamHalfHeight - AlturaLinha / 2, vbCyan
            DrawLine Picture1, RayCount, CamHalfHeight - AlturaLinha / 2, RayCount, CamHalfHeight + AlturaLinha / 2, colors(Wall)
            DrawLine Picture1, RayCount, CamHalfHeight + AlturaLinha / 2, RayCount, CamHeight, vbMagenta
            Me.Line (RayX, RayY)-(RayActualX, RayActualY), vbCyan
            
            RayAngle = RayAngle + IncrementAngle
            If (RayCount = CamWidth) Then Exit For
        Next RayCount
    End Sub

    não tenho controlo entre velocidade e tamanho da tela... a fica fica super pequena... mas não entendi como posso alterar o tamanho da tela.... só se repetir a 2ª 'Drawline" para dupla linha vertical

  8. imagine que temos 1 array de 8X8 de quadrados e cada quadrado tem 64 de tamanho e quer 2 pixels de espaço entre eles.
    agora como posso desenhar esses quadrados com espaço?

    Private Sub DrawMap()
        Dim X As Integer
        Dim Y As Integer
        Dim X0 As Integer
        Dim Y0 As Integer
        Dim Spaces As Integer
        
        'MapResolution=64
        'LevelMapHeight and LevelMapWidth are 8
        
        Spaces = 5
        
        For Y = 0 To LevelMapHeight - 1
            For X = 0 To LevelMapWidth - 1
                X0 = X * MapResolution
                Y0 = Y * MapResolution
                'Line Method:
                'Line(X0,Y0) - (X1,Y2), côr
                'Square Method:
                'Line(X0,Y0) - (X1,Y2), côr, BF
                'X0 e Y0 é o ponto superior esquerdo e X1, Y1 é ponto inferior direito
                If (LevelMap(Y)(X) = 0) Then
                    Me.Line (X0 + Spaces, Y0 + Spaces - 1)-(X0 + MapResolution - Spaces, Y0 + MapResolution - Spaces - 1), vbBlack, BF
                Else
                    Me.Line (X0 + Spaces, Y0 + Spaces - 1)-(X0 + MapResolution - Spaces, Y0 + MapResolution - Spaces - 1), vbWhite, BF
                End If
            Next X
        Next Y

    o meu problema é não ter o mesmo espaço entre os quadrados e vejo isso na altura :(

    image.thumb.png.13ff8dbab259a7f572776c4f977eca04.png

    como posso resolver esse bug?

  9. vendo bem eu posso ter 1 erro da calculos para fazer o RayCasting :(

    Private Sub RayCasting()
        Dim r As Integer
        Dim mx As Integer
        Dim my As Integer
        Dim mp As Integer
        Dim mapx As Double
        Dim mapy As Double
        Dim dof As Integer
        Dim rx As Double
        Dim ry As Double
        Dim ra As Double
        Dim x0 As Double
        Dim y0 As Double
        
        ra = PlayerAngle
        For r = 0 To 10
            'Debug.Print "raycsting"
            'check Horizontal Lines:
            dof = 0
            Dim atan As Double
            If (Tan(ra) > 0) Then
                atan = -1 / Tan(ra)
            Else
                atan = -1
            End If
            If (ra > PI) Then
                ry = (CInt(ShiftLeft(ShiftRight(PlayerY, 6), 6) - 0.0001))
                rx = (PlayerY - ry) * atan + PlayerX
                y0 = -64
                x0 = -y0 * atan
            End If
            If (ra < PI) Then
                ry = (CLng(ShiftLeft(ShiftRight(PlayerY, 6), 6) + 64))
                rx = (PlayerY - ry) * atan + PlayerX
                y0 = 64
                x0 = -y0 * atan
            End If
            If (ra = 0 Or ra = PI) Then
                rx = PlayerX
                ry = PlayerY
                dof = 8
            End If
            While (dof < 8)
                
                mx = Cnt(ShiftLeft(rx, 6)) 'overflow error
                my = CLng(ShiftLeft(ry, 6))
                mp = mx * mapx + mx
                If (LevelMap(mapy)(mapx) = 1) Then
                    dof = 8
                Else
                    rx = rx + x0
                    ry = ry + y0
                    dof = dof + 1
                End If
                
                Me.Line (PlayerX, PlayerY)-(rx, ry), vbRed
            Wend
        Next r
    End Sub

     

  10. como evitar o overflow no Visual Basic 6?

    Function ShiftRight(ByVal lngNumber As Long, ByVal intNumBits As Integer) As Long
        '--------------
        'BIT SHIFT RIGHT >>
        '--------------
        ShiftRight = lngNumber \ 2 ^ intNumBits 'note the integer division op
    End Function
    
    Function ShiftLeft(ByVal lngNumber As Long, ByVal intNumBits As Integer) As Long
        '--------------
        'BIT SHIFT LEFT <<
        '--------------
        ShiftLeft = lngNumber * 2 ^ intNumBits
    End Function
    
     '............
    
    Dim mx As Integer
    mx = Cnt(ShiftLeft(rx, 6)) 'overflow error

    o 'mx' dá me o erro de overflow runtime error '6'. como posso evitar esse erro?

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!