Redo cmd + Z
格式化粘贴 alt + cmd + V
重构 cmd + J
回到选取位置 cmd + j
切换到Project界面 cmd + 0
切换到Debug界面 cmd + R
清空控制台 cmd + ctrl + alt + r
运行 cmd + r
一直都在关注着智能手机,觉得这个圈子真是越来越好玩了.
- 万众期待的iPhone 第4代.
没有任何官方消息,但正因为这样,所以传闻满天地飞,有的说OS 4会有多任务已经是板上钉钉的事,有的说第4代iPhone会改变分辨率变成 960 x 640(估计此人是看了iPad可以拉伸运行iPhone上的软件然后杜撰的).想想之前iPad没出来之前的各种想象力惊人的猜测,最后乔帮主只拿出一只放大了的iPhone来证明网民的想象力是惊人的.想必第二天顶着熊猫眼去上班的同学对乔帮主的怨念不是一般的大吧.
iPhone已经是头上有光环的主了,第四代就算只是改改按钮的大小,只要把多任务放出来,大家照样是今天早上去排队,等着明天天黑时可以轮到自己买.不得不说iPhone的操作的舒适程度真是无机能及.
其实我觉得苹果已经不需要给iPhone做广告了,这三年来,无数的iPhone杀手已经演译了无数个广告,但是最佳男主角无一例外都是iPhone.
很多人/公司总是拿iPhone的封闭平台说事,又拿App Store的审查制度说事,却不明白这才是iPhone无数优秀软件的保证,虽然当中也有些会令一部份人不爽的事情发生,可是无规则不能成方圆,有时候是要拥抱限制的.(这些话说出来可以会引起骂战的,就此打住,不多说.)
- 微软卷土重来的Windows Phone 7
- 拍烂了手掌的Palm Web OS
- 当红炸子鸡Android
当初android刚刚出来的时候,我是很喜欢这个操作系统的,两个原因:一是它使用的开发语言是java,我正是一个java的程序员;第二是Google.但是后来越来越多的android手机出现,android的版本开始分裂,这就令人很不爽了,尤其是开发者,不得不为兼容无数手机写代码啊,这个事我是有着深刻体验的,如果有做Web开发的同学,想想为了兼容不同的浏览修改页面时,对微软家的IE三兄弟的那个恨啊,你就明白这个痛苦了.我不喜欢Android正是源于对这种痛苦有过深刻的体验.
Android的软件在不同的手机上的表现就是一个大大的杯具.手机的硬件注定就不如PC那样划一整齐,所以手机上的操作系统还是封闭的好,这样才会有最佳的操作体验.比如iPhone,还有未来的WP7.
- 笨拙的手机巨人Nokia
- 保守而上进的黑莓
- 就是没有1.0的M8
其实也就是平时八卦一下跟智能手机有关的新闻,偶尔心血来潮时写的.
我觉得魅族公司是很不错的,虽然魅族论坛上的魅友们有着堪比五毛的精神和行为,但是魅族有魅力开发属于自己的系统(基于WinCE的,但是做得还做得不错),总比OMS之流的要强上N倍,N趋向于无穷大.国产神机四个字当之无愧,请注意这绝对是褒义的.
哈哈· 我用的也是M8,魅族的My系统确实做的好,起码我觉得比多普达上面的wm好用多了· 超接近苹果,0.9.X的固件UI和网络上流传的window phone7 很像哦·很多地方的用户习惯都接近了 ·
非常喜欢黑莓和Apple的系统。
Nokia的用户体验确实很久不进步了。
Android注定是山寨机的乐园,没有任何前途。
3D技术对我们来说已经非常熟悉了,最常用的3D API有OpenGL和Microsoft的Direct 3D,在桌面游戏中早已广泛应用。对于J2ME程序而言,Mobile 3D Graphics API(JSR184)的出现,使得为手机应用程序添加3D功能成为可能。
JSR184标准(M3G:Mobile 3D Graphics)为Java移动应用程序定义了一个简洁的3D API接口,J2ME程序可以非常方便地使用M3G来实现3D应用比如游
戏等等。M3G被设计为非常轻量级的,整个API的完整实现不超过150kb。
如果熟悉OpenGL技术,那么M3G是非常容易理解的。在JSR-184中,Graphics3D是3D渲染的屏幕接口,World代表整个虚拟3D场景,包括Camera(用于设置观察者视角)、Light(灯光)、Background(背景)和树型结构的任意数量的3D物体。Camera默认是朝向Z轴的负方向。3D对象在计算机中用点(Point,Pixel)、线(Line,Polyline,Spline)、面(Mesh)来描述,各个物体都是由Mesh类创建的。不同的Mesh属性对应不同的物体。构造物体时
,先要构造物体的骨架(即形状),然后用一种材料蒙到骨架上。物体的形状,是由一组点和每个点的法向量决定的。材料则可以选择为图片。物体的具体存储和运算(如旋转、投影、特技处理)等动作都是矩阵运算和变换。
M3G是J2ME的一个可选包,以OpenGL为基础的精简版,总共约有250个方法及30个类,运行在CLDC1.1/CLDC2.0上(必须支持浮点运算),可以在MIDP1.0和MIDP2.0中使用。目前,支持M3G的手机有Nokia 6230/3650/7650/6600、Siemens S65/CX65/S55/M55、Sony-Ericsson K700i/P800/P900、Moto 220/T720等。M3G只是一个Java接口,具体的底层3D引擎一般由C代码实现,比如许多手机厂商的3D引擎采用的便是SuperScape公司的Swerve引擎,这是一个专门为移动设备设计的高性能3D引擎。
类似于Microsoft的D3D,M3G支持两种3D模式:立即模式(immediate mode)和保留模式(retained mode)。在立即模式下,开发者必须手动渲染每一帧,从而获得较快的速度,但代码较繁琐;在保留模式下,开发者只需设置好关键帧,剩下的动画由M3G完成,代码较简单,但速度较慢。M3G也允许混合使用这两种模式。
3D模型可以在程序中创建,但是非常繁琐。因此,M3G提供一个Loader类,允许直接从一个单一的.m3g文件中读入全部3D场景。m3g文件可以通过3D Studio Max之类的软件创建。
M3G基于的需求如下:
1)支持保留的场景图形模式;
2)支持直接访问模式;
3)支持两种模式的混合;
4)支持建模,结构,材质以及场景,灯光的三维要素;
5)支持虚拟的浮点运算,不需要硬件支持的浮点运算;
6)保证大小在实际终端小于150K
7)高效的垃圾收集机制(我个人觉得这点非常的重要)
8)能很好的和MIDP相关的应用接口衉作(当然指的就是Canvas)
Mobile 3D Graphics API中有几个比较重要的类:
基本的程序框架:
M3GCanvas.java:
import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.game.GameCanvas; import javax.microedition.m3g.Graphics3D; import javax.microedition.m3g.World; public class M3GCanvas extends GameCanvas implements Runnable { public static final int FPS = 20; //每秒绘制的帧数 private Graphics3D g3d; private World world; private boolean runnable=true; private Thread thread; protected M3GCanvas() { // 不抑制按钮事件 super(false); setFullScreenMode(true); g3d = Graphics3D.getInstance(); world = new World(); } public void run() { Graphics g = getGraphics(); while (runnable) { long startTime = System.currentTimeMillis(); // 处理游戏逻辑 try { // Binds the given Graphics or mutable Image2D // as the rendering target of this Graphics3D g3d.bindTarget(g); g3d.render(world); // Render the world } finally { g3d.releaseTarget(); } flushGraphics(); long endTime = System.currentTimeMillis(); long costTime = endTime - startTime; if(costTime<1000/FPS) { try{ Thread.sleep(1000/FPS-costTime); } catch(Exception e){ e.printStackTrace(); } } } System.out.println("Canvas stopped"); } public void start() { thread=new Thread(this); thread.start(); } public void stop() { this.runnable=false; try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } }
M3GDemo.java:
import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class M3GDemo extends MIDlet implements CommandListener { private M3GCanvas canvas; public M3GDemo() { this.canvas=new M3GCanvas(); } protected void destroyApp(boolean unconditional) throws MIDletStateChangeException { this.canvas.stop(); } protected void pauseApp() { } protected void startApp() throws MIDletStateChangeException { Display.getDisplay(this).setCurrent(this.canvas); this.canvas.start(); } public void commandAction(Command c, Displayable d) { notifyDestroyed(); } }