Python Panda3D - 使用坐标渲染

时间:2014-05-04 21:24:47

标签: python sockets client-server rendering panda3d

我遇到了一个错误,我正在尝试使用角色的坐标渲染一个角色然后使用代码reparentTo(渲染),但是我得到以下错误:“TypeError:必须是字符串或缓冲区,而不是None ”

回溯:

  File "C:\On
  line.py", line 1857, in <module>
  run()
  File "C:\Panda3D-1.8.1\direct\showbase\ShowBase.py", line 2921, in run
  self.taskMgr.run()
  File "C:\Panda3D-1.8.1\direct\task\Task.py", line 502, in run
  self.step()
  File "C:\Panda3D-1.8.1\direct\task\Task.py", line 460, in step
  self.mgr.poll()
  File "C:\On
  line.py", line 1591, in updaterender
  s.send(x)
  TypeError: must be string or buffer, not None

客户端代码的一部分:

import direct.directbase.DirectStart
import pickle
from direct.gui.OnscreenText import OnscreenText
from direct.gui.DirectGui import *
from panda3d.core import *
from pandac.PandaModules import CardMaker
from pandac.PandaModules import NodePath
import socket
import sys
import select
print("Connecting...")
name = "fatie"
print 'Please enter the name you wish to use for your pirate?'
name = raw_input()
host = 'localhost'
port = 8303
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(2)

     # connect to remote host
try :
     s.connect((host, port))
except :
    print 'Unable to connect'
    sys.exit()
#When the connection is established the game loads.
#So if the code "Connected" comes up, the connection has been established.
print("Connected")
print("Loading Game")

#Game Loads Info connection to files then half way down the code

def updatecoords(task):
    s.send(name)
    print 'Name sent...'

def updatepos(task):

    y = format(Cat.getPos())
    s.send(y)

def updaterender(task):

    x = Cat.reparentTo(render)
    s.send(x)
    return Task.cont
    print 'Position sent'

 def readServer(task):
    try:
        data = s.recv(4096)
        print data
        return Task.cont
    except:
        print 'no data received'

#Then further down

 base.taskMgr.add(handleMovement, 'controlManager')
 base.taskMgr.add(updatecoords, 'network coords')
 base.taskMgr.add(updaterender, 'network coords')
 base.taskMgr.add(updatepos, 'network coords')
 base.taskMgr.add(readServer, 'read in')

服务器代码:

import socket
import time
import pickle
import select
def broadcast(sock, message):

    for socket in CONNECTION:
        if socket != server_socket and socket != sock :
            try :
                socket.send(message)
            except :
                # broken socket connection may be, chat client pressed ctrl+c for example
                socket.close()
                CONNECTION.remove(socket)




HOST = ""
PORT = 8303
CONNECTION = []
RECV_BUFFER = 4096 
maxclients = 5

print "Online Server started on port " + str(PORT)  
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('',PORT))
server_socket.listen(maxclients)
CONNECTION.append(server_socket)




 while 1:

         read_socks,wri_socks,err_socks = select.select(CONNECTION,[],[])

         for sock in read_socks:
            #New connection
            if sock == server_socket:

                 socknew, addr = server_socket.accept()

                 CONNECTION.append(socknew)

                 print "Client (%s, %s) connected" % addr

                 broadcast(socknew, "[%s:%s] entered game\n" % addr)


             else:

                 try:

                    data = socknew.recv(RECV_BUFFER)
                    if data:
                        print data

                     #  broadcast_data(sock,data) 
                     #  print 'data was broadcast to'
                     #  print CONNECTION_LIST.len()
                except:
                     broadcast(sock, "Client (%s, %s) is offline" % addr)
                     sock.close()
                     CONNECTION.remove(sock)
                     continue

 server_socket.close()

0 个答案:

没有答案