`

flex游戏多人为实现

    博客分类:
  • game
阅读更多
借用了一下blazeds 广播信息produce consumer ,大致意思就是,服务器广播给每个客户端一个名字,和目标坐标

具体的人物移动,由客户端来完成,不必要每移动一点就广播一次,有点乱

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="" xmlns:local="*">

	<mx:RemoteObject id="saveuser" destination="Allroles" endpoint="http://192.168.200.14:8400/roleOnWeb/messagebroker/amf">

		

	</mx:RemoteObject>

	<mx:RemoteObject id="updateRole" destination="Allroles"  endpoint="http://192.168.200.14:8400/roleOnWeb/messagebroker/amf">

		

	</mx:RemoteObject>

	<mx:Script>

		<![CDATA[

			import mx.controls.Alert;

			import simple.MyEvent;

			import mx.events.ChildExistenceChangedEvent;

			import mx.collections.ArrayCollection;

			import entity.Role;

			import mx.rpc.events.ResultEvent;

			import simple.People;

			import mx.managers.PopUpManager;

			import mx.controls.Alert;

			import simple.UtilPeopleRole;

			

			

			public var firstName:String;

			

			private var people:People;

			

			[Bindable]

			public var allRole:ArrayCollection=new ArrayCollection();

			

			public var allPeople:ArrayCollection=new ArrayCollection();

			

			

			/**

			 * 初始化,初始化producer,consumer

			 * 

			 * **/

			public function initApp(){

				trace("initApp");

				initChannel(producer,consumer);

				initChannel(sendPoint,recivePoint);

				consumer.subscribe();

				recivePoint.subscribe();

				initPeople();

				init.enabled=false;

				

			}

			/**

			 * 初始化people

			 * **/

			public function initPeople():void{

				var fx:Number=parseInt(dx.text)

				var fy:Number=parseInt(dy.text);

				var people=UtilPeopleRole.getPeople(fx,fy,fname.text);

				//让服务器保存这个people;

				saveRole(people);

				trace("peple.name"+people.name)

			}

			

			/**

			 * 让server保存这个People

			 * **/

			public function saveRole(p:People):void{

				//添加一个事件监听,添加本role,并把当前添加后返回的array得到遍历他,

				//初始化其他角色

				saveuser.addEventListener(ResultEvent.RESULT,resultArr);

				

				//通过people相应的数据获得一个role对象

				var role:Role=UtilPeopleRole.peopleToRole(p);

				

				firstName=p.name;

				

//				mx.controls.Alert(role.name+"pname:"+p.name);

				//服务器添加这个Role,并返回添加后的数组;

				saveuser.addRole(role);

				/**向所有人广播,谁进来了**/

				sendMessage(role);

			}

			/**

			 * 从服务器得到数据,然后显示所有在线人

			 * 

			 * **/

			public function resultArr(e:ResultEvent):void{

				

				if(e.result is ArrayCollection){

					allRole=e.result as ArrayCollection

					for each(var role:Role in allRole){

						addPeople(role);//向本数组中添加people

						trace(role.name);

					}

				}

			}

			/**

			 * 为本应用添加其他人,向本应用添加所有 服务器返回的Role

			 * **/

			public function addPeople(role:Role):void{

				//通过role信息返回people信息;

				var people:People=UtilPeopleRole.RoleToPeople(role.x,role.y,role.name);

				

				trace("role.name:+"+role.name+"p:"+people.name+"f:"+firstName);

				if(people.name==firstName){

					Application.application.addEventListener(MouseEvent.CLICK,people.moves);

				}

				//添加People本程序添加

				addChild(people);

				//数组中添加

				allPeople.addItem(people);

				//其他人移动时添加一个事件,

				people.addEventListener(MyEvent.MOVING,otherMove);

			}

			

		]]>

	</mx:Script>

	<mx:Producer id="sendPoint" destination="move">

		

	</mx:Producer>

	

	<mx:Consumer id="recivePoint" destination="move" message="getPointMessageHandle(event)">

		

	</mx:Consumer>

	<mx:Script>

		<![CDATA[

			import mx.messaging.MessageAgent;

			public function otherMove(e:MyEvent):void{

				trace("buhuoshijian");

				

				//这是角色走动时的消息驱动

//				initChannel(sendPoint,recivePoint);

				

				

//				if(e.target is People){

					var p:People=e.target as People;

					//通知所有客户端

					sendPointMessage(p,e);

					

//				}

				sendPoint.addEventListener(MessageFaultEvent.FAULT,messageFault);

				recivePoint.addEventListener(MessageFaultEvent.FAULT,messageFault);

			}

			

			public function sendPointMessage(p:People,e:MyEvent):void{

				var message:AsyncMessage=new AsyncMessage();

				message.body=new Object();

				message.body.name=p.name;

				message.body.x=e.x;

				message.body.y=e.y;

				sendPoint.send(message);

			}

			public function getPointMessageHandle(event:MessageEvent):void{

				trace("message");

//				throw new Error;

//				Alert.show("时间触发并且接受");

				//开始移动判断是否有name相同的数据,有就开始移动

				if(event.message.body.name!=firstName){

					Supporting(event);

				}

				

			}

			public function messageFault(e:MessageFaultEvent):void{

				trace(e.message);

			}

			//通过接受到的消息,其他角色开始移动,

			public function Supporting(event:MessageEvent):void{

				try{

				var p:People=getPeopleAsName(event.message.body.name);

				

//				throw new Error;

//				p.addEventListener(MyEvent.STOP,stopMoveAndUpdate);

				//People类没改,这相当于传参数,不是事件

				var me:MyEvent=new MyEvent(MyEvent.MOVING);

				me.x=event.message.body.x;

				me.y=event.message.body.y;

				if(p!=null){

					p.other(me);

					

					var role:Role=new Role();

					role.x=me.x;

					role.y=me.y;

					role.name=p.name;

					

//					updateRole.updateRole(role,p.name);

					//报服务器端的数据更新

					

					p.addEventListener(MyEvent.STOP,stopMoveAndUpdate);

					

				}

				}catch(e:Error){

					trace(e.message);

				}

			}

			//跟新服务器端的Role的信息

			

			public function stopMoveAndUpdate(e:MyEvent){

				trace("stop");

				

			}

			public function getPeopleAsName(name:String):People{

				var p:People=getChildByName(name) as People;

				return p;

			}

			

		]]>

	</mx:Script>

	

	<mx:Text x="240" y="20" text="当前在线" width="57"/>

	<mx:Text x="292" y="20" width="43" id="roleCount" text="{allRole.length}"/>

	<mx:TextInput x="40" y="626" width="34" id="dx" text="x坐标"/>

	<mx:TextInput x="96" y="626" width="39" id="dy" text="y坐标"/>

	<mx:Button x="143" y="626" label="initApp" click="initApp()" id="init"/>

	

	<mx:Script>

		<![CDATA[

			import mx.messaging.channels.StreamingAMFChannel;

			import mx.messaging.events.MessageAckEvent;

			import mx.messaging.events.ChannelFaultEvent;

			import mx.messaging.events.ChannelEvent;

			import mx.messaging.ChannelSet;

			import mx.messaging.channels.AMFChannel;

			import mx.messaging.channels.StreamingAMFChannel;

			import mx.messaging.events.MessageFaultEvent;

			

			import mx.messaging.messages.AsyncMessage;

			import mx.messaging.events.MessageEvent;

			public function initChannel(producer:Producer,consumer:Consumer){

				var myStreamingAMF:StreamingAMFChannel = new StreamingAMFChannel("my-streaming-amf", "messagebroker/streamingamf");

				var myPollingAMF:AMFChannel = new AMFChannel("my-polling-amf", "messagebroker/amfpolling");

				myPollingAMF.pollingEnabled = true;

				myPollingAMF.pollingInterval = 2000;

				var channelSet:ChannelSet = new ChannelSet();

				channelSet.addChannel(myStreamingAMF);

				channelSet.addChannel(myPollingAMF);

				consumer.channelSet = channelSet;				

				producer.channelSet = channelSet;

				producer.addEventListener(MessageFaultEvent.FAULT,sendError);

				consumer.addEventListener(MessageFaultEvent.FAULT,sendError);

				

			}

			/**

			 * 

			 * 

			 * **接受的信息是某个人进来的所发的信息;

			*/

			public function messagehandle(event:MessageEvent):void{

//				ta.text+=event.message.body+"\n";

				//发布一个通知,谁进来了

				come.text=event.message.body.msg+"";

				

				//把他添加到本数组allPeople中;

				addRoleToArray(event);

				

				

//				selectAllRole();//第一次登录的时候,后边人登录第一次登录的人看不到其他人,所以得查一次server

			}

			/**

			 * 添加角色到allRole数组

			 * 

			 * **/

			public function addRoleToArray(event:MessageEvent){

				var role:Role=new Role();

				role.x=event.message.body.x;

				role.y=event.message.body.y;

				role.name=event.message.body.name;

				

				//提交给服务器,

				//因为上边savePeople已经添加了,所以这就不用添加

//				getAll.addRole(role);

				//添加到本应用程序,

				//如果名字相同,是本程序的,所以不必要添加

				if(role.name!=firstName){

					addChildRole(role);

				}

			}

			

			

			/**向所有人广播,谁进来了。并且把这个角色的信息,发给所有客户端,客户端添加这个角色

			 * 并且还要发给服务器保存起来 

			 * **/

			public function sendMessage(role:Role):void{

				

				var message:AsyncMessage=new AsyncMessage();

//				message.body=name+"进入房间";

				message.body=new Object();

				message.body.msg=role.name+"进入房间";

				

				message.body.name=role.name;

				message.body.x=role.x;

				message.body.y=role.y;

				

				producer.send(message);

				

				trace("send");

				

			}

			public function sendError(e:MessageFaultEvent){

				trace(e.message);

			}

			

			public function resultArray(e:ResultEvent):void{

				

			}

			

			

		]]>

	</mx:Script>

	<mx:Producer id="producer" destination="chat">

		

	</mx:Producer>

	

	<mx:Consumer id="consumer" destination="chat" message="messagehandle(event)">

		

	</mx:Consumer>

	

	<mx:Text x="146" y="66" width="403" id="come" height="45" fontFamily="Arial" color="#F42E19" fontSize="19" text=""/><!--发送信息给每个client谁进来了-->

	<mx:TextInput x="218" y="626" width="79" id="fname" text="非中文名"/>

	

	<mx:Script>

		<![CDATA[

			

			public function addChildRole(role:Role):void{

				var peo:People=UtilPeopleRole.RoleToPeople1(role);

				if(peo.name!=firstName){

					addChild(peo);//添加到本数组

					allRole.addItem(role);//role也添加到本数组

					allPeople.addItem(peo);//peo也添加到本书组

					peo.addEventListener(MyEvent.MOVING,otherMove);

				}

			}

		]]>

	</mx:Script>

	<local:Producer_Consumer height="341" width="483" x="835" y="307">

	</local:Producer_Consumer>

</mx:Application>

 

 

3
1
分享到:
评论

相关推荐

    使用FLEX3开发大型多人在线游戏

    ### 使用FLEX3开发大型多人在线游戏 #### MMO游戏概述及发展历程 大型多人在线游戏(Massively Multiplayer Online Games, MMO)自问世以来便以其独特的魅力吸引了众多玩家。这类游戏通过网络将世界各地的玩家聚集...

    flex 游戏人物移动和多人同步简单实例

    在Flex游戏开发中,创建一个游戏人物移动和多人同步的简单实例涉及到多个关键知识点,这里我们将深入探讨这些技术。 首先,让我们关注人物移动的实现。在2D游戏场景中,通常使用精灵(Sprite)类来表示游戏中的角色...

    flex rpg游戏demo(客户端完整)

    7. **网络通信**:虽然这是一个客户端的Demo,但如果游戏是多人在线的,Flex可以使用Socket或HTTPService与服务器进行通信,实现玩家间的交互和数据同步。 8. **资源管理**:游戏中的音频、图片、字体等资源需要被...

    flex 劲爆游戏 flex 劲爆游戏

    8. **网络通信**:如果是多人在线游戏,Flex可以利用AMF或WebSocket等技术实现实时的客户端-服务器通信,同步游戏状态。 9. **声音和视频**:Flex可以嵌入和控制音频和视频,为游戏增添音效和背景音乐,提升游戏...

    flex做的人物移动和多人同步

    标题中的“flex做的人物移动和多人同步”是指在使用Adobe Flex这一开源框架开发游戏或应用时,实现角色在虚拟世界中的移动以及多个用户之间的同步交互。Flex是基于ActionScript和MXML,主要用于构建富互联网应用程序...

    flex游戏 小人地图

    在Flex游戏开发中,"小人地图"通常指的是一个具有角色移动和障碍物躲避功能的游戏场景。Flex是一种基于ActionScript 3.0的开源框架,主要用于构建富互联网应用程序(RIA)。在这个特定的“小人地图”项目中,我们...

    actionscript3 Flex游戏开发之棋牌类游戏 21点游戏 源代码.rar

    在ActionScript3和Flex中实现21点游戏,首先需要理解游戏规则并将其转化为编程逻辑。以下是一些关键的技术点: 1. **数据结构**:为了存储和操作游戏中的牌,我们需要定义一个Card类,包含牌的面值和花色属性。同时...

    flex做的即时通讯游戏源代码

    【标题】"flex做的即时通讯游戏源代码"指的是使用Adobe ...总的来说,这个源代码包是一个宝贵的教育资源,对于想要学习Flex游戏开发的人来说,它提供了实践和学习的平台,有助于提升在即时通讯游戏开发领域的专业技能。

    flex弹球对战游戏

    Flex弹球对战游戏是一种基于Adobe Flex技术开发的多人在线竞技游戏。Flex是Adobe公司推出的一个开源框架,用于构建富互联网应用程序(RIA),它基于ActionScript 3.0和MXML,提供了强大的用户界面组件库,使开发者...

    flex+as3麻将游戏源码

    【描述】提到,这是一个“学习的好资料”,意味着源码包含了完整的开发流程和技术实现,适合想要学习或研究游戏开发、Flex和AS3编程的人员。通过分析和研究源码,开发者能够学习到如何在AS3中定义游戏逻辑,处理用户...

    flex游戏开发

    ### Flex游戏开发:深入解析与实战技巧 在深入探讨Flex游戏开发之前,我们先来了解一下Flex的基本概念。Flex是Adobe Systems推出的一种免费的开源框架,主要用于构建高性能的、跨平台的桌面应用程序和移动应用程序...

    Flex精美空战游戏源码

    Flex精美空战游戏源码是基于Adobe Flex技术开发的一款空中战斗游戏的完整源代码,它包含游戏的所有逻辑、美术资源以及必要的配置文件,使得开发者或游戏爱好者可以直接编译并运行这个游戏。Flex是一种开源的框架,它...

    flex+as3扑克牌类游戏源码1

    SmartFoxServer是一个强大的、可扩展的服务器,支持多种协议如TCP、HTTP、WebSocket等,能为Flex游戏提供稳定的数据传输。在这个扑克牌游戏中,它可能用于实现玩家之间的实时交互,如发牌、出牌通知和其他玩家动作的...

    flex 做的一款射击类游戏

    Flex是一款基于Adobe Flash Platform的开放...对于初学者来说,这是一个宝贵的实践机会,可以从实际项目中学习和理解Flex游戏开发的全过程。而对于经验丰富的开发者,这可能是一个快速了解他人设计思路和技巧的好资源。

    flex flash实现mmorpg包裹DEMO

    在游戏开发中,尤其是在大型多人在线角色扮演游戏(MMORPG)中,背包系统是一个不可或缺的重要组成部分。它允许玩家存储、管理、装备和交易各种游戏内的物品。本篇文章将深入探讨如何利用Adobe Flex和Flash技术,...

    FLEX和Actionscript开发FLASH 游戏

    7. **网络通信**:通过ActionScript的`XMLSocket`、`URLLoader`等类,游戏可以实现与服务器的实时交互,例如上传分数、下载新关卡或实现多人在线对战功能。 8. **数据持久化**:虽然Flash Player内存空间有限,但...

    Flex/Flash实现的地图编辑器源码

    本文将深入探讨一款基于Flex和Flash技术实现的地图编辑器,该编辑器特别适用于构建MMORPG(大型多人在线角色扮演游戏)中的地图。 Flex是Adobe公司推出的一种开源框架,用于构建富互联网应用程序(RIA),其主要...

    flex+as3一款扑克游戏源码,服务端用smartfox

    作为学习材料,它可以为开发者提供深入理解如何在Flex和AS3环境下设计和实现扑克游戏的机会。通过研究源码,开发者可以学习到游戏状态管理、事件处理、图形渲染、动画制作以及与服务器通信等相关知识。 【标签】:...

    flex+as3扑克牌类游戏源码2

    本篇文章将详细探讨一款以“Flex+AS3”编写的扑克牌类游戏源码,服务端采用SmartFoxServer,旨在为开发者提供一个学习和研究的实例。 首先,让我们来了解Flex。Flex是由Adobe公司推出的一种开源框架,主要用于构建...

Global site tag (gtag.js) - Google Analytics