• 关于

    ext 调用js

    的搜索结果

回答

下载的压缩包examples\shared\examples.js里面有,不过是从页头中间弹出的消息框,自己导入这个js后调用examples\message-box里面的示例回调调用的就是examples.js里面Ext.example.msg,会自动隐藏,多个窗口弹出会自动重新定位Ext.example.msg('Button Click', 'You clicked the {0} button', btn);
蛮大人123 2019-12-02 02:15:46 0 浏览量 回答数 0

回答

<imgalt=""src="http://static.oschina.net/uploads/space/2013/1224/175327_TIsB_194048.jpg"/>你只导入这几个文件试试(ext-all.gzjs这个不是,不用管这个),一般来说页面来说只需导入ext-all.js与css就好了,(中文的话需要导入ext-lang-zh_CN.js); 这个不是你引入文件的不对,或者文件没引入,看控制台的的信息,是你取得的一个object没有addCls方法,你可以调试看看,在你调用addCls的地方,看看是不是应该object里面的东西或者ojbect上一级的东西才能调用addCls。如果是文件没引入的话,一般报错都是Ext.xxxxx.xxx.xxx没找到什么的
爱吃鱼的程序员 2020-06-22 13:44:58 0 浏览量 回答数 0

问题

JS的combobox加载清单时获取文本值并作为参数执行查询

//注册的ComboBox //想在此处取出界面上文本框的值,作为action中方法的参数,如何处理 var StrNUMPSColumn = new Ext.form.ComboBox({ id : 'combo_num_...
小旋风柴进 2019-12-01 20:27:57 1446 浏览量 回答数 0

问题

js中onchange事件不能调用函数

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.d...
小旋风柴进 2019-12-01 20:28:49 2039 浏览量 回答数 1

回答

原始mygrid中的定义是:bbar:Ext.create 错误应该是在这儿了,如果用json格式定义一个类的时候,类的属性不能用Ext.create 再简单点儿说,类的属性不是一个对象,否则就会产生引用冲突;只能是string,int等基本类型.如果用json格式定义一个类,对象会在"类"产生前被创建,相当于成了一个静态成员,所有这个类的对象都调用这一个对象.先把所有属性的什都赋成null吧,然后在initComponet中给每个性创建对象,这样就没问题了.这个只要了解了js的原理[对象的引用]和ext的执行顺序[先生成json对象,后生成"类"]就很容易理解了.<imgsrc="http://www.oschina.net/js/ke/plugins/emoticons/images/0.gif"alt=""/>######我想说,这种写法是没有问题的。######感谢你的留言,不过在json格式中使用是可以使用Ext.create来进行的###### 没看懂你在说什么,能说清楚点么。 你执行哪段代码出的错。 你的gridpanel是否动态创建。把情况描述清楚,不然怎么帮你分析呀?######<divclass="ref"> 引用来自“我是潮汐”的答案<divclass="ref_body"> 没看懂你在说什么,能说清楚点么。 你执行哪段代码出的错。 你的gridpanel是否动态创建。把情况描述清楚,不然怎么帮你分析呀?<divclass="a_body"> 代码没有报错,而是渲染出错,所有的东西跑到左上角 代码大致是这样的<preclass="brush:js;toolbar:true;auto-links:false;">Ext.create('Ext.Viewport',{//Ext.create('Ext.form.Panel',{layout:'border',items:[{region:'north',.....},{region:'west',.....},{region:'center',region:'center',xtype:'tabfiles',//这个是一个tabpanellayout:'fit',items:[Ext.create('QXAPP.view.file.Lists',{initfilegroup:0,title:'文档列表',id:'defaultflist'}),Ext.create('QXAPP.view.file.Lists',{initfilegroup:0,title:'文件其他列表',id:'defa32ultflist'})]},{region:'south',......}]});其中<preclass="brush:js;toolbar:true;auto-links:false;">QXAPP.view.file.Lists 的代码大致是这样的<preclass="brush:js;toolbar:true;auto-links:false;">Ext.define('QXAPP.view.file.Lists',{extend:'Ext.grid.Panel',alias:'widget.filelists',//注意,store如果放在这里的话,那么会导致出现的两个file.lists都拥有同样的store,原因不明……redlz2500@20130627//store:newExt.create('QXAPP.store.Files'),columns:[......],//bbar:Ext.create('Ext.PagingToolbar',{////store:'Files',//想办法在后面增加上去.//displayInfo:true,//displayMsg:'显示文档{0}-{1}of{2}',//emptyMsg:"当前没有文档"////items:[////////'-',{////////text:'ShowPreview',////////pressed:pluginExpanded,////////enableToggle:true,////////toggleHandler:function(btn,pressed){////////varpreview=Ext.getCmp('gv').getPlugin('preview');////////preview.toggleExpanded(pressed);////////}////]//}),initComponent:function(){//this.callParent(arguments);this.store=Ext.create('QXAPP.store.Files');this.store.proxy.extraParams={group:this.initfilegroup};//this.id=this.initAppID;//this.bbar.store=this.store;this.bbar=Ext.create('Ext.PagingToolbar',{//store:'Files',//想办法在后面增加上去.store:this.store,displayInfo:true,displayMsg:'显示文档{0}-{1}of{2}',emptyMsg:"当前没有文档"//items:[////'-',{////text:'ShowPreview',////pressed:pluginExpanded,////enableToggle:true,////toggleHandler:function(btn,pressed){////varpreview=Ext.getCmp('gv').getPlugin('preview');////preview.toggleExpanded(pressed);////}//]});this.callParent();}}); 这个代码可以看到有两处是bbar,在config中被注释掉的一处是最开始的,在config的时候,且在center中只有一个filelist的时候一切正常,但是有两个filelist的时候就会渲染错误,逐个注释掉filelist的内容,发现bbar注释掉后就正常了,所以才将bbar的东西放到了initComponet中来定义。 试过直接在lanuch中的tabpanel中用config格式写带有bbar的简单grid,同时写了两个,代码一模一样,完全没有问题,就是filelist不行。 问题就是为什么bbar放到config中就会出问题啊?######话这么多时间发贴求助不如看官方文档。######确保每个id都不一样吗?######<divclass="ref"> 引用来自“cr2121”的答案<divclass="ref_body">话这么多时间发贴求助不如看官方文档。<divclass="a_body">没找到有用的东西,还请赐教######<divclass="ref"> 引用来自“我是潮汐”的答案<divclass="ref_body">确保每个id都不一样吗?<divclass="a_body">确保不一致,在config中输入的id是可以传递到每一个filelist的,这个是试过的######tabfiles发来看看###### 是不是因为你定义在config那边的时候,虽然生成了两个的gridpanel,但是引用了相同的一个bbar,导致渲染异常。试试:定义自己的gridpanel的时候,传一个bbarId进去,然后在bbar那边加一个this.bbarId,
优选2 2020-06-09 15:40:19 0 浏览量 回答数 0

回答

