05-05-2024, 03:01 PM
(05-05-2024, 02:12 PM)1micha.elok Wrote: The Devil's Triangle
click each image to zoom in
Question #1
As you may see in the images above, I found a strange thing with the movement of the pyramid.
When I pressed UP or DOWN, the pyramid followed the plane direction.
What should be changed in the code ?
Question #2
The initial value of
plane.y = 0
pyramid.y = 6
But why are the plane and the pyramid in the same horizontal line at the beginning of the game ?
Code:'=====================================================
'The Devil's Triangle
'
'3D Model :
'Voxel Plane assets by maxparata
'https://maxparata.itch.io/voxel-plane?download
'======================================================
'----------------
' INITIALIZATION
'----------------
include "s3d.n7"; S3D_SetView(primary, rad(45), 0.1, 50)
set window "The Devil's Triangle",800,400,false
set redraw off
'color definition
white = [255,255,255]
black = [0,0,0,120]
gray = [200,200,200]
'plane
plane = []
plane.model = S3D_LoadMesh("plane/Plane01.obj", 0.5,-0.5,0.5, false)
plane.rotate = 30
plane.x = -5 ; plane.y = 0 ; plane.z = 10
'pyramid
pyramid = []
pyramid.rotate = 0
pyramid.x = 20; pyramid.y = 6 ; pyramid.z = 10
pyramid.texture = loadimage("plane/fire.png")
pyramid.mesh =
S3D_BeginMesh()
S3D_Begin(S3D_TRIANGLES) 'sides
S3D_Push()
for i = 0 to 3
S3D_Vertex(0, -1, 0, 0.5, 0)
S3D_Vertex(1, 1, -1, 1, 1)
S3D_Vertex(-1, 1, -1, 0, 1)
S3D_RotateY(rad(90))
next
S3D_Pop()
S3D_End()
S3D_Begin(S3D_QUADS) 'bottom
S3D_Vertex(1, 1, -1, 1, 0)
S3D_Vertex(1, 1, 1, 1, 1)
S3D_Vertex(-1, 1, 1, 0, 1)
S3D_Vertex(-1, 1, -1, 0, 0)
S3D_End()
S3D_EndMesh()
'-----------
' MAIN LOOP
'-----------
while not keydown(KEY_ESCAPE, true)
set color black; cls; S3D_Clear()
'information
set color gray
cx = width(primary)/2
cy = height(primary)/2
draw line cx,0,cx,cy*2
draw line 0,cy,cx*2,cy
'plane control
if keydown(KEY_UP,true) then
if plane.y > -5 then
plane.y = plane.y - 0.08
plane.rotate = (plane.rotate + 90*0.03)%360
else
plane.y = 4
endif
endif
if keydown(KEY_DOWN,true) then
if plane.y < 5 then
plane.y = plane.y + 0.08
plane.rotate = (plane.rotate - 90*0.03)%360
else
plane.y = -4
endif
endif
S3D_Translate(plane.x, plane.y, plane.z)
S3D_RotateX(rad(plane.rotate))
S3D_Mesh(plane.model, 0)
'pyramid
pyramid.rotate = (pyramid.rotate + 30*0.03)%360
if pyramid.x < - 5 then
pyramid.x = 20
else
pyramid.x = pyramid.x - 0.01
endif
S3D_Push()
S3D_Translate(pyramid.x, pyramid.y, pyramid.z)
S3D_RotateX(rad(pyramid.rotate))
S3D_RotateZ(rad(270))
S3D_Texture(pyramid.texture)
S3D_Scale(0.5,0.5,0.5)
S3D_Mesh(pyramid.mesh, 0)
S3D_Pop()
redraw
wait 1
wend
You need to push and pop the transformation when drawing the plane, else the pyramid's position will be relative to the plane's position and rotations.
Code:
' Move everything 10 units into the screen. This can be seen as setting the camera position,
' and it should affect all other drawing, so no push or pop.
S3D_Translate(0, 0, 10)
' Add push and pop around the code to draw the plane, else the position and rotation will
' affect objects drawn afterwards.
S3D_Push()
S3D_Translate(plane.x, plane.y, plane.z)
S3D_RotateX(rad(plane.rotate))
S3D_Mesh(plane.model, 0)
S3D_Pop()
I added a translate into the screen before drawing the plane and the pyramid so that I could see what the pyramid was up to.