【python】用panda3d实现简易版《Minecraft》

1.下載panda3d等等

          panda3d是python的一个第三方库,在Windows的cmd下输入即可下載:

pip install panda3d

         另外还用了 PIL,Pmw,ttkbootstrap這些第三方库,下載方式同上。。。

2.方块模型

          对于建模小白来说,blender有亿点难!!

 (资源放文章结尾了!)

3.代码编写

    可读性极差,后面注释懒得写了。。。

main.py

​
from direct.showbase.ShowBase import ShowBase
from pandac.PandaModules import WindowProperties
from direct.task import Task
from direct.actor.Actor import Actor
from direct.interval.IntervalGlobal import Sequence
from panda3d.core import *
from panda3d.core import loadPrcFileData
from direct.showbase import DirectObject
from direct.gui.OnscreenText import OnscreenText
from direct.gui.DirectGui import *
from direct.particles.ParticleEffect import ParticleEffect
import random
from Mode_FUNCTION import *
from tkinter import *
from panda3d.core import WindowProperties
from PIL import Image,ImageTk

import math
from panda3d.core import CollisionHandlerPusher

from panda3d.core import CollisionSphere, CollisionNode
from direct.gui.OnscreenImage import OnscreenImage

import ttkbootstrap as ttk
from ttkbootstrap import Style
from ttkbootstrap.constants import *
from panda3d.core import Material
import sys


WORD = open('MAINWORD.txt','r',encoding = 'UTF-8')
MODE = open('WORDMODE.txt','r',encoding = 'UTF-8')

#imageObject = OnscreenImage(image='myImage.jpg', pos=(-0.5, 0, 0.02))

Scale = 18

loadMode_all_list = ["mode//land_gree.egg","mode//glass.egg",\
                     "mode//salt.egg","mode//land.egg",\
                 'mode//oxeye_daisy.egg','mode//Tree_wood.egg',\
                'mode//snow_lend.egg',"mode//grass_Guo.egg",'mode//bedrock.egg'\
                     ,'mode//magma.egg' ,'mode//torch.egg','mode//ice.egg'\
                     ,'mode//water.egg','mode//snow.egg'\
                    ,'mode//Tree_leaves.egg','mode//music.egg']
Mode_all_function = [land_gree,glass,\
                     False,False,grass,\
                     False,False,grass,False\
                     ,magma,torch,False,water,False,False
                     ,music]

MAP_dict = {"mode//land_gree.egg":land_gree,"mode//glass.egg":glass,\
                     "mode//salt.egg":False,"mode//land.egg":False,\
                 'mode//oxeye_daisy.egg':grass,'mode//Tree_wood.egg':False,\
                'mode//snow_lend.egg':False,"mode//grass_Guo.egg":grass,'mode//bedrock.egg':False\
                     ,'mode//magma.egg':magma ,'mode//torch.egg':torch,'mode//ice.egg':False\
                     ,'mode//water.egg':water,'mode//snow.egg':False\
                    ,'mode//Tree_leaves.egg':False,'mode//music.egg':music} 

loadMode_list = []
list_function = []

ima=[]

for i in range(10):
    loadMode_list.append(loadMode_all_list[i])

    list_function.append(Mode_all_function[i])

#print(loadMode_list)

# 重力加速度

GV  = 50
image = []

def add_image(la,image_):
    global image
    image_ = Image.open(image_)
    image_ = image_.resize((30, 30),Image.ANTIALIAS)
    image.append(ImageTk.PhotoImage(image_))
    la.config(image = image[len(image)-1])
def addInstructions2(pos, msg):
    return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), scale=.05,
                            shadow=(0, 0, 0, 1), parent=base.a2dTopLeft,
                            pos=(1.2, -pos - 0.04), align=TextNode.ALeft
                            )
def addInstructions(cmr12,pos, msg):
    if cmr12=='':
        return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), scale=.05,
                            shadow=(0, 0, 0, 1), parent=base.a2dTopLeft,
                            pos=(0.08, -pos - 0.04), align=TextNode.ALeft
                            )
    else:
        return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), scale=.05,
                            shadow=(0, 0, 0, 1), parent=base.a2dTopLeft,
                            pos=(0.08, -pos - 0.04), align=TextNode.ALeft
                            ,font = cmr12)