原始mygrid中的定义是:bbar:Ext.create 错误应该是在这儿了,如果用json格式定义一个类的时候,类的属性不能用Ext.create 再简单点儿说,类的属性不是一个对象,否则就会产生引用冲突;只能是string,int等基本类型.如果用json格式定义一个类,对象会在"类"产生前被创建,相当于成了一个静态成员,所有这个类的对象都调用这一个对象.先把所有属性的什都赋成null吧,然后在initComponet中给每个性创建对象,这样就没问题了.这个只要了解了js的原理[对象的引用]和ext的执行顺序[先生成json对象,后生成"类"]就很容易理解了.<imgsrc="http://www.oschina.net/js/ke/plugins/emoticons/images/0.gif"alt=""/>我想说,这种写法是没有问题的。感谢你的留言,不过在json格式中使用是可以使用Ext.create来进行的 没看懂你在说什么,能说清楚点么。 你执行哪段代码出的错。 你的gridpanel是否动态创建。把情况描述清楚,不然怎么帮你分析呀?<divclass="ref"> 引用来自“我是潮汐”的答案<divclass="ref_body"> 没看懂你在说什么,能说清楚点么。 你执行哪段代码出的错。 你的gridpanel是否动态创建。把情况描述清楚,不然怎么帮你分析呀?话这么多时间发贴求助不如看官方文档。确保每个id都不一样吗?<divclass="ref"> 引用来自“cr2121”的答案<divclass=ref_body>话这么多时间发贴求助不如看官方文档。<divclass="ref"> 引用来自“我是潮汐”的答案<divclass=ref_body>确保每个id都不一样吗?tabfiles发来看看 是不是因为你定义在config那边的时候,虽然生成了两个的gridpanel,但是引用了相同的一个bbar,导致渲染异常。试试:定义自己的gridpanel的时候,传一个bbarId进去,然后在bbar那边加一个this.bbarId,
爱吃鱼的程序员 2020-06-22 18:43:02 0 浏览量 回答数 0

回答

原始mygrid中的定义是:bbar: Ext.create  错误应该是在这儿了,如果用json格式定义一个类的时候,类的属性不能用Ext.create  再简单点儿说,类的属性不是一个对象,否则就会产生引用冲突;只能是string,int等基本类型. 如果用json格式定义一个类,对象会在"类"产生前被创建,相当于成了一个静态成员,所有这个类的对象都调用这一个对象.先把所有属性的什都赋成null吧,然后在initComponet中给每个性创建对象,这样就没问题了. 这个只要了解了js的原理[对象的引用]和ext的执行顺序[先生成json对象,后生成"类"]就很容易理解了. ######我想说,这种写法是没有问题的。######感谢你的留言,不过在json格式中使用是可以使用Ext.create来进行的###### 没看懂你在说什么,能说清楚点么。 你执行哪段代码出的错。 你的gridpanel是否动态创建。把情况描述清楚,不然怎么帮你分析呀? ###### 引用来自“我是潮汐”的答案 没看懂你在说什么,能说清楚点么。 你执行哪段代码出的错。 你的gridpanel是否动态创建。把情况描述清楚,不然怎么帮你分析呀? 代码没有报错,而是渲染出错,所有的东西跑到左上角 代码大致是这样的 Ext.create('Ext.Viewport', { //Ext.create('Ext.form.Panel', { layout: 'border', items: [{ region: 'north', ..... },{ region : 'west', ..... },{ region :'center', region : 'center', xtype : 'tabfiles',//这个是一个tabpanel layout:'fit', items:[ Ext.create('QXAPP.view.file.Lists',{ initfilegroup:0, title : '文档列表', id:'defaultflist' }), Ext.create('QXAPP.view.file.Lists',{ initfilegroup:0, title:'文件其他列表', id:'defa32ultflist' }) ] },{ region : 'south', ...... }] }); 其中 QXAPP.view.file.Lists 的代码大致是这样的 Ext.define('QXAPP.view.file.Lists', { extend: 'Ext.grid.Panel', alias : 'widget.filelists', //注意,store如果放在这里的话,那么会导致出现的两个file.lists都拥有同样的store,原因不明……redlz2500@20130627 // store: new Ext.create('QXAPP.store.Files'), columns: [ ...... ], // bbar: Ext.create('Ext.PagingToolbar', { // //store: 'Files', //想办法在后面增加上去. // displayInfo: true, // displayMsg: '显示文档 {0} - {1} of {2}', // emptyMsg: "当前没有文档" //// items:[ //////// '-', { //////// text: 'Show Preview', //////// pressed: pluginExpanded, //////// enableToggle: true, //////// toggleHandler: function(btn, pressed) { //////// var preview = Ext.getCmp('gv').getPlugin('preview'); //////// preview.toggleExpanded(pressed); //////// } //// ] // }), initComponent: function() { // this.callParent(arguments); this.store = Ext.create('QXAPP.store.Files'); this.store.proxy.extraParams={group:this.initfilegroup}; //this.id=this.initAppID; //this.bbar.store=this.store; this.bbar=Ext.create('Ext.PagingToolbar', { //store: 'Files', //想办法在后面增加上去. store : this.store, displayInfo: true, displayMsg: '显示文档 {0} - {1} of {2}', emptyMsg: "当前没有文档" // items:[ //// '-', { //// text: 'Show Preview', //// pressed: pluginExpanded, //// enableToggle: true, //// toggleHandler: function(btn, pressed) { //// var preview = Ext.getCmp('gv').getPlugin('preview'); //// preview.toggleExpanded(pressed); //// } // ] }); this.callParent(); } }); 这个代码可以看到有两处是bbar,在config中被注释掉的一处是最开始的,在config的时候,且在center中只有一个 filelist的时候一切正常,但是有两个filelist的时候就会渲染错误,逐个注释掉filelist的内容,发现bbar注释掉后就正常了,所 以才将bbar的东西放到了initComponet中来定义。 试过直接在lanuch中的tabpanel中用config格式写带有bbar的简单grid,同时写了两个,代码一模一样,完全没有问题,就是filelist不行。 问题就是为什么bbar放到config中就会出问题啊? ######话这么多时间发贴求助不如看官方文档。######确保每个id都不一样吗?###### 引用来自“cr2121”的答案 话这么多时间发贴求助不如看官方文档。 没找到有用的东西,还请赐教 ###### 引用来自“我是潮汐”的答案 确保每个id都不一样吗? 确保不一致,在config中输入的id是可以传递到每一个filelist的,这个是试过的 ######tabfiles 发来看看###### 是不是因为你定义在config那边的时候,虽然生成了两个的gridpanel,但是引用了相同的一个bbar,导致渲染异常。 试试:定义自己的gridpanel的时候,传一个bbarId进去,然后在bbar那边加一个this.bbarId,
爱吃鱼的程序员 2020-05-30 21:46:19 0 浏览量 回答数 0

回答

