1

几天来,我一直在研究我的游戏的假 3D 引擎,似乎无法在下面的视频中创建视图。我想我已经弄清楚了如何正确缩放精灵。我似乎无法弄清楚如何旋转世界精灵。我只能将 x 轴上的世界精灵向左或向右滑动,具体取决于使用的玩家对象旋转键。我对如何复制视频如何进行完整的 360 度旋转以使玩家可以看到前面或后面的对象以及如何实际使世界对象看起来像它们正在旋转感到困惑。

一旦我的 facesDir 变量达到 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

播放器绘制GUI代码

//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

4

0 回答 0