Поддельные 3D 2D от первого лица Engine Game Maker Studio

Я уже несколько дней работаю только над фальшивым 3D-движком своей игры и, похоже, не могу создать вид из видео ниже. Думаю, я понял, как правильно масштабировать спрайты. Я не могу понять, как вращать мир спрайтов. Я могу только перемещать мировые спрайты по оси x влево или вправо в зависимости от того, какие клавиши вращения объекта игрока используются. Я не совсем понимаю, как продублировать, как видео вращается на 360 градусов, чтобы игрок мог видеть объекты спереди или сзади, и как на самом деле заставить объекты мира выглядеть так, как будто они вращаются.

Как только моя переменная faceDir достигает 360 или -360, она сбрасывается в 0. Я не уверен, является ли это частью проблемы, но я не вижу другого способа подделать полный поворот на 360 и получить точные показания.

Я только хочу использовать 2D математику / функции для этого проекта.

Посмотреть скрипт, используемый объектами мира

objectSprite=argument0


//Draw
if x>obj_player.x //Draws sprite if in front of player
    {draw_sprite_ext(argument0,0,x+obj_player.facingDir,
    sprite_height+400,obj_player.scaling,obj_player.scaling,0,c_white,1)}


//Scaling Size Limit
if obj_player.scaling>=4
    {obj_player.scaling=4}
else if obj_player.scaling<=1
    {obj_player.scaling=1}

Код, используемый объектами мира для доступа к скрипту вида

script_execute(scr_view,spr_SPRITE_NAME)

Игрок создает код события

facingDir=0
scaling=0
viewSector=1

Код события шага игрока

//Restart Game
if keyboard_check_pressed(vk_tab)
    {game_restart()}


//Rotate Limit
if facingDir>360
    {facingDir=0}

else if facingDir<-360
    {facingDir=0}


//Rotate Left - Rotates Right View - Negative facingDir
if keyboard_check(ord('A'))
    {facingDir-=2}


//Rotate Right - Rotates Left View - Positive facingDir
if keyboard_check(ord('D'))
    {facingDir+=2}


//Move Forwards
if keyboard_check(ord('W'))
    {motion_set(facingDir,4)
    scaling+=0.2}


//Move Backwards
if keyboard_check(ord('S'))
    {motion_set(facingDir,-4)
    scaling-=0.2}


//Stop Movement
if keyboard_check_released(ord('W')) or keyboard_check_released(ord('S'))
    {speed=0}


//View Sector Tracking - Positive

//Positive - North
if facingDir>0 and facingDir<45
    {viewSector=1}

//Positive - North West
if facingDir>292.5 and facingDir<315
    {viewSector=2}

//Positive - West
if facingDir>225 and facingDir<270
    {viewSector=3}

//Positive - South West
if facingDir>202.5 and facingDir<225
    {viewSector=4}

//Positive - South
if facingDir>135 and facingDir<180
    {viewSector=5}

//Positive - South East
if facingDir>112.5 and facingDir<135
    {viewSector=6}

//Positive - East
if facingDir>45 and facingDir<90
    {viewSector=7}

//Positive - North East
if facingDir>22.5 and facingDir<67.5
    {viewSector=8}


//View Sector Tracking - Negative

//Negative - North
if facingDir<0 and facingDir>-45
    {viewSector=1}

//Negative - North East
if facingDir<-22.5 and facingDir>-67.5
    {viewSector=2}

//Negative - East
if facingDir<-45 and facingDir>-90
    {viewSector=3}

//Negative - South East
if facingDir<-112.5 and facingDir>-135
    {viewSector=4}

//Negative - South
if facingDir<-135 and facingDir>-180
    {viewSector=5}

//Negative - South West
if facingDir<-202.5 and facingDir>-225
    {viewSector=6}

//Negative - West
if facingDir<-225 and facingDir>-270
    {viewSector=7}

//Negative - North West
if facingDir<-292.5 and facingDir>-315
    {viewSector=8}


//
image_angle=facingDir

Плеер рисует графический код

//Draw Labels and Variables
draw_text(20,0,'Direction')
draw_text(150,20,'X')
draw_text(200,20,x)
draw_text(300,20,'Y')
draw_text(350,20,y)
draw_text(20,20,facingDir)
draw_text(20,40,'View Sector')
draw_text(20,60,viewSector)


//View Sectors
if viewSector=1
    {draw_text(160,40,'North')}

else if viewSector=2
    {draw_text(160,40,'North East')}

else if viewSector=3
    {draw_text(160,40,'East')}

else if viewSector=4
    {draw_text(160,40,'South East')}

else if viewSector=5
    {draw_text(160,40,'South')}

else if viewSector=6
    {draw_text(160,40,'South West')}

else if viewSector=7
    {draw_text(160,40,'West')}

else if viewSector=8
    {draw_text(160,40,'North West')}

Поддельный 3D-тест: https://www.youtube.com/watch?v=wuUXPRzPC3E

Файл проекта: http://www.megafileupload.com/tjnN/Raycasting.gmx.zip

1 ответ

все еще есть исходный код? может я смогу помочь

Другие вопросы по тегам