结贴:这个问题解决了,在Extjs4.0中已经有此属性的配置了,看下面代码: Ext.Ajax.request( {                     method : 'POST',                     url : fields[i].js,                     async : false,//添加该属性即可同步                     success : function(response, option) {                         jsStr += response.responseText;                     },                     failure : function(response, option) {                         Ext.MessageBox.alert('错误信息提示',                                 '加载页面超时 或 页面连接错误!');                     }                 }); ######request是异步的啊 ,跟我当年的困惑一样,折腾了好久才明白……哈哈 ###### 引用来自“天涯咫尺”的答案 jquery ajax里面有个参数asycn 默认是true 代表异步,你把它设置成false时,就可用用了。 ext里面应该也有,因为这是ajax的一个参数。 asycn 表示的意思是单个ajax请求的时候 是否为异步, 如果设置为false, 则要等到服务器返回才会继续往下执行代码, 也就是你的页面就卡那, 直到服务器返回. 对于多个ajax之间的同步没有用处. 设置为false后, 每发送一个请求就卡住, 直到他返回, 每次返回都会触发success或failure, 而不是同步所有的ajax都完成之后, 只触发一次success或failure. ######你说的完全对,不过ajax的同步有时也是有用的。必须说在等待后台返回的数据,然后判断进行操作,最后返回TRUE或者FALSE的时候,必须要用ajax的同步了,或者能提供一个别的思路###### 引用来自“szmneo”的答案 request是异步的啊 ,跟我当年的困惑一样,折腾了好久才明白……哈哈 我也发现这个问题了,可是如何解决呢? 真是头疼 ######难道你知道原因了还搞不定ext的同步请求吗?extjs3.2是要自己另加插件的,叫ext-basex.js,然后代码里Ext.Ajax.request里就可以用async : false来控制,4.0我还没开始用呢,不知道内置async了没,自己查看源码吧###### 引用来自“Panaon”的答案 引用来自“szmneo”的答案 request是异步的啊 ,跟我当年的困惑一样,折腾了好久才明白……哈哈 我也发现这个问题了,可是如何解决呢? 真是头疼 那就在ajax的回调函数里面alert呗,或者在回调函数里面调用一个函数,这个函数做alert. ######ajax应该有支持同步的吧,看看是否有同步的参数,jquery是支持的###### jsStr变量在function里面赋的值,以上那种情况外面的jsStr肯定是没有值的。######楼主, 你的意图没有说明白, 你是希望在所有的返回字符串全部链接完毕后再弹出对话框吗? 如果是这样, 你应该使用回调, 而不是return返回结果. 因此必须有一个外部的甚至是全局的变量用来存储返回的值, 并在回调中进行计数, 当全部响应后, 即计数等于循环最大值后, 才调用弹出.  var res= {sum:0,ary:[]};//make sure accessible in your scope var handleFn = function(success, msg, max){     if (success) res.ary.push(msg);    if (max == ++res.sum) alert(res.ary.join(''));//all responsed, call your function back } 在ajax的success方法中改为 handleFn(true, response.responseText, fields.length); 同理,在failure方法中改为 handleFn(false, response.responseText, fields.length); 当所有的请求全部响应时, 才调用你定义的方法, 此处是alert. ######和 extjs 没啥关系 去掉 extjs 代码 , 剩下 var jsFieldLoading = function(fields) {                 var jsStr = "";                                 alert("test:" + jsStr);                 return jsStr;                   } jsFieldLoading只是一个变量, 当然不会 alert , 如果想 alert , 加一个括号就行了。   var jsFieldLoading = function(fields) {                 var jsStr = "";                                 alert("test:" + jsStr);                 return jsStr;                   }();    ######你这真会误导 人……###### 引用来自“scl33”的答案 楼主, 你的意图没有说明白, 你是希望在所有的返回字符串全部链接完毕后再弹出对话框吗? 如果是这样, 你应该使用回调, 而不是return返回结果. 因此必须有一个外部的甚至是全局的变量用来存储返回的值, 并在回调中进行计数, 当全部响应后, 即计数等于循环最大值后, 才调用弹出.  var res= {sum:0,ary:[]};//make sure  accessible in your scope var handleFn = function(success, msg, max){     if (success) res.ary.push(msg);    if (max == ++res.sum) alert(res.ary.join(''));//all responsed, call your function back } 在ajax的success方法中改为 handleFn(true, response.responseText, fields.length); 同理,在failure方法中改为 handleFn(false, response.responseText, fields.length); 当所有的请求全部响应时, 才调用你定义的方法, 此处是alert. 这个功能主要响应EXTJS treepanel点击事件,加载指定URL的页面,因为用到了tabPanel所以对于使用全局变量不合适,而对于在success后执行自定义方法,并不能确定我调用jsFieldLoading方法是返回的是有效的值,现在问题困在如何返回AJAX请求到的文件内容,对于Extjs4.0里没有找到Ext.Ajax的同步设置属性,我现在想不出更好的方案解决它。
kun坤 2020-06-08 10:57:40 0 浏览量 回答数 0

问题

爬取ajax网页,请求指教如果获得ajax参数的值 400 请求报错 

大家好,我在爬取http://hair.allwomenstalk.com/,希望获得图片,图片上的文字以及图片的链接文章地址,这个网站是瀑布流的,按普通爬虫方式写代码爬...
kun坤 2020-05-29 11:34:38 3 浏览量 回答数 1

问题

【新手入门】云服务器linux使用手册

为了让您更快入门,新增linux完整的使用手册。 目录: 远程访问 挂载数据盘 安装Apache 安装MySQL 安装PHP 安装PHPWind -----...
fanyue88888 2019-12-01 21:00:12 151862 浏览量 回答数 145

问题

【新手入门】云服务器linux使用手册

为了让您更快入门,新增linux完整的使用手册。 目录: 远程访问 挂载数据盘 安装Apache 安装MySQL 安装PHP 安装PHPWind -----...
fanyue88888 2019-12-01 21:09:49 32459 浏览量 回答数 55

回答

Re【新手入门】云服务器linux使用手册 为了让您更快入门,新增linux完整的使用手册。 目录: 远程访问 挂载数据盘 安装Apache 安装MySQL 安装PHP 安装PHPWind --------------------------------------------------------------------------------------------------------------- 以CentOS 5.7 64位环境为例 一、     远程访问 远程连接Linux云服务器-命令行模式 1、远程连接工具。 目前Linux远程连接工具有很多种,您可以选择顺手的工具使用。 下面使用的是名为Putty的Linux远程连接工具。该工具是免费的,且不需要安装,在网上方便地下载到。 Putty下载地址推荐:http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe 2、启动Putty.exe程序,进入Putty主界面。在Putty “Host Name”输入IP地址,在Saved Session中输入希望保存的名字(可以任意),点击“Save”;以后可以方便调用而不需要每次输入IP地址;点击“Open”进行连接。 3、初次运行时,会有下图中的提示,请选择“是(Y)”,下次运行就不会再出现该提示信息了。 4、请根据提示,分别输入您的Linux云服务器用户名和密码(本文操作请以root用户名完成)。密码不会显示在屏幕上。输入完成后回车即可。 二、     挂载数据盘 Linux的云服务器数据盘未做分区和格式化,可以根据以下步骤进行分区以及格式化操作。下面的操作将会把数据盘划分为一个分区来使用。

1、查看数据盘 在没有分区和格式化数据盘之前,使用 “df –h”命令,是无法看到数据盘的,可以使用“fdisk -l”命令查看。如下图: 友情提示:若您执行fdisk -l命令,发现没有 /dev/xvdb 表明您的云服务无数据盘,那么您无需进行挂载,此时该教程对您不适用 

2、 对数据盘进行分 执行“fdisk /dev/xvdb”命令,对数据盘进行分区; 根据提示,依次输入“n”,“p”“1”,两次回车,“wq”,分区就开始了,很快就会完成。
 3、 查看新的分区 使用“fdisk -l”命令可以看到,新的分区xvdb1已经建立完成了。
 4、格式化新分区 CentOS 5.7中有ext4模块,但默认没有加载,如果想使用ext4创建文件系统,可以先加载该模块。使用如下命令,可以完成模块加载过程。 cd /lib/modules/2.6.18-274.12.1.el5/kernel/fs/ext4 modprobe ext4 yum install e4fsprogs 加载完ext4模块后,即可使用“mkfs.ext4 /dev/xvdb1”命令对新分区进行格式化,格式化的时间根据硬盘大小有所不同。 5、添加分区信息 如果用户希望将新分区挂载到/var/www目录,可使用如下命令。注:如果/var/www目录不存在,需先运行命令”mkdir /var/www”创建该目录。 “echo '/dev/xvdb1 /var/www ext4 defaults 0 0' >> /etc/fstab”命令写入新分区信息。然后使用“cat /etc/fstab”命令查看,出现以下信息就表示写入成功。 6、挂载新分区 使用“mount -a”命令挂载新分区,然后用“df -h”命令查看,出现以下信息就说明挂载成功,可以开始使用新的分区了。
 三、     安装Apache 使用yum install httpd命令来安装Apache 运行命令chkconfig --levels 235 httpd on使Apache可以自动启动,并运行命令/etc/init.d/httpd start立刻启动Apache 四、  安装MySQL 1、通过yum install mysql命令进行安装MySQL客户端 2、 类似的,使用yum install mysql-server命令安装MySQL 服务。 3、 运行命令chkconfig --levels 235 mysqld on使MySQL服务可以自动启动,并使用命令/etc/init.d/mysqld start立刻启动MySQL服务 4、设置MySQL的root密码,运行命令/usr/bin/mysqladmin -u root password 'new-password',其中’new-password’是新设的密码,如123456 五、安装PHP 1、通过命令yum install php来进行安装 2、安装php-mysql等包使PHP支持MySQL,命令如下:运行命令yum search php来查找可用的PHP模块包,选择所需要的包并运行命令yum install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc 来安装(可不限于本例中的包) 3、运行命令/etc/init.d/httpd restart重新启动Apache。 六、 安装phpwind 1、从地址 http://download.phpwind.net/index.php?m=download&a=do&did=531 下载phpwind 8.7。 2、解压下载包,生成两个目录,分别是docs和upload。 3、在云服务器上安装FTP server,简单步骤如下,详细步骤请参考相关文档: l  yum install vsftpd:安装FTP server vsftpd。 l  service vsftpd start:启动vsftpd服务。 l  vi /etc/vsftpd/vsftpd.conf:配置vsftpd,将以下两行的注释符去掉: #chroot_list_enable=YES #chroot_list_file=/etc/vsftpd/chroot_list l  useradd -d /home/edward -p passw0rd edward:创建一个FTP用户和密码。 l  vi /etc/vsftpd/chroot_list:将创建的用户加入配置文件,一个用户占一行。 l  service vsftpd restart:重启vsftpd。 4、            使用任何一种FTP客户端,以二进制模式上传PW的upload目录下的所有文件至云服务器的/var/www/html/目录。同时确认以下目录或文件属性为可读写模式(777),可使用chmod命令来更改目录或文件属性。 attachment/ attachment/cn_img/ attachment/photo/ attachment/pushpic/ attachment/thumb/ attachment/upload/ attachment/upload/middle/ attachment/upload/small/ attachment/upload/tmp/ attachment/mini/ attachment/mutiupload/ data/ data/bbscache/ data/forums/ data/groupdb/ data/guestcache/ data/tplcache/ data/style/ data/tmp/ html/ html/js/ html/stopic/ html/read/ html/channel/ html/portal/bbsindex/ html/portal/bbsindex/main.htm html/portal/bbsindex/config.htm html/portal/bbsindex/index.html html/portal/bbsradio/ html/portal/bbsradio/main.htm html/portal/bbsradio/config.htm html/portal/bbsradio/index.html html/portal/oindex/ html/portal/oindex/main.htm html/portal/oindex/config.htm html/portal/oindex/index.html html/portal/groupgatherleft/main.htm html/portal/groupgatherleft/config.htm html/portal/groupgatherleft/index.html html/portal/groupgatherright/main.htm html/portal/groupgatherright/config.htm html/portal/groupgatherright/index.html html/portal/userlist/main.htm html/portal/userlist/config.htm html/portal/userlist/index.html html/portal/usermix/main.htm html/portal/usermix/config.htm 5、 html/portal/usermix/index.html安装phpwind。上传完毕后,运行http://云服务器IP/install.php安装程序 (如: http://42.1.1.1/install.php)。 6、点击“接受”,出现环境检测页面 7、点击下一步,创建相应信息。MySQL数据库的密码是在第四步中指定的root用户的密码,管理员账号和密码务必记住,安装完成后需要此账号和密码来管理后台。 8、点击下一步,完成phpwind安装 9、安装完成后,将显示如下页面。 10、将云服务器的/var/www/html中的install.php文件剪切到其他地方保存或删除,以便能正常访问phpwind前后台页面。 11、直接使用云服务器IP或备案后的域名,即可访问网站前台首页。 12、使用phpwind安装过程中设置的管理员账号和密码登录,并点击系统设置进入后台管理界面
凰帝 2019-12-02 00:11:55 0 浏览量 回答数 0

问题

请教ExtJs与数据库通信的问题,请各位老师帮助?报错

    问题描述: 我用ExtJs做了一个Form,想将数据同步到后台MySql数据库中去,在MySql中创建了一张表Depart,包含`id`,&#...
爱吃鱼的程序员 2020-06-10 14:27:07 0 浏览量 回答数 1

回答

01状态机介绍 游戏中的状态机一般都是有限状态机,简写为FSM(有限状态机),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。 状态机的每一个状态至少需要有以下三个操作: 启动:当从其他状态进入这个状态时,需要进行的初始化操作; 更新:在这个状态运行时进行的更新操作; 清理:当从这个状态退出时,需要进行的清除操作。 状态需要的变量: 下一个:表示这个状态退出后要转到的下一个状态; 坚持:在状态间转换时需要传递的数据; 完成:表示这个状态是否结束,状态机会根据这个值来决定转换状态。 游戏界面状态机的状态转换图如下,箭头表示可能的状态转换方向:(注意有个转换不太好画出来:超时状态可以转换到Game Over状态。) 这几个状态的意思比较简单,下面把游戏界面的截图发一下。 主菜单:主菜单,启动程序就进入这个状态,可以用上和下键选择玩家1或玩家2,按回车键开启游戏。 加载屏幕:游戏开始前的加载界面。 游戏运行:游戏运行时的状态,在代码实现中是Level类。 游戏结束:人物死亡且生命数量为0时到这个状态。 超时:在游戏中时间超时会到这个状态,这个和Game Over类似,就不截图了。 02状态机代码实现 因为这篇文章的目的是游戏界面的状态机实现,所以专门写了一个state_demo.py文件,让大家可以更加方便的看代码。 游戏启动代码 开始是pygame的初始化,设置屏幕大小为c.SCREEN_SIZE(800,600)。所有的常量都保存在单独的constants.py中。 import os import pygame as pg import constants as c pg.init() pg.event.set_allowed([pg.KEYDOWN, pg.KEYUP, pg.QUIT]) pg.display.set_caption(c.ORIGINAL_CAPTION) SCREEN = pg.display.set_mode(c.SCREEN_SIZE) SCREEN_RECT = SCREEN.get_rect() load_all_gfx函数查找指定目录下所有符合后缀名的图片,使用pg.image.load函数加载,保存在图形set中。 GFX保存在资源/图形目录找到的所有图片,后面获取各种图形时会用到。 def load_all_gfx(directory, colorkey=(255,0,255), accept=('.png', '.jpg', '.bmp', '.gif')): graphics = {} for pic in os.listdir(directory): name, ext = os.path.splitext(pic) if ext.lower() in accept: img = pg.image.load(os.path.join(directory, pic)) if img.get_alpha(): img = img.convert_alpha() else: img = img.convert() img.set_colorkey(colorkey) graphics[name] = img return graphics GFX = load_all_gfx(os.path.join("resources","graphics")) 下面是demo的入口函数,先创建了一个保存所有状态的state_dict设置,调用setup_states函数设置启动状态是MAIN_MENU。 if __name__=='__main__': game = Control() state_dict = {c.MAIN_MENU: Menu(), c.LOAD_SCREEN: LoadScreen(), c.LEVEL: Level(), c.GAME_OVER: GameOver(), c.TIME_OUT: TimeOut()} game.setup_states(state_dict, c.MAIN_MENU) game.main() 状态类 先定义一个状态基类,按照上面说的状态需要的三个操作分别定义函数(启动,更新,清理)。在init函数中定义了上面说的三个变量(next,persist,```js done),还有start_time和current_time用于记录时间。 class State(): def init(self): self.start_time = 0.0 self.current_time = 0.0 self.done = False self.next = None self.persist = {} @abstractmethod def startup(self, current_time, persist): '''abstract method''' def cleanup(self): self.done = False return self.persist @abstractmethod def update(sefl, surface, keys, current_time): '''abstract method''' 看一个状态类LoadScreen的具体实现,这个状态的显示效果如图3。 startup函数保存了预期的persist,设置next为Level状态类,start_time保存进入该状态的开始时间。初始化一个Infoclass,这个就是专门用来显示界面信息的。 update函数根据在这个状态已运行的时间(current_time-self.start_time),决定显示内容和是否结束状态(self.done = True)。 ```js class LoadScreen(State): def __init__(self): State.__init__(self) self.time_list = [2400, 2600, 2635] def startup(self, current_time, persist): self.start_time = current_time self.persist = persist self.game_info = self.persist self.next = self.set_next_state() info_state = self.set_info_state() self.overhead_info = Info(self.game_info, info_state) def set_next_state(self): return c.LEVEL def set_info_state(self): return c.LOAD_SCREEN def update(self, surface, keys, current_time): if (current_time - self.start_time) < self.time_list[0]: surface.fill(c.BLACK) self.overhead_info.update(self.game_info) self.overhead_info.draw(surface) elif (current_time - self.start_time) < self.time_list[1]: surface.fill(c.BLACK) elif (current_time - self.start_time) < self.time_list[2]: surface.fill((106, 150, 252)) else: self.done = True 信息类 下面介绍的信息类,界面的显示大部分都是由它来完成,初始化函数中create_info_labels函数创建通用的信息,create_state_labels函数对于不同的状态,会初始化不同的信息。 class Info(): def __init__(self, game_info, state): self.coin_total = game_info[c.COIN_TOTAL] self.total_lives = game_info[c.LIVES] self.state = state self.game_info = game_info self.create_font_image_dict() self.create_info_labels() self.create_state_labels() self.flashing_coin = FlashCoin(280, 53) create_font_image_dict函数从之前加载的图片GFX ['text_images']中,截取字母和数字对应的图形,保存在一个设置中,在后面创建文字时会用到。 def create_font_image_dict(self): self.image_dict = {} image_list = [] image_rect_list = [# 0 - 9 (3, 230, 7, 7), (12, 230, 7, 7), (19, 230, 7, 7), (27, 230, 7, 7), (35, 230, 7, 7), (43, 230, 7, 7), (51, 230, 7, 7), (59, 230, 7, 7), (67, 230, 7, 7), (75, 230, 7, 7), # A - Z (83, 230, 7, 7), (91, 230, 7, 7), (99, 230, 7, 7), (107, 230, 7, 7), (115, 230, 7, 7), (123, 230, 7, 7), (3, 238, 7, 7), (11, 238, 7, 7), (20, 238, 7, 7), (27, 238, 7, 7), (35, 238, 7, 7), (44, 238, 7, 7), (51, 238, 7, 7), (59, 238, 7, 7), (67, 238, 7, 7), (75, 238, 7, 7), (83, 238, 7, 7), (91, 238, 7, 7), (99, 238, 7, 7), (108, 238, 7, 7), (115, 238, 7, 7), (123, 238, 7, 7), (3, 246, 7, 7), (11, 246, 7, 7), (20, 246, 7, 7), (27, 246, 7, 7), (48, 246, 7, 7), # -* (68, 249, 6, 2), (75, 247, 6, 6)] character_string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ -*' for character, image_rect in zip(character_string, image_rect_list): self.image_dict[character] = get_image(GFX['text_images'], *image_rect, (92, 148, 252), 2.9) get_image函数从一个大的表面工作表中按照面积(x,y,宽度,高度)截取的部分图片放入表面图像对应的起始位置(0,0),并按比例参数调整大小。 pygame的blit函数介绍如下: pg.Surface.blit(source, dest, area=None, special_flags=0) -> Rect draw one image onto another def get_image(sheet, x, y, width, height, colorkey, scale): image = pg.Surface([width, height]) rect = image.get_rect() image.blit(sheet, (0, 0), (x, y, width, height)) image.set_colorkey(colorkey) image = pg.transform.scale(image, (int(rect.width*scale), int(rect.height*scale))) return image 看一下create_info_labels函数中其中一个字符串'MARIO'是如何在界面上显示的。 create_label函数参数(x,y)表示字符串在界面上的起始位置,从self.image_dict中根据字符获取对应的表面对象。 set_label_rects函数会设置字符串中每一个表面对象rect的(x,y)值。 pygame.Rect 对象中常用的成员变量(x,y),表示这个Surface的左上角的位置。 top, bottom: 表示Surface 在y轴上最上边和最下边的值, 所以top和y 值是一样的 left, right: 表示Surface 在x轴上最左边和最右边的值,所以left 和x 值是一样的 下面的坐标图可以看到,在左上角是整个屏幕的原点(0,0),图中标识了附件矩形的四个顶点的坐标。 def create_info_labels(self): ... self.mario_label = [] ... self.create_label(self.mario_label, 'MARIO', 75, 30) def create_label(self, label_list, string, x, y): for letter in string: label_list.append(Character(self.image_dict[letter])) self.set_label_rects(label_list, x, y) def set_label_rects(self, label_list, x, y): for i, letter in enumerate(label_list): letter.rect.x = x + ((letter.rect.width + 3) * i) letter.rect.y = y if letter.image == self.image_dict['-']: letter.rect.y += 7 letter.rect.x += 2 控制类 Control是状态机类,main函数是游戏的主循环,setup_states函数设置游戏启动时运行的状态。 class Control(): def __init__(self): self.screen = pg.display.get_surface() self.done = False self.clock = pg.time.Clock() self.fps = 60 self.current_time = 0.0 self.keys = pg.key.get_pressed() self.state_dict = {} self.state_name = None self.state = None def setup_states(self, state_dict, start_state): self.state_dict = state_dict self.state_name = start_state self.state = self.state_dict[self.state_name] def main(self): while not self.done: self.event_loop() self.update() pg.display.update() self.clock.tick(self.fps) event_loop函数负责监听输入(键盘输入和退出按钮),slef.keys保存键盘输入。 如果检测到当前状态结束,就调用flip_state函数进行旧状态的清理操作,并转换到下一个状态。更新函数会检测状态的完成值,调用状态的更新函数。 def update(self): self.current_time = pg.time.get_ticks() if self.state.done: self.flip_state() self.state.update(self.screen, self.keys, self.current_time) def flip_state(self): previous, self.state_name = self.state_name, self.state.next persist = self.state.cleanup() self.state = self.state_dict[self.state_name] self.state.startup(self.current_time, persist) def event_loop(self): for event in pg.event.get(): if event.type == pg.QUIT: self.done = True elif event.type == pg.KEYDOWN: self.keys = pg.key.get_pressed() elif event.type == pg.KEYUP: self.keys = pg.key.get_pressed() 03完整代码 有两个文件constants.py和state_demo.py,constants.py保存了所有的字符串定义和常量。 constants.py GAME_TIME_OUT表示游戏的超时时间,这边为了demo演示,设成5秒,实际是300秒。 SCREEN_HEIGHT = 600 SCREEN_WIDTH = 800 SCREEN_SIZE = (SCREEN_WIDTH,SCREEN_HEIGHT) ORIGINAL_CAPTION = "Super Mario Bros" GAME_TIME_OUT = 5 ## COLORS ## # R G B BLACK = ( 0, 0, 0) SIZE_MULTIPLIER = 2.5 BRICK_SIZE_MULTIPLIER = 2.69 BACKGROUND_MULTIPLER = 2.679 GROUND_HEIGHT = SCREEN_HEIGHT - 62 #STATES FOR ENTIRE GAME MAIN_MENU = 'main menu' LOAD_SCREEN = 'load screen' TIME_OUT = 'time out' GAME_OVER = 'game over' LEVEL = 'level' #MAIN MENU CURSOR STATES PLAYER1 = '1 PLAYER GAME' PLAYER2 = '2 PLAYER GAME' #GAME INFO DICTIONARY KEYS COIN_TOTAL = 'coin total' SCORE = 'score' TOP_SCORE = 'top score' LIVES = 'lives' CURRENT_TIME = 'current time' LEVEL_NUM = 'level num' PLAYER_NAME = 'player name' PLAYER_MARIO = 'mario' PLAYER_LUIGI = 'luigi' ITEM_SHEET = 'item_objects' state_demo.py 上面讲的状态类,状态机类都放在这里。 import os import pygame as pg from abc import ABC, abstractmethod import constants as c class State(): def __init__(self): self.start_time = 0.0 self.current_time = 0.0 self.done = False self.next = None self.persist = {} @abstractmethod def startup(self, current_time, persist): '''abstract method''' def cleanup(self): self.done = False return self.persist @abstractmethod def update(sefl, surface, keys, current_time): '''abstract method''' class Menu(State): def __init__(self): State.__init__(self) persist = {c.COIN_TOTAL: 0, c.SCORE: 0, c.LIVES: 3, c.TOP_SCORE: 0, c.CURRENT_TIME: 0.0, c.LEVEL_NUM: 1, c.PLAYER_NAME: c.PLAYER_MARIO} self.startup(0.0, persist) def startup(self, current_time, persist): self.next = c.LOAD_SCREEN self.persist = persist self.game_info = persist self.overhead_info = Info(self.game_info, c.MAIN_MENU) self.setup_background() self.setup_player() self.setup_cursor() def setup_background(self): self.background = GFX['level_1'] self.background_rect = self.background.get_rect() self.background = pg.transform.scale(self.background, (int(self.background_rect.width*c.BACKGROUND_MULTIPLER), int(self.background_rect.height*c.BACKGROUND_MULTIPLER))) self.viewport = SCREEN.get_rect(bottom=SCREEN_RECT.bottom) self.image_dict = {} image = get_image(GFX['title_screen'], 1, 60, 176, 88, (255, 0, 220), c.SIZE_MULTIPLIER) rect = image.get_rect() rect.x, rect.y = (170, 100) self.image_dict['GAME_NAME_BOX'] = (image, rect) def setup_player(self): self.player_list = [] player_rect_info = [(178, 32, 12, 16), (178, 128, 12, 16)] for rect in player_rect_info: image = get_image(GFX['mario_bros'], *rect, c.BLACK, 2.9) rect = image.get_rect() rect.x, rect.bottom = 110, c.GROUND_HEIGHT self.player_list.append((image, rect)) self.player_index = 0 def setup_cursor(self): self.cursor = pg.sprite.Sprite() self.cursor.image = get_image(GFX[c.ITEM_SHEET], 24, 160, 8, 8, c.BLACK, 3) rect = self.cursor.image.get_rect() rect.x, rect.y = (220, 358) self.cursor.rect = rect self.cursor.state = c.PLAYER1 def update(self, surface, keys, current_time): self.current_time = current_time self.game_info[c.CURRENT_TIME] = self.current_time self.player_image = self.player_list[self.player_index][0] self.player_rect = self.player_list[self.player_index][1] self.update_cursor(keys) self.overhead_info.update(self.game_info) surface.blit(self.background, self.viewport, self.viewport) surface.blit(self.image_dict['GAME_NAME_BOX'][0], self.image_dict['GAME_NAME_BOX'][1]) surface.blit(self.player_image, self.player_rect) surface.blit(self.cursor.image, self.cursor.rect) self.overhead_info.draw(surface) def update_cursor(self, keys): if self.cursor.state == c.PLAYER1: self.cursor.rect.y = 358 if keys[pg.K_DOWN]: self.cursor.state = c.PLAYER2 self.player_index = 1 self.game_info[c.PLAYER_NAME] = c.PLAYER_LUIGI elif self.cursor.state == c.PLAYER2: self.cursor.rect.y = 403 if keys[pg.K_UP]: self.cursor.state = c.PLAYER1 self.player_index = 0 self.game_info[c.PLAYER_NAME] = c.PLAYER_MARIO if keys[pg.K_RETURN]: self.done = True class LoadScreen(State): def __init__(self): State.__init__(self) self.time_list = [2400, 2600, 2635] def startup(self, current_time, persist): self.start_time = current_time self.persist = persist self.game_info = self.persist self.next = self.set_next_state() info_state = self.set_info_state() self.overhead_info = Info(self.game_info, info_state) def set_next_state(self): return c.LEVEL def set_info_state(self): return c.LOAD_SCREEN def update(self, surface, keys, current_time): if (current_time - self.start_time) < self.time_list[0]: surface.fill(c.BLACK) self.overhead_info.update(self.game_info) self.overhead_info.draw(surface) elif (current_time - self.start_time) < self.time_list[1]: surface.fill(c.BLACK) elif (current_time - self.start_time) < self.time_list[2]: surface.fill((106, 150, 252)) else: self.done = True class GameOver(LoadScreen): def __init__(self): LoadScreen.__init__(self) self.time_list = [3000, 3200, 3235] def set_next_state(self): return c.MAIN_MENU def set_info_state(self): return c.GAME_OVER class TimeOut(LoadScreen): def __init__(self): LoadScreen.__init__(self) self.time_list = [2400, 2600, 2635] def set_next_state(self): if self.persist[c.LIVES] == 0: return c.GAME_OVER else: return c.LOAD_SCREEN def set_info_state(self): return c.TIME_OUT class Level(State): def __init__(self): State.__init__(self) def startup(self, current_time, persist): self.game_info = persist self.persist = self.game_info self.player = None self.overhead_info = Info(self.game_info, c.LEVEL) self.setup_background() def setup_background(self): self.background = GFX['level_1'] self.bg_rect = self.background.get_rect() self.background = pg.transform.scale(self.background, (int(self.bg_rect.width*c.BACKGROUND_MULTIPLER), int(self.bg_rect.height*c.BACKGROUND_MULTIPLER))) self.bg_rect = self.background.get_rect() self.level = pg.Surface((self.bg_rect.w, self.bg_rect.h)).convert() self.viewport = SCREEN.get_rect(bottom=self.bg_rect.bottom) def update(self, surface, keys, current_time): self.game_info[c.CURRENT_TIME] = self.current_time = current_time self.overhead_info.update(self.game_info, self.player) if self.overhead_info.time <= 0: self.update_game_info() self.done = True self.draw(surface) def update_game_info(self): self.persist[c.LIVES] -= 1 if self.persist[c.LIVES] == 0: self.next = c.GAME_OVER elif self.overhead_info.time == 0: self.next = c.TIME_OUT else: self.next = c.LOAD_SCREEN def draw(self, surface): self.level.blit(self.background, self.viewport, self.viewport) surface.blit(self.level, (0,0), self.viewport) self.overhead_info.draw(surface) class Character(pg.sprite.Sprite): def __init__(self, image): pg.sprite.Sprite.__init__(self) self.image = image self.rect = self.image.get_rect() class Info(): def __init__(self, game_info, state): self.coin_total = game_info[c.COIN_TOTAL] self.total_lives = game_info[c.LIVES] self.state = state self.game_info = game_info self.create_font_image_dict() self.create_info_labels() self.create_state_labels() self.flashing_coin = FlashCoin(280, 53) def create_font_image_dict(self): self.image_dict = {} image_list = [] image_rect_list = [# 0 - 9 (3, 230, 7, 7), (12, 230, 7, 7), (19, 230, 7, 7), (27, 230, 7, 7), (35, 230, 7, 7), (43, 230, 7, 7), (51, 230, 7, 7), (59, 230, 7, 7), (67, 230, 7, 7), (75, 230, 7, 7), # A - Z (83, 230, 7, 7), (91, 230, 7, 7), (99, 230, 7, 7), (107, 230, 7, 7), (115, 230, 7, 7), (123, 230, 7, 7), (3, 238, 7, 7), (11, 238, 7, 7), (20, 238, 7, 7), (27, 238, 7, 7), (35, 238, 7, 7), (44, 238, 7, 7), (51, 238, 7, 7), (59, 238, 7, 7), (67, 238, 7, 7), (75, 238, 7, 7), (83, 238, 7, 7), (91, 238, 7, 7), (99, 238, 7, 7), (108, 238, 7, 7), (115, 238, 7, 7), (123, 238, 7, 7), (3, 246, 7, 7), (11, 246, 7, 7), (20, 246, 7, 7), (27, 246, 7, 7), (48, 246, 7, 7), # -* (68, 249, 6, 2), (75, 247, 6, 6)] character_string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ -*' for character, image_rect in zip(character_string, image_rect_list): self.image_dict[character] = get_image(GFX['text_images'], *image_rect, (92, 148, 252), 2.9) def create_info_labels(self): self.score_text = [] self.coin_count_text = [] self.mario_label = [] self.world_label = [] self.time_label = [] self.stage_label = [] self.create_label(self.score_text, '000000', 75, 55) self.create_label(self.coin_count_text, '*00', 300, 55) self.create_label(self.mario_label, 'MARIO', 75, 30) self.create_label(self.world_label, 'WORLD', 450, 30) self.create_label(self.time_label, 'TIME', 625, 30) self.create_label(self.stage_label, '1-1', 472, 55) self.info_labels = [self.score_text, self.coin_count_text, self.mario_label, self.world_label, self.time_label, self.stage_label] def create_state_labels(self): if self.state == c.MAIN_MENU: self.create_main_menu_labels() elif self.state == c.LOAD_SCREEN: self.create_player_image() self.create_load_screen_labels() elif self.state == c.LEVEL: self.create_level_labels() elif self.state == c.GAME_OVER: self.create_game_over_labels() elif self.state == c.TIME_OUT: self.create_time_out_labels() def create_player_image(self): self.life_times_image = get_image(GFX['text_images'], 75, 247, 6, 6, (92, 148, 252), 2.9) self.life_times_rect = self.life_times_image.get_rect(center=(378, 295)) self.life_total_label = [] self.create_label(self.life_total_label, str(self.total_lives), 450, 285) if self.game_info[c.PLAYER_NAME] == c.PLAYER_MARIO: rect = (178, 32, 12, 16) else: rect = (178, 128, 12, 16) self.player_image = get_image(GFX['mario_bros'], *rect, (92, 148, 252), 2.9) self.player_rect = self.player_image.get_rect(center=(320, 290)) def create_main_menu_labels(self): mario_game = [] luigi_game = [] top = [] top_score = [] self.create_label(mario_game, c.PLAYER1, 272, 360) self.create_label(luigi_game, c.PLAYER2, 272, 405) self.create_label(top, 'TOP - ', 290, 465) self.create_label(top_score, '000000', 400, 465) self.state_labels = [mario_game, luigi_game, top, top_score, *self.info_labels] def create_load_screen_labels(self): world_label = [] self.stage_label2 = [] self.create_label(world_label, 'WORLD', 280, 200) self.create_label(self.stage_label2, '1-1', 430, 200) self.state_labels = [world_label, self.stage_label2, *self.info_labels, self.life_total_label] def create_level_labels(self): self.time = c.GAME_TIME_OUT self.current_time = 0 self.clock_time_label = [] self.create_label(self.clock_time_label, str(self.time), 645, 55) self.state_labels = [*self.info_labels, self.clock_time_label] def create_game_over_labels(self): game_label = [] over_label = [] self.create_label(game_label, 'GAME', 280, 300) self.create_label(over_label, 'OVER', 400, 300) self.state_labels = [game_label, over_label, *self.info_labels] def create_time_out_labels(self): timeout_label = [] self.create_label(timeout_label, 'TIME OUT', 290, 310) self.state_labels = [timeout_label, *self.info_labels] def create_label(self, label_list, string, x, y): for letter in string: label_list.append(Character(self.image_dict[letter])) self.set_label_rects(label_list, x, y) def set_label_rects(self, label_list, x, y): for i, letter in enumerate(label_list): letter.rect.x = x + ((letter.rect.width + 3) * i) letter.rect.y = y if letter.image == self.image_dict['-']: letter.rect.y += 7 letter.rect.x += 2 def update(self, level_info, level=None): self.level = level self.handle_level_state(level_info) def handle_level_state(self, level_info): self.score = level_info[c.SCORE] self.update_text(self.score_text, self.score) self.update_text(self.coin_count_text, level_info[c.COIN_TOTAL]) self.update_text(self.stage_label, level_info[c.LEVEL_NUM]) self.flashing_coin.update(level_info[c.CURRENT_TIME]) if self.state == c.LOAD_SCREEN: self.update_text(self.stage_label2, level_info[c.LEVEL_NUM]) if self.state == c.LEVEL: if (level_info[c.CURRENT_TIME] - self.current_time) > 1000: self.current_time = level_info[c.CURRENT_TIME] self.time -= 1 self.update_text(self.clock_time_label, self.time, True) def update_text(self, text, score, reset=False): if reset and len(text) > len(str(score)): text.remove(text[0]) index = len(text) - 1 for digit in reversed(str(score)): rect = text[index].rect text[index] = Character(self.image_dict[digit]) text[index].rect = rect index -= 1 def draw(self, surface): self.draw_info(surface, self.state_labels) if self.state == c.LOAD_SCREEN: surface.blit(self.player_image, self.player_rect) surface.blit(self.life_times_image, self.life_times_rect) surface.blit(self.flashing_coin.image, self.flashing_coin.rect) def draw_info(self, surface, label_list): for label in label_list: for letter in label: surface.blit(letter.image, letter.rect) class FlashCoin(pg.sprite.Sprite): def __init__(self, x, y): pg.sprite.Sprite.__init__(self) self.frame_index = 0 self.frames = [] self.load_frames() self.image = self.frames[self.frame_index] self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y self.animation_timer = 0 def load_frames(self): sheet = GFX[c.ITEM_SHEET] frame_rect_list = [(1, 160, 5, 8), (9, 160, 5, 8), (17, 160, 5, 8), (9, 160, 5, 8)] for frame_rect in frame_rect_list: self.frames.append(get_image(sheet, *frame_rect, c.BLACK, c.BRICK_SIZE_MULTIPLIER)) def update(self, current_time): time_list = [375, 125, 125, 125] if self.animation_timer == 0: self.animation_timer = current_time elif (current_time - self.animation_timer) > time_list[self.frame_index]: self.frame_index += 1 if self.frame_index == 4: self.frame_index = 0 self.animation_timer = current_time self.image = self.frames[self.frame_index] class Control(): def __init__(self): self.screen = pg.display.get_surface() self.done = False self.clock = pg.time.Clock() self.fps = 60 self.current_time = 0.0 self.keys = pg.key.get_pressed() self.state_dict = {} self.state_name = None self.state = None def setup_states(self, state_dict, start_state): self.state_dict = state_dict self.state_name = start_state self.state = self.state_dict[self.state_name] def update(self): self.current_time = pg.time.get_ticks() if self.state.done: self.flip_state() self.state.update(self.screen, self.keys, self.current_time) def flip_state(self): previous, self.state_name = self.state_name, self.state.next persist = self.state.cleanup() self.state = self.state_dict[self.state_name] self.state.startup(self.current_time, persist) def event_loop(self): for event in pg.event.get(): if event.type == pg.QUIT: self.done = True elif event.type == pg.KEYDOWN: self.keys = pg.key.get_pressed() elif event.type == pg.KEYUP: self.keys = pg.key.get_pressed() def main(self): while not self.done: self.event_loop() self.update() pg.display.update() self.clock.tick(self.fps) def get_image(sheet, x, y, width, height, colorkey, scale): image = pg.Surface([width, height]) rect = image.get_rect() image.blit(sheet, (0, 0), (x, y, width, height)) image.set_colorkey(colorkey) image = pg.transform.scale(image, (int(rect.width*scale), int(rect.height*scale))) return image def load_all_gfx(directory, colorkey=(255,0,255), accept=('.png', '.jpg', '.bmp', '.gif')): graphics = {} for pic in os.listdir(directory): name, ext = os.path.splitext(pic) if ext.lower() in accept: img = pg.image.load(os.path.join(directory, pic)) if img.get_alpha(): img = img.convert_alpha() else: img = img.convert() img.set_colorkey(colorkey) graphics[name] = img return graphics # pygame related initial code pg.init() pg.event.set_allowed([pg.KEYDOWN, pg.KEYUP, pg.QUIT]) pg.display.set_caption(c.ORIGINAL_CAPTION) SCREEN = pg.display.set_mode(c.SCREEN_SIZE) SCREEN_RECT = SCREEN.get_rect() GFX = load_all_gfx(os.path.join("resources","graphics")) if __name__=='__main__': game = Control() state_dict = {c.MAIN_MENU: Menu(), c.LOAD_SCREEN: LoadScreen(), c.LEVEL: Level(), c.GAME_OVER: GameOver(), c.TIME_OUT: TimeOut()} game.setup_states(state_dict, c.MAIN_MENU) game.main() 用到的图片 图片文件名要保存为对应的,不然代码中会找到,并且保存到state_demo.py所在目录下的resources \ graphics子目录中。如果能上github,可以直接下载resources \ graphics目录中的图片。 1,item_objects.png 2,level_1.png 3,mario_bros.png 4,text_images.png 5,tile_set.png 6,title_screen.png 编译环境:python3.7 + pygame1.9。 原文链接
珍宝珠 2019-12-25 10:11:52 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT