🤔 Para Refletir : "As memórias, os sussurros, tudo vem da floresta, ela faz parte de você. E você faz parte dela." - Yonori Akari

uma engine raycasting com apenas 8 direções?(wolfstein3D)(RMXP)

Membro Membro
Postagens
24
Bravecoins
31
não sei ao certo se essa é a área correta até porque isso é mais um experimento do que nescessáriamente um pedido...peço que leia até o final
e coloque na area correta caso não estiver.....já peço desculpas de antemão quanto a isso.

pra quem não sabe o que é raycasting é uma técnica usada em jogos antigos para simular um jogo com a perspectiva em primeira pessoa
algo como vemos em wolfstein 3d por exemplo:

<iframe width="560" height="315" src="
" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

a ideia surgiu quando eu estava fuçando no script FPLE ENGINE de MGC(créditos a ele) que pode ser encontrado aqui:

FPLE : First Person Labyrinth Explorer

nesse script a camera fica em primeira pessoa mas ele se move em quatro direções como em um jogo dugeon crawler algo comum em rpgs do genero:

<iframe width="560" height="315" src="
" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

é claro que a camera girar em 360 graus e fazer o player se mover suavemente por todo o mapa deve ser algo complicado

mas e se fizesse algo mais simplificado respeitando os limites do rpg maker xp?,

eu pensei em um script de raycasting onde o personagem andasse respeitando a grid do mapa andando ainda de quadrado em quadrado mas ao invés de girar em um angulo de 90 graus para quatro direções(como é no script de mgc) ele girasse a camera em 45 graus para 8 direções ao invés de quatro(e não em várias como no wolfstein) ainda respeitando a grid do mapa o personagem poderia andar na diagonal....

eu falando aqui parece simples mas eu sei que não é xD, até porque não manjo de scripts e foi pensando nisso que pensei em ter pelo menos um norte do que fazer...

o conceito inicial do raycasting é um raio que varre todo o mapa em busca de objetos sólidos...... o raio detecta aquele objeto e calcula a distancia entre ela e o player naquele raio para fazer a parede se aproximar e desaproximar conforme a distancia:



Simple_raycasting_with_fisheye_correction.gif


note que as paredes que são realmente desenhadas na tela em tempo real só são aquelas que está na visão do jogador,isso permite uma alta performance

pensando nesse conceito imaginei usar um tilesset para o mapa,mas esse tileset para ser identificado como parede ou não parede eu usaria as tags de terreno:

"0" como não parede e "acima de 0" como parede.o raio que passaria para detectar estaria todo no script e ele usaria os parametros das tags para identificar as paredes,a distancia da parede seria calculada com a distancia do player e do tileset no mapa,mas ele não faria todo esse movimento em /360 graus suavemente como na imagem acima e sim ele respeitaria os angulos impostos pelas 8 direções do player do rpg maker ..... seria algo mais ou menos assim na visão do player:

ezgif-2-40e0109323.gif


e o player se movimentaria desta forma:

Animação.gif


o raio que faria toda varredura do mapa seria criado pelo script e a distancia do raio entre a parede já identificada pela tag de terreno
e o player seria calculado para fazer as paredes se aproximarem ou se afastarem

mas como eu disse anteriormente eu não sou bom em scripts...então para poder me ajudar usei o chat GPT

e dei a ele todos esses parametros citados anteriormente

e ele me gerou este script:

Ruby:
#-------------------------------------------------------------------------------
# Wolf3D-style 8-directional walls script for RPG Maker XP
# by ChatGPT
#-------------------------------------------------------------------------------

# Constants
WALL_TAG = 1
SCREEN_WIDTH = 640
SCREEN_HEIGHT = 480
GRID_SIZE = 32

# Wall drawing function
def draw_walls
  for x in 0...$game_map.width
    for y in 0...$game_map.height
      # Get the distance from the player to the current tile
      dist_x = ($game_player.x - x) * GRID_SIZE
      dist_y = ($game_player.y - y) * GRID_SIZE
      # Check if there is a wall in the tile
      if $game_map.terrain_tag(x, y) > 0
        # Check the direction of the wall based on the distance from the player
        if dist_x.abs > dist_y.abs
          if dist_x > 0
            # Wall is to the right
            $game_map.set_tile(x, y, wall_right_tile_id)
          else
            # Wall is to the left
            $game_map.set_tile(x, y, wall_left_tile_id)
          end
        else
          if dist_y > 0
            # Wall is to the bottom
            $game_map.set_tile(x, y, wall_bottom_tile_id)
          else
            # Wall is to the top
            $game_map.set_tile(x, y, wall_top_tile_id)
          end
        end
      else
        # No wall, so use the empty tile
        $game_map.set_tile(x, y, empty_tile_id)
      end
    end
  end
end

é claro que ele não faria o código todo milagrosamente pra mim mas quando joguei ele no meu projeto nenhuma mensagem de erro foi recebida....
mas tambem nada de diferente ocorreu...

apesar de tudo acho que ele apenas deu uma base para poder desenvolver....

como não sei nada de scripts queria saber o que vocês acham, e se é possivel modifica-lo para finalmente atingir o resultado

(e não,não espero texturas logo de cara)

de qualquer forma o código esta ai pra quem quiser brincar com ele e ver o que dá pra fazer...desde já agradeço
 
Última edição:
Voltar
Topo