2014年5月16日星期五

创业三年来的一些感想 - 创业篇1 - CoderZh

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
创业三年来的一些感想 - 创业篇1 - CoderZh  阅读原文»

游戏篇

见:创业三年来的一些感想 - 游戏篇

创业篇

公司初创人员有10几个, 大都来自金山内部。我经历了公司从无到有的整个过程,从申请营业执照,到选取办公地点、办公设备,申请域名,搭建Git,RTX,Wiki,项目管理平台Redmine,持续构建CCNet…… 这些都是一个公司必要的支持。而对于我来说,还是蛮新鲜的,能接触到一些平时不容易接触到的东西,初创人员也是激情四溢,各擅所长,感觉平时听他们聊天都能学习到不少的知识。

即使我平时游戏玩的够多,自认为也算是个中高端游戏玩家。但做为一个刚刚涉入游戏开发领域的新人,心中还是有一些胆怯的,所以我更多的是去听他们的想法,然后在心里理解分析。

关于游戏定位的讨论一开始就进行了。我们认真去玩并且分析了当时市面上刚出的几款端游。比如《征途2》、《凡人修仙传》等。最终,我们给出了我们游戏的定位:面向低端玩家的电脑配置要求低、易上手操作简单的道具收费玄幻题材的3DMMORPG。好吧,前面这句话是我自己总结的,大致是符合当时的想法的。我对于游戏定位的思考,一直贯穿着整个创业过程。但是在当时,身边都是比我有游戏经验的同事,我其实是没有太多的想法的。我的想法就是,信任他们。

为了实现游戏的配置低的目标,我们想出一个办法。就是给所有人的电脑配置都比较低,价格控制在3000块左右。一旦一个不合理的算法出现,或者不合理的美术资源添加,将直接影响到我们自己的游戏体验,从而督促着我们去修改。当时的我配置甚至是一台联想笔记本,在上面开发着3D游戏。

关于这种做法,当时我是纠结的。它的好处是明显的,开发环境和玩家环境一致,可以时刻督促我们的游戏在配置上不至于跑偏。当然,也有另外一个好处就是帮老板省钱。它的坏处也是明显的,严重影响了我们的开发效率。实际上,这条规则并没有一直贯穿执行下去,老同事用着慢如蜗牛的机器,用幻灯片的方式艰难的玩着LOL。新来的同事的配置调到最高却依然满帧。就在前几天,我们给所有程序的电脑升级到8G的内存,并且配置240G的SSD(固态硬盘),我使用了3年的老旧电脑也被替换了下来。用这种极端的方式控制游戏的性能,我也不能完全说是对是错,至少这是我们走过的路。

开始阶段,我负责整个游戏的UI脚本和表现逻辑部分。这在西山居可是两个组干的活,而且我还是个新手,需要不断的在摸索中学习。很快,我就已经上手。UI需要直接和游戏逻辑交互,表现逻辑需要直接和3D引擎交互,很快,我又担当起了游戏逻辑组的重担,并且在3D引擎组打了一手酱油。如今,我已经成为了程序组内的Full Stack,对整体开发环节最了解的一个。

写这篇文章,并不是从程序角度对写过的代码和模块进行总结。而是通过回忆一路走过的创业历程,让自己重新去思考,公司和人员是如何变化的,游戏产品是如何演变的,当然最重要的,是自己的心态和思维方式是如何改变的。

(写的有些慢,作为三年的创业总结,希望不要写到第四年,呵呵。未完待续……)


本文链接:创业三年来的一些感想 - 创业篇1,转载请注明。

关于GridView自定义绑定过程的行状态e.Row.RowState一点解析 - 月皇  阅读原文»

GridView相信这个控件大家已经家喻户晓,而且用的也非常多了,本文针对GridView的行状态进行一点浅析,高手请留步,就此打住!

现在我们看个例子,现在要使用gridview输出一张订单表,订单有个状态字段取值为:0(未完成交易)1(已完成交易),现在重点是,我们绑定数据到gridview,显然绑定输出时候只能输出0和1,那么怎么实现将0输出为未完成交易,而1输出为已完成交易呢。这里我们就需要用到gridview为我们准备的数据行绑定事件了,如下图所示,我们订阅该事件,在gridview属性的闪电图标下面的选项中:

