; e3dhsp.dll test script #include "e3dhsp3.as" #module #deffunc waitbyfps int p1, var fps E3DWaitbyFPS@ p1, fps await 0 return #global dim keybuf, 256 ;file のpath 用のバッファーの作成 pathlen = 2048 sdim mediadir, pathlen mediadir = dir_cur + "\\Media" sdim pathbuf, pathlen, 4 mapsize = 120000.0 mapdiv = 50 mapheight = 5500.0 screenw = 640 : screenh = 480 screen 0, screenw, screenh, 1 title "Easy3D for HSP3 sample" ;開発中は下の行のコメントアウトを外すことを推奨します。 ;E3DEnableDbgFile ;初期化 E3DInit 0, -1, 0, 16, 0, scid1 ;カメラの初期化 camposx = 0.0 : camposy = 2500.0 : camposz = 0.0 E3DSetCameraPos camposx, camposy, camposz ;projectionの変更をしたいときは、以下の2行を有効にしてください。 proj_near = 1000.0 : proj_far = 40000.0 : proj_fov = 45.0 E3DSetProjection proj_near, proj_far, proj_fov E3DCreateProgressBar E3DSetProgressBar 0 ; 地面データのロード pathbuf.0 = mediadir + "\\g_6_20_1.bmp" pathbuf.1 = mediadir + "\\8.bmp" pathbuf.2 = mediadir + "\\g_river_6_20_1.bmp" pathbuf.3 = mediadir + "\\BG43.bmp" E3DLoadGroundBMP pathbuf.0, pathbuf.1, pathbuf.2, pathbuf.3, mapsize, mapsize, mapdiv, mapdiv, mapheight, hsid0 posx0 = 0.0 : posy0 = 0.0 : posz0 = 0.0 degx0 = 0.0 : degy0 = 0.0 : degz0 = 0.0 E3DSetPos hsid0, posx0, posy0, posz0 E3DSetDir hsid0, degx0, degy0, degz0 frameno0 = 0 E3DSetProgressBar 50 pathbuf.0 = mediadir + "\\morob_6_26_r3.sig" pathbuf.1 = mediadir + "\\morob_6_26_r3.qua" E3DSigLoad pathbuf.0, hsid4 E3DAddMotion hsid4, pathbuf.1, mk4_idling, max4_idling E3DSetMotionKind hsid4, mk4_idling posx4 = 53898.0 : posy4 = 3000.0 : posz4 = 44982.0 degx4 = 0.0 : degy4 = 180.0 : degz4 = 0.0 E3DSetPos hsid4, posx4, posy4, posz4 E3DSetDir hsid4, degx4, degy4, degz4 curposx4 = posx4 : curposy4 = posy4 : curposz4 = posz4 E3DSetBeforePos hsid4 E3DSetProgressBar 60 ;!!!!!!!!!!!!!!!!!!!!! ; PosOnGround 命令を使うために、ChkInViewを、あらかじめ、呼んでおく必要があります。 ;!!!!!!!!!!!!!!!!!!!!! E3DChkInView scid1, hsid0 ;////////billboard E3DSeed 321 bbnum = 50 ;/////////////////////////// ; 地面(hsid0)に木をはやす dim bbid0, bbnum ;billboard id bbno = 0 repeat bbnum E3DRand 3, texkind pathbuf.0 = mediadir + "\\lowtree2.png" E3DCreateBillboard pathbuf.0, 2000, 3200, 0, bbid0.bbno divsize = mapsize / 4 E3DRand divsize, rand1 E3DRand divsize, rand2 randx = rand1 * 4 randz = rand2 * 4 E3DSetBillboardOnGround bbid0.bbno, hsid0, mapheight, -100, randx, randz bbno++; loop E3DSetProgressBar 90 ;///////////////// testfps = 0 ldirx = -0.5 ldiry = -1.0 ldirz = 1.0 lightr1 = 255 lightg1 = 255 lightb1 = 255 E3DCreateLight lid1 E3DSetDirectionalLight lid1, ldirx, ldiry, ldirz, lightr1, lightg1, lightb1 // E3DSetLightAmbient lid1, 77, 77, 77 // E3DSetLightSpecular lid1, 0, 0, 0 pathbuf.0 = mediadir + "\\lake.bmp" pathbuf.1 = "dummy" E3DCreateBG scid1, pathbuf.0, pathbuf.1, 0.0, 0.0, 0 E3DDestroyProgressBar befposx = posx4 : befposy = posy4 : befposz = posz4 dim arfps, 50 E3DSetLinearFogParams 1, 0, 0, 255, 1000.0, proj_far //シャドウマップ用のレンダーテクスチャを作成する(可能なら浮動小数点フォーマットで) E3DCheckRTFormat D3DFMT_A16B16G16R16F, fmtok if( fmtok != 0 ){ rtsize = 1024 E3DCreateRenderTargetTexture 1024, 1024, rtscid, rttexid, rtok1, D3DFMT_A16B16G16R16F if( rtok1 == 0 ){ rtsize = 512 E3DCreateRenderTargetTexture 512, 512, rtscid, rttexid, rtok2, D3DFMT_A16B16G16R16F if( rtok2 == 0 ){ rtsize = 256 E3DCreateRenderTargetTexture 256, 256, rtscid, rttexid, rtok3, D3DFMT_A16B16G16R16F } } } if( (fmtok == 0) || ((rtok1 == 0) && (rtok2 == 0) && (rtok3 == 0)) ){ rtsize = 1024 E3DCreateRenderTargetTexture 1024, 1024, rtscid, rttexid, rtok4, D3DFMT_A8R8G8B8 if( rtok4 == 0 ){ rtsize = 512 E3DCreateRenderTargetTexture 512, 512, rtscid, rttexid, rtok5, D3DFMT_A8R8G8B8 if( rtok5 == 0 ){ rtsize = 256 E3DCreateRenderTargetTexture 256, 256, rtscid, rttexid, rtok6, D3DFMT_A8R8G8B8 if( rtok6 == 0 ){ dialog "メモリ不足で実行できません" goto *bye } } } } //シャドウマップテクスチャを表示するためのスプライトを作成し、シャドウマップを貼り付ける E3DCreateSprite mediadir + "\\dummy512.bmp", 0, spriteid E3DGetSpriteSize spid1, spw1, sph1 E3DSetTextureToDispObj -2, spid1, rttexid //シャドウマップのバイアス E3DSetShadowBias 0.005 //影の暗さ E3DSetShadowDarkness 1.0 //影用の平行光源の向き E3DSetShadowMapLightDir ldirx, ldiry, ldirz *main ; keybuf変数は、メインループの外で、dim keybuf, 256 として、確保しておいてください。 E3DGetKeyboardState keybuf if keybuf.VK_ESCAPE = 1 : goto *bye ; [ESC]で終了 gosub *MoveChara gosub *MoveCamera E3DSetNewPose hsid4, frameno4 E3DChkInView scid1, hsid0 E3DChkInView scid1, hsid4 gosub *ChkConf ; !!! E3DChkInViewより後で呼んでください。 //影付きで一括描画 arhsid.0 = hsid0 arhsid.1 = hsid4 arhsid.2 = -1 E3DRenderWithShadow scid1, rtscid, rttexid, arhsid, 3 //追加描画したいときはE3DBeginSceneのskipflagに1を設定する E3DBeginScene scid1, 1 E3DBeginSprite spsc = 120.0 / double( rtsize ) E3DRenderSprite spid1, spsc, spsc, 0, 0, 0.0 E3DEndSprite gosub *DrawText E3DEndScene E3DPresent scid1 waitbyfps 60, chkfps1 arno = 0 repeat 49 befno = 48 - arno aftno = 49 - arno arfps.aftno = arfps.befno arno++ loop arfps.0 = chkfps1 E3DGetPos hsid4, posx4, posy4, posz4 E3DSetBeforePos hsid4 befposx = posx4 : befposy = posy4 : befposz = posz4 goto *main *bye E3DBye end *MoveChara forwardstep = 100.0 backstep = -100.0 degstep = 5.0 mdegstep = -degstep posstep = 100.0 ; VK_ が頭につく、定数の詳細は、e3dhsp_vk.as をご覧ください。 ; keybuf は、GetKeyboardState 命令で、セットされます。 if keybuf.VK_UP = 1 : E3DPosForward hsid4, forwardstep ;矢印上 if keybuf.VK_DOWN = 1 : E3DPosForward hsid4, backstep ;矢印下 if keybuf.VK_LEFT = 1 : E3DRotateY hsid4, mdegstep ;矢印左 if keybuf.VK_RIGHT = 1 : E3DRotateY hsid4, degstep ;矢印右 ; a が 押されたときに、前進したいときは、下の様に記述します。 ;if keybuf.'A' = 1 : E3DPosForward hsid4, forwardstep return *ChkConf result0 = 0 resultbillboard = 0 ; ビルボードと、キャラクタのあたり判定 dim confbbid, 10 E3DChkConfBillboard hsid4, 0.1, resultbillboard, confbbid, 10, confbbnum if ( resultbillboard ) : posx4 = befposx : posy4 = befposy : posz4 = befposz : E3DSetPos hsid4, posx4, posy4, posz4 ; 地面その1と、キャラクタのあたり判定 E3DChkConfGround hsid4, hsid0, 1, 200, -100, result0, adjustx0, adjusty0, adjustz0, nx0, ny0, nz0 ; 自分で、移動前後の座標を管理すれば、E3DChkConfGround2も使用できます。 ;下のコメント化された命令を参照。 ;E3DGetPos hsid4, posx4, posy4, posz4 ;E3DChkConfGround2 befposx, befposy, befposz, posx4, posy4, posz4, hsid0, 1, 200, 0, result0, adjustx0, adjusty0, adjustz0, nx0, ny0, nz0 if ( result0 != 0 ) : E3DSetPos hsid4, adjustx0, adjusty0, adjustz0 return *MoveCamera E3DGetPos hsid4, saveposx4, saveposy4, saveposz4 E3DPosForward hsid4, -2500.0 E3DGetPos hsid4, backposx, backposy, backposz E3DSetPos hsid4, saveposx4, saveposy4, saveposz4 ;E3DSetCameraPos backposx, backposy + 1000, backposz camposx = backposx camposy = backposy + 1500.0 camposz = backposz E3DSetCameraPos camposx, camposy, camposz E3DSetCameraTarget saveposx4, saveposy4 + 700.0, saveposz4, 0.0, 1.0, 0.0 return *DrawText textr = 255 : textg = 255 : textb = 255 textscale = 1 lcnt = 0 avfps = 0 repeat 50 avfps += arfps.lcnt lcnt++ loop avfps = avfps / 50 textposx = 10 : textposy = 160 strchk2 = "avfps " + avfps E3DDrawText textposx, textposy, textscale, textr, textg, textb, strchk2 E3DGetPos hsid4, chkposx, chkposy, chkposz textposy += 20 strchk3 = "chara position X : " + chkposx + " Y : " + chkposy + " Z : " + chkposz E3DDrawText textposx, textposy, textscale, textr, textg, textb, strchk3 textposy += 20 strchk3 = "fmtok " + fmtok + " rtok1 " + rtok1 + " rtok2 " + rtok2 + " rtok3 " + rtok3 + " rtok4 " + rtok4 + " rtok5 " + rtok5 + " rtok6 " + rtok6 E3DDrawText textposx, textposy, textscale, textr, textg, textb, strchk3 return