2016-05-05 13 views
1

Ich versuche, grundlegende Online-Spiel zu schreiben, nur um mein aktuelles Niveau in Web-Programmierung zu überprüfen. Hier ist ein Code Ich habe jetzt:TypeError: socket.emit ist keine Funktion

var io = require('socket.io') (serv, {}); 
io.sockets.on('connection', function(socket) { 
    console.log('1 '+socket); 
    function fight (player,monster) { 
     console.log('2 '+socket); 
     monsterData = {}; 
     monsterData.name = monster; 
     switch(monster){ 
      case 'rat 1st level': 
      monsterData.hp = 50; 
      monsterData.attack = 1; 
      monsterData.money = Math.floor(Math.random()*3)+1; 
      break; 
     } 
     result = attack(player,monsterData); 
     console.log('3 '+socket); 
     if(result.winner === 'player'){ 
      db.account.findOne({'username':player.username},function(err,player){ 
       money = player.money + monsterData.money; 
       db.account.update({'username':player.username},{$set:{'money':money}}); 
       socket.emit('addToChat',{type:'system',message:'You win battle against "'+monster+'"'}) 
      }); 
     } 
    } 
    console.log('4 '+socket); 
    socket.on('click',function(data){ 
     db.account.find({'username':data.username,'socket':data.socket},function(err,res){ 
      if(res.length > 0) { 
       position = 0; 
       //console.log('x - '+data.x+'; y- '+data.y); 
          /* RIGH BAR */ 
       if(data.x>(1024-200) && data.x<1024 && data.y>80) { 
        // if(data.y>50&&data.y<80) 
        // position=1; 
        if(data.y>80&&data.y<110){ 
         monster='rat 1st level'; 
        } 
        if(data.y>110&&data.y<140){ 
         monster='2ndMonster'; 
        } 
        if(data.y>140&&data.y<170){ 
         monster='3rdMonster'; 
        } 
        if(data.y>170&&data.y<210){ 
         monster='4thMonster'; 
        } 
        db.account.findOne({'username':data.username},function(err,res){ 
         db.account.update({'username':res.username},{$set:{'inFight':true,'monster':monster}}); 
         io.sockets.emit('fightStart',{'username':res.username,'monster':monster}); 
         result = fight(res,monster); 
        }); 


          /* /RIGHTBAR */ 
       } 
       //console.log(position); 
      } 
     }); 
    }); 

    socket.on('signIn',function(data){                 
     isValidPassword(data,function(res){              
      if(res){                      
       db.account.find({'username':data.username},function(err,player){       
        player = player[0]; 
        socket.emit('signInResponse',{ 
         success:true, 
         username:player.username, 
         password:player.password, 
         level:player.level, 
         money:player.money, 
         hp:player.hp, 
         maxhp:player.maxhp 
        }); 
       }); 

      } else {                    
       socket.emit('signInResponse',{success:false,reason:'wrong login or password'});   
      } 
     }); 
    }); 
} 

Also, im Grunde kann ich Buchse variabel in socket.on('signin') bekommen, aber wenn ich versuche, es in Funktion Kampf zu bekommen oder socket.on('click'), es gibt mir, dass Socket-Fehler ist nicht definiert, oder gib mir einen Fehler weil Socket nur socket.id Client ist, mit dem ich keine Daten ausgeben kann.

Was ich brauche

einige, wie variable Buchse zugänglich in Kampf Funktion erhalten Fähigkeit zu haben, Daten zu bestimmten Spieler zu emittieren.

+0

Sie verwendet 'io.sockets.emit' statt' socket.emit' in der onClick-Handler. –

+0

Ja, aber wenn ich es hier nicht benutze, werde ich nicht in der Lage sein, socket.emit, weil Socket socket.id des Clients ist. Ich sende dieses Paket an alle Benutzer nur für den Moment, aber muss es an bestimmte senden, gleich mit socket.emit ('addToChat') in Kampf-Funktion – dgleming

+0

(Off topic) Sie sollten besser Benutzernamen mit Socket-Objekt, dass Client-Daten. In login: 'socket.clientData = {Benutzername: player.username}', und Sie können es wie folgt verwenden: 'db.account.find ({'Benutzername': socket.clientData.username}'. –

Antwort

0

Sie sollten io direkt verwenden:

io.on('connection', function(socket){ 
    socket.on('xxx', function(obj){ 
     io.emit('xxx', {xxx: xxx}) 
    }) 
})