该事件是什么作用呢:打个比方整个输出表格的过程类似一群人去坐一个位置,位置1坐领导,位置2坐学生,现在我们要做的是,要位置2的学生,坐上三好学生,girdview绑定后,现在坐的就是学生,而该事件就是发生在这个学生坐上这个位置之后,因此,我们在这个事件响应函数里面做的就是将三号学生取代掉该学生!

然后在订阅该事件后的响应函数中输入以下代码:

/// <summary>
/// 3.修改状态显示为:已完成-1/未完成-0
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)//绑定数据行
{
if (e.Row.RowState == DataControlRowState.Normal||e.Row.RowState==DataControlRowState.Alternate)//正常状态,I don't set other state,so it is not neccessary.
{
Label label1
= new Label();
label1.Text
+= e.Row.Cells[8].Text;
Page.Controls.Add(label1);
if (e.Row.Cells[8].Text =="0")//说明有未完成的订单,按钮可使用
{
e.Row.Cells[
8].Text = "未完成";
has_nopay
= true;
}
else
{
e.Row.Cells[
8].Text = "已完成";
}


}
}
}

这段代码出现在gridview的行绑定事件中,首先我截取数据,如果该单元格显示的是0,那么我将其修改为未完成,反之 ,则修改为完成。

相信这段代码很多人见怪不怪了,但是那上面的几个判断条件是什么意思呢?现在我就一一分析。

一. 变量e

这是在建造行对象时产生的事件描述数据,它里面包含正在建造的当前行对象的信息,通过它我们可以取得正在建造的行对象和行对象中的单元格对象,并可以取得或设置这些对象相应的属性,这个变量的重要程度,直接决定了gridview在自定义操作中的霸主地位。

二、e.Row.RowType属性

它描述的是正在建造的行对象的类型(页眉、页脚、数据行、分页行、分隔符)

取值为:DataControlRowType枚举类型

(1)DataRow:数据行,也就是我们判断经常使用到,他表示我们操作的对象只是绑定的数据部分,而不是页脚、页眉之类的部分

(2)EmptyDataRow:空数据行,也就是当前表示的是数据记录为空的行,这个必须在我们设置了空模板时候有效

(3)Footer:当前行是脚注行

(4)Hearder:当前行是标题行

(5)Separator:当前行是分隔符

(6)Pager:当前行是分页行

  有了这些,我们就可以判断当前行是什么了,然后就可以执行响应的操作,比如上面这个例子,我就先判断是不是数据行,从而进行下一步的操作!

if (e.Row.RowType == DataControlRowType.DataRow)//绑定数据行

下一步的问题来了,我们怎么去判断数据行是处于什么状态呢(有点基础的同学应该知道,数据行可能会处于多种状态,比如编辑状态、选中状态、正常态等),这时候我需要的是正常状态下的所有数据行,怎么判断呢?见三.

三、e.Row.RowState属性

  它表示正在建造的行对象的状态(普通状态、交替状态、编辑状态、选中状态等)

(1)Alternate:交替态行

(2)Normal:正常态行

(3)Edit:编辑态行

(4)Insert:插入态行

(5)Selected:选中态。
它代表我们的操作只对数据行起作用,不对页眉和页脚起作用(因为页眉页脚的文本中并不包含我们需要的数据)。并且仅当数据行处理普通状态和交替状态时起作用,在编辑和选中状态不是不起作用的(编辑状态下,数据不是显示在单元格的Text中,而是显示在单元格的控件中的)。因此,对于如何取得表中相应位置处的值,判断数据行的状态十分重要,现在我们的例子只是修改绑定数据行的某个单元格的值,所以只需判断当前行的状态为Normal或者Alternate即可,记住,不要少任何一项,少了会遗漏行数据,我之前不写Alternate这一状态,那么就无法取得第二条记录的数据,如下图,此时的第二行数据无法扑捉,原因是该行数据在判断行状态的时候被跳转了:

没有评论:

发表评论