Lee Davies
05-12-2009, 07:41 AM
I'm trying to convert the PixelTank game to OO AS3, and I'm hitting a slight snag with the Chat interface.
Everything will compile, and run - but when I press the "Login" button (after specifying a username), I get this error:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at src::Chat/onJoinRoomEvent()
at com.electrotank.electroserver4.utils::Observable/dispatchEvent()
at com.electrotank.electroserver4.transaction::JoinRo omEventTransaction/execute()
at com.electrotank.electroserver4::ElectroServer/::processMessage()
at com.electrotank.electroserver4::ElectroServer/::processStringData()
at com.electrotank.electroserver4::ElectroServer/onStringData()
at com.electrotank.electroserver4.utils::Observable/notifyListeners()
at com.electrotank.electroserver4.connection::Connect ion/onPreData()
at com.electrotank.electroserver4.connection::Connect ion/::dataHandler()
Here's my code. It's taken from the "AdvancedChat" tutorial, though it's been somewhat rearranged as I've been playing about with it.
I've traced out messages on each line within the "onJoinRoomEvent" method and messages stop getting traced immediately before the reference to the "zoneManager". I then tried tracing out the "zoneManager.getZonebyId(e.getZoneId)" line, but it returned a "null" value; whereas if I trace out "e.getZoneId" by itself it returns '6'.
I've spent the better part of two hours on this and it's driving me nuts! Any help, please?
[code]package src {
import flash.display.MovieClip;
import flash.events.MouseEvent;
import fl.controls.listClasses.CellRenderer;
import fl.controls.listClasses.ListData;
import flash.utils.getQualifiedClassName;
import com.electrotank.electroserver4.ElectroServer;
import com.electrotank.electroserver4.message.request.*;
import com.electrotank.electroserver4.message.event.*;
import com.electrotank.electroserver4.message.response.*;
import com.electrotank.electroserver4.message.MessageType ;
import com.electrotank.electroserver4.entities.RoomVariab le;
import com.electrotank.electroserver4.user.User;
import com.electrotank.electroserver4.zone.ZoneManager;
import com.electrotank.electroserver4.zone.Zone;
import com.electrotank.electroserver4.room.Room;
public class Chat extends MovieClip {
// Constructor
var _es:ElectroServer;
var _mainClass:RTankS;
private var es:ElectroServer;
private var serverInfo:Object;
private var myRoom:Room;
private var myZone:Zone;
private var zoneManager:ZoneManager;
private var isConnected:Boolean;
private var isConnectionRequestSent:Boolean;
private var isLoginRequestSent:Boolean;
private var zoneId:Number;
public function Chat(docuClass:RTankS, server:ElectroServer):void {
_es = server;
_mainClass = docuClass; // I like this. "docuClass". It's funny.
this.x = 50;
this.y = 50;
addEventListeners();
createRoom("Game Room");
}
public function createRoom(roomName:String):void {
trace("in to createRoom()");
var crr:CreateRoomRequest = new CreateRoomRequest();
crr.setRoomName(roomName);
crr.setZoneName("Lobby");
_es.send(crr);
}
public function serverNum(e:GetUserCountResponse):void {
trace("###### In to serverNum");
trace("Number of users connected: " + e.getCount());
c_chatBox.appendText("\n" + "There are " + e.getCount() + " user(s) connected to the server.");
}
private function addEventListeners():void {
addEventListener(MouseEvent.CLICK, onButtonClick);
_es.addEventListener(MessageType.GetUserCountRespo nse, "serverNum", this);
_es.addEventListener(MessageType.PublicMessageEven t, "onPublicMessageEvent", this);
_es.addEventListener(MessageType.UserListUpdateEve nt, "onUserListUpdateEvent", this);
_es.addEventListener(MessageType.JoinRoomEvent, "onJoinRoomEvent", this);
_es.addEventListener(MessageType.ZoneUpdateEvent, "onZoneUpdateEvent", this);
_es.addEventListener(MessageType.PrivateMessageEve
Everything will compile, and run - but when I press the "Login" button (after specifying a username), I get this error:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at src::Chat/onJoinRoomEvent()
at com.electrotank.electroserver4.utils::Observable/dispatchEvent()
at com.electrotank.electroserver4.transaction::JoinRo omEventTransaction/execute()
at com.electrotank.electroserver4::ElectroServer/::processMessage()
at com.electrotank.electroserver4::ElectroServer/::processStringData()
at com.electrotank.electroserver4::ElectroServer/onStringData()
at com.electrotank.electroserver4.utils::Observable/notifyListeners()
at com.electrotank.electroserver4.connection::Connect ion/onPreData()
at com.electrotank.electroserver4.connection::Connect ion/::dataHandler()
Here's my code. It's taken from the "AdvancedChat" tutorial, though it's been somewhat rearranged as I've been playing about with it.
I've traced out messages on each line within the "onJoinRoomEvent" method and messages stop getting traced immediately before the reference to the "zoneManager". I then tried tracing out the "zoneManager.getZonebyId(e.getZoneId)" line, but it returned a "null" value; whereas if I trace out "e.getZoneId" by itself it returns '6'.
I've spent the better part of two hours on this and it's driving me nuts! Any help, please?
[code]package src {
import flash.display.MovieClip;
import flash.events.MouseEvent;
import fl.controls.listClasses.CellRenderer;
import fl.controls.listClasses.ListData;
import flash.utils.getQualifiedClassName;
import com.electrotank.electroserver4.ElectroServer;
import com.electrotank.electroserver4.message.request.*;
import com.electrotank.electroserver4.message.event.*;
import com.electrotank.electroserver4.message.response.*;
import com.electrotank.electroserver4.message.MessageType ;
import com.electrotank.electroserver4.entities.RoomVariab le;
import com.electrotank.electroserver4.user.User;
import com.electrotank.electroserver4.zone.ZoneManager;
import com.electrotank.electroserver4.zone.Zone;
import com.electrotank.electroserver4.room.Room;
public class Chat extends MovieClip {
// Constructor
var _es:ElectroServer;
var _mainClass:RTankS;
private var es:ElectroServer;
private var serverInfo:Object;
private var myRoom:Room;
private var myZone:Zone;
private var zoneManager:ZoneManager;
private var isConnected:Boolean;
private var isConnectionRequestSent:Boolean;
private var isLoginRequestSent:Boolean;
private var zoneId:Number;
public function Chat(docuClass:RTankS, server:ElectroServer):void {
_es = server;
_mainClass = docuClass; // I like this. "docuClass". It's funny.
this.x = 50;
this.y = 50;
addEventListeners();
createRoom("Game Room");
}
public function createRoom(roomName:String):void {
trace("in to createRoom()");
var crr:CreateRoomRequest = new CreateRoomRequest();
crr.setRoomName(roomName);
crr.setZoneName("Lobby");
_es.send(crr);
}
public function serverNum(e:GetUserCountResponse):void {
trace("###### In to serverNum");
trace("Number of users connected: " + e.getCount());
c_chatBox.appendText("\n" + "There are " + e.getCount() + " user(s) connected to the server.");
}
private function addEventListeners():void {
addEventListener(MouseEvent.CLICK, onButtonClick);
_es.addEventListener(MessageType.GetUserCountRespo nse, "serverNum", this);
_es.addEventListener(MessageType.PublicMessageEven t, "onPublicMessageEvent", this);
_es.addEventListener(MessageType.UserListUpdateEve nt, "onUserListUpdateEvent", this);
_es.addEventListener(MessageType.JoinRoomEvent, "onJoinRoomEvent", this);
_es.addEventListener(MessageType.ZoneUpdateEvent, "onZoneUpdateEvent", this);
_es.addEventListener(MessageType.PrivateMessageEve