Tässäpä on tälläinen 3d huone jossa voi liikkua ja sen sellaista. Otinpa tämän http://nehe.gamedev.net joka on yksi hyvä openGl sivusto (jos joku ei sitä tiennyt). Joops.
Että siitä vaan sitten. Tarvitset kuvan joka on 255*255 (Mud.bmp).
ja kaksi moduulia ja yhden formin ja yhden picturen.
ja yhden world.txt nimisen teksti filen jonka kirjoituksen näet alhaalla. Tämän world.txt ja Mud.bmp pitää olla kansiossa Data ja sen pitää olla samassa kansiossa kuin
formi
' Note the ScaleMode of this form is set to pixels Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Keys(KeyCode) = True End Sub Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) Keys(KeyCode) = False End Sub Private Sub Form_Resize() ReSizeGLScene ScaleWidth, ScaleHeight End Sub Private Sub Form_Unload(Cancel As Integer) KillGLWindow End Sub
moduuli1
Option Explicit Public Function DrawGLScene() As Boolean ' Here's Where We Do All The Drawing glClear clrColorBufferBit Or clrDepthBufferBit ' Clear Screen And Depth Buffer glLoadIdentity ' Reset The Current Matrix Dim x_m As GLfloat Dim y_m As GLfloat Dim z_m As GLfloat Dim u_m As GLfloat Dim v_m As GLfloat ' Floating Point For Temp X, Y, Z, U And V Vertices Dim xtrans As GLfloat Dim ztrans As GLfloat Dim ytrans As GLfloat Dim sceneroty As GLfloat xtrans = -xpos ' Used For Player Translation On The X Axis ztrans = -zpos ' Used For Player Translation On The Z Axis ytrans = -walkbias - 0.25 ' Used For Bouncing Motion Up And Down sceneroty = 360# - yrot ' 360 Degree Angle For Player Direction Dim numtriangles As Integer ' Integer To Hold The Number Of Triangles glRotatef lookupdown, 1#, 0#, 0# ' Rotate Up And Down To Look Up And Down glRotatef sceneroty, 0#, 1#, 0# ' Rotate Depending On Direction Player Is Facing glTranslatef xtrans, ytrans, ztrans ' Translate The Scene Based On Player Position glBindTexture glTexture2D, Texture(mFilter) ' Select A Texture Based On filter numtriangles = Sector1.numtriangles ' Get The Number Of Triangles In Sector 1 ' Process Each Triangle Dim loop_m As Integer For loop_m = 0 To numtriangles - 1 ' Loop Through All The Triangles glBegin bmTriangles ' Start Drawing Triangles glNormal3f 0#, 0#, 1# ' Normal Pointing Forward x_m = Sector1.triangle(loop_m).Vertex(0).x ' X Vertex Of 1st Point y_m = Sector1.triangle(loop_m).Vertex(0).y ' Y Vertex Of 1st Point z_m = Sector1.triangle(loop_m).Vertex(0).z ' Z Vertex Of 1st Point u_m = Sector1.triangle(loop_m).Vertex(0).u ' U Texture Coord Of 1st Point v_m = Sector1.triangle(loop_m).Vertex(0).v ' V Texture Coord Of 1st Point glTexCoord2f u_m, v_m: glVertex3f x_m, y_m, z_m ' Set The TexCoord And Vertice x_m = Sector1.triangle(loop_m).Vertex(1).x ' X Vertex Of 2nd Point y_m = Sector1.triangle(loop_m).Vertex(1).y ' Y Vertex Of 2nd Point z_m = Sector1.triangle(loop_m).Vertex(1).z ' Z Vertex Of 2nd Point u_m = Sector1.triangle(loop_m).Vertex(1).u ' U Texture Coord Of 2nd Point v_m = Sector1.triangle(loop_m).Vertex(1).v ' V Texture Coord Of 2nd Point glTexCoord2f u_m, v_m: glVertex3f x_m, y_m, z_m ' Set The TexCoord And Vertice x_m = Sector1.triangle(loop_m).Vertex(2).x ' X Vertex Of 3rd Point y_m = Sector1.triangle(loop_m).Vertex(2).y ' Y Vertex Of 3rd Point z_m = Sector1.triangle(loop_m).Vertex(2).z ' Z Vertex Of 3rd Point u_m = Sector1.triangle(loop_m).Vertex(2).u ' U Texture Coord Of 3rd Point v_m = Sector1.triangle(loop_m).Vertex(2).v ' V Texture Coord Of 3rd Point glTexCoord2f u_m, v_m: glVertex3f x_m, y_m, z_m ' Set The TexCoord And Vertice glEnd ' Done Drawing Triangles Next loop_m DrawGLScene = True ' Keep Going End Function
moduuli2
Option Explicit ' a couple of declares to work around some deficiencies of the type library Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lpDevMode As Any) As Boolean Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwflags As Long) As Long Private Declare Function CreateIC Lib "gdi32" Alias "CreateICA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, ByVal lpInitData As Long) As Long Private Const CCDEVICENAME = 32 Private Const CCFORMNAME = 32 Private Const DM_BITSPERPEL = &H40000 Private Const DM_PELSWIDTH = &H80000 Private Const DM_PELSHEIGHT = &H100000 Private Type DEVMODE dmDeviceName As String * CCDEVICENAME dmSpecVersion As Integer dmDriverVersion As Integer dmSize As Integer dmDriverExtra As Integer dmFields As Long dmOrientation As Integer dmPaperSize As Integer dmPaperLength As Integer dmPaperWidth As Integer dmScale As Integer dmCopies As Integer dmDefaultSource As Integer dmPrintQuality As Integer dmColor As Integer dmDuplex As Integer dmYResolution As Integer dmTTOption As Integer dmCollate As Integer dmFormName As String * CCFORMNAME dmUnusedPadding As Integer dmBitsPerPel As Integer dmPelsWidth As Long dmPelsHeight As Long dmDisplayFlags As Long dmDisplayFrequency As Long End Type Public Keys(255) As Boolean ' used to keep track of key_downs Public Active As Boolean Private hrc As Long Private fullscreen As Boolean Const piover180 As Double = 0.0174532925 Public heading As Double Public xpos As Double Public zpos As Double Public yrot As GLfloat ' Y Rotation Public walkbias As GLfloat Public walkbiasangle As GLfloat Public lookupdown As GLfloat Public z As GLfloat ' Depth Into The Screen (we need to initialize this ' as we can't declare and assign an initivalue like C ' initial value -0.5# Public light As Boolean ' Lighting ON / OFF Public lp As Boolean ' L Pressed? Public fp As Boolean ' F Pressed? Public LightAmbient(3) As GLfloat ' Ambient Light Values ( NEW ) ' = { 0.5f, 0.5f, 0.5f, 1.0f }; Public LightDiffuse(3) As GLfloat ' Diffuse Light Values ( NEW ) ' = { 1.0f, 1.0f, 1.0f, 1.0f }; Public LightPosition(3) As GLfloat ' Light Position ( NEW ) ' = { 0.0f, 0.0f, 2.0f, 1.0f }; Public mFilter As GLuint ' Which Filter To Use Public Texture(3) As GLuint ' Storage For Three Textures Type tagVERTEX ' Build Our Vertex Structure x As GLfloat y As GLfloat z As GLfloat ' 3D Coordinates u As GLfloat v As GLfloat ' Texture Coordinates End Type Type tagTRIANGLE ' Build Our Triangle Structure Vertex(2) As tagVERTEX ' Array Of Three Vertices End Type ' Call It TRIANGLE Type tagSECTOR ' Build Our Sector Structure numtriangles As Integer ' Number Of Triangles In Sector triangle() As tagTRIANGLE ' Pointer To Array Of Triangles End Type Public Sector1 As tagSECTOR ' Call It SECTOR Private OldWidth As Long Private OldHeight As Long Private OldBits As Long Private OldVertRefresh As Long Private mPointerCount As Integer Private Sub readstr(ByVal FileNum As Integer, ByRef s As String) ' Read In A String Do ' Start A Loop Line Input #FileNum, s ' Read One Line Loop While Left$(s, 1) = "/" Or Len(Trim$(s)) = 0 ' See If It Is Worthy Of Processing End Sub Private Function Tokenize(ByVal s As String, ByVal delim As String) As Variant Dim a() As String Dim i As Integer Dim pos As Integer i = 0 s = Trim$(s) Do While (InStr(s, delim) > 0) ReDim Preserve a(i) a(i) = Left$(s, InStr(s, delim) - 1) s = Trim$(Mid$(s, InStr(s, delim) + 1)) i = i + 1 Loop If Len(s) > 0 Then ReDim Preserve a(i) a(i) = s End If Tokenize = a() End Function Private Sub SetupWorld() Dim i As Integer Dim vert As Integer Dim numtriangles As Integer Dim filein As Integer Dim LineItems() As String filein = FreeFile Dim oneline As String Open "data/world.txt" For Input As #filein ' File To Load World Data From readstr filein, oneline LineItems = Tokenize(oneline, " ") If LineItems(0) = "NUMPOLLIES" Then numtriangles = CInt(LineItems(1)) End If ReDim Sector1.triangle(numtriangles) Sector1.numtriangles = numtriangles For i = 0 To numtriangles - 1 For vert = 0 To 2 readstr filein, oneline LineItems() = Tokenize(oneline, " ") Sector1.triangle(i).Vertex(vert).x = Val(LineItems(0)) Sector1.triangle(i).Vertex(vert).y = Val(LineItems(1)) Sector1.triangle(i).Vertex(vert).z = Val(LineItems(2)) Sector1.triangle(i).Vertex(vert).u = Val(LineItems(3)) Sector1.triangle(i).Vertex(vert).v = Val(LineItems(4)) With Sector1.triangle(i).Vertex(vert) Debug.Print .x, .y, .z, .u, .v End With Next vert Next i Close #filein End Sub Private Function GetNextToken(ByVal s As String) As String ' return the next item in the string until space or end of line ' the passed in string will be End Function Private Sub SetupLightingArrays() LightAmbient(0) = 0.5 LightAmbient(1) = 0.5 LightAmbient(2) = 0.5 LightAmbient(3) = 1# LightDiffuse(0) = 1# LightDiffuse(1) = 1# LightDiffuse(2) = 1# LightDiffuse(3) = 1# LightPosition(0) = 0# LightPosition(1) = 0# LightPosition(2) = 2# LightPosition(3) = 1# End Sub Private Sub HidePointer() ' hide the cursor (mouse pointer) mPointerCount = ShowCursor(False) + 1 Do While ShowCursor(False) >= -1 Loop Do While ShowCursor(True) <= -1 Loop ShowCursor False End Sub Private Sub ShowPointer() ' show the cursor (mouse pointer) Do While ShowCursor(False) >= mPointerCount Loop Do While ShowCursor(True) <= mPointerCount Loop End Sub Private Function LoadBMP(ByVal Filename As String, ByRef Texture() As GLuint, ByRef Height As Long, ByRef Width As Long) As Boolean Dim intFileHandle As Integer Dim bitmapheight As Long Dim bitmapwidth As Long ' Open a file. ' The file should be BMP with pictures 64x64,128x128,256x256 ..... If Filename = "" Then End End If If UCase(Right(Filename, 3)) = "BMP" Then Form1.Picture1.Picture = LoadPicture(Filename) CreateTextureMapFromImage Form1.Picture1, Texture(), Height, Width ElseIf UCase(Right(Filename, 3)) = "MOT" Then intFileHandle = FreeFile Open Filename For Binary Access Read Lock Read Write As intFileHandle Get #intFileHandle, , Width Get #intFileHandle, , Height ReDim bitmapImage(2, Height - 1, Width - 1) Get #intFileHandle, , Texture Close intFileHandle End If LoadBMP = True End Function Private Sub CreateTextureMapFromImage(pict As PictureBox, ByRef TextureImg() As GLbyte, ByRef Height As Long, ByRef Width As Long) ' Create the array as needed for the image. pict.ScaleMode = 3 ' Pixels Height = pict.ScaleHeight Width = pict.ScaleWidth ReDim TextureImg(2, Height - 1, Width - 1) ' Fill the array with the bitmap data... This could take ' a while... Dim x As Long, y As Long Dim c As Long Dim yloc As Long For x = 0 To Width - 1 For y = 0 To Height - 1 c = pict.Point(x, y) ' Returns in long format. yloc = Height - y - 1 TextureImg(0, x, yloc) = c And 255 TextureImg(1, x, yloc) = (c And 65280) \ 256 TextureImg(2, x, yloc) = (c And 16711680) \ 65536 Next y Next x End Sub Private Function LoadGLTextures() As Boolean ' Load Bitmaps And Convert To Textures Dim Status As Boolean Dim h As Long Dim w As Long Dim TextureImage() As GLbyte Status = False ' Status Indicator If LoadBMP("Data\Mud.BMP", TextureImage(), h, w) Then ' Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit Status = True ' Set The Status To TRUE glGenTextures 3, Texture(0) ' Create The Textures ' Create Nearest Filtered Texture glBindTexture glTexture2D, Texture(0) glTexParameteri glTexture2D, tpnTextureMagFilter, GL_NEAREST '( NEW ) glTexParameteri glTexture2D, tpnTextureMinFilter, GL_NEAREST '( NEW ) glTexImage2D glTexture2D, 0, 3, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage(0, 0, 0) ' Create Linear Filtered Texture glBindTexture glTexture2D, Texture(1) glTexParameteri glTexture2D, tpnTextureMinFilter, GL_LINEAR ' Linear Filtering glTexParameteri glTexture2D, tpnTextureMagFilter, GL_LINEAR ' Linear Filtering glTexImage2D glTexture2D, 0, 3, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage(0, 0, 0) ' Create MipMapped Texture glBindTexture glTexture2D, Texture(2) glTexParameteri glTexture2D, tpnTextureMagFilter, GL_LINEAR glTexParameteri glTexture2D, tpnTextureMinFilter, GL_LINEAR_MIPMAP_NEAREST '( NEW ) gluBuild2DMipmaps glTexture2D, 3, w, h, GL_RGB, GL_UNSIGNED_BYTE, VarPtr(TextureImage(0, 0, 0)) ' ( NEW ) End If Erase TextureImage ' Free the texture image memory LoadGLTextures = Status End Function Public Sub ReSizeGLScene(ByVal Width As GLsizei, ByVal Height As GLsizei) ' Resize And Initialize The GL Window If Height = 0 Then ' Prevent A Divide By Zero By Height = 1 ' Making Height Equal One End If glViewport 0, 0, Width, Height ' Reset The Current Viewport glMatrixMode mmProjection ' Select The Projection Matrix glLoadIdentity ' Reset The Projection Matrix ' Calculate The Aspect Ratio Of The Window gluPerspective 45#, Width / Height, 0.1, 100# glMatrixMode mmModelView ' Select The Modelview Matrix glLoadIdentity ' Reset The Modelview Matrix End Sub Public Function InitGL() As Boolean ' All Setup For OpenGL Goes Here If Not LoadGLTextures Then ' Jump To Texture Loading Routine ( NEW ) InitGL = False ' If Texture Didn't Load Return FALSE ( NEW ) Exit Function End If glEnable glcTexture2D ' Enable Texture Mapping ( NEW ) glShadeModel smSmooth ' Enables Smooth Shading glClearColor 0#, 0#, 0#, 0.5 ' Black Background glClearDepth 1# ' Depth Buffer Setup glEnable glcDepthTest ' Enables Depth Testing glDepthFunc cfLEqual ' The Type Of Depth Test To Do glHint htPerspectiveCorrectionHint, hmNicest ' Really Nice Perspective Calculations glLightfv ltLight1, lpmAmbient, LightAmbient(0) ' Setup The Ambient Light glLightfv ltLight1, lpmDiffuse, LightDiffuse(0) ' Setup The Diffuse Light glLightfv ltLight1, lpmPosition, LightPosition(0) ' Position The Light glEnable glcLight0 ' Enable Light One InitGL = True ' Initialization Went OK End Function Public Sub KillGLWindow() ' Properly Kill The Window If fullscreen Then ' Are We In Fullscreen Mode? ResetDisplayMode ' If So Switch Back To The Desktop ShowPointer ' Show Mouse Pointer End If If hrc Then ' Do We Have A Rendering Context? If wglMakeCurrent(0, 0) = 0 Then ' Are We Able To Release The DC And RC Contexts? MsgBox "Release Of DC And RC Failed.", vbInformation, "SHUTDOWN ERROR" End If If wglDeleteContext(hrc) = 0 Then ' Are We Able To Delete The RC? MsgBox "Release Rendering Context Failed.", vbInformation, "SHUTDOWN ERROR" End If hrc = 0 ' Set RC To NULL End If ' Note ' The form owns the device context (hDC) window handle (hWnd) and class (RTThundermain) ' so we do not have to do all the extra work End Sub Private Sub SaveCurrentScreen() ' Save the current screen resolution, bits, and Vertical refresh Dim ret As Long ret = CreateIC("DISPLAY", "", "", 0&) OldWidth = GetDeviceCaps(ret, HORZRES) OldHeight = GetDeviceCaps(ret, VERTRES) OldBits = GetDeviceCaps(ret, BITSPIXEL) OldVertRefresh = GetDeviceCaps(ret, VREFRESH) ret = DeleteDC(ret) End Sub Private Function FindDEVMODE(ByVal Width As Integer, ByVal Height As Integer, ByVal Bits As Integer, Optional ByVal VertRefresh As Long = -1) As DEVMODE ' locate a DEVMOVE that matches the passed parameters Dim ret As Boolean Dim i As Long Dim dm As DEVMODE i = 0 Do ' enumerate the display settings until we find the one we want ret = EnumDisplaySettings(0&, i, dm) If dm.dmPelsWidth = Width And _ dm.dmPelsHeight = Height And _ dm.dmBitsPerPel = Bits And _ ((dm.dmDisplayFrequency = VertRefresh) Or (VertRefresh = -1)) Then Exit Do ' exit when we have a match i = i + 1 Loop Until (ret = False) FindDEVMODE = dm End Function Private Sub ResetDisplayMode() Dim dm As DEVMODE ' Device Mode dm = FindDEVMODE(OldWidth, OldHeight, OldBits, OldVertRefresh) dm.dmFields = DM_BITSPERPEL Or DM_PELSWIDTH Or DM_PELSHEIGHT If OldVertRefresh <> -1 Then dm.dmFields = dm.dmFields Or DM_DISPLAYFREQUENCY End If ' Try To Set Selected Mode And Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar. If (ChangeDisplaySettings(dm, CDS_FULLSCREEN) <> DISP_CHANGE_SUCCESSFUL) Then ' If The Mode Fails, Offer Two Options. Quit Or Run In A Window. MsgBox "The Requested Mode Is Not Supported By Your Video Card", , "NeHe GL" End If End Sub Private Sub SetDisplayMode(ByVal Width As Integer, ByVal Height As Integer, ByVal Bits As Integer, ByRef fullscreen As Boolean, Optional VertRefresh As Long = -1) Dim dmScreenSettings As DEVMODE ' Device Mode Dim p As Long SaveCurrentScreen ' save the current screen attributes so we can go back later dmScreenSettings = FindDEVMODE(Width, Height, Bits, VertRefresh) dmScreenSettings.dmBitsPerPel = Bits dmScreenSettings.dmPelsWidth = Width dmScreenSettings.dmPelsHeight = Height dmScreenSettings.dmFields = DM_BITSPERPEL Or DM_PELSWIDTH Or DM_PELSHEIGHT If VertRefresh <> -1 Then dmScreenSettings.dmDisplayFrequency = VertRefresh dmScreenSettings.dmFields = dmScreenSettings.dmFields Or DM_DISPLAYFREQUENCY End If ' Try To Set Selected Mode And Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar. If (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) <> DISP_CHANGE_SUCCESSFUL) Then ' If The Mode Fails, Offer Two Options. Quit Or Run In A Window. If (MsgBox("The Requested Mode Is Not Supported By" & vbCr & "Your Video Card. Use Windowed Mode Instead?", vbYesNo + vbExclamation, "NeHe GL") = vbYes) Then fullscreen = False ' Select Windowed Mode (Fullscreen=FALSE) Else ' Pop Up A Message Box Letting User Know The Program Is Closing. MsgBox "Program Will Now Close.", vbCritical, "ERROR" End ' Exit And Return FALSE End If End If End Sub Public Function CreateGLWindow(frm As Form, Width As Integer, Height As Integer, Bits As Integer, fullscreenflag As Boolean) As Boolean Dim PixelFormat As GLuint ' Holds The Results After Searching For A Match Dim pfd As PIXELFORMATDESCRIPTOR ' pfd Tells Windows How We Want Things To Be fullscreen = fullscreenflag ' Set The Global Fullscreen Flag If (fullscreen) Then ' Attempt Fullscreen Mode? SetDisplayMode Width, Height, Bits, fullscreen End If If fullscreen Then HidePointer ' Hide Mouse Pointer frm.WindowState = vbMaximized End If pfd.cColorBits = Bits pfd.cDepthBits = 16 pfd.dwflags = PFD_DRAW_TO_WINDOW Or PFD_SUPPORT_OPENGL Or PFD_DOUBLEBUFFER Or PFD_TYPE_RGBA pfd.iLayerType = PFD_MAIN_PLANE pfd.iPixelType = PFD_TYPE_RGBA pfd.nSize = Len(pfd) pfd.nVersion = 1 PixelFormat = ChoosePixelFormat(frm.hDC, pfd) If PixelFormat = 0 Then ' Did Windows Find A Matching Pixel Format? KillGLWindow ' Reset The Display MsgBox "Can't Find A Suitable PixelFormat.", vbExclamation, "ERROR" CreateGLWindow = False ' Return FALSE End If If SetPixelFormat(frm.hDC, PixelFormat, pfd) = 0 Then ' Are We Able To Set The Pixel Format? KillGLWindow ' Reset The Display MsgBox "Can't Set The PixelFormat.", vbExclamation, "ERROR" CreateGLWindow = False ' Return FALSE End If hrc = wglCreateContext(frm.hDC) If (hrc = 0) Then ' Are We Able To Get A Rendering Context? KillGLWindow ' Reset The Display MsgBox "Can't Create A GL Rendering Context.", vbExclamation, "ERROR" CreateGLWindow = False ' Return FALSE End If If wglMakeCurrent(frm.hDC, hrc) = 0 Then ' Try To Activate The Rendering Context KillGLWindow ' Reset The Display MsgBox "Can't Activate The GL Rendering Context.", vbExclamation, "ERROR" CreateGLWindow = False ' Return FALSE End If frm.Show ' Show The Window SetForegroundWindow frm.hWnd ' Slightly Higher Priority frm.SetFocus ' Sets Keyboard Focus To The Window ReSizeGLScene frm.ScaleWidth, frm.ScaleHeight ' Set Up Our Perspective GL Screen If Not InitGL() Then ' Initialize Our Newly Created GL Window KillGLWindow ' Reset The Display MsgBox "Initialization Failed.", vbExclamation, "ERROR" CreateGLWindow = False ' Return FALSE End If CreateGLWindow = True ' Success End Function Sub Main() Dim Done As Boolean Dim frm As Form Done = False SetupWorld SetupLightingArrays ' Ask The User Which Screen Mode They Prefer fullscreen = MsgBox("Would You Like To Run In Fullscreen Mode?", vbYesNo + vbQuestion, "Start FullScreen?") = vbYes ' Create Our OpenGL Window Set frm = New Form1 If Not CreateGLWindow(frm, 800, 600, 16, fullscreen) Then Done = True ' Quit If Window Was Not Created End If Do While Not Done ' Draw The Scene. Watch For ESC Key And Quit Messages From DrawGLScene() If (Not DrawGLScene Or Keys(vbKeyEscape)) Then ' Updating View Only If Active Unload frm ' ESC or DrawGLScene Signalled A Quit Else ' Not Time To Quit, Update Screen SwapBuffers (frm.hDC) ' Swap Buffers (Double Buffering) If Keys(vbKeyRight) Then ' Is The Right Arrow Being Pressed? yrot = yrot - 1.5 ' Rotate The Scene To The Left End If If Keys(vbKeyLeft) Then ' Is The Left Arrow Being Pressed? yrot = yrot + 1.5 ' Rotate The Scene To The Right End If If Keys(vbKeyUp) Then ' Is The Up Arrow Being Pressed? xpos = xpos - Sin(yrot * piover180) * 0.05 ' Move On The X-Plane Based On Player Direction zpos = zpos - Cos(yrot * piover180) * 0.05 ' Move On The Z-Plane Based On Player Direction If (walkbiasangle >= 359#) Then ' Is walkbiasangle>=359? walkbiasangle = 0# ' Make walkbiasangle Equal 0 Else ' Otherwise walkbiasangle = walkbiasangle + 10# ' If walkbiasangle < 359 Increase It By 10 End If walkbias = Sin(walkbiasangle * piover180) / 20# ' Causes The Player To Bounce End If If Keys(vbKeyDown) Then ' Is The Down Arrow Being Pressed? xpos = xpos + Sin(yrot * piover180) * 0.05 ' Move On The X-Plane Based On Player Direction zpos = zpos + Cos(yrot * piover180) * 0.05 ' Move On The Z-Plane Based On Player Direction If (walkbiasangle <= 1#) Then ' Is walkbiasangle<=1? walkbiasangle = 359# ' Make walkbiasangle Equal 359 Else ' Otherwise walkbiasangle = walkbiasangle - 10# ' If walkbiasangle > 1 Decrease It By 10 End If walkbias = Sin(walkbiasangle * piover180) / 20# ' Causes The Player To Bounce End If If Keys(vbKeyL) And Not lp Then ' L Key Being Pressed Not Held? lp = True ' lp Becomes TRUE light = Not light ' Toggle Light TRUE/FALSE If Not light Then ' If Not Light glDisable glcLighting ' Disable Lighting Else ' Otherwise glEnable glcLighting ' Enable Lighting End If End If If Not Keys(vbKeyL) Then ' Has L Key Been Released? lp = False ' If So, lp Becomes FALSE End If If Keys(vbKeyF) And Not fp Then ' Is F Key Being Pressed? fp = True ' fp Becomes TRUE mFilter = mFilter + 1 ' filter Value Increases By One If (mFilter > 2) Then ' Is Value Greater Than 2? mFilter = 0 ' If So, Set filter To 0 End If End If If Not Keys(vbKeyF) Then ' Has F Key Been Released? fp = False ' If So, fp Becomes FALSE End If DoEvents End If If Keys(vbKeyF1) Then ' Is F1 Being Pressed? Keys(vbKeyF1) = False ' If So Make Key FALSE Unload frm ' Kill Our Current Window Set frm = New Form1 ' create a new one fullscreen = Not fullscreen ' Toggle Fullscreen / Windowed Mode ' Recreate Our OpenGL Window If Not CreateGLWindow(frm, 800, 600, 16, fullscreen) Then Unload frm ' Quit If Window Was Not Created End If End If Done = frm.Visible = False ' if the form is not visible then we are done Loop ' Shutdown Set frm = Nothing End End Sub
world.txt
NUMPOLLIES 36 // Floor 1 -3.0 0.0 -3.0 0.0 6.0 -3.0 0.0 3.0 0.0 0.0 3.0 0.0 3.0 6.0 0.0 -3.0 0.0 -3.0 0.0 6.0 3.0 0.0 -3.0 6.0 6.0 3.0 0.0 3.0 6.0 0.0 -3.0 0.0 -3.0 0.0 6.0 3.0 0.0 -3.0 6.0 6.0 3.0 0.0 3.0 6.0 0.0 -3.0 0.0 -3.0 0.0 6.0 3.0 0.0 -3.0 6.0 6.0 3.0 0.0 3.0 6.0 0.0 -3.0 0.0 -3.0 0.0 6.0 3.0 0.0 -3.0 6.0 6.0 3.0 0.0 3.0 6.0 0.0 -3.0 0.0 -3.0 0.0 6.0 -3.0 0.0 3.0 0.0 0.0 3.0 0.0 3.0 6.0 0.0 -3.0 0.0 -3.0 0.0 6.0 3.0 0.0 -3.0 6.0 6.0 3.0 0.0 3.0 6.0 0.0 -3.0 0.0 -3.0 0.0 6.0 3.0 0.0 -3.0 6.0 6.0 3.0 0.0 3.0 6.0 0.0 -3.0 0.0 -3.0 0.0 6.0 3.0 0.0 -3.0 6.0 6.0 3.0 0.0 3.0 6.0 0.0 -3.0 0.0 -3.0 0.0 6.0 3.0 0.0 -3.0 6.0 6.0 3.0 0.0 3.0 6.0 0.0 // Ceiling 1 -3.0 1.0 -3.0 0.0 6.0 -3.0 1.0 3.0 0.0 0.0 3.0 1.0 3.0 6.0 0.0 -3.0 1.0 -3.0 0.0 6.0 3.0 1.0 -3.0 6.0 6.0 3.0 1.0 3.0 6.0 0.0 // A1 -2.0 1.0 -2.0 0.0 1.0 -2.0 0.0 -2.0 0.0 0.0 -0.5 0.0 -2.0 1.5 0.0 -2.0 1.0 -2.0 0.0 1.0 -0.5 1.0 -2.0 1.5 1.0 -0.5 0.0 -2.0 1.5 0.0 // A2 2.0 1.0 -2.0 2.0 1.0 2.0 0.0 -2.0 2.0 0.0 0.5 0.0 -2.0 0.5 0.0 2.0 1.0 -2.0 2.0 1.0 0.5 1.0 -2.0 0.5 1.0 0.5 0.0 -2.0 0.5 0.0 // B1 -2.0 1.0 2.0 2.0 1.0 -2.0 0.0 2.0 2.0 0.0 -0.5 0.0 2.0 0.5 0.0 -2.0 1.0 2.0 2.0 1.0 -0.5 1.0 2.0 0.5 1.0 -0.5 0.0 2.0 0.5 0.0 // B2 2.0 1.0 2.0 2.0 1.0 2.0 0.0 2.0 2.0 0.0 0.5 0.0 2.0 0.5 0.0 2.0 1.0 2.0 2.0 1.0 0.5 1.0 2.0 0.5 1.0 0.5 0.0 2.0 0.5 0.0 // C1 -2.0 1.0 -2.0 0.0 1.0 -2.0 0.0 -2.0 0.0 0.0 -2.0 0.0 -0.5 1.5 0.0 -2.0 1.0 -2.0 0.0 1.0 -2.0 1.0 -0.5 1.5 1.0 -2.0 0.0 -0.5 1.5 0.0 // C2 -2.0 1.0 2.0 2.0 1.0 -2.0 0.0 2.0 2.0 0.0 -2.0 0.0 0.5 0.5 0.0 -2.0 1.0 2.0 2.0 1.0 -2.0 1.0 0.5 0.5 1.0 -2.0 0.0 0.5 0.5 0.0 // D1 2.0 1.0 -2.0 0.0 1.0 2.0 0.0 -2.0 0.0 0.0 2.0 0.0 -0.5 1.5 0.0 2.0 1.0 -2.0 0.0 1.0 2.0 1.0 -0.5 1.5 1.0 2.0 0.0 -0.5 1.5 0.0 // D2 2.0 1.0 2.0 2.0 1.0 2.0 0.0 2.0 2.0 0.0 2.0 0.0 0.5 0.5 0.0 2.0 1.0 2.0 2.0 1.0 2.0 1.0 0.5 0.5 1.0 2.0 0.0 0.5 0.5 0.0 // Upper hallway - L -0.5 1.0 -3.0 0.0 1.0 -0.5 0.0 -3.0 0.0 0.0 -0.5 0.0 -2.0 1.0 0.0 -0.5 1.0 -3.0 0.0 1.0 -0.5 1.0 -2.0 1.0 1.0 -0.5 0.0 -2.0 1.0 0.0 // Upper hallway - R 0.5 1.0 -3.0 0.0 1.0 0.5 0.0 -3.0 0.0 0.0 0.5 0.0 -2.0 1.0 0.0 0.5 1.0 -3.0 0.0 1.0 0.5 1.0 -2.0 1.0 1.0 0.5 0.0 -2.0 1.0 0.0 // Lower hallway - L -0.5 1.0 3.0 0.0 1.0 -0.5 0.0 3.0 0.0 0.0 -0.5 0.0 2.0 1.0 0.0 -0.5 1.0 3.0 0.0 1.0 -0.5 1.0 2.0 1.0 1.0 -0.5 0.0 2.0 1.0 0.0 // Lower hallway - R 0.5 1.0 3.0 0.0 1.0 0.5 0.0 3.0 0.0 0.0 0.5 0.0 2.0 1.0 0.0 0.5 1.0 3.0 0.0 1.0 0.5 1.0 2.0 1.0 1.0 0.5 0.0 2.0 1.0 0.0 // Left hallway - Lw -3.0 1.0 0.5 1.0 1.0 -3.0 0.0 0.5 1.0 0.0 -2.0 0.0 0.5 0.0 0.0 -3.0 1.0 0.5 1.0 1.0 -2.0 1.0 0.5 0.0 1.0 -2.0 0.0 0.5 0.0 0.0 // Left hallway - Hi -3.0 1.0 -0.5 1.0 1.0 -3.0 0.0 -0.5 1.0 0.0 -2.0 0.0 -0.5 0.0 0.0 -3.0 1.0 -0.5 1.0 1.0 -2.0 1.0 -0.5 0.0 1.0 -2.0 0.0 -0.5 0.0 0.0 // Right hallway - Lw 3.0 1.0 0.5 1.0 1.0 3.0 0.0 0.5 1.0 0.0 2.0 0.0 0.5 0.0 0.0 3.0 1.0 0.5 1.0 1.0 2.0 1.0 0.5 0.0 1.0 2.0 0.0 0.5 0.0 0.0 // Right hallway - Hi 3.0 1.0 -0.5 1.0 1.0 3.0 0.0 -0.5 1.0 0.0 2.0 0.0 -0.5 0.0 0.0 3.0 1.0 -0.5 1.0 1.0
Aihe on jo aika vanha, joten et voi enää vastata siihen.