﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-简易语言</title><link>http://www.blogjava.net/yangyusong/</link><description>数字沟通</description><language>zh-cn</language><lastBuildDate>Sun, 03 May 2026 11:43:21 GMT</lastBuildDate><pubDate>Sun, 03 May 2026 11:43:21 GMT</pubDate><ttl>60</ttl><item><title>安装rails(ruby on rails)</title><link>http://www.blogjava.net/yangyusong/archive/2012/09/02/386779.html</link><dc:creator>yangyusong</dc:creator><author>yangyusong</author><pubDate>Sat, 01 Sep 2012 17:17:00 GMT</pubDate><guid>http://www.blogjava.net/yangyusong/archive/2012/09/02/386779.html</guid><wfw:comment>http://www.blogjava.net/yangyusong/comments/386779.html</wfw:comment><comments>http://www.blogjava.net/yangyusong/archive/2012/09/02/386779.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangyusong/comments/commentRss/386779.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangyusong/services/trackbacks/386779.html</trackback:ping><description><![CDATA[<div>&nbsp; 记得两年前使用ror做网站，自动生成功能记忆犹新，只是当时网络知识实在缺乏，体会不到其中的乐趣。现在了解的很多了，书也有两本，一直想重新体验最新版做个网站。安装这个过程实在有点坑爹，查找网上若干ror的书包括2012年版的书，按照上面的步骤都没法安装完成，搞得我一会在linux下试验，一会在windows下试验，都没成功，只好放下。时间花不少，很不爽的体验。<br /><br />&nbsp; 好在，过了一段时间，忽然想看看ruby的那两本书，然后就爱上这个语言了。于是做一些想做的试验，一些试验需要做些配置，对安装目录也就了解了。下载一些插件居然自己跑到了ruby的下载页。看到上面居然一个版本有3样要下的，帮助文件和安装文件不就够了吗。还要一个mingw做工具么？这个不是有自己的官网下载么。也没管。想起ruby目录下include中有i386-mingw32，才联系起来。应该是以mingw做make工具的。rails应该需要make，因为每次安装都抛出make出错信息。虽然有mingw官网，但这里应该是做成自己的插件。于是到下载页http://rubyforge.org/frs/?group_id=167下载相应版本的mingw32工具解压覆盖到安装目录中，要是怕出问题先对目录做备份<br /><br />&nbsp; 另外下载不了的都cross wall下载<br /><br /><br />C:\Documents and Settings\Administrator&gt;gem install rails<br />ERROR:&nbsp; Error installing rails:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The 'json' native gem requires installed build tools.<br /><br />Please update your PATH to include build tools or download the DevKit<br />from 'http://rubyinstaller.org/downloads' and follow the instructions<br />at 'http://github.com/oneclick/rubyinstaller/wiki/Development-Kit'<br /><br />&nbsp; 还有错，但明显不是曾经报的make错误了。<br />&nbsp; 按照网址下载和遵从上面的方法安装即可（下面的命令即是按照安装方法安装的）<br />&nbsp; 其中config.yml文件仅仅描述ruby所在路径，修改成你的ruby路径即可<br /><br />D:\&gt;cd D:\Ruby192\devkit<br /><br />D:\Ruby192\devkit&gt;ruby dk.rb init<br />[INFO] found RubyInstaller v1.9.2 at D:/Ruby192<br /><br />Initialization complete! Please review and modify the auto-generated<br />'config.yml' file to ensure it contains the root directories to all<br />of the installed Rubies you want enhanced by the DevKit.<br /><br />D:\Ruby192\devkit&gt;ruby dk.rb review<br />Based upon the settings in the 'config.yml' file generated<br />from running 'ruby dk.rb init' and any of your customizations,<br />DevKit functionality will be injected into the following Rubies<br />when you run 'ruby dk.rb install'.<br /><br />D:/Ruby192<br /><br />D:\Ruby192\devkit&gt;ruby dk.rb install<br />[INFO] Updating convenience notice gem override for 'D:/Ruby192'<br />[INFO] Installing 'D:/Ruby192/lib/ruby/site_ruby/devkit.rb'<br /><br />D:\Ruby192\devkit&gt;gem install rdiscount --platform=ruby<br />Fetching: rdiscount-1.6.8.gem (100%)<br />Temporarily enhancing PATH to include DevKit...<br />Building native extensions.&nbsp; This could take a while...<br />Successfully installed rdiscount-1.6.8<br />1 gem installed<br />Installing ri documentation for rdiscount-1.6.8...<br />Installing RDoc documentation for rdiscount-1.6.8...<br /><br />D:\Ruby192\devkit&gt;ruby -rubygems -e "require 'rdiscount'; puts RDiscount.new('**<br />Hello RubyInstaller**').to_html"<br />&lt;p&gt;&lt;strong&gt;Hello RubyInstaller&lt;/strong&gt;&lt;/p&gt;<br /><br />下面安装rails<br /><br />D:\Ruby192\devkit&gt;gem install rails<br />Temporarily enhancing PATH to include DevKit...<br />Building native extensions.&nbsp; This could take a while...<br />Fetching: rdoc-3.12.gem (100%)<br />Depending on your version of ruby, you may need to install ruby rdoc/ri data:<br /><br />&lt;= 1.8.6 : unsupported<br />&nbsp;= 1.8.7 : gem install rdoc-data; rdoc-data --install<br />&nbsp;= 1.9.1 : gem install rdoc-data; rdoc-data --install<br />&gt;= 1.9.2 : nothing to do! Yay!<br />Fetching: railties-3.2.8.gem (100%)<br />Fetching: bundler-1.2.0.gem (100%)<br />Fetching: rails-3.2.8.gem (100%)<br />Successfully installed json-1.7.5<br />Successfully installed rdoc-3.12<br />Successfully installed railties-3.2.8<br />Successfully installed bundler-1.2.0<br />Successfully installed rails-3.2.8<br />5 gems installed<br />Installing ri documentation for json-1.7.5...<br />Installing ri documentation for rdoc-3.12...<br />unable to convert U+00A9 from UTF-8 to GBK for lib/rdoc/text.rb, skipping<br />Installing ri documentation for railties-3.2.8...<br />Installing ri documentation for bundler-1.2.0...<br />Installing ri documentation for rails-3.2.8...<br />Installing RDoc documentation for json-1.7.5...<br />Installing RDoc documentation for rdoc-3.12...<br />unable to convert U+00A9 from UTF-8 to GBK for lib/rdoc/text.rb, skipping<br />Installing RDoc documentation for railties-3.2.8...<br />Installing RDoc documentation for bundler-1.2.0...<br />Installing RDoc documentation for rails-3.2.8...<br /><br />&nbsp; 果然成功了，哈哈<br /><br />D:\Ruby192\devkit&gt;rails -v<br />Rails 3.2.8<br /><br />&nbsp; 想做个实例，搜一下网上的书，还是不行，那些书最新的2012的都不用命令行做，2011的还是老的命令行方式。根本没法用，上官网看就是了。<br />D:\Ruby192\devkit&gt;rails new D:/project/ruby/railsapp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; README.rdoc<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; Rakefile<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config.ru<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; .gitignore<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; Gemfile<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; app<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; app/assets/images/rails.png<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; app/assets/javascripts/application.js<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; app/assets/stylesheets/application.css<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; app/controllers/application_controller.rb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; app/helpers/application_helper.rb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; app/mailers<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; app/models<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; app/views/layouts/application.html.erb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; app/mailers/.gitkeep<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; app/models/.gitkeep<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config/routes.rb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config/application.rb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config/environment.rb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config/environments<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config/environments/development.rb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config/environments/production.rb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config/environments/test.rb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config/initializers<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config/initializers/backtrace_silencers.rb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config/initializers/inflections.rb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config/initializers/mime_types.rb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config/initializers/secret_token.rb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config/initializers/session_store.rb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config/initializers/wrap_parameters.rb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config/locales<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config/locales/en.yml<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config/boot.rb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; config/database.yml<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; db<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; db/seeds.rb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; doc<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; doc/README_FOR_APP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; lib<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; lib/tasks<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; lib/tasks/.gitkeep<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; lib/assets<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; lib/assets/.gitkeep<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; log<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; log/.gitkeep<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; public<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; public/404.html<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; public/422.html<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; public/500.html<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; public/favicon.ico<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; public/index.html<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; public/robots.txt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; script<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; script/rails<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; test/fixtures<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; test/fixtures/.gitkeep<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; test/functional<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; test/functional/.gitkeep<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; test/integration<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; test/integration/.gitkeep<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; test/unit<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; test/unit/.gitkeep<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; test/performance/browsing_test.rb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; test/test_helper.rb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; tmp/cache<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; tmp/cache/assets<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; vendor/assets/javascripts<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; vendor/assets/javascripts/.gitkeep<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; vendor/assets/stylesheets<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; vendor/assets/stylesheets/.gitkeep<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; vendor/plugins<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp; vendor/plugins/.gitkeep<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; run&nbsp; bundle install<br />Fetching gem metadata from https://rubygems.org/.........<br />Installing rake (0.9.2.2)<br />Installing i18n (0.6.1)<br />Installing multi_json (1.3.6)<br />Using activesupport (3.2.8)<br />Using builder (3.0.0)<br />Using activemodel (3.2.8)<br />Using erubis (2.7.0)<br />Using journey (1.0.4)<br />Using rack (1.4.1)<br />Using rack-cache (1.2)<br />Using rack-test (0.6.1)<br />Using hike (1.2.1)<br />Using tilt (1.3.3)<br />Using sprockets (2.1.3)<br />Using sprockets (2.1.3)<br />Using actionpack (3.2.8)<br />Installing mime-types (1.19)<br />Using polyglot (0.3.3)<br />Using treetop (1.4.10)<br />Using mail (2.4.4)<br />Using actionmailer (3.2.8)<br />Using arel (3.0.2)<br />Using tzinfo (0.3.33)<br />Using activerecord (3.2.8)<br />Using activeresource (3.2.8)<br />Using bundler (1.2.0)<br />Installing coffee-script-source (1.3.3)<br />Installing execjs (1.4.0)<br />Installing coffee-script (2.2.0)<br />Using rack-ssl (1.3.2)<br />Using json (1.7.5)<br />Using rdoc (3.12)<br />Installing thor (0.16.0)<br />Using railties (3.2.8)<br />Installing coffee-rails (3.2.2)<br />Installing jquery-rails (2.1.1)<br />Using rails (3.2.8)<br />Installing sass (3.2.1)<br />Installing sass-rails (3.2.5)<br />Using sqlite3 (1.3.6)<br />Installing uglifier (1.2.7)<br />Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem<br />is installed.<br /><br />D:\Ruby192\devkit&gt;cd D:\project\ruby\railsapp<br /><br />D:\project\ruby\railsapp&gt;rails server<br />=&gt; Booting WEBrick<br />=&gt; Rails 3.2.8 application starting in development on http://0.0.0.0:3000<br />=&gt; Call with -d to detach<br />=&gt; Ctrl-C to shutdown server<br />[2012-09-01 06:44:40] INFO&nbsp; WEBrick 1.3.1<br />[2012-09-01 06:44:41] INFO&nbsp; ruby 1.9.2 (2011-07-09) [i386-mingw32]<br />[2012-09-01 06:44:41] INFO&nbsp; WEBrick::HTTPServer#start: pid=2924 port=3000<br /><br />&nbsp; 浏览器中输入http://localhost:3000/，熟悉的界面出现<br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/webbrick.png" height="593" width="1052" /><br /><br />&nbsp; 所以ror厚厚的书读完也没用，可能动手连代码都没机会敲。<br /><br />&nbsp; 另外也可以到网站http://railsinstaller.org/下载配置好的安装包，就免去手动配置啦。</div><img src ="http://www.blogjava.net/yangyusong/aggbug/386779.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangyusong/" target="_blank">yangyusong</a> 2012-09-02 01:17 <a href="http://www.blogjava.net/yangyusong/archive/2012/09/02/386779.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>涂鸦秀秀游戏项目介绍</title><link>http://www.blogjava.net/yangyusong/archive/2012/07/18/383408.html</link><dc:creator>yangyusong</dc:creator><author>yangyusong</author><pubDate>Wed, 18 Jul 2012 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/yangyusong/archive/2012/07/18/383408.html</guid><wfw:comment>http://www.blogjava.net/yangyusong/comments/383408.html</wfw:comment><comments>http://www.blogjava.net/yangyusong/archive/2012/07/18/383408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangyusong/comments/commentRss/383408.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangyusong/services/trackbacks/383408.html</trackback:ping><description><![CDATA[<div>  <p><span style="font-family:宋体;">&nbsp; 这是六月初完成的一个游戏</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">两个月时间终于完成了我们的涂鸦秀秀项目，与同类产品相比，我们内容更多些，分为双人对战模式，多人模式，相信可以同时在线很多人。</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">技术上实践了一把前后端都</span>js<span style="font-family:宋体;">的游戏。算是过了把小瘾。用到</span>nodejs<span style="font-family:宋体;">，</span>socket.io<span style="font-family:宋体;">，</span>phonegap<span style="font-family:宋体;">，</span>express<span style="font-family:宋体;">框架和其他细枝末节。一路上我们披荆斩棘，果然爽。</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">其实从项目需求到解决各个小</span>bug<span style="font-family:宋体;">，真是刷了若干个夜</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">这样的项目特点就是能在各手机上玩，包括</span>ipod<span style="font-family:宋体;">，</span>pad<span style="font-family:宋体;">。</span>Pc<span style="font-family:宋体;">上只要支持</span>canvas<span style="font-family:宋体;">也可以一起玩，多好的一个大融合。当然其实要兼容</span>ie6<span style="font-family:宋体;">也不是什么难事，难在我根本没时间理了，真不好意思。简单说就是跨平台。适配的机器也较多，能有较广的群众基础。</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">我们也有好友系统，分享，邀请，当然不会做深，我们的目标是先吸引住市场，然后再集中力量对用户喜欢的点做深入研发。</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">做完后同学陪我玩好长时间，他很喜欢玩，这一点让我比较欣慰。感觉画图游戏来源于人类的自恋，人类天然喜欢用图来表达意思。只是世界上的系统还是符号的多。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">如图：</span></p>  <p> </p>  <p>&nbsp;<img data-pinit="registered" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/souapp.jpg" height="415" width="558" /></p>  <p style="text-indent:10.5pt;">SouApp.com<span style="font-family:宋体;">还给我们盖了章，我特地确认了一下，这是人家主动盖的章。在审核的时候就下载了一百多次。当然我也不知道这算什么概念。至少觉得有人感兴趣，其实这游戏对美术是乐事，他们功底好，</span>pc<span style="font-family:宋体;">上有自己的画图板，画起来非常专业。赢点小礼品根本不是问题。当然以后的版本会更好，更吸引人。已经有不少想法，可改进的地方也不少。</span></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">如下是一些界面截图</span></p><p><span style="font-family: 宋体;"><img data-pinit="registered" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/ui1.jpg" height="484" width="324" /></span></p><p><span style="font-family: 宋体;"><img data-pinit="registered" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/ui2.jpg" /></span></p><p><span style="font-family: 宋体;"><img data-pinit="registered" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/ui3.jpg" /></span></p><p><span style="font-family:宋体;"><img data-pinit="registered" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/ui4.jpg" /><br /></span></p>  <p> </p>  <p>&nbsp;<img data-pinit="registered" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/ui5.jpg" height="604" width="406" /></p>  <p> </p>  <p>&nbsp;</p><p><span style="font-family:宋体;">一些小作品</span></p>  <p>&nbsp;<img data-pinit="registered" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/alt1.jpg" height="433" width="329" /></p><p><img data-pinit="registered" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/alt2.jpg" height="398" width="330" /></p><p><img data-pinit="registered" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/alt3.jpg" height="368" width="246" /></p><p><img data-pinit="registered" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/alt4.jpg" /><br /></p><p> </p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">下载地址</span></p>  <p><a href="http://souapp.com/app_detail/?appid=aaf7a621-205a-4c73-a88b-a5ef3ebb9431">http://souapp.com/app_detail/?appid=aaf7a621-205a-4c73-a88b-a5ef3ebb9431</a></p>  <p>&nbsp;</p>  <p><a href="http://www.appchina.com/soft_detail_291505_0_10.html">http://www.appchina.com/soft_detail_291505_0_10.html</a></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">游戏地址</span></p>  <p>m<span>.tuyaxiuxiu.com</span></p>  <p>360.tuyaxiuxiu.com</p>  <p>google.tuyaxiuxiu.com</p>  <p><span style="font-family:宋体;">官网地址</span></p>  <p><a href="http://www.tuyaxiuxiu.com">www.tuyaxiuxiu.com</a></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">两个月我们都做了什么？</span></p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">美术需求，协议定制，详细编码，修</span>bug<span style="font-family:宋体;">，手机测试，稳定服务，官网搭建，后台搭建，推广运维。非常多的细节，充实有趣。</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">现已通过</span>sina,google<span style="font-family:宋体;">等各大平台，能搜到精选，分享，当然不是我们自己弄的，比如下面这个精选，人家是还要注册才能下载的社区。我们自己搞这种就过头了。</span></p>  <p>&nbsp;<img data-pinit="registered" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/app1.jpg" /></p>  <p> </p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">如果大家觉得两个月太长了，其实试试就知道，光推广就够累的，各个平台各种限制。不玩得技术欲仙欲死才怪。官网，后台，各种修改更新。甚至图都要自己改改。开始半个月，美术需求就写了</span>10<span style="font-family:宋体;">次，不敢说每次都很详细，但也够有调理和详细的了。</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">不过从中也获得不少经验，本来规划非常短的时间来完成，这个按照很理想的条件来处理的话。当然其实也准时完成了，只不过我们又要了加倍的功能，而我们的人数从开始实施时就减少了一半。这样的条件下，没报告什么特别的，既然说了就做吧，通宵很多个晚上，弄得我经常起不来。</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">另一些感触就是积极加入各种思考分析中就好，根本不要去考虑回报，这个世界上能去考虑回报的人并不多。</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">其实其中有的地方不太到位，比如分享界面、官网、统计分析。只能等人来帮忙了。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">如下图是当时做的一个极限测试</span></p>  <p> </p>  <p>&nbsp;<img data-pinit="registered" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/test1.jpg" /></p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">当时数据量一大就丢失数据。于是自己做了个编码方式，减少数据量，这个图证明的就是只要网络能传输，内容再多都能处理。</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">这个游戏的不好之处就是必须有一定的玩家基数才能带动起来。另外，我们开发很多功能其实没必要，先开发主要功能，看市场反应，在进一步开发才有意义。于是有了下一个游戏，见下一篇。</span></p>  </div><img src ="http://www.blogjava.net/yangyusong/aggbug/383408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangyusong/" target="_blank">yangyusong</a> 2012-07-18 15:49 <a href="http://www.blogjava.net/yangyusong/archive/2012/07/18/383408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>进军手机游戏和一些建议</title><link>http://www.blogjava.net/yangyusong/archive/2012/06/13/380654.html</link><dc:creator>yangyusong</dc:creator><author>yangyusong</author><pubDate>Tue, 12 Jun 2012 20:26:00 GMT</pubDate><guid>http://www.blogjava.net/yangyusong/archive/2012/06/13/380654.html</guid><wfw:comment>http://www.blogjava.net/yangyusong/comments/380654.html</wfw:comment><comments>http://www.blogjava.net/yangyusong/archive/2012/06/13/380654.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/yangyusong/comments/commentRss/380654.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangyusong/services/trackbacks/380654.html</trackback:ping><description><![CDATA[<div>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">转眼又过了几个月，但是这几个月做了好多游戏，疯狂了。其中做的第一款游戏今天进了</span>google<span style="font-family:宋体;">应用首页最上面的图。如图中，有好多金币那个图，就是我们的游戏。一个非常简单的游戏。</span></p>  <p><img data-pinit="registered" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/google.jpg" height="335" width="558" /><br /></p><p><br /></p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">这个游戏名称叫砸金币水果机，我们做了英文版，中文版，</span>ios<span style="font-family:宋体;">版</span>,andriod<span style="font-family:宋体;">版。如下就是英文</span>andriod<span style="font-family:宋体;">版，模仿街机风格，颇有怀旧的味道。当然技术上我并不看好这款游戏，但实际效果却不好说，图片精美，物理效果不错，触发的神奇界面不少，就看游戏屌丝对街机是否着迷过了。估计也是这些原因导致被</span>google<span style="font-family:宋体;">推荐吧，我们也没花任何一分钱买推荐。</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">其实我更想推荐的是多人网上互动的手机游戏，希望在下一篇给大家做介绍。</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">现在我们发现最火的语言成了</span>javascript<span style="font-family:宋体;">，原因是</span>html5<span style="font-family:宋体;">的推出，其实原理上讲，这个语言也是必然要火的，首先人类交互最密集的地方转移到互联网上了，人类交互的重要性是不言而喻的，就要求我们的网页有更多的功能，而这个功能的提供者第一个是</span>js<span style="font-family:宋体;">，且语言简洁，开源，这就奠定了它的竞争力基础。有了这些基础后，最大数量的研究人员都会在这上面。如果将</span>it<span style="font-family:宋体;">产业比喻成火山，那么网络这部分就是岩浆部分，就是变化最快的地方。一开始都是最专业的人研究底层，当这些底层成熟后，应用层就快速发展起来，推陈出新非常快。</span>Html5<span style="font-family:宋体;">推出将人们最常用的应用以很简洁的方式表达出来，</span>nodejs<span style="font-family:宋体;">将</span>js<span style="font-family:宋体;">推向后端，</span>socket.io<span style="font-family:宋体;">加速交互效率和交互设计。当然有非常多的js框架都出来了。这里不具体说了。</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">这几个月的经验总结希望给大家一些启发，</span> <span style="font-family:宋体;">如果我们做一个跨平台手机游戏发最好做好以下准备</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;">Js<span style="font-family:宋体;">越熟越好，不要以为它真的很简单，要做手机游戏，必须学会优化，如果是客户端，要求很高，如果在绘图时画一大堆对象，</span>andriod<span style="font-family:宋体;">一定会过不去的。那么就一方面研究</span>js<span style="font-family:宋体;">（我的建议是，不要去啃面向对象，代码清晰，规范最重要），一方面细读</span>html5<span style="font-family:宋体;">规范吧。</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">有</span>java<span style="font-family:宋体;">基础，那么在用</span>phonegap<span style="font-family:宋体;">打包到</span>andriod<span style="font-family:宋体;">系统下时，就能较快明白怎么做配置，怎么添加插件和使用。</span>Java<span style="font-family:宋体;">和</span>js<span style="font-family:宋体;">都不错的话那么写点插件也不错。有的功能是必须用插件的哦。</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">有点</span>andriod<span style="font-family:宋体;">设计的基础，我是没什么基础，所以也花不少时间研究，其实就研究它的一些配置关系。也会有烦人问题的。</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">有点</span>mac<span style="font-family:宋体;">下的</span>xcode<span style="font-family:宋体;">基础，</span>xcode<span style="font-family:宋体;">的基本的使用最好明白，否则还是要花不少时间摸索，对于</span>mac<span style="font-family:宋体;">系统的设计，我实在不太苟同，虽然我能挺快适应。至于</span>oc<span style="font-family:宋体;">，会一些也更好，这样方便使用插件和写插件。</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">想进军</span>app store<span style="font-family:宋体;">，越早申请账号，越早提交越好，遇到的问题非常之多。也许怪物英文不好，</span>mac<span style="font-family:宋体;">不熟吧。</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">当然硬件上最好有几个手机，</span>ipod,pad<span style="font-family:宋体;">做测试，</span>ipad3<span style="font-family:宋体;">尤其要测。</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">你还会遇到的问题，比如手机屏幕适配，音乐的使用，兼容浏览器等。</span></p>  <p>&nbsp;</p>  <p>&nbsp;<span style="font-family:宋体;">另一个建议就是认准了自己喜欢的，一头扎进去动手就是了。</span></p>  <p>&nbsp;</p>  <p style="text-indent:10.5pt;"><span style="font-family:宋体;">这篇文章总体质量不高，没给大家讲讲技术细节，商业游戏，不太方便哈，会给大家讲开源的。甚至有的地方可能讲失误也欢迎批评指出。本篇完。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">游戏地址</span>1<span style="font-family:宋体;">：</span><a href="http://app.baidu.com/273943">http://app.baidu.com/273943</a></p>  <p><span style="font-family:宋体;">游戏地址</span>2<span style="font-family:宋体;">：</span></p>  <p><a href="https://chrome.google.com/webstore/detail/jdjcanmclknahldoohmphkiicmggghdf?hl=zh-CN">https://chrome.google.com/webstore/detail/jdjcanmclknahldoohmphkiicmggghdf?hl=zh-CN</a></p>  <p><span style="font-family:宋体;">（要在</span>chrome<span style="font-family:宋体;">下安装过才可玩）</span></p>  </div><img src ="http://www.blogjava.net/yangyusong/aggbug/380654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangyusong/" target="_blank">yangyusong</a> 2012-06-13 04:26 <a href="http://www.blogjava.net/yangyusong/archive/2012/06/13/380654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用yecc（erlang）写一个json解析器</title><link>http://www.blogjava.net/yangyusong/archive/2011/12/30/367605.html</link><dc:creator>yangyusong</dc:creator><author>yangyusong</author><pubDate>Fri, 30 Dec 2011 15:28:00 GMT</pubDate><guid>http://www.blogjava.net/yangyusong/archive/2011/12/30/367605.html</guid><wfw:comment>http://www.blogjava.net/yangyusong/comments/367605.html</wfw:comment><comments>http://www.blogjava.net/yangyusong/archive/2011/12/30/367605.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangyusong/comments/commentRss/367605.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangyusong/services/trackbacks/367605.html</trackback:ping><description><![CDATA[<div>&nbsp; 昨天写了个json的解析器。其实yecc早看过了，只是那时对自己要求太高，想一下子写个小语言。然后大脑就陷入混乱... 后来注意力转移了。就不那么急着去开发些难道大的。今天回来一看，觉得都理解了，实践一下，发现没人写json的，太好了。于是就在纸上写了一下。晚上没事都敲掉计算机里试试。果然很好用。废话就不多说了，不专业的我在readme里面已经写了不少废话了。主要也不知道git有没规范约束readme不能写废话。其实被google骗了一下，有人写过json的erlang解析，每次我搜yrl，它就主动搜url文件。还要点一下坚持搜索才行。看看https://github.com/jchris/erlang-json-eep-parser/downloads这上面就是一个解析器，还好我们写的不是太像，他写的更精细一点。我写的更容易使用上手。我写的就到这下载吧https://github.com/yangyusong/erlang_json_parser。<br /><br />&nbsp; 接着就是讲讲内容了，大学学过编译原理就很容易理解这其中的内容。yrl文件就是erlang中的满足LALR-1规范的解析生成器，相似于yacc。会有很多文章做解释，这里不详述。yrl文件或yacc中的.y这类文件就是给我们写编译规则用的，我们写好一个推理机制，按照规范分解成4部分，放到这一个文件中，那么yecc就可以给我们生成一个符合这个推理规则的解析器，当然这里就是生成.erl的源文件给我们使用，其中会有parse作为默认方法提供给我们解析我们的字符串。<br /><br />&nbsp; yrl文件中一共有四部分，其实三部分分别用Nonterminals Terminals Rootsymbol关键字来标识，意义很明显，非终结符，终结符，起始符（这个忘了怎么翻译）。要解释一下也行，一个更好的理解方式就是，非终结符可以在推理符号（-&gt;）的左边和右边，相当于函数作用，最终分析为终结符的组合。终结符只能在推理符号（-&gt;）的右边。意义就是一个符号系统的基本集合。 Rootsymbol是其中一个非终结符，作为推理的起始点。用一棵解析树来表示的话，Rootsymbol就是根节点。Nonterminals就是树枝。Terminals就是树叶。任何一个符合此推理规则的字符串都可以用这样一棵解析树表示出来（我就不画了）。<br /><br />&nbsp; 除了上面说的三部分就剩下最重要的部分了:推理规则。其实这四部分都是列表，只不过Rootsymbol这个表只有一个元素。规则列表有多条，通常每行一条规则，和erlang一样用.结束一条规则。<br />终结符用单引号引起，冒号后面是我们解析后的erlang表达式。$1,$2,$3这种相似正则表达式规则，也说一下吧，就是对冒号左边的元素作为列表并从1计数。再搞不懂就发邮局问吧，呵呵。<br /><br />&nbsp; 那么这样的一个规则列表就很好建立了，其实这个过程还是有很多规则可以遵循的，其中这里遵循了左递归，终结字符先出现的规则优先表达这两条规则。更多，你还可以画个有限状态机，做一下分析，化解，做成闭包，某些运算还要考虑优先级之类。当然这里这样小的结构基本是最优了，没什么化解的必要。<br /><br />代码附上<br />Nonterminals list object kv_list v_list kv k v. % 7<br /><br />Terminals ',' ':' 'element' '[' ']' '{' '}'. % 7<br /><br />Rootsymbol object.<br /><br />object -&gt; '{' '}' : {}.<br />object -&gt; '{' kv_list '}' : { '$2' }.<br /><br /><br />kv_list -&gt; kv ',' kv_list : '$1' , '$3'.<br />kv_list -&gt; kv : '$1'.<br /><br />kv -&gt; k ':' v : {'$1', '$3'}.<br /><br />k -&gt; 'element' : '$1'.<br /><br />v -&gt; 'element' : '$1'.<br />v -&gt; list : '$1'.<br />v -&gt; object : '$1'.<br /><br />list -&gt; '[' ']' : [].<br />list -&gt; '[' v_list ']' : [ '$2' ].<br /><br />v_list -&gt; v ',' v_list : '$1' , '$3'.<br />v_list -&gt; v.<br /><br />&nbsp; 其中object，list就是json中最基本的结构。kv_list就是剥离大括号后的键值对列表。v_list是剥离中括号的列表。<br /><br />&nbsp; 再讲讲这个解析器的使用吧，json_parser就是yrl文件生成的解析器了，我们就用这个解析器来做解析。文件use_json_parser对json_parser的使用做了一个包装，那就是parser/1函数了，我们给它传入json字符串就返回解析后的erlang列表。例如我们输入use_json_parser:parser("{a, b, c}").就会返回[{'{',1},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {atom,1,a},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {',',1},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {atom,1,b},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {',',1},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {atom,1,c},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {'}',1},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {'$end',999}]。<br />&nbsp; 这个文件还提供一个测试函数了unit_test_()。为了方便大家，我还是讲讲测试方法吧。在命令行输入<br />cd erlang_json_parser<br />erl -pa ./ebin/ -eval "make:all([{d, 'EUNIT'},{outdir, \"./ebin/\"}, debug_info]) ,eunit:test(\"./ebin\",[]),init:stop()"<br /><br />&nbsp; 参考更多的解析器制作，可以参考erlang官网提供的计算表达式解析，list解析。也可以从其他网站搜到html,xml等的解析,当然如果你看得多一点还会看到aleppo,erlydtl这类的工程。希望更多的人们投入到这些更有意思的开发中。下次再写yecc，就不写这么简单的了。哈哈。不要期待在下一篇里出现哦。</div><img src ="http://www.blogjava.net/yangyusong/aggbug/367605.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangyusong/" target="_blank">yangyusong</a> 2011-12-30 23:28 <a href="http://www.blogjava.net/yangyusong/archive/2011/12/30/367605.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个小游戏ChainReaction的设计（html5）</title><link>http://www.blogjava.net/yangyusong/archive/2011/12/18/366685.html</link><dc:creator>yangyusong</dc:creator><author>yangyusong</author><pubDate>Sun, 18 Dec 2011 15:03:00 GMT</pubDate><guid>http://www.blogjava.net/yangyusong/archive/2011/12/18/366685.html</guid><wfw:comment>http://www.blogjava.net/yangyusong/comments/366685.html</wfw:comment><comments>http://www.blogjava.net/yangyusong/archive/2011/12/18/366685.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/yangyusong/comments/commentRss/366685.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangyusong/services/trackbacks/366685.html</trackback:ping><description><![CDATA[<div>    <p style="text-indent:21.0pt;"><span style="font-family:宋体;">本来一直觉得</span>js<span style="font-family:宋体;">是个让人混乱不堪的语言，</span>html5<span style="font-family:宋体;">的出现改变了我对它的看法。到了</span>html5<span style="font-family:宋体;">的时代，各种犀利的设计就更明显的需要</span>js<span style="font-family:宋体;">了。看了一些小游戏设计，忽然来了兴趣，于是写了几个小游戏，这是其中一个。已经开源，欢迎下载</span>https://github.com/yangyusong/ChainReaction<span style="font-family:宋体;">。</span></p>  <p>&nbsp;</p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">游戏叫连锁反应，这个游戏是看到有人在</span>ipad<span style="font-family:宋体;">上面玩的游戏，觉得好玩，自己实现一遍。游戏是这样的，一群小球在区域内弹来弹去，玩家鼠标点击一个地方，在一个圆的范围内，小球碰上就会爆炸，爆炸的过程中其他小球碰上也会发生爆炸，这就叫连锁反应。每一关爆破一定数量的小球就算胜利。</span></p>  <p style="text-indent:21.0pt">&nbsp;</p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">我的设计中一个有</span>20<span style="font-family:宋体;">关，数值增长比较平和，运气不是太差的话都能一次通关。在说有个再玩本级的功能，过一关的压力是一点都没有。这样设计是为了给工作后的朋友缓解压力。我们轻松的一点就爆炸一片。</span></p>  <p style="text-indent:21.0pt">&nbsp;</p>  <p style="text-indent: 21pt;"><span style="font-family: 宋体;">看看截图</span></p><p style="text-indent:21.0pt"><span style="font-family:宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/frist.jpg" height="326" width="558" /><br /></span></p>  <p style="text-indent:21.0pt"></p>  <p style="text-indent:21.0pt">&nbsp;</p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">大的那个灰色的（其实是半透明的）圆是鼠标范围。其他是弹来弹去的小球。可以看到，小球是各种颜色的。</span></p>  <p style="text-indent:21.0pt">&nbsp;</p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">我们看看小球的定义</span></p>  <p style="text-indent:21.0pt"><span>function Circle(x, y, xSpeed, ySpeed, radius, color, liveTime, state){</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; //</span><span style="font-family:宋体;">圆心坐标</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; this.x = x;</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; this.y = y;</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; //</span><span style="font-family:宋体;">运动速度</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; this.xSpeed = xSpeed;</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; this.ySpeed = ySpeed;</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; //</span><span style="font-family:宋体;">半径</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; this.radius = radius;</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; //</span><span style="font-family:宋体;">颜色</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; this.color = color;</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; //</span><span style="font-family:宋体;">生存计数器</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; this.liveTime = liveTime;</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; //</span><span style="font-family:宋体;">状态：</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; this.state = state;</span></p>  <p style="text-indent:21.0pt">}</p>  <p style="text-indent:21.0pt">&nbsp;</p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">其中生存计数器是要和状态结合使用的，状态分为如下</span>5<span style="font-family:宋体;">个状态</span></p>  <p style="text-indent:21.0pt">//<span style="font-family:宋体;">小球状态</span></p>  <p style="text-indent:21.0pt">var SMALL = 0;</p>  <p style="text-indent:21.0pt">var BIG = 1;</p>  <p style="text-indent:21.0pt">var EXPEND = 2;</p>  <p style="text-indent:21.0pt">var END = 3;</p>  <p style="text-indent:21.0pt"><span>var DIS_VISIBLE = 4;</span></p>  <p style="text-indent:21.0pt">&nbsp;</p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">当处于</span>EXPEND<span style="font-family:宋体;">状态的时候，就说明小球进入爆炸状态，这时候生存计数器就用上了。计数器是个倒计时，计时到零，小球进入</span>DIS_VISIBLE<span style="font-family:宋体;">状态。这时候小球就不再渲染出来。</span></p>  <p style="text-indent:21.0pt">&nbsp;</p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">我们的小球有不同大小，不同颜色，看看小球的初始化就知道了，代码在</span>ObjectMgr.js<span style="font-family:宋体;">中</span></p>  <p style="text-indent:21.0pt"><span>for(i = 0; i &lt; g_StepsArr[g_Steps].ballsNum; i++){</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //_Util.dump_obj(_Color.color_str(new Color(Math.random(), Math.random(), Math.random())));</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var raduis = _Util.random_range(SMALL_RADIUS1, SMALL_RADIUS2);</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.circles.push(new Circle(</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Util.random_range(raduis*2, this.canvasWidth-2*raduis),</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Util.random_range(raduis*2, this.canvasHeight-2*raduis),</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Util.random(SPEED_MIN, SPEED_MAX),</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Util.random(SPEED_MIN, SPEED_MAX),</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raduis,</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Color.color_rgba_str(new Color1(Math.random(), Math.random(), Math.random(), 0.8)),</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MID_LIVE_TIME,</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SMALL</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ));</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>  <p style="text-indent:21.0pt">&nbsp;</p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">其中</span>g_StepsArr<span style="font-family:宋体;">负责我们关卡的管理，有这一关的小球数，和通关需要爆破的小球数。总之，这里按照本关需要的小球数初始化小球，可以看到里面有很多的随机函数使用。小球的半径处于如下两个数之间</span></p>  <p style="text-indent:21.0pt"><span>var SMALL_RADIUS1 = 3;</span></p>  <p style="text-indent:21.0pt"><span>var SMALL_RADIUS2 = 10;</span></p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">通过</span>random_range<span style="font-family:宋体;">来进行这个范围随机。我们看到速度也是随机的，范围是</span></p>  <p style="text-indent:21.0pt"><span>var SPEED_MIN = 10;</span></p>  <p style="text-indent:21.0pt"><span>var SPEED_MAX = 50;</span></p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">颜色中的</span>color_rgba_str<span style="font-family:宋体;">函数的第四个参数说明我们的每个小球的透明度是</span>0.8<span style="font-family:宋体;">，这样我们就能在爆破的时候，或弹动的时候仍然看清其他小球。这段代码就说到这。</span></p>  <p style="text-indent:21.0pt">&nbsp;</p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">我们讲讲主要流程，其实其中的详细注释，我觉得已经可以教会很多初学者。不过还是讲讲好。主要流程就在</span>Main.js<span style="font-family:宋体;">中。负责初始化，渲染和循环。开始我们设置了一堆全局变量。</span></p>  <p style="text-indent:21.0pt"><span>var g_ObjectMgr = null;</span></p>  <p style="text-indent:21.0pt"><span>var g_MouseEventDispatch = new MouseEventDispatch();</span></p>  <p style="text-indent:21.0pt"><span>var g_MouseMgr = null;//g_MouseMgr</span><span style="font-family:宋体;">在</span>g_ObjectMgr<span style="font-family:宋体;">初始化后才初始化</span></p>  <p style="text-indent:21.0pt">//<span style="font-family:宋体;">当前关</span></p>  <p style="text-indent:21.0pt"><span>var g_Steps = 1;//todo </span><span style="font-family:宋体;">显示出来</span></p>  <p style="text-indent:21.0pt">//<span style="font-family:宋体;">关卡数组</span></p>  <p style="text-indent:21.0pt"><span>var g_StepsArr = [];</span></p>  <p style="text-indent:21.0pt"><span>g_StepsArr = stepsInit();</span></p>  <p style="text-indent:21.0pt">//<span style="font-family:宋体;">爆炸开始标识</span></p>  <p style="text-indent:21.0pt"><span>var _ExpendStart = false;</span></p>  <p style="text-indent:21.0pt">&nbsp;</p>  <p style="text-indent:21.0pt">if(DEBUG){</p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; _CircleLib.test();</span></p>  <p style="text-indent:21.0pt">}</p>  <p style="text-indent:21.0pt">var _Main = { <span style="font-family:宋体;">。。。</span></p>  <p style="text-indent:21.0pt">&nbsp;</p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">包括关卡数组，当前关数，爆炸标识等。居然还设置了一个是否调试的状态量，其实我也不知道</span>js<span style="font-family:宋体;">调试怎样才好，基本就按自己的方式调。</span> _Main<span style="font-family:宋体;">是个很大的结构。我更宁愿把它当做单例来思考。主要是，它包括了渲染，这个渲染不具通用性，仅此一例就够。其他地方用了且不是画出什么就难说了。当然已经设计其实我会更多考虑通用性的设计，尽量不设计成这种单例。</span></p>  <p style="text-indent:21.0pt">&nbsp;</p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">这个</span>_Main<span style="font-family:宋体;">结构中有我们的画布</span>canvas,<span style="font-family:宋体;">我们的初始化函数，每关调用一次，它来负责</span>2d<span style="font-family:宋体;">对象的初始化，游戏对象的初始化。鼠标监听初始化。然后就是进入我们的循环。循环很简单，就干四件事情</span></p>  <p style="text-indent:21.0pt">/*</p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp; * </span><span style="font-family:宋体;">循环绘图</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp; * 1.</span><span style="font-family:宋体;">清空画面</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp; * 2.</span><span style="font-family:宋体;">游戏对象关系处理</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp; * 3.</span><span style="font-family:宋体;">渲染出来</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp; * 4.</span><span style="font-family:宋体;">循环调用</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; step: function(){</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.clear();</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_ObjectMgr.step();</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.render();</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _this = this;</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this._st = setTimeout(function(){</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _this.step();</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, 50);</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; }</span></p>  <p style="text-indent:21.0pt">&nbsp;</p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">看看我们的下一关都干些什么</span></p>  <p style="text-indent:21.0pt">/*</p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp; * </span><span style="font-family:宋体;">下一关</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; nextStep: function(){</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clearTimeout(this._st);</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(this.canvas.getContext)</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_MouseEventDispatch.start();</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.initObjects();</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.step();</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; }</span></p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">它就是清除计时器，重新分配事件，初始化对象。然后进入循环，为什么是这样呢？清除计时器以使我们之前的循环停止。因为我们马上有新的循环了，其实事件可以看做有两个状态，我们按下鼠标的时候，这个事件就不可用了，下次使用必须初始化。小球数量变了，必须按照本关的需求来初始化。进入循环，新的循环开始。</span></p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">看看再玩一次（本级）按钮的调用：</span></p>  <p style="text-indent:21.0pt">/*</p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp; * </span><span style="font-family:宋体;">再玩一次（本级）</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; again: function(){</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.nextStep()</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; }</span></p>  <p style="text-indent:21.0pt">&nbsp;</p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">为什么居然是调用下一关呢？只能说我设计的太懒惰，</span>nextStep()<span style="font-family:宋体;">本身根本不管关卡的变更。关卡的变更完全在爆炸检查函数里，一旦发现小球爆炸，就会修改当前关卡。而单纯调用</span>nextStep<span style="font-family:宋体;">所使用的关卡是未改变过的，故而是在玩本级。</span></p>  <p style="text-indent:21.0pt">&nbsp;</p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">我们再看一下</span>ObjectMgr.js<span style="font-family:宋体;">中的爆炸检查函数</span></p>  <p style="text-indent:21.0pt">&nbsp;</p>  <p style="text-indent:21.0pt"><span>expendCheck: function(){</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(_ExpendStart){</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.expendNum = _CircleLib.intersect(this.circles, g_MouseMgr.mouseCircle);</span></p>  <p style="text-indent:21.0pt">//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Util.dump_obj(g_StepsArr[g_Steps])</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(this.expendNum &gt;= g_StepsArr[g_Steps].killNum){</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var next = g_Steps + 1;</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert("</span><span style="font-family:宋体;">成功爆破超过</span>"+this.expendNum+"<span style="font-family:宋体;">个小球，恭喜进入第</span><span>"+ next + "</span><span style="font-family:宋体;">关，</span>\n\</p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">下一关需要爆破</span><span>" +g_StepsArr[g_Steps + 1].killNum + "</span><span style="font-family:宋体;">个小球</span>");</p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_Steps++;</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Main.init();</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>  <p style="text-indent:21.0pt"><span>&nbsp;&nbsp;&nbsp; }</span></p>  <p style="text-indent:21.0pt">&nbsp;</p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">还记得</span>_ExpendStart<span style="font-family:宋体;">这个变量的意思么？就是说鼠标是否按下了，按下的话我们就要检查是否有小球撞上鼠标范围或撞上爆炸中的小球。其实这里的调用</span>_CircleLib.intersect<span style="font-family:宋体;">这个函数是有些小问题的。它是通过引用修改的当前小球的状态，至于为什么有很少量的小球未修改状态，这个我还没弄明白。总之，这个函数检查了爆炸小球的数量，一旦爆炸小球的数量符合本关的要求，那么就可以进入下一关，可以看到我们进入下一关的提示是一个对话框，不是很友好，可以设计为一个图片较好，可惜我没时间找美术。</span></p>  <p style="text-indent:21.0pt"></p>  <p style="text-indent:21.0pt">&nbsp;<img src="http://www.blogjava.net/images/blogjava_net/yangyusong/nextstep.jpg" alt="" border="0" height="157" width="280" /></p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">点击确定，我们玩下一关</span></p>  <p style="text-indent:21.0pt"></p>  <p style="text-indent:21.0pt">&nbsp;<img src="http://www.blogjava.net/images/blogjava_net/yangyusong/secoend.jpg" alt="" border="0" height="328" width="558" /></p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">小球多了很多，找个好点的位置，能捕捉很多小球。</span></p>  <p style="text-indent: 21pt;"><span style="font-family: 宋体;">看一下爆炸过程吧：</span></p><p style="text-indent:21.0pt"><span style="font-family:宋体;"><img src="http://www.blogjava.net/images/blogjava_net/yangyusong/expend.jpg" alt="" border="0" height="321" width="558" /><br /></span></p>  <p style="text-indent:21.0pt"></p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">这是第十八关的一个爆炸情形，更具体的内容欢迎看具体代码吧，要不还讲好长时间。</span></p>  <p style="text-indent:21.0pt">&nbsp;</p>  <p style="text-indent:21.0pt"><span style="font-family:宋体;">做完这个例子，发现其实非常多的小游戏很好设计，可惜没那么多时间，再说设计别人设计过的游戏也不是我的目标。设计一些有趣的小游戏到手机里，这个倒是个不错的方向</span></p>  </div><img src ="http://www.blogjava.net/yangyusong/aggbug/366685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangyusong/" target="_blank">yangyusong</a> 2011-12-18 23:03 <a href="http://www.blogjava.net/yangyusong/archive/2011/12/18/366685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏中最近可达点（用erlang写一个简单算法）</title><link>http://www.blogjava.net/yangyusong/archive/2011/06/24/352985.html</link><dc:creator>yangyusong</dc:creator><author>yangyusong</author><pubDate>Fri, 24 Jun 2011 15:54:00 GMT</pubDate><guid>http://www.blogjava.net/yangyusong/archive/2011/06/24/352985.html</guid><wfw:comment>http://www.blogjava.net/yangyusong/comments/352985.html</wfw:comment><comments>http://www.blogjava.net/yangyusong/archive/2011/06/24/352985.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangyusong/comments/commentRss/352985.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangyusong/services/trackbacks/352985.html</trackback:ping><description><![CDATA[<div>游戏中有点击障碍点，人物走到离障碍物最近点的算法。我这给一个简单的算法，这个问题可以复杂化，另外这个问题应该由客户端来完成。<br /><br />如图，玩家在b点，点击了a点，a在一个障碍区（红色，玩家只能在障碍区外移到）。这时候玩家应该走到c点，我们就需要计算出c点，一个简单的数学题，用什么语言都没几行代码，我就用erlang写一下。<br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/path.jpg" height="193" width="355" /><br /><br />障碍物通常都不规则的，我们只能从a点开始一个个点测试，直到不是障碍点，也就是x自增，y=x*tan(A),然后测试这个点，地图数据都是静态的数据，方便测试，这里就写死一个x为障碍结束的地方作为障碍检测函数。<br /><br />我们还需要一个记录表示点，tan函数在erlang中是有的，但其实可以不用，我们就直接要一个比值，但需要一个向上取整的函数，据说是round函数，但测试一下，不行，难道是因为不是最新otp<br />D:\NetBeanPj\mytest\src&gt;erl<br />Eshell V5.8.1.1&nbsp; (abort with ^G)<br />1&gt; round(1.2).<br />1<br /><br />所以这里我们要写的一个辅助函数，最后就是我们的重点，取最近点，用一个列表解析就够了，剩下的就看具体实现吧，还可以写个测试函数，这次就不写成单元测试了。好的我们看代码：<br />-module(nearst_point).<br /><br />-export([ceil/1, is_barrier/1, nearst_point/2]).<br /><br />-export([p1/0, p2/0, test_1/0]).<br /><br />%% 一个点<br />-record(point,{<br />&nbsp;&nbsp;&nbsp; x,<br />&nbsp;&nbsp;&nbsp; y<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }).<br /><br />%% 向上取整<br />ceil(Num) -&gt;<br />&nbsp;&nbsp;&nbsp; Num1 = round(Num),<br />&nbsp;&nbsp;&nbsp; case Num1 &gt;= Num of<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; true -&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Num1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; false -&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Num1+1<br />&nbsp;&nbsp;&nbsp; end.<br /><br />%% 判断是否是障碍物<br />is_barrier(Point) -&gt;<br />&nbsp;&nbsp;&nbsp; Point#point.x =/= 5 .<br /><br />%% 查找最近点<br />nearst_point(Pointa,Pointb) -&gt;<br />&nbsp;&nbsp;&nbsp; Tan = (Pointa#point.x - Pointb#point.x)/(Pointa#point.y - Pointb#point.y),<br />&nbsp;&nbsp;&nbsp; case Pointa#point.x &gt; Pointb#point.y of<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; true -&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MaxX = Pointa#point.x,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MinX = Pointb#point.x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; false -&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MaxX = Pointb#point.x,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MinX = Pointa#point.x<br />&nbsp;&nbsp;&nbsp; end,<br />&nbsp;&nbsp;&nbsp; try<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Point = #point{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x = X,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y = ceil(X*Tan)},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case is_barrier(Point) of<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; true -&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; false -&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw(Point)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end|| X &lt;- lists:seq(MinX, MaxX)]<br />&nbsp;&nbsp;&nbsp; catch<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw: Point -&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; io:format("~p", [Point]),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Point<br />&nbsp;&nbsp;&nbsp; end.<br /><br />%% 下面函数测试用，可以改成单元测试，这里就免了<br />p1() -&gt;<br />&nbsp;&nbsp;&nbsp; #point{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x = 1,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y = 9}.<br /><br />p2() -&gt;<br />&nbsp;&nbsp;&nbsp; #point{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x = 15,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y = 25}.<br /><br />test_1() -&gt;<br />&nbsp;&nbsp;&nbsp; nearst_point(p1(),p2()).<br /><br />编译和测试<br />2&gt; c(nearst_point).<br />{ok,nearst_point}<br />3&gt; nearst_point:test_1().<br />{point,5,5}{point,5,5}<br />4&gt;<br /><br />我们的测试如预期的在5那个点得到，好像有个小问题，怎么这个点输出了两次？哦，这不是问题，一个点是代码里的io输出的，一个点是返回给shell，shell的输出，看来写代码的人太懒，疑惑也会增多啊。在nearst_point中用到了一个小技巧，就是用throw来跳出循环（这个在erlang中还是挺有意思），这次到这，应该说写的很基础很难看。下次会来点有意思的，欢迎大家学习erlang。</div><img src ="http://www.blogjava.net/yangyusong/aggbug/352985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangyusong/" target="_blank">yangyusong</a> 2011-06-24 23:54 <a href="http://www.blogjava.net/yangyusong/archive/2011/06/24/352985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>给www.bayke.com做的一个简单seo分析</title><link>http://www.blogjava.net/yangyusong/archive/2010/10/21/335821.html</link><dc:creator>yangyusong</dc:creator><author>yangyusong</author><pubDate>Thu, 21 Oct 2010 14:21:00 GMT</pubDate><guid>http://www.blogjava.net/yangyusong/archive/2010/10/21/335821.html</guid><wfw:comment>http://www.blogjava.net/yangyusong/comments/335821.html</wfw:comment><comments>http://www.blogjava.net/yangyusong/archive/2010/10/21/335821.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/yangyusong/comments/commentRss/335821.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangyusong/services/trackbacks/335821.html</trackback:ping><description><![CDATA[<p style="text-indent: 21pt"><span style="font-family: 宋体">曾经也是写</span>java<span style="font-family: 宋体">程序，如今也写起了网站，还做起了</span>seo<span style="font-family: 宋体">分析，看到雪落无声的两篇博文：《</span>SEO<span style="font-family: 宋体">新手从</span>bayke<span style="font-family: 宋体">网站建设到关键词排名第一的详细步骤》和《做为百客购物返利网</span>(bayke)<span style="font-family: 宋体">站长，哥感觉鸭梨很大</span>!<span style="font-family: 宋体">》发现在这个博客里还有不少同仁，和他一样也为了推广自己的网站，开始写关于</span>seo<span style="font-family: 宋体">的博文，就目前我所掌握给他做一些分析，不知道他会不会建议，早点发现和我聊聊。其实我和他一样，感觉很辛苦，而且我是孤军奋战，但感觉死的是自己,也就不是那么在意了，<a href="http://www.suchseo.com/">我的网站</a>建得晚，简单，效果比他的差，但相信我的分析很实用。时间有限，内容不会多。建议从第三条看起。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">我进了他的网站：</span><a href="http://www.bayke.com/">http://www.bayke.com/</a><span style="font-family: 宋体">，内容非常丰富，各种分类非常全，一个正规的购物类网站。我相信它的前途是好的，只是知道的人还太少，产生信任也要一段时间。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">好像会定时自动刷新，也许是为了实时性。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">他是</span>09<span style="font-family: 宋体">年</span>8<span style="font-family: 宋体">月建的网站，我是今年</span>10<span style="font-family: 宋体">月建的网站。他的是商业网站，我的是专业网站。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt">4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">我给他查了一下收录情况，情况如下：<br />
</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体"><img height="160" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/bkhas.jpg" width="870" border="0" /><br />
&nbsp;&nbsp;&nbsp; 也就是说谷歌对它的认同比较好，收录了</span>43<span style="font-family: 宋体">个页面（或链接），有道，必应有都有一个链接，百度收录为</span>0<span style="font-family: 宋体">，这个我怀疑不是很准，用另一家的工具查看，情况如下<br />
</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体"><img alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/bkhas1.jpg" border="0" /><br />
&nbsp;&nbsp;&nbsp; 百度有</span>26<span style="font-family: 宋体">个反向链接，雅虎有</span>43<span style="font-family: 宋体">个反向链接，说明哥们写了很多博文，发了不少链接，搜狗收录了</span>12<span style="font-family: 宋体">个链接。百度没有收录或说很少，我想原因有</span>3<span style="font-family: 宋体">，（</span>1<span style="font-family: 宋体">）可能页面的定时刷新被百度认为是作弊，（</span>2<span style="font-family: 宋体">）可能关键词的密度太低，我不知道这个是否真重要到如此程度。（</span>3<span style="font-family: 宋体">）百度是个中文网，商品网站的词对百度来说基本都是熟词，但百度几乎只收录不熟的，感觉是原创的网页。这些只是猜测。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt">5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">现在做一下密度测试，百客（或</span>bayke<span style="font-family: 宋体">）应该作为该站的一个关键词，我们看如下查询结果：<br />
</span></p>
<p style="margin-left: 17.95pt"><span style="font-family: 宋体"><img height="241" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/bkmd.jpg" width="746" border="0" /><br />
&nbsp;&nbsp;&nbsp; 结果告诉我们在首页中，关键词百客的密度是</span>0.2%<span style="font-family: 宋体">，而正常的网页在</span>2%-8%<span style="font-family: 宋体">比较恰当，当然通常不用刻意在意。</span></p>
<p style="margin-left: 17.95pt"><span style="font-family: 宋体">我们在查一下&#8220;潇洒男装&#8221;分类页中的关键字&#8220;百客&#8221;的密度，如图：<br />
</span></p>
<p style="margin-left: 17.95pt"><span style="font-family: 宋体"><img height="218" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/bkmdn.jpg" width="670" border="0" /><br />
&nbsp;&nbsp;&nbsp; 频率特别的小，我对</span>bayke<span style="font-family: 宋体">也在这两个页面查询，结果是一样。建议站长在各页做长尾关键词。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt">6.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">查了一下该站的死链接，做的特别好，没有死链接，如图<br />
</span></p>
<p style="margin-left: 17.95pt"><span style="font-family: 宋体"><img height="242" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/bkdiel.jpg" width="722" border="0" /><br />
&nbsp;&nbsp;&nbsp; 该站一共两百多站内链接，</span>20<span style="font-family: 宋体">站外链接，还能看出站长用的是</span>php<span style="font-family: 宋体">写的网站。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt">7.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">网站出错时返回</span>404<span style="font-family: 宋体">是最好的，有很多网站为了美观页面，总对</span>404<span style="font-family: 宋体">错误做重定向，导致出现</span>301<span style="font-family: 宋体">等错误，这些错误是会受到引擎处罚的。贵站这点做的不错，返回的是</span>404<span style="font-family: 宋体">，如图：<br />
</span></p>
<p style="margin-left: 17.95pt"><span style="font-family: 宋体"><img height="345" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/bk404.jpg" width="350" border="0" /><br />
&nbsp;&nbsp;&nbsp; 时间有限，下次再接着分析。欢迎到我的网站</span><a href="http://www.suchseo.com/">http://www.suchseo.com/</a><span style="font-family: 宋体">了解更多具体</span>seo<span style="font-family: 宋体">内容和对网站的分析方法。一定要看看本站分析，seo工具，这些分类，你就知道今天的分析很简单，也还算实用。</span></p>
<img src ="http://www.blogjava.net/yangyusong/aggbug/335821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangyusong/" target="_blank">yangyusong</a> 2010-10-21 22:21 <a href="http://www.blogjava.net/yangyusong/archive/2010/10/21/335821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是躲猫猫</title><link>http://www.blogjava.net/yangyusong/archive/2010/02/26/duomaomao.html</link><dc:creator>yangyusong</dc:creator><author>yangyusong</author><pubDate>Fri, 26 Feb 2010 13:39:00 GMT</pubDate><guid>http://www.blogjava.net/yangyusong/archive/2010/02/26/duomaomao.html</guid><wfw:comment>http://www.blogjava.net/yangyusong/comments/314035.html</wfw:comment><comments>http://www.blogjava.net/yangyusong/archive/2010/02/26/duomaomao.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangyusong/comments/commentRss/314035.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangyusong/services/trackbacks/314035.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 躲猫猫是云南的一个游戏，小朋友都爱玩，躲避的时间由这段话的时间来度量：&#8220;蒙猫猫，躲老耗，老耗老耗躲稳点，不给老猫拿得着，一碗油，二碗油，放个猫猫拿气球；一碗水，二碗水，放个猫猫拿小鬼&#8221;。<br />
&nbsp;&nbsp;&nbsp; 躲猫猫事件让这个词变得很热门，而这段脍炙人口的顺口溜却一直只能在云南的小朋友中口口相传，小时候还有很多顺口溜，书上并不能见，如&#8220;XXX，放个屁，放到意大利，意大利的老板在看戏，闻到这个屁，真生气...&#8221;，xxx表示任一人名。省略号是因为我记不清了，哎；再如&#8220;切切切，切韭菜，两只小猫翻锅盖&#8221;。现在就我一个人在外地，暂时还没老乡过来，玩不起脑力激荡，就回忆这两句。民间艺术是要我们快乐的，是不要钱的，流传那么多年，还是没人写出来。也许会渐渐消失，也许还是口口相传下去。很多地方，很多方言，很多的表达方式，只有我们去玩，去听，才能体会人们生活的许多乐趣。并非就普通话表达的那一点。网上也开始流行各地方言的教科书。往往都是异想天开的学生们对生活乐趣的一种表达，对自己每天用的语言的一种热爱。网络会慢慢承载更多文化，更多乐趣。<br />
&nbsp;&nbsp;&nbsp; 就写这么点了，理科生就这样，已经写不少废话。觉得有点味道就行了。</p>
<img src ="http://www.blogjava.net/yangyusong/aggbug/314035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangyusong/" target="_blank">yangyusong</a> 2010-02-26 21:39 <a href="http://www.blogjava.net/yangyusong/archive/2010/02/26/duomaomao.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>打包——izpack(2)</title><link>http://www.blogjava.net/yangyusong/archive/2008/11/24/izpack_2.html</link><dc:creator>yangyusong</dc:creator><author>yangyusong</author><pubDate>Mon, 24 Nov 2008 12:01:00 GMT</pubDate><guid>http://www.blogjava.net/yangyusong/archive/2008/11/24/izpack_2.html</guid><wfw:comment>http://www.blogjava.net/yangyusong/comments/242351.html</wfw:comment><comments>http://www.blogjava.net/yangyusong/archive/2008/11/24/izpack_2.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangyusong/comments/commentRss/242351.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangyusong/services/trackbacks/242351.html</trackback:ping><description><![CDATA[&nbsp;
<p style="margin-left: 17.95pt; text-indent: 10.5pt"><span style="font-family: 宋体">现在我们接着玩上次的试验结果，双击生成的</span>install.jar<span style="font-family: 宋体">运行安装，如下图：<br />
</span></p>
<p style="margin-left: 17.95pt; text-indent: 10.5pt; text-align: center" align="center"><span style="font-family: 宋体"><img height="172" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/image003iz.png" width="214" border="0" /><br />
图</span>lzPack1-1</p>
<p style="margin-left: 17.95pt; text-indent: 10.5pt"><span style="font-family: 宋体">下一步如图：（你发现和</span>lzPack<span style="font-family: 宋体">本身的安装过程和界面是一样的，不过也已经够漂亮了，是吧）（以后都是下一步的图）</span><br />
</p>
<p style="margin-left: 17.95pt; text-indent: 10.5pt; text-align: center" align="center"><span style="font-family: 宋体"><img alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/image005iz.png" border="0" /><br />
<span style="font-family: 宋体">图</span>lzPack1-2<br />
<br />
</span><span style="font-family: 宋体"><img height="477" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/image007iz.png" width="640" border="0" /><br />
图lzPack1-3<br />
</span></p>
<p style="margin-left: 17.95pt; text-indent: 10.5pt; text-align: center" align="center"><span style="font-family: 宋体"><img height="477" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/image009iz.png" width="637" border="0" /><br />
图lzPack1-4<br />
</span></p>
<p style="margin-left: 17.95pt; text-indent: 10.5pt; text-align: center" align="center"><span style="font-family: 宋体"><img height="476" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/image011iz.png" width="639" border="0" /><br />
图lzPack1-5</span></p>
<p style="margin-left: 17.95pt; text-indent: 10.5pt; text-align: center" align="center"><span style="font-family: 宋体"><img height="480" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/image013iz.png" width="642" border="0" /><br />
图lzPack1-6<br />
<img height="468" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/image015iz.png" width="633" border="0" /><br />
图lzPack1-7<br />
</span></p>
<p style="margin-left: 17.95pt; text-indent: 10.5pt; text-align: center" align="center"><span style="font-family: 宋体"><img height="477" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/image017iz.png" width="638" border="0" /><br />
图lzPack1-8<br />
<br />
</span></p>
<p style="margin-left: 17.95pt; text-indent: 10.5pt"><span style="font-family: 宋体">&nbsp; 点击</span>Done<span style="font-family: 宋体">完成安装</span></p>
<p style="margin-left: 17.95pt; text-indent: 10.5pt"><span style="font-family: 宋体">&nbsp; 看看我们</span>sample<span style="font-family: 宋体">的结构（即要安装的软件）<br />
</span></p>
<p style="margin-left: 17.95pt; text-indent: 10.5pt; text-align: center" align="center"><span style="font-family: 宋体"><img height="188" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/image019iz.png" width="635" border="0" /><br />
图</span>lzPack1-9</p>
<p style="margin-left: 17.95pt; text-indent: 10.5pt"><span style="font-family: 宋体">&nbsp; 看看安装好的文件结构<br />
</span></p>
<p style="margin-left: 17.95pt; text-indent: 10.5pt; text-align: center" align="center"><span style="font-family: 宋体"><img height="181" alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/image021iz.png" width="521" border="0" /><br />
图</span>lzPack1-10</p>
<p style="margin-left: 17.95pt; text-indent: 10.5pt"><span style="font-family: 宋体">少了一个文件</span>listener<span style="font-family: 宋体">，多了一个文件</span>uninstaller,<span style="font-family: 宋体">进入</span>uninstaller<span style="font-family: 宋体">双击</span>uninstaller.jar<span style="font-family: 宋体">就看到卸载界面了（超简单的界面，就不贴了）。我们在回头看看那个配置文件</span>install.xml,<span style="font-family: 宋体">如下：</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&lt;?</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">xml version="1.0" encoding="iso-8859-1" standalone="yes" </span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">?&gt;</span></p>
<p style="margin-left: 12pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</strong></a> </span></span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&lt;!--</span></p>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp; A sample installation file.</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp; Use it as a base for your own installers :-)</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp; </span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp;&nbsp;To compile it :</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp; - go in the bin directory where you installed IzPack</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp; - call "compile ../sample/install.xml -b ../sample"</span></pre>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> --&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</span></strong></a> &lt;installation version="<strong>1.0</strong>"&gt;</span></p>
<p style="margin-left: 12pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</strong></a> </span></span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&lt;!--</span></p>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The info section.</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The meaning of the tags should be natural ...</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp; </span></pre>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> --&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</span></strong></a> &lt;info&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;appname&gt;Sample Installation&lt;/appname&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;appversion&gt;1.4 beta 666&lt;/appversion&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</span></strong></a> &lt;authors&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;author name="<strong>JPz</strong>" email="<strong>jpz@superman.org</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;author name="<strong>Hidden Man</strong>" email="<strong>hidden@hisdomain.com</strong>" /&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;/authors&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;url&gt;http://www.anotherworld-inspace-website.net/&lt;/url&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;/info&gt;</span></p>
<p style="margin-left: 12pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</strong></a> </span></span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&lt;!--</span></p>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The gui preferences indication.</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sets the installer window to 640x480. It will not be able to change the size.</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp; </span></pre>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> --&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;guiprefs width="<strong>640</strong>" height="<strong>480</strong>" resizable="<strong>no</strong>" /&gt; </span></p>
<p style="margin-left: 12pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</strong></a> </span></span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&lt;!--</span></p>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The locale section.</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Asks here to include the English and French langpacks.</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp; </span></pre>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> --&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</span></strong></a> &lt;locale&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;langpack iso3="<strong>eng</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;langpack iso3="<strong>fra</strong>" /&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;/locale&gt;</span></p>
<p style="margin-left: 12pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</strong></a> </span></span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&lt;!--</span></p>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The resources section.</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The ids must be these ones if you want to use the LicencePanel and/or the InfoPanel.</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp; </span></pre>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> --&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</span></strong></a> &lt;resources&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;res id="<strong>LicencePanel.licence</strong>" src="<strong>Licence.txt</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;res id="<strong>InfoPanel.info</strong>" src="<strong>Readme.txt</strong>" /&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;/resources&gt;</span></p>
<p style="margin-left: 12pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</strong></a> </span></span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&lt;!--</span></p>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The panels section.</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; We indicate here which panels we want to use. The order will be respected.</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp; </span></pre>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> --&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</span></strong></a> &lt;panels&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;panel classname="<strong>HelloPanel</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;panel classname="<strong>InfoPanel</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;panel classname="<strong>LicencePanel</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;panel classname="<strong>TargetPanel</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;panel classname="<strong>PacksPanel</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;panel classname="<strong>InstallPanel</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;panel classname="<strong>FinishPanel</strong>" /&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;/panels&gt;</span></p>
<p style="margin-left: 12pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</strong></a> </span></span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&lt;!--</span></p>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The packs section.</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; We specify here our packs.</span></pre>
<pre style="margin-left: 12pt"><span style="color: #888888">&nbsp;&nbsp;&nbsp; </span></pre>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> --&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</span></strong></a> &lt;packs&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</span></strong></a> &lt;pack name="<strong>Base</strong>" required="<strong>yes</strong>"&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;description&gt;The base files&lt;/description&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;file src="<strong>Readme.txt</strong>" targetdir="<strong>$INSTALL_PATH</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;file src="<strong>Licence.txt</strong>" targetdir="<strong>$INSTALL_PATH</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;file src="<strong>script.bat</strong>" targetdir="<strong>$INSTALL_PATH</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;parsable targetfile="<strong>$INSTALL_PATH/script.bat</strong>" /&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">- &lt;!-- </span></p>
<pre style="margin-left: 12pt; text-indent: -12pt"><span style="color: #888888">&nbsp;The file will be parsed </span></pre>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> --&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;/pack&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</span></strong></a> &lt;pack name="<strong>Docs</strong>" required="<strong>no</strong>"&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;description&gt;The documentation&lt;/description&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;file src="<strong>doc</strong>" targetdir="<strong>$INSTALL_PATH</strong>" /&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">- &lt;!-- </span></p>
<pre style="margin-left: 12pt; text-indent: -12pt"><span style="color: #888888">&nbsp;Reccursive adding </span></pre>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> --&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;/pack&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</span></strong></a> &lt;pack name="<strong>Sources</strong>" required="<strong>no</strong>"&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;description&gt;The sources&lt;/description&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;file src="<strong>src</strong>" targetdir="<strong>$INSTALL_PATH</strong>" /&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;/pack&gt;</span></p>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;/packs&gt;</span></p>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;/installation&gt;</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; font-family: 宋体">&nbsp;我算它是七段，第一段</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&lt;</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">installation version</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">="</span><strong><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">1.0</span></strong><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">"&gt;</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;声明安装的版本</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; color: black; font-family: 宋体">第二段</span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&lt;</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">info</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;appname&gt;Sample Installation&lt;/appname&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;appversion&gt;1.4 beta 666&lt;/appversion&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</span></strong></a> &lt;authors&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;author name="<strong>JPz</strong>" email="<strong>jpz@superman.org</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;author name="<strong>Hidden Man</strong>" email="<strong>hidden@hisdomain.com</strong>" /&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;/authors&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;url&gt;http://www.anotherworld-inspace-website.net/&lt;/url&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;/info&gt;</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;声明软件的基本信息：名称、版本、各个作者和联系方式、公司主页。对应图</span><span style="font-size: 10pt; color: black; font-family: 'Verdana','sans-serif'">lzPack1-2</span><span style="font-size: 10pt; color: black; font-family: 宋体">。</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; color: black; font-family: 宋体">第三段</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&lt;</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">guiprefs</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> width="<strong>640</strong>" height="<strong>480</strong>" resizable="<strong>no</strong>" /&gt;</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; color: black; font-family: 宋体">设置安装导航的宽高等属性。</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; color: black; font-family: 宋体">第四段</span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&lt;</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">locale</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;langpack iso3="<strong>eng</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;langpack iso3="<strong>fra</strong>" /&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;/locale&gt;</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;语言选择，对应图</span><span style="font-family: 宋体">图</span>lzPack1-1<span style="font-family: 宋体">。</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-family: 宋体">第五段</span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&lt;</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">resources</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;res id="<strong>LicencePanel.licence</strong>" src="<strong>Licence.txt</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;res id="<strong>InfoPanel.info</strong>" src="<strong>Readme.txt</strong>" /&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;/resources&gt;</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; font-family: 宋体">&nbsp;提供两个资源给客户阅读，对应两个界面，图</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">lzPack1-3</span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">lzPack1-4</span><span style="font-size: 10pt; font-family: 宋体">。分别为软件说明和基本条款。</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; font-family: 宋体">第六段</span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&lt;</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">panels</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;panel classname="<strong>HelloPanel</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;panel classname="<strong>InfoPanel</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;panel classname="<strong>LicencePanel</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;panel classname="<strong>TargetPanel</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;panel classname="<strong>PacksPanel</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;panel classname="<strong>InstallPanel</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;panel classname="<strong>FinishPanel</strong>" /&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;/panels&gt;</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;说明顺序下来都经过那些界面。</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; color: black; font-family: 宋体">第七段</span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&lt;</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">packs</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</span></strong></a> &lt;pack name="<strong>Base</strong>" required="<strong>yes</strong>"&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;description&gt;The base files&lt;/description&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;file src="<strong>Readme.txt</strong>" targetdir="<strong>$INSTALL_PATH</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;file src="<strong>Licence.txt</strong>" targetdir="<strong>$INSTALL_PATH</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;file src="<strong>script.bat</strong>" targetdir="<strong>$INSTALL_PATH</strong>" /&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;parsable targetfile="<strong>$INSTALL_PATH/script.bat</strong>" /&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">- &lt;!-- </span></p>
<pre style="margin-left: 12pt; text-indent: -12pt"><span style="color: #888888">&nbsp;The file will be parsed </span></pre>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> --&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;/pack&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</span></strong></a> &lt;pack name="<strong>Docs</strong>" required="<strong>no</strong>"&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;description&gt;The documentation&lt;/description&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;file src="<strong>doc</strong>" targetdir="<strong>$INSTALL_PATH</strong>" /&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">- &lt;!-- </span></p>
<pre style="margin-left: 12pt; text-indent: -12pt"><span style="color: #888888">&nbsp;Reccursive adding </span></pre>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> --&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;/pack&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"><a href="file:///E:/Program%20Files/IzPack/sample/install.xml"><strong><span style="color: red; font-family: 'Courier New'">-</span></strong></a> &lt;pack name="<strong>Sources</strong>" required="<strong>no</strong>"&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;description&gt;The sources&lt;/description&gt; </span></p>
<p style="margin-left: 24pt; text-indent: -24pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;file src="<strong>src</strong>" targetdir="<strong>$INSTALL_PATH</strong>" /&gt; </span></p>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;/pack&gt;</span></p>
<p style="margin-left: 12pt; text-indent: -12pt">&nbsp;<span style="font-size: 10pt; font-family: 'Verdana','sans-serif'"> &lt;/packs&gt;</span></p>
<p style="margin-left: 24pt; text-indent: -24pt"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp; 提供了要复制的文件夹结构，由</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&lt;</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">packs</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&gt;</span><span style="font-size: 10pt; font-family: 宋体">标签包括</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp; 共有三个包，每个包由</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&lt;</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">pack</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&gt;</span><span style="font-size: 10pt; color: #0d0d0d; font-family: 宋体">标签标识</span><span style="font-size: 10pt; color: black; font-family: 宋体">，</span><span style="font-size: 10pt; color: black; font-family: 'Verdana','sans-serif'"> name=&#8221;base&#8221; </span><span style="font-size: 10pt; color: black; font-family: 宋体">的包为基本包，包括所有文件和文件夹的文件夹，其下包括三个文件。</span><strong><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">$INSTALL_PATH</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">即安装路径，由用户给出</span></strong></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp; 包</span><span style="font-size: 10pt; color: black; font-family: 'Verdana','sans-serif'">Docs </span><span style="font-size: 10pt; color: black; font-family: 宋体">是文件夹</span><strong><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">doc</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">。</span></strong></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&nbsp; &lt;</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">file</span><span style="font-size: 10pt; color: black; font-family: 'Verdana','sans-serif'"> &gt;</span><span style="font-size: 10pt; color: black; font-family: 宋体">元素标明文件或文件夹，</span><span style="font-size: 10pt; color: black; font-family: 'Verdana','sans-serif'">src</span><span style="font-size: 10pt; color: black; font-family: 宋体">属性为文件或文件夹名，</span><span style="font-size: 10pt; color: black; font-family: 'Verdana','sans-serif'">targetdir</span><span style="font-size: 10pt; color: black; font-family: 宋体">属性为要放到的路径</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp; 包</span><span style="font-size: 10pt; color: black; font-family: 'Verdana','sans-serif'">Sources</span><span style="font-size: 10pt; color: black; font-family: 宋体">是文件夹</span><span style="font-size: 10pt; color: black; font-family: 'Verdana','sans-serif'">src</span><span style="font-size: 10pt; color: black; font-family: 宋体">。</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp; 整个文件结构和关系就由最后这一段来阐释。</span></p>
<p style="margin-left: 12pt; text-indent: -12pt"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; 另外，包</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&lt;</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">pack</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'">&gt;</span><span style="font-size: 10pt; color: #0d0d0d; font-family: 宋体">还可以有其他的用途，下一节是个较实用的实例，你会看到它的用途，要不我们打的包都和</span><span style="font-size: 10pt; color: #0d0d0d; font-family: 'Verdana','sans-serif'">izpack</span><span style="font-size: 10pt; color: #0d0d0d; font-family: 宋体">一样光秃秃的，没快捷键，没环境变量，在实践中我们慢慢发现光明，原来有趣的东西等着我们去探索。</span></p>
<img src ="http://www.blogjava.net/yangyusong/aggbug/242351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangyusong/" target="_blank">yangyusong</a> 2008-11-24 20:01 <a href="http://www.blogjava.net/yangyusong/archive/2008/11/24/izpack_2.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>打包——IzPack（1）</title><link>http://www.blogjava.net/yangyusong/archive/2008/11/24/IzPack_1.html</link><dc:creator>yangyusong</dc:creator><author>yangyusong</author><pubDate>Mon, 24 Nov 2008 10:47:00 GMT</pubDate><guid>http://www.blogjava.net/yangyusong/archive/2008/11/24/IzPack_1.html</guid><wfw:comment>http://www.blogjava.net/yangyusong/comments/242331.html</wfw:comment><comments>http://www.blogjava.net/yangyusong/archive/2008/11/24/IzPack_1.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/yangyusong/comments/commentRss/242331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangyusong/services/trackbacks/242331.html</trackback:ping><description><![CDATA[&nbsp;
<p style="text-indent: 10.5pt"><span style="font-family: 宋体">网页上简绍一堆开源打包软件，你饶有兴趣的在那阅读，发现</span>IzPack<span style="font-family: 宋体">就是你很理想的打包软件，点开详细简绍，看到了软件的开源网址（这是基本规律嘛，没给俺就</span>google<span style="font-family: 宋体">、</span>baidu<span style="font-family: 宋体">）</span><a href="http://izpack.org/">http://izpack.org</a><span style="font-family: 宋体">，常规你看到了</span>download<span style="font-family: 宋体">的按钮，点吧，不用等网页完全打开，就进入了</span><a href="http://izpack.org/downloads/">http://izpack.org/downloads/</a><span style="font-family: 宋体">页面，就只顾找下载的那个链接去，当迅雷下着软件的时候，你在看此页面的各标题，确定重点段落阅读一下，发现没有教你怎么用的，就最初的那个链接也是草草讲了一点无关紧要的然后就叫你上官方网站找学的。不用急，软件下完了，咱先安装，看自述不就行了。</span></p>
<p>&nbsp;<span style="font-family: 宋体">就软件的安装界面来看，它打出来的包也挺不错，这算一种自身思考吧。安装完毕时，它叫保存什么东西？连什么格式也弄不清（好几个点呢），随便取名保存吧。失望的是，它没有弹出自述文件，看看桌面上，从开始菜单进去一看，有卸载和帮助，就是没有启动。你是不是该怀疑你下载的东西被人做过手脚，可这是官方的呀。简单，问题来了。我们就想关键字，</span>google<span style="font-family: 宋体">上输入软件名&#8220;</span>IzPack<span style="font-family: 宋体">&#8221;，点击相关搜索</span> <span style="font-family: 宋体">&#8220;</span>lzpack<span style="font-family: 宋体">使用&#8221;。看了几个简绍的，教学大同小异，知道有大概策略，却无从下手，关键就在于写文章的不像我一样喜欢搞策略，总是没我需要的实际，高效。他们往往会讲重点，但却不注意切入点，在大学听课也经常这样，让你痛苦不已，就像被蚊子叮了，挠痒痒的只挠旁边。总是看不到你的存在。</span></p>
<p>&nbsp;<span style="font-family: 宋体">那些重点、难点你已经知道是那些就行了（其实还不用知道，知道是为了先跳过），只细致的搜寻这你要的切入点。有一个网页说有两三种用</span>IzPack<span style="font-family: 宋体">的方法，只是概述那种也把责任推给官方。不幸看到一网站这一段&#8220;这个</span>software<span style="font-family: 宋体">的基本思想就是，它给你提供了许多安装步骤所需要的</span>panel<span style="font-family: 宋体">（比如选择安装路径、选择安装的内容、观看</span>License<span style="font-family: 宋体">等等），然后你自己写一个</span>install.xml<span style="font-family: 宋体">文件将你自己软件的信息、安装需要的步骤、以及安装的资源等等都写进这个文件里，然后使用它所提供的</span>compile<span style="font-family: 宋体">批处理文件编译这个文件</span>(e.g. compile install.xml)<span style="font-family: 宋体">，它就会自动生成一个</span>install.jar<span style="font-family: 宋体">的可执行</span>Java<span style="font-family: 宋体">包。至此，整个过程就结束了，双击这个</span>install.jar<span style="font-family: 宋体">，就能启动</span>install<span style="font-family: 宋体">界面。&#8221;，可以想到应该用命令行的方式来用这个软件，其实这个想法早出来了，因为，桌面上也没有</span>lzPack<span style="font-family: 宋体">的快捷方式。可我使用命令上就只会如 </span>Javac xx.java <span style="font-family: 宋体">这一种，不过这一点也够了，我已经萌生了一个测试策略。不就是命令加参数吗？验证一下再看其他的。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">用</span>cmd<span style="font-family: 宋体">进入软件的</span>bin<span style="font-family: 宋体">目录（</span>compile.bat<span style="font-family: 宋体">在这里）</span></p>
<p style="margin-left: 18pt; text-indent: -18pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">软件附有样例这是常规，进入软件目录</span>IzPack<span style="font-family: 宋体">下的</span>sample(<span style="font-family: 宋体">只有一个</span>xml,compile <span style="font-family: 宋体">处理的就应该是</span>xml<span style="font-family: 宋体">，总共只有一个样例，当然所有东西全用</span>)<span style="font-family: 宋体">，全选，复制，贴入</span>bin<span style="font-family: 宋体">目录下（不用怕混了，到时咱对照着删就是了）。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(<span style="font-family: 宋体">输入什么呢，应该以</span>bat<span style="font-family: 宋体">文件为命令吧，以所要处理的文件为参数。那就</span>)<span style="font-family: 宋体">输入</span></p>
<p style="margin-left: 18pt">Compile install.xml </p>
<p style="margin-left: 18pt"><span style="font-family: 宋体">&nbsp; 有输出，有许多文字在输出，你已经露微笑了，不幸命中，就是这么用，一看</span>bin<span style="font-family: 宋体">中多了个</span>install.jar,<span style="font-family: 宋体">就更放心了。双击看看，哦，原来是个语言选择界面。那么你该处理&#8220;策略垃圾&#8221;了，你同时打开</span>bin<span style="font-family: 宋体">目录和</span>sample<span style="font-family: 宋体">目录对比着把</span>bin<span style="font-family: 宋体">中复制来的文件一个一个删掉（这只是一种严慎的行为，因为错误总会随时降临）。</span></p>
<p style="margin-left: 18pt">&nbsp; Bin<span style="font-family: 宋体">未删</span>sample里复制过来的文件<span style="font-family: 宋体">时如下图：<br />
</span></p>
<p style="margin-left: 18pt"><span style="font-family: 宋体"><img alt="" src="http://www.blogjava.net/images/blogjava_net/yangyusong/image001iz.png" border="0" /><br />
&nbsp; 你其实挺兴奋，严格记下你的第一次，以备以后快速进入和研究，于是你还把</span>cmd<span style="font-family: 宋体">上留下的命令行输出复制出来留待研究。而且你的很多策略也出来了，那个</span>sample<span style="font-family: 宋体">就是你参照的对象，写</span>xml<span style="font-family: 宋体">可以仿写，</span>sample<span style="font-family: 宋体">的结构有多复杂，你打包处理的软件就至少能有这么复杂。对，</span>start<span style="font-family: 宋体">里面的帮助文档还没使用呢，下次肯定得用上。其实你在做这个测试的时候都是数着步数的，因为你想看看和上次相比，这软件最快的使用方式有多大差别，对，每次你都用</span>sample<span style="font-family: 宋体">来数你开始的步伐了吗？</span> </p>
<p style="margin-left: 18pt"><span style="font-family: 宋体">&nbsp; 这是在</span>cmd<span style="font-family: 宋体">里的操作和输出，不是很有意义，仅作为一种完整性贴这。</span></p>
<p style="margin-left: 18pt">C:"Documents and Settings"yys&gt;cd E:"Program Files"IzPack"bin</p>
<p style="margin-left: 18pt">C:"Documents and Settings"yys&gt;e:</p>
<p style="margin-left: 18pt">E:"Program Files"IzPack"bin&gt;compile install.xml</p>
<p style="margin-left: 18pt">.::&nbsp;IzPack - Version 4.1.0 ::.</p>
<p style="margin-left: 18pt">&lt; compiler specifications version: 1.0 &gt;</p>
<p style="margin-left: 18pt">- Copyright (c) 2001-2008 Julien Ponge</p>
<p style="margin-left: 18pt">- Visit http://izpack.org/ for the latest releases</p>
<p style="margin-left: 18pt">- Released under the terms of the Apache Software License version 2.0.</p>
<p style="margin-left: 18pt">-&gt; Processing&nbsp;: install.xml</p>
<p style="margin-left: 18pt">-&gt; Output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : install.jar</p>
<p style="margin-left: 18pt">-&gt; Base path&nbsp;&nbsp; : .</p>
<p style="margin-left: 18pt">-&gt; Kind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : standard</p>
<p style="margin-left: 18pt">-&gt; Compression : default</p>
<p style="margin-left: 18pt">-&gt; Compr. level: -1</p>
<p style="margin-left: 18pt">-&gt; IzPack home : .</p>
<p style="margin-left: 18pt">Adding resource: IzPack.uninstaller</p>
<p style="margin-left: 18pt">Setting the installer information</p>
<p style="margin-left: 18pt">Setting the GUI preferences</p>
<p style="margin-left: 18pt">Adding langpack: eng</p>
<p style="margin-left: 18pt">Adding resource: flag.eng</p>
<p style="margin-left: 18pt">Adding langpack: fra</p>
<p style="margin-left: 18pt">Adding resource: flag.fra</p>
<p style="margin-left: 18pt">Adding resource: LicencePanel.licence</p>
<p style="margin-left: 18pt">Adding resource: InfoPanel.info</p>
<p style="margin-left: 18pt">Adding content of jar: file:/E:/Program%20Files/IzPack/lib/standalone-compiler.j</p>
<p style="margin-left: 18pt">ar!/bin/panels/HelloPanel.jar</p>
<p style="margin-left: 18pt">Adding content of jar: file:/E:/Program%20Files/IzPack/lib/standalone-compiler.j</p>
<p style="margin-left: 18pt">ar!/bin/panels/InfoPanel.jar</p>
<p style="margin-left: 18pt">Adding content of jar: file:/E:/Program%20Files/IzPack/lib/standalone-compiler.j</p>
<p style="margin-left: 18pt">ar!/bin/panels/LicencePanel.jar</p>
<p style="margin-left: 18pt">Adding content of jar: file:/E:/Program%20Files/IzPack/lib/standalone-compiler.j</p>
<p style="margin-left: 18pt">ar!/bin/panels/TargetPanel.jar</p>
<p style="margin-left: 18pt">Adding content of jar: file:/E:/Program%20Files/IzPack/lib/standalone-compiler.j</p>
<p style="margin-left: 18pt">ar!/bin/panels/PacksPanel.jar</p>
<p style="margin-left: 18pt">Adding content of jar: file:/E:/Program%20Files/IzPack/lib/standalone-compiler.j</p>
<p style="margin-left: 18pt">ar!/bin/panels/InstallPanel.jar</p>
<p style="margin-left: 18pt">Adding content of jar: file:/E:/Program%20Files/IzPack/lib/standalone-compiler.j</p>
<p style="margin-left: 18pt">ar!/bin/panels/FinishPanel.jar</p>
<p style="margin-left: 18pt">Building installer jar: E:"Program Files"IzPack"bin"install.jar</p>
<p style="margin-left: 18pt">[ Begin ]</p>
<p style="margin-left: 18pt">Copying the skeleton installer</p>
<p style="margin-left: 18pt">Copying 7 files into installer</p>
<p style="margin-left: 18pt">Merging 7 jars into installer</p>
<p style="margin-left: 18pt">Writing 3 Packs into installer</p>
<p style="margin-left: 18pt">Writing Pack 0: Base</p>
<p style="margin-left: 18pt">Writing Pack 1: Docs</p>
<p style="margin-left: 18pt">Writing Pack 2: Sources</p>
<p style="margin-left: 18pt">[ End ]</p>
<p style="margin-left: 18pt">Build time: Thu Oct 30 20:08:24 CST 2008</p>
<p style="margin-left: 18pt">E:"Program Files"IzPack"bin&gt;</p>
<p style="margin-left: 18pt">&nbsp;&nbsp; <span style="font-family: 宋体">从</span>cmd<span style="font-family: 宋体">输出的你能看到我用的命令就是刚才写的，就那么一条，然后输出它打包的过程，</span>xml<span style="font-family: 宋体">配置有问题的话，就会编译不过去。<br />
&nbsp; 同样izpack是个小巧的开源软件，用大部分用java写的，离不开java环境，打出的包就一jar文件，比起installsheild轻省多了，但问题也来了，客户要安装你的软件就要安装jdk，以后我们会解决这问题。<br />
&nbsp;下节看看我们的结果并简单研究一下要配置的xml。</span></p>
<img src ="http://www.blogjava.net/yangyusong/aggbug/242331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangyusong/" target="_blank">yangyusong</a> 2008-11-24 18:47 <a href="http://www.blogjava.net/yangyusong/archive/2008/11/24/IzPack_1.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>