class MyApp(ShowBase):
        
    def __init__(self):
        ShowBase.__init__(self, windowType = 'none')
        base.startTk()
        style = Style(theme='newtheme')

        self.frame = base.tkRoot
        self.frame.geometry("800x600")

        label = Label(self.frame,relief="flat")
        label.place(relx=0.04, rely=0.05, anchor=CENTER,height = 40 ,width = 40)

        #add_image(label ,'mode\\cool_back.jpg')
        image_ = Image.open('mode\\cool_back.jpg')
        image_ = image_.resize((30, 30),Image.ANTIALIAS)
        label.config(image = ImageTk.PhotoImage(image_))
        
        props = WindowProperties()
        props.set_parent_window(self.frame.winfo_id())
        props.set_origin(0, 0)
        props.set_size(self.frame.winfo_width(), self.frame.winfo_height())

        
        #base.enableParticles()
        #self.p = ParticleEffect()
        #self.p.loadConfig('particles\\fireish.ptf')
        #p.start(parent = render, renderParent = render)

        base.make_default_pipe()
        base.open_default_window(props = props)

        self.frame.bind("<Configure>", self.resize)
        
        cmr12 = self.loader.loadFont('cmr12.egg')
        self.title1 = addInstructions('',1.88,"New word")

        self.title2 = addInstructions(cmr12,1.94,"Panda: my word_1.0")


        myMaterial = Material()
        myMaterial.setShininess(128.0) # Make this material shiny
        myMaterial.setAmbient((0, 0, 1, 1))
        myMaterial.setEmission((0,0,100,100))
        #myMaterial.setSpecular((255,255,255,255))
        

        

        self.key = 0

        
        self.init_h = 3
        self.Camerapos = [0.1,0.1,self.init_h]
        self.Cameramode = True
        self.rotate_speed = 30
        self.up_speed = 380
        self.run_speed = 0.3
        self.rotate_y = 0
        self.rotate_x = 0
        self.dont_run = 0


        self.light_rotate = 135


        self.e_bag = False
        self.esc = True

        self.square_num = 0

        self.fame_bu = Frame(self.frame,bg = '#D3D3D3')
        self.fame_bu.place(relx=0.5, rely=0.96, anchor=CENTER,height = 42 ,width = 412)

        self.la_list = []
        for i in range(10):
            self.la = Label(self.fame_bu,relief="flat")
            self.la.place(x=i*41+1,y=1,height = 40 ,width = 40)
            self.la_list.append(self.la)

        e = 0
        for i in loadMode_list:
            
            add_image(self.la_list[e] ,i+'.png')
            e += 1

        self.la_list[self.square_num].config(relief="solid")

        # 初速度
        self.V = 0

        self.win.setClearColor((0.2549, 0.41176, 0.88235, 0))

        #ambientLight = AmbientLight("ambientLight")
      #  ambientLight.setColor((.3, .3, .3, 1))
     #   directionalLight = DirectionalLight("directionalLight")
     #   directionalLight.setDirection((-5, -5, -5))
     #   directionalLight.setColor((1, 1, 1, 1))
     #   directionalLight.setSpecularColor((1, 1, 1, 1))
     #   render.setLight(render.attachNewNode(ambientLight))
     #   render.setLight(render.attachNewNode(directionalLight))
        #plight = PointLight('plight')
        #plight.setColor((0.2, 0.2, 0.2, 2))
        #plight.attenuation = (0, 0, 0.00001)
       # plnp = render.attachNewNode(plight)
       # plnp.setPos(0, 0, 100)
       # render.setLight(plnp)

        alight = AmbientLight('alight')
        alight.setColor((0.1, 0.1, 0.1, 0.1))
        alnp = render.attachNewNode(alight)
        #render.setLight(alnp)

        self.alight = render.attachNewNode(AmbientLight("Ambient"))
        self.alight.node().setColor(LVector4(0.7, 0.7, 0.7, 0.4))
        render.setLight(self.alight)

        # Important! Enable the shader generator.
        render.setShaderAuto()



        #alight.setShadowCaster(True, 512, 512)
        #plight.setShadowCaster(True, 512, 512)
        #render.setShaderAuto()

        # 显示碰撞物体

        # 添加为活跃对象

        self.camera.setPos(self.Camerapos[0] ,self.Camerapos[1] ,self.Camerapos[2])
        
        #scene = loader.loadModel("mode//env.egg.pz")

        #scene.reparentTo(render)
        #scene.setScale(1000, 1000, 1000)
        #scene.setPos(0, 0, -1.99)

        #self.cleck = loader.loadModel("mode//ice.egg")

        #self.cleck.reparentTo(render)
        #self.cleck.setScale(1.01, 1.01, 1.01)
        #self.cleck.setPos(0, 0, 6)


        self.cleck = loader.loadModel("mode//cleck_cool.egg")

        self.cleck.reparentTo(render)
        self.cleck.setScale(0.51, 0.51, 0.51)
        self.cleck.setPos(0, 0, -4)
        z = -1

        
        self.cTravTwo = CollisionTraverser()
        self.cTravTwo.setRespectPrevTransform(True)
        #self.me = loader.loadModel("mode//steve.egg")

        #self.me.reparentTo(render)
        #self.me.setScale(0.5,0.5, 0.5) 
        #self.me.setPos(0, 0, 0)
        #s=1.3
        self.camGroundRay = CollisionRay()
        #self.camGroundRay.setRespectPrevTransform(True)
        self.camGroundRay.setOrigin(0, 0, 9)
        self.camGroundRay.setDirection(0, 0, -1)
       # self.camGroundRay1 = CollisionRay()
       # self.camGroundRay1.setOrigin(-s, s, 9)
       # self.camGroundRay1.setDirection(0, 0, -1)
       # self.camGroundRay2 = CollisionRay()
      #  self.camGroundRay2.setOrigin(s, -s, 9)
       # self.camGroundRay2.setDirection(0, 0, -1)
       # self.camGroundRay3 = CollisionRay()
      #  self.camGroundRay3.setOrigin(-s, -s, 9)
      #  self.camGroundRay3.setDirection(0, 0, -1)
      #  self.camGroundRay4 = CollisionRay()
      #  self.camGroundRay4.setOrigin(0, 0, 9)
      #  self.camGroundRay4.setDirection(0, 0, -1)
        self.ralphGroundHandler_two = CollisionHandlerQueue()
        self.camGroundCol = CollisionNode('camRay')

        #Collision_listi = [[-0.9*s,0.8*s],[-0.7*s,0.8*s],[0.7*s,0.8*s],[0.9*s,0.8*s],[-0.9*s,-2.2*s],\
        #                   [-0.6*s,-2.2*s],[0.6*s,-2.2*s],[0.9*s,-2.2*s],[0.6*s,0.6*s],\
        #                   [-0.6*s,0.6*s],[0.6*s,-0.6*s],[-0.6*s,-0.6*s],[0,-0.6*s],[0,0.6*s]]
        Collision_listii = []
        Collision_listi = [[1.2,1.2],[1,-1.2],[-1.2,1.2],[-1.2,-1.2],\
                           [0,1.2],[1.2,0],[-1.2,0],[0,-1.2],[0,0],\
                           [1.2,0.6],[0.6,1,2],[1.2,-0.6],[0.6,-1.2],\
                           [-1.2,0.6],[-0.6,1,2],[-1.2,-0.6],[-0.6,-1.2]]
        
        for i in Collision_listi:
            self.camGroundRay = CollisionRay()
            self.camGroundRay.setOrigin(i[0], i[1], 9)
            self.camGroundRay.setDirection(0, 0, -1)
            self.camGroundCol.addSolid(self.camGroundRay)
        self.camGroundCol.addSolid(self.camGroundRay)
        self.camGroundCol.setFromCollideMask(GeomNode.getDefaultCollideMask())
                
        self.me = Actor("mode/steve.egg",
                           {"run": "models/steve_run.egg"})
        
        #self.me = loader.loadModel("mode//steve.egg")

        self.me.reparentTo(render)
        self.me.setScale(0.4, 0.4, 0.4)
        self.me.setPos(0, 0, 0)
        self.me.setTwoSided(False)
        self.me.hide()
        self.me.setTag('myObjectTag','me')

        
        self.scene1 = loader.loadModel("env.egg.pz")

        self.scene1.reparentTo(render)
        self.scene1.setTwoSided(True)
        self.scene1.setShaderAuto()
        self.scene1.setScale(600, 600, 600)
        self.scene1.setPos(0, 0, -160.99)
        #self.me.loop("
        self.light = render.attachNewNode(Spotlight("Spot"))
        #self.light.node().setScene(render)
        self.light.node().setShadowCaster(True)
        self.light.setPos(0,-30,1)
        self.light.setHpr(0,self.light_rotate,0)
        self.light.node().showFrustum()
        self.light.node().getLens().setFov(40)
        self.light.node().getLens().setNearFar(10, 100)
        render.setLight(self.light)
        #lens = PerspectiveLens()
        #self.light.setLens(lens)
        #self.slnp = render.attachNewNode(self.light)
        #self.slnp.node().setShadowCaster(True)
        #self.slnp.node().getLens().setFov(40)
        #self.slnp.node().getLens().setNearFar(10, 100)
        #self.slnp.setPos(10, 20, 0)
        #slnp.lookAt(myObject)

        
        self.camGroundColNp = self.me.attachNewNode(self.camGroundCol)
        #self.camGroundHandler = CollisionRay()

        self.cTravTwo.addCollider(self.camGroundColNp, self.ralphGroundHandler_two)
        self.camGroundColNp.show()
        #self.cTravTwo.showCollisions(render)

        #self.plightw = PointLight('plight')
        #self.plightw.setColor((205, 98, 55, 2))
        #self.plightw.attenuation = (0, 0, 5)
        #self.plnp = render.attachNewNode(self.plightw)
        #self.plnp.setPos(5, 5, 3)
        #self.plightw.setShadowCaster(True)
        #self.plightw.showFrustum()
        #self.render.setLight(self.plnp)

        
        self.cTrav = CollisionTraverser()
        self.scene_mode = []
        self.scene_list = []
        self.pos_list = []
        self.scene_Funstion = {}
        self.ralphGroundCol = CollisionNode('ralphRay')
        self.ralphGroundRay = CollisionRay()
        self.ralphGroundRay.setOrigin(0.5, 0.5, 9)
        self.ralphGroundRay.setDirection(0, 0, -1)
        #self.ralphGroundRay1 = CollisionRay()
        #self.ralphGroundRay1.setOrigin(-0.5, 0.5, 9)
        #self.ralphGroundRay1.setDirection(0.5, 0.5, -1)
        #self.ralphGroundRay2 = CollisionRay()
        #self.ralphGroundRay2.setOrigin(0.5, -0.5, 9)
        #self.ralphGroundRay2.setDirection(0, 0, -1)
        #self.ralphGroundRay3 = CollisionRay()
        #self.ralphGroundRay3.setOrigin(-0.5, -0.5, 9)
        #self.ralphGroundRay3.setDirection(0, 0, -1)
        #self.ralphGroundRay = CollisionPolygon(Point3(0, 0, 0), Point3(0, 0, 1),
                        #Point3(0, 1, 1), Point3(0, 1, 0))
        self.ralphGroundCol.addSolid(self.ralphGroundRay)
        #self.ralphGroundCol.addSolid(self.ralphGroundRay1)
        #self.ralphGroundCol.addSolid(self.ralphGroundRay2)
        #self.ralphGroundCol.addSolid(self.ralphGroundRay3)
        self.ralphGroundCol.setFromCollideMask(CollideMask.bit(0))
        self.ralphGroundCol.setIntoCollideMask(CollideMask.allOff())

        l = list(WORD)
        m = list(MODE)
        for e,i in enumerate(l):
            x = float(i[:i.find('*')])
            i = i[i.find('*')+1:]
            y = float(i[:i.find('*')])
            z = float(i[i.find('*')+1:])
            m[e] = m[e][:-1]
            self.add_scene = loader.loadModel(m[e])
            self.add_scene.setMaterial(myMaterial)
            self.add_scene.setShaderAuto()

            if MAP_dict[m[e]]:
                function_ = MAP_dict[m[e]]()
                self.add_scene.setTwoSided(function_.setTwoSided)
                if function_.Run:
                    function_.Run_(self,x, y, z)
                if function_.Scale:
                    self.add_scene.setScale(function_.Scale[0], \
                            function_.Scale[1],function_.Scale[2])
                else:
                    self.add_scene.setScale(0.4999, 0.4999, 0.4999)
                            
                if function_.pos:
                    self.add_scene.setPos(x + function_.pos[0], \
                            y +  function_.pos[1], \
                                z +  function_.pos[2])
                            #print(i[0] + list_function[self.square_num].pos[0], \
                                #  i[1] +  list_function[self.square_num].pos[1], \
                                 #       i[2] +  list_function[self.square_num].pos[2])
                else:
                    self.add_scene.setPos(x, y, z)
            else:
                function_ = MAP_dict[m[e]]
                self.add_scene.setScale(0.4999, 0.4999, 0.4999)
                self.add_scene.setPos(x, y, z)



            self.add_scene.setShaderAuto()

            self.add_scene.reparentTo(render)
            self.add_scene.setTag('myObjectTag', str(float(x))+','+str(float(y))+','+str(float(z)))

            self.ralphGroundColNp = self.add_scene.attachNewNode(self.ralphGroundCol)
            self.ralphGroundHandler = CollisionHandlerQueue()
                    #scene.setTag('myObjectTag',str(x)+','+str(y)+','+str(z))#str(x)+','+str(y)+','+str(z)
            self.cTrav.addCollider(self.ralphGroundColNp, self.ralphGroundHandler)

            self.cTravTwo.addCollider(self.ralphGroundColNp, self.ralphGroundHandler_two)

            ### 切记核心 scene_mode种类 post_list 位置
            self.scene_mode.append(m[e])
            self.scene_list.append(self.add_scene)
            self.pos_list.append([float(x), float(y), float(z)])
            self.scene_Funstion[str(float(x))+','+str(float(y))+','+str(float(z))] = function_




        render.setShaderAuto()        

                #self.ralphGroundColNp.show()
###########

##########

        self.pickerNode = CollisionNode('mouseRay')
        self.pickerNP = self.camera.attachNewNode(self.pickerNode)
        self.pickerNode.setFromCollideMask(GeomNode.getDefaultCollideMask())
        self.pickerRay = CollisionRay()
        self.pickerNode.addSolid(self.pickerRay)
        self.cTrav.addCollider(self.pickerNP, self.ralphGroundHandler)


        
        self.keyMap = {'w':False,'s':False,'a':False,'d':False,'f':False}
        self.accept( 'w-up' , self.app_key,['w',False])
        self.accept( 's-up' , self.app_key,['s',False])
        self.accept( 'a-up' , self.app_key,['a',False])
        self.accept( 'd-up' , self.app_key,['d',False])
        self.accept( 'f-up' , self.app_key,['f',False])
        self.accept( 'f' , self.app_key,['f',True])
        self.accept( 'w' , self.app_key,['w',True])
        self.accept( 's' , self.app_key,['s',True])
        self.accept( 'a' , self.app_key,['a',True])
        self.accept( 'd' , self.app_key,['d',True])

        self.accept( 'e' , self.app_e_down)
        self.accept( 'escape' , self.app_esc_down)
        
        self.accept( 'f1' , self.app_View)
        self.accept( 'space' , self.backspace)
        self.accept( 'p' , self.save)
        
        self.accept( '0' , self.app_num,[0])
        self.accept( '1' , self.app_num,[1])
        self.accept( '2' , self.app_num,[2])
        self.accept( '3' , self.app_num,[3])
        self.accept( '4' , self.app_num,[4])
        self.accept( '5' , self.app_num,[5])
        self.accept( '6' , self.app_num,[6])
        self.accept( '7' , self.app_num,[7])
        self.accept( '8' , self.app_num,[8])
        self.accept( '9' , self.app_num,[9])

        self.accept( 'mouse1' , self.app_mouse,[True])
        self.accept( 'mouse3' , self.app_mouse,[False])

        

        #in = {'1':loader.loadModel("mode//land_gree.egg"),
        #'2': loader.loadModel("mode//land_gree.egg"}

        #self.square_dict = {}




        dr = self.win.makeDisplayRegion()
        dr.sort = 0

        myCamera2d = NodePath(Camera('myCam2d'))
        lens = OrthographicLens()
        lens.setFilmSize(2, 2)
        lens.setNearFar(-1000, 1000)
        myCamera2d.node().setLens(lens)
        
        myRender2d = NodePath('myRender2d')
        myRender2d.setDepthTest(False)
        myRender2d.setDepthWrite(False)
        myCamera2d.reparentTo(myRender2d)
        dr.setCamera(myCamera2d)
        
        aspectRatio = base.getAspectRatio()
        myAspect2d = myRender2d.attachNewNode(PGTop('myAspect2d'))
        myAspect2d.setScale(2.0 / aspectRatio, 2.0, 2.0)
        myAspect2d.node().setMouseWatcher(base.mouseWatcherNode)

        #self.text=OnscreenText(fg=(255,255,255,255),pos=(-0.9,0.9),scale=0.1,mayChange=True)

        X1=DirectFrame(frameColor=(255,255,255,255),frameSize=(-0.04,0.04,-0.002,0.002),pos=(0,0,0))
        X2=DirectFrame(frameColor=(255,255,255,255),frameSize=(-0.002,0.002,-0.04,0.04),pos=(0,0,0))
        self.taskMgr.add(self.appdown, "appdown")
        self.taskMgr.add(self.find_Collision, "appdown")

    def save(self):
        s = ''
        for i in self.pos_list:
            x = str(i[0]) + '*' + str(i[1]) + '*' + str(i[2])

            s = s + x + '\n'
        s = s[:-1]
        p = ''
        for i in self.scene_mode:
            p = p + i + '\n'

        print(p,s)
        
        
        f=open('WORDMODE.txt','w')
        f.write(p)
        f=open('MAINWORD.txt','w')
        f.write(s)

    def app_e_down(self):
        global ima
        if self.e_bag:
            self.e_bag = False
            self.fame_bag.destroy()

        else:
            self.e_bag = True
            self.fame_bag = Canvas(self.frame,bg = '#D3D3D3')
            self.fame_bag.place(relx=0.5, rely=0.5, anchor=CENTER,height = 400 ,width = 545)

            x=5
            y=25
            e=0
            for L in loadMode_all_list:
                ima_ = Image.open(L+'.png')
                ima_ = ima_.resize((30, 30))
                ima.append(ImageTk.PhotoImage(ima_))             
                la = Label( image = ima[-1])
                self.fame_bag.create_window((x, y),window=la,anchor='w',height=40,width=40)
                la.bind('<Button-1>',lambda but = Mode_all_function[e],massage = [L,Mode_all_function[e]], : self.button(but,massage))
                print(L,Mode_all_function[e])
                if x == 500:
                    x = 5
                    y += 45
                else:
                    x += 45
                e+=1
                    
    def button(self,b,t):
        global key,image
        loadMode_list[self.key] = t[0]
        list_function[self.key] = t[1]

        image_ = Image.open(t[0]+'.png')
        image_ = image_.resize((30, 30))
        image_ = ImageTk.PhotoImage(image_)
        image[self.key] = image_

        self.la_list[self.key].config(image = image[self.key])
            
            
    def app_esc_down(self):
        if self.esc:
            self.esc = False

        else:
            self.esc = True
            
    def resize(self, event):
        props = WindowProperties()
        props.set_origin(0, 0)
        props.set_size(self.frame.winfo_width(), self.frame.winfo_height())
        base.win.request_properties(props)
        
    def backspace(self):
        
        self.V = -self.up_speed 
        print(1)
    def app_num(self, key):
        print(key)
        self.key = key
        self.square_num = key

        for i in self.la_list:
            i.config(relief="flat")

        self.title1['text'] = loadMode_list[self.square_num]


        self.la_list[self.square_num].config(relief="solid")

        
    def app_View(self):
        if self.Cameramode:
            self.Cameramode = False
            self.me.show()
        else:
            self.Cameramode = True
            self.me.hide()
        
    def app_mouse(self,num):
        if num:
            self.myFunction()
        else:
            self.myFunction3()

    def app_key(self, key, value):  
        self.keyMap[key] = value

    def find_Collision(self,task):
        #try:
        #0  1 前 2 后 3 ← 4 右
        t = 0.9
        self.dont_run = []
        self.G_down = True
        self.cTravTwo.traverse(render)
        #print(self.ralphGroundHandler_two.getNumEntries())
        if self.ralphGroundHandler_two.getNumEntries() > 0:
            self.ralphGroundHandler_two.sortEntries()
            for e in range(self.ralphGroundHandler_two.getNumEntries()):
                #print(self.ralphGroundHandler_two.getEntry(e).getIntoNodePath())
                try:
                    pickedObj = self.ralphGroundHandler_two.getEntry(e).getIntoNodePath()
                    index = pickedObj.getNetTag('myObjectTag')
                    pickedObj = pickedObj.getNetTag('myObjectTag')
                    x = float(pickedObj[:pickedObj.index(',')])
                    pickedObj = pickedObj[pickedObj.index(',')+1:]
                    y = float(pickedObj[:pickedObj.index(',')])
                    pickedObj = pickedObj[pickedObj.index(',')+1:]
                    z = float(pickedObj)
                    #print(self.ralphGroundHandler_two.getEntry(e).getIntoNodePath())
                    #print(self.Camerapos[0])
                    #print(float((self.Camerapos[0]//1 + math.ceil(self.Camerapos[0]))/2) ,x)
                    #print(z)
                    if self.Camerapos[0]//1 == math.ceil(self.Camerapos[0]):
                        if self.Camerapos[0]>=0:
                            index_x = self.Camerapos[0] + 0.5
                        else:
                            index_x = self.Camerapos[0] - 0.5
                    else:
                        index_x = float((self.Camerapos[0]//1 + math.ceil(self.Camerapos[0]))/2)
                    if self.Camerapos[1]//1 == math.ceil(self.Camerapos[1]):
                        if self.Camerapos[1]>=0:
                            index_y = self.Camerapos[1] + 0.5
                        else:
                            index_y = self.Camerapos[1] - 0.5
                    else:
                        index_y = float((self.Camerapos[1]//1 + math.ceil(self.Camerapos[1]))/2)
                    #print(index_x,index_y)
                    if  index_x == x and index_y == y :
                        if z + 0.5 >= self.Camerapos[2] - self.init_h > z - 0.5:
                            if self.scene_Funstion[index]:
                                if self.scene_Funstion[index].can_collision:
                                    print(11)
                                else:
                                    self.G_down = False
                                    #self.V -= GV
                                    self.Camerapos[2] = z + self.init_h + 0.5
                            else:
                                self.G_down = False
                                #self.V -= GV
                                self.Camerapos[2] = z + self.init_h + 0.5          
                        #else:
                    #print(self.ralphGroundHandler_two.getEntry(e).getIntoNodePath())
                    if self.scene_Funstion[index]:
                        if self.scene_Funstion[index].can_collision:
                            continue
                        else:
                            pass
                    else:
                        pass
                    if self.Camerapos[2]-0.5 > z > self.Camerapos[2] - self.init_h:
                        self.dont_run = []
                        #print(111)
                        #if self.Camerapos[1] == y - t or self.Camerapos[1] == y + t\
                         #                      or self.Camerapos[0] == x + t or\
                         #                      self.Camerapos[0] == x - t:
                         #   t += 0.1
                        #else:
                         #   t = 0.9
                        if self.Camerapos[1]-y == 0:
                            if self.Camerapos[0]-x >= 0:
                                self.dont_run.append(3)
                                if self.Camerapos[1] >= y - t:
                                    self.Camerapos[1] = y - t
                            else:
                                self.dont_run.append(4)
                                if self.Camerapos[1] <= y + t:
                                    self.Camerapos[1] = y + t
                        else:
                            tan = (self.Camerapos[0]-x)/(self.Camerapos[1]-y)
                            #print(tan,self.Camerapos[0],x,self.Camerapos[0]-x)
                            if tan>1 or tan<-1:
                                if self.Camerapos[0]-x>0:
                                    self.dont_run.append(3)
                                    if self.Camerapos[0] <= x + t:
                                        self.Camerapos[0] = x + t
                                if self.Camerapos[0]-x<0:
                                    self.dont_run.append(4)
                                    if self.Camerapos[0] >= x - t:
                                        self.Camerapos[0] = x - t
                            elif -1<tan<1 and self.Camerapos[1]-y>0:
                                self.dont_run.append(1)
                                if self.Camerapos[1] <= y + t:
                                    self.Camerapos[1] = y + t
                            elif -1<tan<1 and self.Camerapos[1]-y<0:
                                self.dont_run.append(2)
                                if self.Camerapos[1] >= y - t:
                                    self.Camerapos[1] = y - t
                            elif tan==1  and self.Camerapos[0]-x>=0:
                                self.dont_run = 31
                                if self.Camerapos[1] <= y + t:
                                    self.Camerapos[1] = y + t
                            elif tan==-1  and self.Camerapos[0]-x>=0:
                                self.dont_run.append(2)
                                self.dont_run.append(3)
                                if self.Camerapos[0] <= x + t:
                                    self.Camerapos[0] = x + t
                                if self.Camerapos[1] >= y - t:
                                    self.Camerapos[1] = y - t

                            elif tan==1 and self.Camerapos[0]-x<0:
                                self.dont_run.append(2)
                                self.dont_run.append(4)
                                if self.Camerapos[0] >= x - t:
                                    self.Camerapos[0] = x - t
                                if self.Camerapos[1] >= y - t:
                                    self.Camerapos[1] = y - t
                            elif tan==-1 and self.Camerapos[0]-x<0:
                                self.dont_run.append(1)
                                self.dont_run.append(4)
                                if self.Camerapos[0] >= x - t:
                                    self.Camerapos[0] = x - t
                                if self.Camerapos[1] <= y + t:
                                    self.Camerapos[1] = y + t
                            if tan == 1 or tan == -1:
                                print(111)
                                        


                                #print(z)

                        #if z<= self.Camerapos[2]:
                        #print(1)
                        #self.G_down = False
                        #self.V = 0
                except:
                    pass
        if self.G_down or self.V<0:
            #self.V=0
            self.G_run()
        else:
            self.V=0
        #if self.V<0:
            #self.G_run()
            #pass
            
        return task.cont
    
    def appdown(self,task):
        if self.Cameramode:
            if self.keyMap['f']:
                run_speed = 2*self.run_speed
            else:
                run_speed = self.run_speed
            run_x,run_y = self.Camerarun(True,-2.4*run_speed)
            self.camera.setFluidPos(self.Camerapos[0] +run_x,self.Camerapos[1] +run_y ,self.Camerapos[2]-1.2)
            self.me.setFluidPos(self.Camerapos[0] ,self.Camerapos[1] ,self.Camerapos[2]-3.2)
        else:
            if self.keyMap['f']:
                run_speed = 1.8*self.run_speed
            else:
                run_speed = self.run_speed
            #print(self.rotate_y)
            a = (-math.sin(((self.rotate_y)/180)*math.pi)*10+10)*5
            h = 9-math.cos(((self.rotate_y)/180)*math.pi)*5
            run_x,run_y = self.Camerarun(True,-run_speed)
            self.camera.setFluidPos(self.Camerapos[0]+run_x*a ,self.Camerapos[1]+run_y*a ,self.Camerapos[2]+h)
            self.me.setFluidPos(self.Camerapos[0] ,self.Camerapos[1] ,self.Camerapos[2]-3.2)
        #self.text['text'] = 'pos: X= ' + str(int(self.Camerapos[0])) +',Y = '+ str(int(self.Camerapos[1])) + ',Z = ' + str(int(self.Camerapos[2]))
      #self.light.setPos(1,1, 2)
        if self.keyMap['f']:
            run_speed = 1.8*self.run_speed
        else:
            run_speed = self.run_speed
            
        if self.keyMap['w']:
            x,y = self.Camerarun(True,run_speed)
            self.add_run(x,y)
        if self.keyMap['s']:
            x,y = self.Camerarun(True,-run_speed)
            self.add_run(x,y)
        if self.keyMap['a']:
            x,y = self.Camerarun(False,-run_speed)
            self.add_run(x,y)
            #Camerapos
        if self.keyMap['d']:
            x,y = self.Camerarun(False,run_speed)
            self.add_run(x,y)
            #Camerapos
        if self.esc or self.e_bag:
            self.disableMouse()
            props = WindowProperties()
            props.setCursorHidden(False)
            props.setMouseMode(WindowProperties.M_relative)
            self.win.requestProperties(props)
            
            if self.mouseWatcherNode.hasMouse():
                self.rotate_x = self.mouseWatcherNode.getMouseX()*self.rotate_speed
                self.rotate_y = self.mouseWatcherNode.getMouseY()*self.rotate_speed
        else:
            self.disableMouse()
            props = WindowProperties()
            props.setCursorHidden(True)
            props.setMouseMode(WindowProperties.M_relative)
            self.win.requestProperties(props)

            mw = self.mouseWatcherNode
            if mw.hasMouse():
                self.rotate_x -= mw.getMouseX()*self.rotate_speed
                self.un_rotate_y = -1
                if self.rotate_y>90:
                    self.un_rotate_y = True
                elif self.rotate_y<-90:
                    self.un_rotate_y = False
                if mw.getMouseY()<=0 and self.un_rotate_y:
                    self.rotate_y += mw.getMouseY()*self.rotate_speed
                if mw.getMouseY()>=0 and not self.un_rotate_y:
                    self.rotate_y += mw.getMouseY()*self.rotate_speed
                if self.un_rotate_y == -1:
                    self.rotate_y += mw.getMouseY()*self.rotate_speed
                

                props = self.win.getProperties()
                base.win.movePointer(0,
                                     props.getXSize() // 2,
                                     props.getYSize() // 2)
        self.myFunction2()

        #self.G_run()
            
        self.camera.setHpr(self.rotate_x,self.rotate_y,0)
        self.me.setH(180+self.rotate_x)
        return task.cont
    
    def G_run(self):
        self.V += GV

        self.Camerapos[2] -= self.V/1000
    
    def myFunction3(self):
        try:
            if self.mouseWatcherNode.hasMouse():
                mpos = self.mouseWatcherNode.getMouse()

            self.pickerRay.setFromLens(self.camNode, mpos.x, mpos.y)
            mpos = base.mouseWatcherNode.getMouse()
            self.pickerRay.setFromLens(self.camNode, mpos.getX(), mpos.getY())

            self.cTrav.traverse(render)
            if self.ralphGroundHandler.getNumEntries() > 0:
                self.ralphGroundHandler.sortEntries()
                pickedObj = self.ralphGroundHandler.getEntry(0).getIntoNodePath()
                pickedObj = pickedObj.getNetTag('myObjectTag')
            x = float(pickedObj[:pickedObj.index(',')])
            pickedObj = pickedObj[pickedObj.index(',')+1:]
            y = float(pickedObj[:pickedObj.index(',')])
            pickedObj = pickedObj[pickedObj.index(',')+1:]
            z = float(pickedObj)

            mode_pos = [[x,y,z+1],[x+1,y,z],[x,y+1,z],[x-1,y,z],[x,y-1,z],[x,y,z-1]]

            for i in mode_pos:
                if i in self.pos_list:
                    pass
                else:
                    #print(self.square_num,self.square_dict)
                    self.add_scene = loader.loadModel(loadMode_list[self.square_num])
                    #self.add_scene.setMaterial(myMaterial)
                    #self.add_scene.setShaderAuto()
                    self.add_scene.reparentTo(render)
                    #print(list_function,self.square_num)
                    render.setShaderAuto()
                    if list_function[self.square_num]:
                        function_ = list_function[self.square_num]()
                        self.add_scene.setTwoSided(function_.setTwoSided)
                        if function_.Run:
                            function_.Run_(self,i[0], i[1], i[2])
                        if function_.Scale:
                            self.add_scene.setScale(function_.Scale[0], \
                                   function_.Scale[1],function_.Scale[2])
                        else:
                            self.add_scene.setScale(0.4999, 0.4999, 0.4999)
                            
                        if function_.pos:
                            self.add_scene.setPos(i[0] + function_.pos[0], \
                                  i[1] +  function_.pos[1], \
                                        i[2] +  function_.pos[2])
                            #print(i[0] + list_function[self.square_num].pos[0], \
                                #  i[1] +  list_function[self.square_num].pos[1], \
                                 #       i[2] +  list_function[self.square_num].pos[2])
                        else:
                            self.add_scene.setPos(i[0], i[1], i[2])
                    else:
                        function_ = list_function[self.square_num]
                        self.add_scene.setScale(0.4999, 0.4999, 0.4999)
                        self.add_scene.setPos(i[0], i[1], i[2])
                    self.add_scene.setTag('myObjectTag', str(i[0])+','+str(i[1])+','+str(i[2]))
                    #scene.scene.setPos(i[0], i[1], i[2])
                    #print(self.add_scene.getPos())
                    self.ralphGroundColNp = self.add_scene.attachNewNode(self.ralphGroundCol)
                    self.ralphGroundHandler = CollisionHandlerQueue()
                    self.cTrav.addCollider(self.ralphGroundColNp, self.ralphGroundHandler)

                    self.cTrav.addCollider(self.pickerNP, self.ralphGroundHandler)
                    
                    if self.mouseWatcherNode.hasMouse():
                        mpos = self.mouseWatcherNode.getMouse()

                    self.pickerRay.setFromLens(self.camNode, mpos.x, mpos.y)
                    mpos = base.mouseWatcherNode.getMouse()
                    self.pickerRay.setFromLens(self.camNode, mpos.getX(), mpos.getY())

                    self.cTrav.traverse(render)
                    if self.ralphGroundHandler.getNumEntries() > 0:
                        self.ralphGroundHandler.sortEntries()
                        pickedObj = self.ralphGroundHandler.getEntry(0).getIntoNodePath()
                        pickedObj = pickedObj.getNetTag('myObjectTag')
                    if pickedObj == str(float(i[0]))+','+str(float(i[1]))+','+str(float(i[2])):
                        self.scene_list.append(self.add_scene)
                        self.pos_list.append([float(i[0]), float(i[1]), float(i[2])])
                        self.scene_Funstion[str(float(i[0]))+','+str(float(i[1]))+','+str(float(i[2]))] = function_
                        self.scene_mode.append(loadMode_list[self.square_num])
                        print(len(self.scene_mode),len(self.pos_list))
                        print(2)
                    else:
                        
                        if function_:
                            #print(list_function[self.square_num].pos)
                            if function_.Run:
                                function_.Del_(self)
                        
                        self.add_scene.removeNode()
                        self.ralphGroundColNp.removeNode()
        except:
            pass
    
    def myFunction2(self):
        try:
            if self.mouseWatcherNode.hasMouse():
                mpos = self.mouseWatcherNode.getMouse()

            self.pickerRay.setFromLens(self.camNode, mpos.x, mpos.y)
            mpos = base.mouseWatcherNode.getMouse()
            self.pickerRay.setFromLens(self.camNode, mpos.getX(), mpos.getY())

            self.cTrav.traverse(render)
            # Assume for simplicity's sake that myHandler is a CollisionHandlerQueue.
            if self.ralphGroundHandler.getNumEntries() > 0:
                #print(self.ralphGroundHandler.getNumEntries())
                # This is so we get the closest object
                self.ralphGroundHandler.sortEntries()
                pickedObj = self.ralphGroundHandler.getEntry(0).getIntoNodePath()
                pickedObj = pickedObj.getNetTag('myObjectTag')
                if pickedObj == 'me':
                    pickedObj = self.ralphGroundHandler.getEntry(1).getIntoNodePath()
                    pickedObj = pickedObj.getNetTag('myObjectTag')
                    
                x = pickedObj[:pickedObj.index(',')]
                pickedObj = pickedObj[pickedObj.index(',')+1:]
                y = pickedObj[:pickedObj.index(',')]
                pickedObj = pickedObj[pickedObj.index(',')+1:]
                z = pickedObj
                self.cleck.setPos(float(x),float(y),float(z))
        except:
            pass
            
    def myFunction(self):
        if self.mouseWatcherNode.hasMouse():
            mpos = self.mouseWatcherNode.getMouse()

        self.pickerRay.setFromLens(self.camNode, mpos.x, mpos.y)
        mpos = base.mouseWatcherNode.getMouse()
        self.pickerRay.setFromLens(self.camNode, mpos.getX(), mpos.getY())

        self.cTrav.traverse(render)
        if self.ralphGroundHandler.getNumEntries() > 0:
            self.ralphGroundHandler.sortEntries()
            pickedObj = self.ralphGroundHandler.getEntry(0).getIntoNodePath()
            if pickedObj.findNetTag('myObjectTag'):
                for e,i in enumerate(self.pos_list):
                    if pickedObj.getNetTag('myObjectTag') == str(i[0])+','+str(i[1])+','+str(i[2]):
                        if self.scene_Funstion[str(i[0])+','+str(i[1])+','+str(i[2])]:
                            if self.scene_Funstion[str(i[0])+','+str(i[1])+','+str(i[2])].Run:
                                self.scene_Funstion[str(i[0])+','+str(i[1])+','+str(i[2])].Del_(self)
                        del self.pos_list[e]
                        del self.scene_list[e]
                        del self.scene_mode[e]
                        del self.scene_Funstion[str(i[0])+','+str(i[1])+','+str(i[2])]
                        print(1)
                pickedObj.removeNode()
    
    def Camerarun(self,rotate,speed):
        pi_rotate = (self.rotate_x/180)*math.pi
        if rotate:
            add_runx = -math.sin(pi_rotate)*speed
            add_runy = math.cos(pi_rotate)*speed
        else:
            speed = speed*0.8
            add_runx = math.cos(pi_rotate)*speed
            add_runy = math.sin(pi_rotate)*speed
            
            
        return add_runx,add_runy

        #self.camera.setPos(self.Camerapos[0] ,self.Camerapos[1] ,self.Camerapos[2])
        #self.me.setPos(self.Camerapos[0] ,self.Camerapos[1] ,self.Camerapos[2]-3.5)        

    def add_run(self,add_runx,add_runy):
        self.light.setPos(self.Camerapos[0],self.Camerapos[1]-30, 2)
        self.light.setHpr(0,self.light_rotate,0)
        #print(self.dont_run)
        if self.dont_run == []:
            pass
        if 1 in self.dont_run:
            if add_runy<=0:
                add_runy = 0
         
        if 2 in self.dont_run:
            if add_runy>=0:
                add_runy = 0
            
        if 3 in self.dont_run:
            if add_runx<=0:
                add_runx = 0
            
        if 4 in self.dont_run:
            if add_runx>=0:
                add_runx = 0

        
                
        self.Camerapos[0] += add_runx
        self.Camerapos[1] += add_runy
            
  
a = MyApp()
a.run()


​

Mode_FUNCTION.py

from direct.showbase.ShowBase import ShowBase
from math import pi, sin, cos
from pandac.PandaModules import WindowProperties
from direct.task import Task
from direct.actor.Actor import Actor
from direct.interval.IntervalGlobal import Sequence
from panda3d.core import *
from panda3d.core import loadPrcFileData
from direct.showbase import DirectObject
import random


class magma():
    def __init__(self):
        self.setTwoSided = False
        self.Run = True
        self.can_collision = True
        self.Scale = False
        self.pos = False
        self.disremove = False
        self.reflection = False
        
    def Run_(self,main_app,x,y,z):
        self.plight = PointLight('plight')
        self.plight.setColor((205, 98, 55, 2))
        self.plight.attenuation = (0, 0, 250)
        self.plnp = render.attachNewNode(self.plight)
        self.plnp.setPos(x, y, z+0.1)
        self.plight.setShadowCaster(True)
        main_app.render.setLight(self.plnp)
    def Del_(self,main_app):
        main_app.render.clearLight(self.plnp)      


class water():
    def __init__(self):
        self.setTwoSided = False
        self.Run = False
        self.can_collision = True
        self.Scale = False
        self.pos = False
        self.disremove = False
        self.reflection = True

class torch(ShowBase):
    def __init__(self):
        self.setTwoSided = False
        self.Run = True
        self.can_collision = True
        self.Scale = [0.05,0.05,0.05]
        self.pos = [0,0,-0.4]
        self.disremove = False
        self.reflection = False

    def Run_(self,main_app,x,y,z):
        #self.lightpivot = main_app.render.attachNewNode("lightpivot")
        #self.lightpivot.setPos(x,y,z)
        #self.lightpivot.hprInterval(10, LPoint3(360, 0, 0)).loop()
       # plight = DirectionalLight("directionalLight")
     #   plight.setColor((1, 1, 1, 1))
   #     plnp = self.lightpivot.attachNewNode(plight)
      #  plnp.setPos(x,y,z)
   #     main_app.render.setLight(plnp)
        self.plight = PointLight('plight')
        self.plight.setColor((150, 50, 10, 2))
        self.plight.attenuation = (0, 0, 100)
        self.plnp = render.attachNewNode(self.plight)
        self.plnp.setPos(x, y, z+0.1)
        self.plight.setShadowCaster(True)
        main_app.render.setLight(self.plnp)
    def Del_(self,main_app):
        main_app.render.clearLight(self.plnp)
        #self.plnp.hide()
        print(1111111)
        
class grass(ShowBase):
    def __init__(self):
        self.setTwoSided = True
        self.Run = False
        self.can_collision = True
        self.Scale = False
        self.pos = False
        self.disremove = False
        self.reflection = False
        
class glass(ShowBase):
    def __init__(self):
        self.setTwoSided = False
        self.Run = False
        self.can_collision = False
        self.Scale = False
        self.pos = False
        self.disremove = False
        self.reflection = False
#class grass_Guo(ShowBase):
   # def __init__(self):
       # self.Run = False
       # self.can_collision = True
       # self.Scale = False
       # self.pos = False
class land_gree(ShowBase):
    def __init__(self):
        self.setTwoSided = False
        self.Run = True
        self.can_collision = False
        self.Scale = False
        self.pos = False
        self.disremove = False
        self.reflection = False
    def Run_(self,main_app,x,y,z):
        main_app.add_scene.setH(random.randint(0,4)*90)

        
    def Del_(self,main_app):
        pass

class music(ShowBase):
    def __init__(self):
        self.setTwoSided = False
        self.Run = False
        self.can_collision = False
        self.Scale = False
        self.pos = False
        self.disremove = True
        self.reflection = False


class lamp():
    def __init__(self):
        self.setTwoSided = False
        self.Run = True
        self.can_collision = False
        self.Scale = False
        self.pos = False
        self.disremove = False
        self.reflection = False
        
    def Run_(self,main_app,x,y,z):
        self.plight = PointLight('plight')
        self.plight.setColor((255, 161, 98, 2))
        self.plight.attenuation = (0, 0, 100)
        self.plnp = render.attachNewNode(self.plight)
        self.plnp.setPos(x, y, z+0.1)
        self.plight.setShadowCaster(True)
        main_app.render.setLight(self.plnp)
    def Del_(self,main_app):
        main_app.render.clearLight(self.plnp)      

(main.py和Mode_FUNCTION.py 在同一文件夹内)

鍵位:wasd移動     f1切換視野  f2 f3 調節視野   e 背包  shift飛行模式 (上下調節高度)

4.添加地图

        我想到直接读取txt文件来加载地图。。。

MAINWORD.txt

1.5*0.5*-1.0
-1.5*-0.5*-1.0
-1.5*1.5*-1.0
-1.5*2.5*-1.0
1.5*2.5*-1.0
1.5*3.5*-1.0
0.5*3.5*-1.0
-0.5*3.5*-1.0
-1.5*-1.5*-1.0
1.5*-1.5*-1.0
-0.5*-2.5*-1.0
-1.5*-2.5*-1.0
0.5*-2.5*-1.0
1.5*-2.5*-1.0
2.5*1.5*-1.0
2.5*0.5*-1.0
2.5*-0.5*-1.0
2.5*-1.5*-1.0
2.5*-2.5*-1.0
2.5*2.5*-1.0
2.5*3.5*-1.0
3.5*3.5*-1.0
4.5*3.5*-1.0
3.5*1.5*-1.0
3.5*2.5*-1.0
4.5*2.5*-1.0
4.5*1.5*-1.0
3.5*0.5*-1.0
3.5*-0.5*-1.0
3.5*-1.5*-1.0
3.5*-2.5*-1.0
4.5*-2.5*-1.0
4.5*-1.5*-1.0
4.5*-0.5*-1.0
5.5*-3.5*-1.0
6.5*-3.5*-1.0
7.5*-3.5*-1.0
8.5*-3.5*-1.0
9.5*-3.5*-1.0
9.5*-2.5*-1.0
9.5*-1.5*-1.0
9.5*-0.5*-1.0
9.5*0.5*-1.0
9.5*2.5*-1.0
9.5*3.5*-1.0
-1.5*4.5*-1.0
-0.5*4.5*-1.0
0.5*4.5*-1.0
1.5*4.5*-1.0
2.5*4.5*-1.0
3.5*4.5*-1.0
4.5*4.5*-1.0
5.5*4.5*-1.0
6.5*4.5*-1.0
7.5*4.5*-1.0
8.5*4.5*-1.0
9.5*4.5*-1.0
4.5*-3.5*-1.0
3.5*-3.5*-1.0
2.5*-3.5*-1.0
1.5*-3.5*-1.0
0.5*-3.5*-1.0
-0.5*-3.5*-1.0
-1.5*-3.5*-1.0
-2.5*-3.5*-1.0
-3.5*-3.5*-1.0
9.5*-4.5*-1.0
8.5*-4.5*-1.0
7.5*-4.5*-1.0
6.5*-4.5*-1.0
5.5*-4.5*-1.0
4.5*-4.5*-1.0
3.5*-4.5*-1.0
2.5*-4.5*-1.0
1.5*-4.5*-1.0
0.5*-4.5*-1.0
-0.5*-4.5*-1.0
-2.5*-4.5*-1.0
-1.5*-4.5*-1.0
-3.5*-4.5*-1.0
5.5*3.5*-2.0
5.5*2.5*-2.0
5.5*1.5*-2.0
5.5*0.5*-2.0
5.5*-0.5*-2.0
5.5*-1.5*-2.0
5.5*-2.5*-2.0
6.5*3.5*-2.0
6.5*2.5*-2.0
6.5*1.5*-2.0
6.5*0.5*-2.0
6.5*-0.5*-2.0
6.5*-1.5*-2.0
7.5*3.5*-2.0
7.5*2.5*-2.0
8.5*3.5*-2.0
8.5*2.5*-2.0
7.5*1.5*-2.0
8.5*1.5*-2.0
7.5*0.5*-2.0
8.5*0.5*-2.0
7.5*-0.5*-2.0
7.5*-1.5*-2.0
8.5*-1.5*-2.0
8.5*-0.5*-2.0
6.5*-2.5*-2.0
7.5*-2.5*-2.0
8.5*-2.5*-2.0
4.5*0.5*-1.0
8.5*3.5*-1.0
7.5*3.5*-1.0
6.5*3.5*-1.0
8.5*2.5*-1.0
7.5*2.5*-1.0
6.5*2.5*-1.0
8.5*-2.5*-1.0
8.5*-1.5*-1.0
8.5*-0.5*-1.0
6.5*-2.5*-1.0
6.5*-1.5*-1.0
7.5*-2.5*-1.0
7.5*-1.5*-1.0
7.5*-0.5*-1.0
6.5*-0.5*-1.0
-1.5*3.5*-1.0
1.5*1.5*-1.0
1.5*-0.5*-1.0
-0.5*-0.5*-1.0
0.5*-0.5*-1.0
-0.5*-1.5*-1.0
0.5*-1.5*-1.0
-1.5*0.5*-1.0
-0.5*0.5*-1.0
0.5*0.5*-1.0
-0.5*1.5*-1.0
0.5*1.5*-1.0
-0.5*2.5*-1.0
0.5*2.5*-1.0
4.5*-2.5*0.0
4.5*-2.5*1.0
4.5*-2.5*2.0
4.5*-2.5*3.0
4.5*-1.5*3.0
4.5*-1.5*4.0
4.5*-2.5*4.0
3.5*-2.5*3.0
3.5*-2.5*4.0
2.5*-2.5*4.0
1.5*-2.5*4.0
0.5*-2.5*4.0
-1.5*-2.5*0.0
-1.5*-2.5*1.0
-0.5*-2.5*4.0
-1.5*-2.5*4.0
-1.5*-2.5*3.0
-1.5*-2.5*2.0
-0.5*-2.5*3.0
-1.5*-1.5*4.0
-1.5*-1.5*3.0
-1.5*-0.5*4.0
-1.5*0.5*4.0
-1.5*1.5*4.0
-1.5*2.5*4.0
4.5*4.5*0.0
4.5*4.5*1.0
4.5*-0.5*4.0
4.5*0.5*4.0
4.5*1.5*4.0
4.5*2.5*4.0
4.5*3.5*4.0
4.5*4.5*4.0
4.5*4.5*3.0
4.5*4.5*2.0
4.5*3.5*3.0
3.5*4.5*4.0
3.5*4.5*3.0
2.5*4.5*4.0
1.5*4.5*4.0
0.5*4.5*4.0
-1.5*4.5*0.0
-1.5*4.5*1.0
-0.5*4.5*4.0
-1.5*4.5*4.0
-1.5*4.5*3.0
-1.5*4.5*2.0
-1.5*3.5*4.0
-1.5*3.5*3.0
-0.5*4.5*3.0
3.5*-2.5*0.0
2.5*-2.5*0.0
3.5*-2.5*2.0
3.5*-2.5*1.0
2.5*-2.5*3.0
2.5*-2.5*2.0
2.5*-2.5*1.0
-0.5*-2.5*0.0
-0.5*-2.5*1.0
-0.5*-2.5*2.0
0.5*-2.5*3.0
1.5*-2.5*3.0
0.5*-2.5*2.0
0.5*-2.5*1.0
0.5*-2.5*0.0
1.5*-2.5*0.0
4.5*-1.5*1.0
4.5*-1.5*0.0
4.5*-1.5*2.0
4.5*-0.5*3.0
4.5*-0.5*1.0
4.5*-0.5*0.0
4.5*-0.5*2.0
4.5*2.5*3.0
4.5*1.5*3.0
4.5*0.5*3.0
4.5*3.5*0.0
4.5*3.5*1.0
4.5*3.5*2.0
4.5*2.5*2.0
4.5*2.5*0.0
4.5*2.5*1.0
-1.5*-1.5*0.0
-1.5*-0.5*0.0
-1.5*-1.5*2.0
-1.5*-1.5*1.0
-1.5*-0.5*1.0
-1.5*-0.5*3.0
-1.5*-0.5*2.0
-1.5*0.5*3.0
-1.5*3.5*0.0
-1.5*3.5*1.0
-1.5*3.5*2.0
-1.5*2.5*3.0
-1.5*1.5*3.0
-1.5*2.5*2.0
-1.5*2.5*1.0
-1.5*2.5*0.0
-1.5*1.5*0.0
-1.5*0.5*0.0
-1.5*0.5*1.0
-1.5*0.5*2.0
-1.5*1.5*2.0
-1.5*1.5*1.0
-0.5*4.5*0.0
-0.5*4.5*1.0
-0.5*4.5*2.0
3.5*4.5*2.0
3.5*4.5*0.0
3.5*4.5*1.0
2.5*4.5*0.0
2.5*4.5*3.0
2.5*4.5*2.0
2.5*4.5*1.0
0.5*4.5*3.0
0.5*4.5*2.0
0.5*4.5*0.0
0.5*4.5*1.0
1.5*4.5*0.0
3.5*3.5*4.0
-0.5*3.5*4.0
-0.5*-1.5*4.0
3.5*-1.5*4.0
0.5*3.5*4.0
1.5*3.5*4.0
2.5*3.5*4.0
3.5*2.5*4.0
2.5*2.5*4.0
1.5*2.5*4.0
0.5*2.5*4.0
-0.5*2.5*4.0
-0.5*1.5*4.0
-0.5*0.5*4.0
-0.5*-0.5*4.0
0.5*-1.5*4.0
1.5*-1.5*4.0
2.5*-0.5*4.0
3.5*-0.5*4.0
3.5*1.5*4.0
3.5*0.5*4.0
2.5*0.5*4.0
2.5*1.5*4.0
1.5*1.5*4.0
0.5*1.5*4.0
0.5*0.5*4.0
0.5*-0.5*4.0
1.5*-0.5*4.0
5.5*3.5*-1.0
5.5*2.5*-1.0
5.5*1.5*-1.0
5.5*0.5*-1.0
5.5*-0.5*-1.0
5.5*-1.5*-1.0
5.5*-2.5*-1.0
8.5*0.5*-1.0
7.5*0.5*-1.0
6.5*0.5*-1.0
9.5*1.5*-1.0
8.5*1.5*-1.0
7.5*1.5*-1.0
6.5*1.5*-1.0
-1.5*4.5*5.0
-1.5*3.5*5.0
-1.5*2.5*5.0
-1.5*1.5*5.0
-1.5*0.5*5.0
-1.5*-2.5*5.0
-1.5*-1.5*5.0
-1.5*-0.5*5.0
-0.5*-2.5*5.0
0.5*-2.5*5.0
1.5*-2.5*5.0
2.5*-2.5*5.0
4.5*-2.5*5.0
3.5*-2.5*5.0
4.5*-1.5*5.0
4.5*-0.5*5.0
4.5*0.5*5.0
4.5*1.5*5.0
4.5*2.5*5.0
4.5*3.5*5.0
4.5*4.5*5.0
3.5*4.5*5.0
2.5*4.5*5.0
0.5*4.5*5.0
-0.5*4.5*5.0
1.5*4.5*5.0
-3.5*-5.5*-1.0
-2.5*-5.5*-1.0
-1.5*-5.5*-1.0
-0.5*-5.5*-1.0
1.5*-5.5*-1.0
0.5*-5.5*-1.0
3.5*-5.5*-1.0
2.5*-5.5*-1.0
9.5*-5.5*-1.0
8.5*-5.5*-1.0
7.5*-5.5*-1.0
7.5*-6.5*-1.0
6.5*-5.5*-1.0
5.5*-5.5*-1.0
4.5*-5.5*-1.0
9.5*-6.5*-1.0
8.5*-6.5*-1.0
6.5*-6.5*-1.0
5.5*-6.5*-1.0
4.5*-6.5*-1.0
3.5*-6.5*-1.0
2.5*-6.5*-1.0
1.5*-6.5*-1.0
0.5*-6.5*-1.0
-0.5*-6.5*-1.0
-1.5*-6.5*-1.0
-2.5*-6.5*-1.0
-3.5*-6.5*-1.0
-2.5*-2.5*-1.0
-3.5*-2.5*-1.0
-3.5*-1.5*-1.0
-2.5*-1.5*-1.0
-2.5*-0.5*-1.0
-3.5*-0.5*-1.0
-3.5*0.5*-1.0
-2.5*0.5*-1.0
-2.5*1.5*-1.0
-3.5*1.5*-1.0
-3.5*2.5*-1.0
-2.5*2.5*-1.0
-2.5*3.5*-1.0
-2.5*4.5*-1.0
-3.5*3.5*-1.0
-3.5*4.5*-1.0
5.5*5.5*-1.0
4.5*5.5*-1.0
3.5*5.5*-1.0
2.5*5.5*-1.0
1.5*5.5*-1.0
-3.5*5.5*-1.0
-2.5*5.5*-1.0
-1.5*5.5*-1.0
-0.5*5.5*-1.0
0.5*5.5*-1.0
2.5*-1.5*4.0
1.5*4.5*3.0
1.5*4.5*1.0
1.5*4.5*2.0
1.5*0.5*4.0
1.5*0.5*3.0
1.5*-2.5*1.0
1.5*-2.5*2.0
7.5*-3.5*0.0
7.5*-3.5*1.0
7.5*-3.5*2.0
7.5*-3.5*3.0
7.5*-4.5*3.0
7.5*-3.5*4.0
7.5*-3.5*5.0
7.5*-3.5*6.0
7.5*-4.5*4.0
7.5*-4.5*5.0
8.5*-3.5*3.0
8.5*-3.5*4.0
8.5*-3.5*5.0
7.5*-2.5*3.0
7.5*-2.5*4.0
7.5*-2.5*5.0
6.5*-3.5*3.0
6.5*-3.5*4.0
6.5*-3.5*5.0
6.5*-4.5*4.0
6.5*-4.5*5.0
8.5*-4.5*4.0
8.5*-4.5*5.0
8.5*-2.5*4.0
8.5*-2.5*5.0
6.5*-2.5*4.0
6.5*-2.5*5.0
5.5*3.5*0.0
5.5*2.5*0.0

 WORDMODE.txt

mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//salt.egg
mode//land_gree.egg
mode//water.egg
mode//water.egg
mode//water.egg
mode//water.egg
mode//water.egg
mode//water.egg
mode//water.egg
mode//water.egg
mode//water.egg
mode//water.egg
mode//water.egg
mode//water.egg
mode//water.egg
mode//water.egg
mode//water.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//glass.egg
mode//glass.egg
mode//glass.egg
mode//glass.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//land_gree.egg
mode//Birch_planks.egg
mode//Birch_planks.egg
mode//glass.egg
mode//glass.egg
mode//Birch_planks.egg
mode//redstone_lamp_on.egg
mode//glass.egg
mode//glass.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_wood.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//Tree_leaves.egg
mode//grass_Guo.egg
mode//grass_Guo.egg

5.效果展示

...視頻传不上来,算了

 6资源分享

链接:https://pan.baidu.com/s/1uH0WkP9jvZnbH-mQS2bclw?pwd=wwii 
提取码:wwii

7结语 

陆陆续续看了panda3d官网一年多才写出了个这玩意,用百度翻译的外网真的很难看懂。。。

panda3d官網:Panda3D Manual — Panda3D Manual

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值