怎样用python入门小游戏写游戏

python 自己写的简单的类似minecraft的游戏 - 为程序员服务
为程序员服务
自己写的简单的类似minecraft的游戏
# 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,1), pos = (1.3,-0.95),align=TextNode.ARight, scale = .07)
def addInstructions(pos, msg):
return OnscreenText(text=msg, style=1, fg=(1,1,1,1), mayChange=1,
pos=(-1.3, pos), align=TextNode.ALeft, scale = .05, shadow=(0,0,0,1), shadowOffset=(0.1,0.1))
def addWords(text):
return OnscreenText(text = text,style = 1, fg = (0,0,1,1), bg = (0.6,0.8,2,0.5),pos = (0,0),align=TextNode.ACenter, scale = .07,shadow=(0,0,0,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)
for i in reader:
M.append(i)
#maze是个矩阵,就是我们的迷宫,从中选出eve可以活动的地方
def selectPos(maze):
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,x,y) :
pos.append((2*x - 78,2*y - 78,1))
while len(pos) & 10:
x,y = random.randint(0,w-5),random.randint(0,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,x,y) :
pos.append((2*x - 78,2*y - 78,0))
return pos
def randomPos(maze):
w = len(maze)
l = len(maze[0])
while len(pos) & 10:
x,y = random.randint(0,w-5),random.randint(0,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',self.setKey,['back',1])
self.accept('arrow_left',self.setKey,['left',1])
self.accept('arrow_right',self.setKey,['right',1])
self.accept('arrow_up-up',self.setKey,['forward',0])
self.accept('arrow_down-up',self.setKey,['back',0])
self.accept('arrow_left-up',self.setKey,['left',0])
self.accept('arrow_right-up',self.setKey,['right',0])
self.accept('mouse1',self.setKey,['cube',-1])
self.accept('mouse3',self.setKey,['cube',1])
self.accept('1',self.setKey,['texture',0])
self.accept('2',self.setKey,['texture',1])
self.accept('3',self.setKey,['texture',2])
self.accept('4',self.setKey,['texture',3])
self.accept('5',self.setKey,['texture',4])
self.accept('space',self.setKey,['up',1])
self.accept('enter',self.setKey,['mode',1])
self.accept('f',self.setKey,['camleft',1])
self.accept('j',self.setKey,['camright',1])
self.accept('f-up',self.setKey,['camleft',0])
self.accept('j-up',self.setKey,['camright',0])
self.accept('g',self.setKey,['camera',1])
self.accept('h',self.setKey,['camera',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,0,2,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,0.5,1))
self.envLNP = render.attachNewNode(self.envLight)
render.setLight(self.envLNP)
#选中背景光
self.envLight1 =AmbientLight( &ambientLight1& )
self.envLight1.setColor(Vec4(1,1,1,1))
self.envLNP1 = render.attachNewNode(self.envLight1)
#太阳背景光
self.envLight2 =AmbientLight( &ambientLight2& )
self.envLight2.setColor(Vec4(2,2,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.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,0.8,2)
self.fog.setExpDensity(.02)
render.setFog(self.fog)
base.setBackgroundColor(0.6,0.8,2)
self.defaultTex = 0
#生成地形图
self.makeMap()
self.cloud = render.attachNewNode('cloud')
self.cloud.setTransparency(TransparencyAttrib.MAlpha)
self.cloud.setColor(1,1,1,0.5)
for i in range(4):
self.makeCube(30 + 2*i,30,11,self.cloud,4)
self.makeCube(30 + 2*i,28,11,self.cloud,4)
self.makeCube(32,32,11,self.cloud,4)
self.makeCube(34,32,11,self.cloud,4)
self.makeCube(32,26,11,self.cloud,4)
self.makeCube(34,26,11,self.cloud,4)
for i in range(6):
self.makeCube(-30 + 2*i,40,15,self.cloud,4)
self.makeCube(-30 + 2*i,38,15,self.cloud,4)
for i in range(4):
self.makeCube(-28 + 2*i,42,15,self.cloud,4)
self.makeCube(-28 + 2*i,36,15,self.cloud,4)
for i in range(6):
self.makeCube(2*i,20,13,self.cloud,4)
self.makeCube(2*i,18,13,self.cloud,4)
for i in range(4):
self.makeCube(2 + 2*i,22,13,self.cloud,4)
self.makeCube(2 + 2*i,16,13,self.cloud,4)
self.cloud.flattenStrong()
self.buildFinal()
self.v = [0]
self.button1 = DirectRadioButton(text = 'normal mode', variable=self.v, value=[0], scale=0.05, pos=(-0.9,0,0.8), command=self.changeMode)
self.button2 = DirectRadioButton(text = 'maze mode', variable=self.v, value=[1], scale=0.05, pos=(-0.5,0,0.8), command=self.changeMode)
self.button3 = DirectCheckButton(text = 'music on/off',scale=0.05, pos=(-0.9,0,0.7), command=self.changeMusic)
self.buttons = [self.button1,self.button2]
for button in self.buttons:
button.setOthers(self.buttons)
#-----------------------------------------------------------------------------------------------
def makeCube(self,x,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,y,z)
self.cubes[cube] = (x,y,z)
self.cubeNumber += 1
#修改地形图
if self.heightMap[(x,y)] & z +1:
self.heightMap[(x,y)] = z +1
return cube
def makeEve(self,x,y,bool):
eve = Eve()
eve.actor.setTag('eve',str(self.eveNumber))
self.eves.append([eve,random.choice(self.eveType)]) #
eve.enterWalk(x,y,bool)
self.eveNumber += 1
def setSpos(self,x,y,z):
self.spos = (x,y,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
self.keyMap[key] = value
#print self.keyMap
#移动摄像机
def moveRalph(self,dt):
cx = base.camera.getX()
h = self.ralph.getH()
x,y,z = self.ralph.getPos()
tx,ty = 2*int(x/2),2*int(y/2)
x_,y_,z_ = x,y,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
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]:
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,20,0)
#最后更新位置
self.ralph.setH(h_)
self.ralph.setPos(x_,y_,z_)
#先看是不是要到什么特别的位置,如果有的话要去
if self.ralphCollide() and self.spos == None:
self.ralph.setPos(x,y,z)
elif self.spos != None:
xs,ys,zs = self.spos
self.ralph.setPos(xs,ys,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,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)
#优化任务处理的,为了保证帧率
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,y,z = self.cubes[cube]
blank = [(x+2,y,z),(x-2,y,z),(x,y+2,z),(x,y-2,z),(x,y,z+2),(x,y,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,pos[2],2)[::-1]:
if [pos[0],pos[1],z] in self.cubes.values():
self.heightMap[(pos[0],pos[1])] = z + 1
#查看一个块是不是可见的
def checkCube(self,task):
for cube in self.cubes:
if len(self.blankCube(cube)) == 0:
cube.hide(BitMask32.allOn())
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
return False
#检测摄像机是不是该下去
def goDown(self):
x,y,z =self.ralph.getPos()
tx,ty = 2*int(x/2),2*int(y/2)
if z & self.heightMap[(tx,ty)]:
return True
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
return False
def check(self):
if self.cubeNumber & 500:
return False
return True
#是不是到达终点了
def final(self):
x,y,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),Func(self.setSpos,74,76,2),Func(self.delete,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),Func(self.setSpos,x,y,20),Func(self.delete,self.words)).start()
if type == 'jumpEve':
self.words = addWords('I Do Not Add Any Thing! ')
Sequence(Wait(2.0),Func(self.delete,self.words)).start()
def movepRalph(self):
x,y,z = self.ralph.getPos()
x_ = 0.3 * x / 160
z_ = 0.3 * y / 160
self.pralph.setPos(x_,y_,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,20,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,-74,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()
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,0,1,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,0,1)
self.startP.setPos(-0.17,0,-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,0,0,1)
self.finalP.setPos(0.17,0,0.17)
self.cardMap.setTransparency(TransparencyAttrib.MAlpha)
self.cardMap.setPos(0.8,3,0.6)
self.cardMap.setColor(1,0.6,0.6,0.5)
def buildFinal(self):
base.enableParticles()
self.fire = ParticleEffect()
self.fire.loadConfig('fireish.ptf')
self.fire.setPos(74,75,0)
self.fire.start(render)
self.fire.setScale(0.5)
self.pandaGNP = render.attachNewNode('pandaGNP')
self.pandaGNP.setPos(74,75,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,0)
self.pandaG.setScale(0.001,0.001,0.001)
self.pandaGMove = self.pandaGNP.hprInterval(20.0,Point3(-360,0,0),startHpr=Point3(0,0,0))
self.pandaGMove.loop()
for pos in self.evePos:
x,y,bool = pos
self.makeEve(x,y,bool)
for i in range(25):
x,y = self.node[i]
self.makeCube(x,y,3,render,6)
def buildStart(self):
for i in range(4):
self.makeCube(4,2*i-4,1,self.startCubes,2)
self.makeCube(4,2*i-4,3,self.startCubes,2)
self.makeCube(-6,2*i-4,1,self.startCubes,2)
self.makeCube(-6,2*i-4,3,self.startCubes,2)
self.makeCube(2*i-4,4,1,self.startCubes,2)
self.makeCube(2*i-4,4,3,self.startCubes,2)
self.makeCube(2*i-4,-6,1,self.startCubes,2)
self.makeCube(2*i-4,-6,3,self.startCubes,2)
self.makeCube(2,2,1,self.startCubes,2)
self.makeCube(2,2,3,self.startCubes,2)
self.makeCube(2,-4,1,self.startCubes,2)
self.makeCube(2,-4,3,self.startCubes,2)
self.makeCube(-4,2,1,self.startCubes,2)
self.makeCube(-4,2,3,self.startCubes,2)
self.makeCube(-4,-4,1,self.startCubes,2)
self.makeCube(-4,-4,3,self.startCubes,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,2*j-10,1,self.startCubes,3)
for i in range(4):
self.makeCube(2*i-4,0,3,self.startCubes,5)
self.makeCube(2*i-4,-2,3,self.startCubes,5)
self.makeCube(0,2,3,self.startCubes,5)
self.makeCube(-2,2,3,self.startCubes,5)
self.makeCube(-2,-4,3,self.startCubes,5)
self.makeCube(0,-4,3,self.startCubes,5)
base.enableParticles()
self.fountain = ParticleEffect()
self.fountain.loadConfig('fountain.ptf')
self.fountain.setPos(-1,0,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,self.startCubes,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,30+2*k,1+2*i,self.startCubes,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,1+2*i,self.startCubes,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,-30+2*k,1+2*i,self.startCubes,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,0,2,1.5)
self.ColNP.node().addSolid(self.Sphere)
self.ColNP.node().setFromCollideMask(0)
def enterWalk(self,x,y,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,y,0),startPos=Point3(x+8,y,0))
self.PosInterval2 = self.actor.posInterval(8,Point3(x+8,y,0),startPos=Point3(x,y,0))
self.HprInterval1 = self.actor.hprInterval(3,Point3(90,0,0),startHpr=Point3(-90,0,0))
self.HprInterval2 = self.actor.hprInterval(3,Point3(-90,0,0),startHpr=Point3(90,0,0))
elif bool == 1:
self.PosInterval1 = self.actor.posInterval(8,Point3(x,y,0),startPos=Point3(x,y+8,0))
self.PosInterval2 = self.actor.posInterval(8,Point3(x,y+8,0),startPos=Point3(x,y,0))
self.HprInterval1 = self.actor.hprInterval(3,Point3(180,0,0),startHpr=Point3(0,0,0))
self.HprInterval2 = self.actor.hprInterval(3,Point3(0,0,0),startHpr=Point3(180,0,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,Point3(90,0,0),startHpr=Point3(450,0,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()
您可能的代码
相关聚客文章
荣誉:1655
相关专栏文章}

我要回帖

更多关于 python写小游戏 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信