当前位置: 首页 > 新闻 > 网页游戏开发入门教程2

网页游戏开发入门教程2

来源:汇众教育 编辑:小汇 2021-07-27 211

摘要:一个webgame的基本内容需要些什么呢?数据库:玩家、地图、城市、建筑、武器、士兵。功能:登陆、升级、个人战斗、士兵之间的战斗、与城市的战斗、修建建筑、打造武器、买卖道具。(注意:每一个功能,必然对应1个或多个数据表。上面数据库中所列的只是基础中的基础。)首先是地图、城市、建筑。这里认为,地图可以有多张,城市在地图上,建筑在城市内。地图表Map :Map_ID ,X坐标, Y坐标,City_ID(城市ID),描述。其中Map_ID是指地图的id。不是自动编号。一张地图就是一个Map_ID,可以重复。

    单纯的讨论数据流程是件痛苦的事情。
    讨论程序而不给代码也是比较痛苦。
    这里用的是php+mysql的。同时,这个例子没有用到类。如果时间充足的话,今年年底,我会提供一个带即时交互的简单webgame代码和核心类来说明使用了设计模式的好处。

     那就按一个超简单的webgame的方式来讨论。配上适当的代码。应该有所帮助。不足的地方也请大家指出,对我个人也是帮助。

     我们不去考虑游戏的可玩性,数值平衡等等问题。我们先只考虑一个简单例子的实现。

     那么一个webgame的基本内容需要些什么呢?

     数据库:玩家、地图、城市、建筑、武器、士兵。

    功能:登陆、升级、个人战斗、士兵之间的战斗、与城市的战斗、修建建筑、打造武器、买卖道具。(注意:每一个功能,必然对应1个或多个数据表。上面数据库中所列的只是基础中的基础。)


    首先是地图、城市、建筑。
    这里认为,地图可以有多张,城市在地图上,建筑在城市内。


    地图表
    Map  :Map_ID ,X坐标, Y坐标,City_ID(城市ID),描述。
    其中Map_ID是指地图的id。不是自动编号。一张地图就是一个Map_ID,可以重复。

    城市表
    City:City_ID,城市名字,城市所有人,城市等级,城市资源,描述。

   建筑表
   Build:ID,City_ID,建筑名称,建筑等级,建筑功能。

   其中,地图表确定城市的位置,城市表确定城市的相关数据以及所有人,建筑表内的多条信息属于某一个城市。

   建表后,显示出来。
   一个for循环。把地图表整个取出来就ok。
   跟普通网站的新闻列表没太大区别。不同的是,你需要取得X坐标和Y坐标定位。可以用tabel也可以用div。


class Map//地图类
{
var $Map_ID;
function Map_bg_css($Map_ID) {

  $this->Map_ID = $Map_ID;


  mysql_select_db($db_name,$link);
  $sql="select * from map where Map_ID='".$this->Map_ID."' limit 1";   
  $result=mysql_query($sql,$link);   
  echo "<style type="."text"."/"."css>";
  $rs=mysql_fetch_array($result);  


   echo "#map{";
   echo "position:absolute;";
   echo "width:".$rs[X坐标]."px;";
   echo "height:".$rs[Y坐标]."px;";
   echo "z-index:0;";
   echo "left:0px;top:0px;}";


  }


function Map_bg($Map_ID){

  $this->Map_ID = $Map_ID;


  $sql="select * from map where Map_ID='".$this->Map_ID."'";     
  $result=mysql_query($sql,$link);
  while($rs=mysql_fetch_array($result))  
  {
   echo "<div id=Layer_bg_".$rs[X坐标]."_".$rs[Y坐标].">";
   echo "<img src=".$rs[Map_bg]." border=0 title=".$rs[ID]."></div>";


  }


}
}

    上面是一个很简单的地图类。代码可能不太正确,意思是正确的。就是根据map表中的坐标,生成了一组div层,以及这一组层的css。你可以改为table的。你可以也把坐标放到一个字段里,用数组的形式取。

使用的时候,用

new map;
map(N);

其中N是map表里的地图Map_ID.

城市内的建筑也类似。如果要显示出来的话。

    关于地图,现在我采用的方式更为简单。通过坐标来判断需要哪些图,然后直接显示出来。当然没有碰撞什么的,因为暂时不需要。至于人物走动什么的,不在本文讨论范围。

有了地图和城市后。

涉及到的问题就是城市里资源的产生。

这时候,City表里需要有可供判断的时间和数量的字段。
比如:产生资金量Money,产生资金花费的时间Action_Time,上次产生资金时间Money_time。

这两个字段的数值应该在City_base表里出现。(即城市基础表,不同等级,不同类型城市的对应数值。这是给策划填数据用的,建好表后就等策划去头痛吧。如果你身兼数职。。。)

如何自动产生资源呢?

我们可以在城市所有人改变的时候,写入一个时间。或者在城市初始化的时候写入一个时间。

$Now_Time=date('Y-m-d H:i:s');

(说明:$开头是变量的意思。php里特有的。如果是asp的话可以写成。Now_Time=Now() )

把$Now_Time写入到Money_time里。

update("UPDATE City SET  Money_time='$Now_Time  WHERE  City_ID='$City_ID' LIMIT 1;");

$City_ID是你自己定义的。指某一个城市。如:$City_ID=1;

我们假定当前城市产生资金量为100。即$Money=100;(具体的数值,应该是由City_base表里取出的。)

