自己写的简单的类似minecraft的游戏
发布时间:2020-05-24 23:44:35 所属栏目:Python 来源:互联网
导读:自己写的简单的类似minecraft的游戏
|
下面是脚本之家 jb51.cc 通过网络收集整理的代码片段。 脚本之家小编现在分享给大家,也给大家做个参考。 # coding: utf-8
#中文注释
import direct.directbase.DirectStart
from direct.showbase.DirectObject import DirectObject
from direct.particles.Particles import Particles
from direct.particles.ParticleEffect import ParticleEffect
from direct.task import Task
from direct.actor.Actor import Actor
from direct.gui.OnscreenText import OnscreenText
from direct.gui.DirectGui import *
from direct.interval.IntervalGlobal import *
from direct.fsm.FSM import FSM
from panda3d.core import Fog,Material,TransparencyAttrib
from panda3d.core import PandaNode,NodePath,TextNode,GeomNode
from panda3d.core import GeomVertexFormat,GeomVertexData,Geom,GeomTriangles,GeomVertexWriter
from panda3d.core import Vec3,Vec4,VBase4,Point3,CardMaker,BitMask32
from panda3d.core import AmbientLight,PointLight,DirectionalLight
from panda3d.core import CollisionTraverser,CollisionNode
from panda3d.core import CollisionHandlerQueue,CollisionRay,CollisionSphere,CollisionSegment
from panda3d.ai import *
from math import sin,cos,pi
import random
import csv
floorTex=loader.loadTexture('textures/texture1.png')
sandTex=loader.loadTexture('textures/texture3.png')
brickTex=loader.loadTexture('textures/texture2.png')
grassTex=loader.loadTexture('textures/texture4.png')
waterTex=loader.loadTexture('textures/texture5.jpg')
cloudTex = None
sunTex = loader.loadTexture('textures/sun_1k_tex.jpg')
winTex=loader.loadTexture('textures/youwin.jpg')
cubePath = ['models/cube0.bam','models/cube1.bam','models/cube2.bam','models/cube3.bam','models/cube4.bam','models/cube5.bam','models/cube6.bam']
#标题和说明设定
def addTitle(text):
return OnscreenText(text = text,style = 1,fg = (1,1,1),pos = (1.3,-0.95),align=TextNode.ARight,scale = .07)
def addInstructions(pos,msg):
return OnscreenText(text=msg,style=1,fg=(1,mayChange=1,pos=(-1.3,pos),align=TextNode.ALeft,scale = .05,shadow=(0,shadowOffset=(0.1,0.1))
def addWords(text):
return OnscreenText(text = text,fg = (0,bg = (0.6,0.8,2,0.5),pos = (0,0),align=TextNode.ACenter,scale = .07,1))
def distance(lst,x,y):
result = True
for pos in lst:
dist = (x-pos[0]) **2 + (y-pos[1])**2
if dist < 50:
result = False
return result
#读取csv文件的
def read(name):
f = open(name,'rb')
reader = csv.reader(f)
M = []
for i in reader:
M.append(i)
return M
#maze是个矩阵,就是我们的迷宫,从中选出eve可以活动的地方
def selectPos(maze):
pos = []
w = len(maze)
l = len(maze[0])
while len(pos) < 5:
x,y = random.randint(0,w-5),random.randint(0,l-5)
#连续的四个都是空的
if maze[x][y] == ' 'and maze[x][y+1] == ' 'and maze[x][y+2] == ' 'and maze[x][y+3] == ' ':
#离起点和终点还有列表中已经存在的点足够远
if x**2 + y**2 > 100 and (w-x-5)**2 + (l-y-5)**2 > 100 and distance(pos,y) :
pos.append((2*x - 78,2*y - 78,1))
while len(pos) < 10:
x,l-5)
if maze[x][y] == ' 'and maze[x+1][y] == ' 'and maze[x+2][y] == ' 'and maze[x+3][y] == ' ':
if x**2 + y**2 > 100 and (w-x-5)**2 + (l-y-5)**2 > 100 and distance(pos,0))
print pos
return pos
def randomPos(maze):
pos = []
w = len(maze)
l = len(maze[0])
while len(pos) < 10:
x,l-5)
if maze[x][y] == ' ':
pos.append((2*x - 78,2*y - 78))
return pos
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
class World(DirectObject):
def __init__(self):
render.prepareScene(base.win.getGsg())
#base.oobe()
base.setFrameRateMeter(True)
#声音
self.sound1 = base.loader.loadSfx('/文档/小日子/python&game/bunnycraft/musicbox.ogg')
#我们的主人公ralph
self.ralph = Actor("ralph.egg.pz",{"run":"models/ralph-run.egg.pz","walk":"models/ralph-walk.egg.pz"})
self.ralph.reparentTo(render)
self.ralph.setPos(-76,74,0)
self.ralph.setScale(0.4)
self.isMoving = False
self.spos = None
self.camZ = 2
self.moveSpeed = 20
self.rotateSpeed = 80
#悬浮框,现实位置
self.makeCardMap()
#和他的小宠物panda
self.panda = Actor("models/panda-model.egg.pz",{"run":"models/panda-walk4.egg.pz"})
self.panda.reparentTo(render)
self.panda.setPos(-74,76,0)
self.panda.setScale(0.001,0.001,0.001)
self.setAI()
#标题什么的
self.instMouse = addInstructions(0.5,"click mouse to diminish a cube")
self.instMouse1 = addInstructions(0.4,"double click to add a cube")
self.instSpace = addInstructions(0.3,"press space to jump")
self.instArrow = addInstructions(0.2,"use arrows to move Ralph")
self.instTex = addInstructions(0.1,"change texture:")
self.inst0 = addInstructions(0.0,"press 1:floorTex")
self.inst1 = addInstructions(-0.1,'2:sandTex')
self.inst2 = addInstructions(-0.2,'3:brickTex')
self.inst3 = addInstructions(-0.3,'4:grassTex')
self.inst4 = addInstructions(-0.4,'5:cloudTex')
self.inst5 = addInstructions(-0.5,'6:waterTex')
#摄像机,必须禁用鼠标控制才能控制摄像机
base.disableMouse()
base.camera.setPos(0,40,3)
#按键
self.keyMap = {"left":0,"right":0,"forward":0,"back":0,"up":0,"cube":0,"texture":0,'mode':0,'camleft':0,'camright':0,'camera':0}
#所有的立方体
self.cubes = {}
self.cubeNumber = 0
#地形图:(x,y)~zmax
self.heightMap = {}
#要处理的立方体们
self.toAdd = []
self.toRemove = []
#放装饰物的节点
self.node = []
for x in range(-78,78):
for y in range(-78,78):
if x % 6 == 0 and y % 6 == 0:
self.node.append((x,y))
random.shuffle(self.node)
#女巫们的生成
self.maze = read('environm.csv')
self.evePos = selectPos(self.maze)
self.eveNumber = 0
self.eveType = ['startEve','finalEve','highEve','jumpEve']
self.eves = []
#准备好的随机位置
self.randomPos = randomPos(self.maze)
#任务管理器
self.last = 0 #向下运动的
self.velocityZ = 8
self.velocityZ_ = 0
taskMgr.add(self.doAll,'do all things')
#一秒钟检查一下是否需要隐藏块或者显示块
taskMgr.doMethodLater(1.0,self.checkCube,'checkCube')
self.accept('arrow_up',self.setKey,['forward',1])
self.accept('arrow_down',['back',1])
self.accept('arrow_left',['left',1])
self.accept('arrow_right',['right',1])
self.accept('arrow_up-up',0])
self.accept('arrow_down-up',0])
self.accept('arrow_left-up',0])
self.accept('arrow_right-up',0])
self.accept('mouse1',['cube',-1])
self.accept('mouse3',1])
self.accept('1',['texture',0])
self.accept('2',1])
self.accept('3',2])
self.accept('4',3])
self.accept('5',4])
self.accept('space',['up',1])
self.accept('enter',['mode',1])
self.accept('f',['camleft',1])
self.accept('j',['camright',1])
self.accept('f-up',0])
self.accept('j-up',0])
self.accept('g',['camera',1])
self.accept('h',0])
#碰撞检测
#创建 traverser 和 handler
self.picker = CollisionTraverser()
self.pq = CollisionHandlerQueue()
self.pq1 = CollisionHandlerQueue()
#创建鼠标检测这个node,并且添加到摄像机节点下面
self.pickerNode = CollisionNode('mouseRay')
self.pickerNP = base.camera.attachNewNode(self.pickerNode)
#为了区分其他东西的碰撞,碰撞(into)物体的数据格式
self.pickerNode.setFromCollideMask(BitMask32.bit(1))
self.pickerNode.setIntoCollideMask(0)
#生成碰撞物体添加
#如果要限制鼠标的点选范围,应该用CollisionLine or CollisionSegment
self.pickerRay = CollisionRay()
self.pickerNode.addSolid(self.pickerRay)
self.picker.addCollider(self.pickerNP,self.pq)
#摄像机的碰撞检测
#self.cCamNP = CollisionNode('mouseSphere')
#self.cCamera = base.camera.attachNewNode(self.cCamNP)
#self.cCamNP.setFromCollideMask(BitMask32.bit(1))
#self.cCamNP.setIntoCollideMask(0)
#self.picker.addCollider(self.cCamera,self.pq1)
#人物的碰撞
self.ralphColNP = self.ralph.attachNewNode(CollisionNode('ralph'))
ralphSphere = CollisionSphere(0,1.5)
self.ralphColNP.node().addSolid(ralphSphere)
self.picker.addCollider(self.ralphColNP,self.pq1)
self.ralphColNP.node().setFromCollideMask(BitMask32.bit(1) | BitMask32.bit(0))
self.ralphColNP.node().setIntoCollideMask(0)
#环境场景设定
#启动阴影
#render.setShaderAuto()
self.startCubes = render.attachNewNode('startCubes')
self.env = loader.loadModel('models/environm.bam')
self.env.reparentTo(render)
self.env.setTag('environment','1')
#背景光
self.envLight =AmbientLight( "ambientLight" )
self.envLight.setColor(Vec4(0.5,0.5,1))
self.envLNP = render.attachNewNode(self.envLight)
render.setLight(self.envLNP)
#选中背景光
self.envLight1 =AmbientLight( "ambientLight1" )
self.envLight1.setColor(Vec4(1,1))
self.envLNP1 = render.attachNewNode(self.envLight1)
#太阳背景光
self.envLight2 =AmbientLight( "ambientLight2" )
self.envLight2.setColor(Vec4(2,1))
self.envLNP2 = render.attachNewNode(self.envLight2)
#太阳
self.sun = loader.loadModel("models/planet_sphere.egg.pz")
self.sun.setTexture(sunTex)
self.sun.setPos(60,100,12)
self.sun.setScale(2)
self.sun.reparentTo(render)
self.sun.setLight(self.envLNP2)
#太阳光
self.sunLight = DirectionalLight('sunLight')
self.sunLight.setColor(Vec4(0.8,0.4,1))
self.sunLight.setShadowCaster(True,512,512)
self.sunLNP = render.attachNewNode(self.sunLight)
self.sunLNP.setHpr(-30,30,-10)
render.setLight(self.sunLNP)
#雾,实验中
self.fog = Fog('distanceFog')
self.fog.setColor(0.6,2)
self.fog.setExpDensity(.02)
render.setFog(self.fog)
base.setBackgroundColor(0.6,2)
self.defaultTex = 0
#生成地形图
self.makeMap()
#方块
self.cloud = render.attachNewNode('cloud')
self.cloud.setTransparency(TransparencyAttrib.MAlpha)
self.cloud.setColor(1,0.5)
for i in range(4):
self.makeCube(30 + 2*i,11,self.cloud,4)
self.makeCube(30 + 2*i,28,4)
self.makeCube(32,32,4)
self.makeCube(34,26,4)
for i in range(6):
self.makeCube(-30 + 2*i,15,4)
self.makeCube(-30 + 2*i,38,4)
for i in range(4):
self.makeCube(-28 + 2*i,42,4)
self.makeCube(-28 + 2*i,36,4)
for i in range(6):
self.makeCube(2*i,20,13,4)
self.makeCube(2*i,18,4)
for i in range(4):
self.makeCube(2 + 2*i,22,4)
self.makeCube(2 + 2*i,16,4)
self.cloud.flattenStrong()
self.buildFinal()
#GUI
self.v = [0]
self.button1 = DirectRadioButton(text = 'normal mode',variable=self.v,value=[0],scale=0.05,pos=(-0.9,0.8),command=self.changeMode)
self.button2 = DirectRadioButton(text = 'maze mode',value=[1],pos=(-0.5,command=self.changeMode)
self.button3 = DirectCheckButton(text = 'music on/off',0.7),command=self.changeMusic)
self.buttons = [self.button1,self.button2]
for button in self.buttons:
button.setOthers(self.buttons)
#-----------------------------------------------------------------------------------------------
#生成cube
def makeCube(self,y,z,myRender,texture):
if texture in range(7):
cube = loader.loadModel(cubePath[texture])
cube.reparentTo(myRender)
cube.setTag("myCube",str(self.cubeNumber))
cube.setPos(x,z)
self.cubes[cube] = (x,z)
self.cubeNumber += 1
#修改地形图
if self.heightMap[(x,y)] < z +1:
self.heightMap[(x,y)] = z +1
return cube
else:
pass
def makeEve(self,bool):
eve = Eve()
eve.actor.setTag('eve',str(self.eveNumber))
self.eves.append([eve,random.choice(self.eveType)]) #
eve.enterWalk(x,bool)
self.eveNumber += 1
def setSpos(self,z):
self.spos = (x,z)
def makeMap(self):
for i in xrange(-40,40):
for j in xrange(-40,40):
self.heightMap[(2*i,2*j)] = 0
for pos in self.cubes.values():
x,y = pos[0],pos[1]
z = pos[2]
if (x,y) in self.heightMap :
if z +1 > self.heightMap[(x,y)]:
self.heightMap[(x,y)] = z +1
#设置键盘对应的值
def setKey(self,key,value):
self.keyMap[key] = value
#if key == 'mode':
# self.keyMap[key] += value
#else:
# self.keyMap[key] = value
#print self.keyMap
#移动摄像机
def moveRalph(self,dt):
cx = base.camera.getX()
cx_ = cx
h = self.ralph.getH()
x,z = self.ralph.getPos()
tx,ty = 2*int(x/2),2*int(y/2)
h_ = h
x_,y_,z_ = x,z
#******控制Ralph*****
if self.keyMap["forward"] + self.keyMap["back"] + self.keyMap["left"] + self.keyMap["right"] > 0:
if self.isMoving is False:
self.ralph.loop("run")
self.isMoving = True
else:
if self.isMoving:
self.ralph.stop()
self.ralph.pose("walk",5)
self.isMoving = False
if self.keyMap['left'] == 1:
h_ = h+globalClock.getDt() * self.rotateSpeed
if self.keyMap['right'] == 1:
h_ = h-globalClock.getDt() * self.rotateSpeed
if self.keyMap['back'] == 1:
x_ = x - sin(h* pi /180) * globalClock.getDt() * self.moveSpeed
y_ = y + cos(h* pi /180) * globalClock.getDt() * self.moveSpeed
if self.keyMap['forward'] == 1:
x_ = x + sin(h* pi /180) * globalClock.getDt() * self.moveSpeed
y_ = y - cos(h* pi /180) * globalClock.getDt() * self.moveSpeed
if self.keyMap['up'] == 1:
#禁用移动功能
if self.v == [1]:
x_ = x
y_ = y
if z >= self.heightMap[(tx,ty)] - 0.2 :
z_ = z + dt * self.velocityZ
self.velocityZ = -dt * 10 + self.velocityZ
if z < self.heightMap[(tx,ty)] and z >= self.heightMap[(tx,ty)] - 1 :
z_ = self.heightMap[(tx,ty)]
self.setKey('up',0)
self.velocityZ = 8
if self.goDown() and self.keyMap['up'] == 0:
z_ = z + dt * self.velocityZ_
self.velocityZ_ = -dt * 10 + self.velocityZ_
if z < self.heightMap[(tx,ty)] + 0.1 :
z_ = self.heightMap[(tx,ty)]
self.velocityZ_ = 0
if abs(x) > 80 or (abs(y) > 80 or z < -1 ):
self.spos = (0,0)
#最后更新位置
self.ralph.setH(h_)
self.ralph.setPos(x_,z_)
#先看是不是要到什么特别的位置,如果有的话要去
if self.ralphCollide() and self.spos == None:
self.ralph.setPos(x,z)
elif self.spos != None:
xs,ys,zs = self.spos
self.ralph.setPos(xs,zs)
self.spos = None
#*****控制照相机******f
if self.keyMap['camera'] == 0:
base.camera.lookAt(self.ralph)
if self.keyMap['camleft'] == 1:
cx_ = cx + globalClock.getDt() * self.moveSpeed
if self.keyMap['camright'] == 1:
cx_ = cx - globalClock.getDt() * self.moveSpeed
base.camera.setX(cx_)
base.camera.lookAt(self.ralph)
base.camera.setZ(self.ralph.getZ() + self.camZ)
#这个模式中着摄像机的运动是保持和ralph相距不远的
camvec = self.ralph.getPos() - base.camera.getPos()
camvec.setZ(0)
camdist = camvec.length()
camvec.normalize()
if (camdist > 10.0):
base.camera.setPos(base.camera.getPos() + camvec*(camdist-10))
camdist = 10.0
if (camdist < 5.0):
base.camera.setPos(base.camera.getPos() - camvec*(5-camdist))
camdist = 5.0
elif self.keyMap['camera'] == 1:
base.camera.setPos(0,400)
base.camera.setP(-90)
render.clearFog()
#改变默认的纹理样式
def handleTex(self):
if self.keyMap['texture'] == 0:
self.defaultTex = 0
if self.keyMap['texture'] == 1:
self.defaultTex = 1
if self.keyMap['texture'] == 2:
self.defaultTex = 2
if self.keyMap['texture'] == 3:
self.defaultTex = 3
if self.keyMap['texture'] == 4:
self.defaultTex = 4
if self.keyMap['texture'] == 5:
self.defaultTex = 5
def handleCube(self):
#鼠标点击一个就删除这个方块,彻底删除
if base.mouseWatcherNode.hasMouse():
mx = base.mouseWatcherNode.getMouseX()
my = base.mouseWatcherNode.getMouseY()
for cube in self.cubes:
cube.clearLight()
self.pickerRay.setFromLens(base.camNode,mx,my)
self.picker.traverse(render)
if self.pq.getNumEntries() > 0:
#队列中由远及近排序
self.pq.sortEntries()
pickerObj = self.pq.getEntry(0).getIntoNodePath()
pickerObj = pickerObj.findNetTag('myCube')
if pickerObj in self.cubes:
pickerObj.setLight(self.envLNP1)
if self.keyMap['cube'] == -1:
#del self.cubes[pickerObj]
#pickerObj.remove()
self.toRemove.append(pickerObj)
self.setKey('cube',0)
elif self.keyMap['cube'] == 1:
#self.addCube(pickerObj)
self.toAdd.append(pickerObj)
self.setKey('cube',0)
#鼠标点选增加一个方块,在空的位置上随机增加
def addCube(self,cube):
if len(self.blankCube(cube)) >= 1 :
pos = random.choice(self.blankCube(cube))
self.makeCube(pos[0],pos[1],pos[2],render,self.defaultTex)
else:
pass
#优化任务处理的,为了保证帧率
def _handleCube(self):
for obj in self.toRemove:
if obj in self.cubes:
self.checkHeight(obj)
self.cubeNumber -= 1
obj.remove()
for obj in self.toAdd:
self.cubeNumber += 1
self.addCube(obj)
self.toRemove = []
self.toAdd = []
def setAI(self):
self.AIworld = AIWorld(render)
self.AIchar = AICharacter("ralph's pat",self.panda,500,0.05,5)
self.AIworld.addAiChar(self.AIchar)
self.AIbehaviors = self.AIchar.getAiBehaviors()
self.AIbehaviors.pursue(self.ralph)
self.panda.loop("run")
#查看一个方块附近的空位置
def blankCube(self,cube):
x,z = self.cubes[cube]
blank = [(x+2,z),(x-2,(x,y+2,y-2,z+2),z-2)]
blank_ = []
for pos in blank:
if not pos in self.cubes.values() and self.inMap(pos):
blank_.append(pos)
return blank_
#在删除方块的时候判断是不是需要更改高度图并且从self.cubes中删除了这个东东
def checkHeight(self,obj):
pos = self.cubes[obj]
del self.cubes[obj]
if self.heightMap[(pos[0],pos[1])] == pos[2] + 1:
self.heightMap[(pos[0],pos[1])] = 0
for z in range(1,2)[::-1]:
if [pos[0],z] in self.cubes.values():
self.heightMap[(pos[0],pos[1])] = z + 1
break
#查看一个块是不是可见的
def checkCube(self,task):
for cube in self.cubes:
if len(self.blankCube(cube)) == 0:
cube.hide(BitMask32.allOn())
else:
cube.show(BitMask32.allOn())
return task.again
#检测一个位置是不是在地图里面
def inMap(self,pos):
if abs(pos[0]) < 77 and (abs(pos[1]) < 77 and pos[2] > 0 ):
return True
else:
return False
#检测摄像机是不是该下去
def goDown(self):
x,z =self.ralph.getPos()
tx,2*int(y/2)
if z > self.heightMap[(tx,ty)]:
return True
else:
return False
#控制移动范围的碰撞检测,还有检测ralph的碰撞会不会引发什么别的
def ralphCollide(self):
self.picker.traverse(render)
if self.pq1.getNumEntries() > 0:
self.pq1.sortEntries()
Obj = self.pq1.getEntry(0).getIntoNodePath()
if Obj.node().getIntoCollideMask() == BitMask32.bit(0):
Obj = Obj.findNetTag('eve')
n = int(Obj.getTag('eve'))
Obj = self.eves[n][0]
type = self.eves[n][1]
self.eveAct(Obj,type)
return True
else:
return False
def check(self):
if self.cubeNumber > 500:
return False
else:
return True
#是不是到达终点了
def final(self):
x,z = self.ralph.getPos()
if x > 73 and x < 77 and y > 75 and y < 79:
self.winSphere = loader.loadModel("models/planet_sphere.egg.pz")
self.winSphere.setScale(0.5)
self.winSphere.setTexture(winTex)
self.winSphere.reparentTo(render)
self.winSphere.setPos(74,75,3)
return True
def delete(self,nodePath):
nodePath.remove()
#女巫的行为
def eveAct(self,eve,type):
eve.exitWalk()
eve.request("Magic")
if type == 'startEve':
self.words = addWords('Go Back To The Start ! HaHa !')
Sequence(Wait(2.0),Func(self.setSpos,-76,-74,2),Func(self.delete,self.words)).start()
if type == 'finalEve':
self.words = addWords('Do Not Appeciate me!')
Sequence(Wait(2.0),self.words)).start()
if type == 'highEve':
self.words = addWords('Where Do You Think You Will Go?')
random.shuffle(self.randomPos)
x,y = self.randomPos[0]
Sequence(Wait(2.0),20),self.words)).start()
if type == 'jumpEve':
self.words = addWords('I Do Not Add Any Thing! ')
Sequence(Wait(2.0),self.words)).start()
def movepRalph(self):
x,z = self.ralph.getPos()
x_ = 0.3 * x / 160
z_ = 0.3 * y / 160
y_ = 0
self.pralph.setPos(x_,z_)
#集中处理所有需要每帧检查的东东
def doAll(self,task):
dt = task.time - self.last
self.last = task.time
self.handleTex()
self.moveRalph(dt)
self.movepRalph()
self._handleCube()
self.handleCube()
self.AIworld.update()
self.final()
return task.cont
def changeMode(self,status=None):
if self.v == [0]:
self.env.remove()
self.env = loader.loadModel('models/environ.bam')
self.env.reparentTo(render)
self.ralph.setPos(0,0)
self.fire.remove()
self.pandaGNP.remove()
self.cardMap.remove()
self.moveSpeed = 20
self.rotateSpeed = 80
self.camZ = 2
for i in range(len(self.eves)):
self.eves[i][0].clean()
self.eves = []
self.eveNumber = 0
for cube in self.cubes:
self.toRemove.append(cube)
self.buildStart()
if self.v == [1]:
self.env.remove()
self.env = loader.loadModel('models/environm.bam')
self.env.reparentTo(render)
self.fountain.remove()
self.makeCardMap()
self.ralph.setPos(-76,0)
self.moveSpeed = 10
self.rotateSpeed = 60
self.camZ = 4
for cube in self.cubes:
self.toRemove.append(cube)
self.buildFinal()
def changeMusic(self,status):
if status and self.sound1.status() != self.sound1.PLAYING:
self.sound1.setLoop(True)
self.sound1.play()
else:
self.sound1.stop()
def makeCardMap(self):
cm=CardMaker('')
cm.setFrame(-0.2,0.2,-0.2,0.2)
self.cardMap = base.camera.attachNewNode(cm.generate())
self.pralph = loader.loadModel("models/planet_sphere.egg.pz")
self.pralph.reparentTo(self.cardMap)
self.pralph.setScale(0.01)
self.pralph.setColor(0,1)
self.startP = loader.loadModel("models/planet_sphere.egg.pz")
self.startP.reparentTo(self.cardMap)
self.startP.setScale(0.015)
self.startP.setColor(0,1)
self.startP.setPos(-0.17,-0.17)
self.finalP = loader.loadModel("models/planet_sphere.egg.pz")
self.finalP.reparentTo(self.cardMap)
self.finalP.setScale(0.015)
self.finalP.setColor(1,1)
self.finalP.setPos(0.17,0.17)
self.cardMap.setTransparency(TransparencyAttrib.MAlpha)
self.cardMap.setPos(0.8,3,0.6)
self.cardMap.setColor(1,0.6,0.5)
def buildFinal(self):
base.enableParticles()
self.fire = ParticleEffect()
self.fire.loadConfig('fireish.ptf')
self.fire.setPos(74,0)
self.fire.start(render)
self.fire.setScale(0.5)
self.pandaGNP = render.attachNewNode('pandaGNP')
self.pandaGNP.setPos(74,0)
self.pandaG = Actor("models/panda-model.egg.pz",{"run":"models/panda-walk4.egg.pz"})
self.pandaG.loop('run')
self.pandaG.reparentTo(self.pandaGNP)
self.pandaG.setPos(1,0)
self.pandaG.setScale(0.001,0.001)
self.pandaGMove = self.pandaGNP.hprInterval(20.0,Point3(-360,startHpr=Point3(0,0))
self.pandaGMove.loop()
for pos in self.evePos:
x,bool = pos
self.makeEve(x,bool)
for i in range(25):
x,y = self.node[i]
self.makeCube(x,6)
def buildStart(self):
for i in range(4):
self.makeCube(4,2*i-4,self.startCubes,2)
self.makeCube(4,2)
self.makeCube(-6,2)
self.makeCube(2*i-4,4,-6,2)
self.makeCube(2,-4,2)
self.makeCube(-4,2)
for i in range(10):
for j in range(10):
pos = (2*i-10,2*j-10,1)
if pos not in self.cubes.values():
self.makeCube(2*i-10,3)
for i in range(4):
self.makeCube(2*i-4,5)
self.makeCube(2*i-4,-2,5)
self.makeCube(0,5)
self.makeCube(-2,5)
self.makeCube(0,5)
#喷泉
base.enableParticles()
self.fountain = ParticleEffect()
self.fountain.loadConfig('fountain.ptf')
self.fountain.setPos(-1,4)
self.fountain.start(render)
self.fountain.setScale(5)
for i in range(3):
for j in range(7-2*i):
for k in range(7-2*i):
self.makeCube(30+2*j,30+2*k,1+2*i,1)
for i in range(3):
for j in range(7-2*i):
for k in range(7-2*i):
self.makeCube(-30+2*j,2)
for i in range(3):
for j in range(7-2*i):
for k in range(7-2*i):
self.makeCube(30+2*j,-30+2*k,3)
for i in range(3):
for j in range(7-2*i):
for k in range(7-2*i):
self.makeCube(-30+2*j,0)
class Eve(FSM):
def __init__(self):
FSM.__init__(self,'Eve')
self.actor = Actor('models/eve.egg.pz',{'walk':'models/eve_walk.egg.pz'})
self.actor.setScale(0.4)
self.actor.reparentTo(render)
self.interval = self.actor.actorInterval("walk",playRate = 2)
self.ColNP = self.actor.attachNewNode(CollisionNode('eve'))
self.Sphere = CollisionSphere(0,1.5)
self.ColNP.node().addSolid(self.Sphere)
self.ColNP.node().setFromCollideMask(0)
def enterWalk(self,bool):
self.x = x
self.y = y
self.bool = bool
self.ColNP.node().setIntoCollideMask(BitMask32.bit(0))
self.interval.loop()
if bool == 0:
self.PosInterval1 = self.actor.posInterval(8,Point3(x,startPos=Point3(x+8,0))
self.PosInterval2 = self.actor.posInterval(8,Point3(x+8,startPos=Point3(x,0))
self.HprInterval1 = self.actor.hprInterval(3,Point3(90,startHpr=Point3(-90,0))
self.HprInterval2 = self.actor.hprInterval(3,Point3(-90,startHpr=Point3(90,0))
elif bool == 1:
self.PosInterval1 = self.actor.posInterval(8,y+8,Point3(180,Point3(0,startHpr=Point3(180,0))
self.Pace = Sequence(self.PosInterval1,self.HprInterval1,self.PosInterval2,self.HprInterval2)
#没有名字,不知道碍不碍事
self.Pace.loop()
def exitWalk(self):
self.interval.pause()
self.Pace.pause()
def enterMagic(self):
self.actor.setZ(1)
self.magicInterval = self.actor.hprInterval(1,startHpr=Point3(450,0))
self.magicPace = Sequence(Wait(1.0),self.magicInterval,Func(self.exitMagic),Func(self.enterWalk,self.x,self.y,self.bool))
self.magicPace.start()
self.ColNP.node().setIntoCollideMask(0)
def exitMagic(self):
self.magicPace.pause()
def clean(self):
self.actor.delete()
w = World()
run()
以上是脚本之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。 如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
