【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 = Poi
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值