假设间隔时间为$Action_Time,我们再假定是每小时执行一次。即$Action_Time=3600;(具体的数值,是根据你的初始化表里取得的。也可以根据城市等级或者用户等级取得。反正随便你自己怎么设定。)

这时候,有基础时间了。有基础资金产量了。有间隔时间了。

让它循环执行起来就行了。

    上面说过,服务端用C语言定时器。客户端用javascript。

    服务端,资源定时器设定为5分钟执行一次。那么我们的误差就是5分钟。对网页游戏来说,可以接受。(战斗的定时器得1分钟吧。当然服务器够牛的话,几秒钟都可以。)

    当然,可以完全php写,然后配置php的corn。现在我在做的程序就是直接用php写了。包括任意长时间的定时器类,专门控制抽象事件用的。C的定时器暂时没用。

每次执行什么代码呢?

首先得新建一个定时器任务的表。目的就是让定时器知道需要执行哪些程序和数据的更新。表内容比如:城市资源更新。当然,这个表可要可不要。建立的好处是方便处理类似保护状态不产生资源之类的问题。

服务端程序:

获得当前服务器时间。

获得当前需要更新城市。

判断服务器时间与$Money_time的时间差。(时间戳,具体的时间戳网上资料满多的。)

判断时间差是否大于$Action_Time。
   大于,则更新资源。同时更新$Money_time。
  小于,则无操作。


    客户端程序:

    获得当前服务器时间。

    获得当前城市的$Money,$Money_time,$Action_Time。

    使用javascript显示剩余时间的倒计时,以及增加的资源量。


    客户端特殊情况触发:
    因为客户端显示的资源情况是伪同步,所以当客户端使用该资源的时候。需要服务端将当前的实际资源更新,属于定时器处理的时间也需要更新。
    即,当客户端触发涉及资源的情况时,立即更新当前资源。同时更新定时器中会用到的$Money_time。这样才不会造成,看的资源用不到,或者定时器重复产生资源。


    总体来说。这部分程序都很简单。难点在C语言定时器的制作,以及前台javascipt倒计时的写法上。

    C语言定时器,找个C语言程序员,超简单;前台的javascipt,网上有很多倒计时的代码,找个来改改就能用。


<SCRIPT LANGUAGE="JavaScript">
var maxtime = 这里是你的时间差///一个小时,按秒计算,自己调整!
function CountDown(){
if(maxtime>=0){
minutes = Math.floor(maxtime/60);
seconds = Math.floor(maxtime%60);
msg = "你的文字说明"+minutes+"分"+seconds+"秒";//动态显示剩余时间。
document.all["timer"].innerHTML=msg;
//if(maxtime == 3) document.all["timer"].innerHTML='只剩3秒!';
--maxtime;
}
else{
clearInterval(timer);
document.all["timer"].innerHTML='时间到';
}
}
timer = setInterval("CountDown()",1000);
</SCRIPT>

<div id=timer></div>

这个是网上找的代码。稍微修改就可以用的。这里只是显示了倒计时。也可以改为显示资源的增加情况。

C语言里操作mysql数据库。

// TODO: Add your control notification handler code here
bool bRes = m_dbConn.Connect("数据库ip地址", 3306 , "用户名", "密码", "数据库名");
    if(!bRes)
{
  AfxMessageBox("connect fail");
  return;
}

string strSql = "select * from city limit 1";//所有显示或取值类的都用这段。中间的sql语句可以自己构造。
ResultSet* rs = m_dbConn.ExecuteQuery(strSql);
while(rs->Next())
{
  string str = rs->GetString("username");
  AfxMessageBox(str.c_str());
}

m_dbConn.Close();

定时器的主函数。
void CBeiLiDlg::Go()
{
while(true)
{
// AfxMessageBox("go");


  Sleep(5*1000);//毫秒。定时器刷新时间。
}
}


当然。这里的C的代码不能直接用。只是一部分。

    新的方法是,通过php定时器类负责前台、时间到后,调用ajax执行完成。后台通过定时执行php定时器类的专用处理函数,处理前台掉线,前台未正常执行等情况。
    如果我们的新游戏今年年底能正常上线的话。我可以公开这个类,没技术含量,但是很巧妙。

    汇众教育北京公主坟(游戏)校区,地处长安街沿线,周边有海淀高新技术产业园及石景山文化创意产业园。校区自2004年成立起来,被誉为游戏学院示范校区,创建精英型、学习型团队为不断追求目标,以教师和学生的发展为立足之本,07年评为全国十佳校区、08年评为体系内A级校区.

    汇众教育北京公主坟(游戏)校区周边聚集了北京工商大学,北京师范大学,北方工业大学、北京外国语学院等十几所全国知名重点院校,及北京西单图书大厦、北京军事博物馆,北京电视台,八一电影制片场,学习气氛浓郁、并且公主坟校区优越的地理条件引来众多游戏企业参观考察并与多家游戏企业进行项目合作及外包,使学员在此掌握最新游戏行业的动态,提前置身于工作环境中。

 

【点击咨询】 ↓↓↓   

                

                                    点击这里给我发消息 点击这里给我发消息 点击这里给我发消息点击这里给我发消息点击这里给我发消息


课程体系


学员作品


师资力量


校区简介


合作单位


交通指南

游戏学院首页

上一篇 :无
下一篇 :无

相关文章

关注我们

  • 官方微信

    咨询热线

    010-82826482 校区地址
  • 官方微博

    建议与投诉

    400-0065-789 联系我们
  • 线上直播平台