#!/usr/bin/python
#coding:utf8
from direct.showbase.ShowBase import ShowBase
# Actor 需要单独导入
from direct.actor.Actor import Actor
from direct.task import Task
from panda3d.core import loadPrcFile, PStatCollector
from panda3d.core import AmbientLight,DirectionalLight, Vec4
import sys
import math
import os
class MyApp(ShowBase):
key = {'left':False, 'right':False, 'up':False,
'down':False, 'crouch':False, 'mouse':False,
'shift':False}
def __init__(self):
ShowBase.__init__(self)
# 禁用默认的鼠标操作
self.disableMouse()
g = loader.loadModel('bridge')
g.reparentTo(render)
self.camera.setPos(0,-12,4)
self.camera.setP(-12)
# DirectionalLight: 有方向的平行光
pLight = DirectionalLight("pLight")
pLight.setColor(Vec4( 0.8,0.8,0.8,1 ) )
pLight.setShadowCaster(True,1024, 1024)
pLight.getLens().setNearFar(5,31)
pLight.getLens().setFilmSize(44)
plnp = render.attachNewNode(pLight)
plnp.setPos(0,-0,10)
plnp.setHpr(30,-60,0)
render.setLight(plnp)
# AmbientLight: 没有方向的环境光
ambientLight = AmbientLight("ambientLight")
ambientLight.setColor(Vec4(0.8,0.8,0.8,1))
alnp = render.attachNewNode(ambientLight)
render.setLight(alnp)
#######################################################################################
render.setShaderAuto()
#######################################################################################
self.player = Actor('setsuna',
{'stand':'setsuna-stand',
'run':'setsuna-run',
'walk':'setsuna-walk',
'crouch':'setsuna-crouch',
'zyj':'setsuna-zyj',
'blyhz1':'setsuna-blyhz1',
'blyhz2':'setsuna-blyhz2',
'blyhz3':'setsuna-blyhz3'})
self.player.reparentTo(render)
self.player.pose('stand', 0)
center = render.attachNewNode("center")
center.reparentTo(self.player)
center.setCompass()
self.camera.reparentTo(center)
plnp.reparentTo(center)
taskMgr.add(self.task, 'mainTask')
self.accept(",", self.keyboard, ['up', True])
self.accept(",-up", self.keyboard, ['up', False])
self.accept("o", self.keyboard, ['down', True])
self.accept("o-up", self.keyboard, ['down', False])
self.accept("a", self.keyboard, ['left', True])
self.accept("a-up", self.keyboard, ['left', False])
self.accept("e", self.keyboard, ['right', True])
self.accept("e-up", self.keyboard, ['right', False])
self.accept("arrow_up", self.keyboard, ['up', True])
self.accept("arrow_up-up", self.keyboard, ['up', False])
self.accept("arrow_down", self.keyboard, ['down', True])
self.accept("arrow_down-up", self.keyboard, ['down', False])
self.accept("arrow_left", self.keyboard, ['left', True])
self.accept("arrow_left-up", self.keyboard, ['left', False])
self.accept("arrow_right", self.keyboard, ['right', True])
self.accept("arrow_right-up", self.keyboard, ['right', False])
self.accept("shift", self.keyboard, ['shift', True])
# lshift
self.accept("shift-up", self.keyboard, ['shift', False])
self.accept("shift-,", self.keyboard, ['up', True])
self.accept("shift-,-up", self.keyboard, ['up', False])
self.accept("shift-o", self.keyboard, ['down', True])
self.accept("shift-o-up", self.keyboard, ['down', False])
self.accept("shift-a", self.keyboard, ['left', True])
self.accept("shift-a-up", self.keyboard, ['left', False])
self.accept("shift-e", self.keyboard, ['right', True])
self.accept("shift-e-up", self.keyboard, ['right', False])
self.accept("shift-arrow_up", self.keyboard, ['up', True])
self.accept("shift-arrow_up-up", self.keyboard, ['up', False])
self.accept("shift-arrow_down", self.keyboard, ['down', True])
self.accept("shift-arrow_down-up", self.keyboard, ['down', False])
self.accept("shift-arrow_left", self.keyboard, ['left', True])
self.accept("shift-arrow_left-up", self.keyboard, ['left', False])
self.accept("shift-arrow_right", self.keyboard, ['right', True])
self.accept("shift-arrow_right-up", self.keyboard, ['right', False])
self.accept("mouse1", self.keyboard, ['mouse', True])
self.accept("mouse1-up", self.keyboard, ['mouse', False])
self.accept("q", self.keyboard, ['crouch', True])
self.accept("q-up", self.keyboard, ['crouch', False])
self.accept("h", self.attack, ['light'])
def p(self, string):
print(string)
def keyboard(self, name, value):
self.key[name] = value
if self.key['mouse']:
play = 'walk'
elif self.key['up']:
play = 'walk'
self.player.setH(180)
if self.key['left']:
self.player.setH(215)
elif self.key['right']:
self.player.setH(135)
elif self.key['down']:
play = 'walk'
self.player.setH(0)
if self.key['left']:
self.player.setH(-45)
elif self.key['right']:
self.player.setH(45)
elif self.key['left']:
play = 'walk'
self.player.setH(-90)
elif self.key['right']:
play = 'walk'
self.player.setH(90)
elif self.key['crouch']:
play = 'crouch'
else:
play = 'stand'
if play == 'walk' and self.key['shift']:
play = 'run'
if play != self.player.getCurrentAnim():
if play == 'walk':
self.player.loop('walk')
elif play == 'run':
self.player.loop('run')
elif play == 'stand':
self.player.pose('stand', 0)
elif play == 'crouch':
self.player.play('crouch')
def attack(self, widget):
play = self.player.getCurrentAnim()
if widget=='light':
if self.key['crouch']:
self.player.play('zyj')
elif play==None:
self.player.play('blyhz1')
elif play=='blyhz1':
frame = self.player.getCurrentFrame('blyhz1')
if frame>=9 and frame<=15:
self.player.play('blyhz2')
elif play=='blyhz2':
frame = self.player.getCurrentFrame('blyhz2')
if frame>=3 and frame<=9:
self.player.play('blyhz3')
def task(self, task):
play = self.player.getCurrentAnim()
if self.key['mouse']:
if base.mouseWatcherNode.hasMouse():
x=base.mouseWatcherNode.getMouseX()
y=base.mouseWatcherNode.getMouseY()
self.player.setH(math.atan2(y,x)*57.29578+90)
if play == 'walk':
self.player.setPos(self.player, 0, -task.time*2, 0)
elif play == 'run':
self.player.setPos(self.player, 0, -task.time*5, 0)
return task.again
#######################################################################################
loadPrcFile(sys.path[0]+"/Config.prc")
#######################################################################################
app = MyApp()
app.run()
When I use “threading-model Cull/Draw” without “render.setShaderAuto()”, it work.
When I only use “render.setShaderAuto()”, it work again.
But I use “threading-model Cull/Draw” with “render.setShaderAuto()”, it loss of response.
It’s my Config.prc file:
text-encoding utf8
show-frame-rate-meter #t
show-buffers #f
sync-video #t
want-pstats #t