博文
转贴 在MIDP2.0中操作图片像素(2007-05-08 20:31:00)
摘要:正文
我们知道,在MIDP1.0中,除非我们利用特定厂商的API(比如Nokia),我们是没法对图片的像素进行操作的,但是在MIDP2.0中,Image和Graphics的功能都大大增强了。比如,我们可以获取Image的所有像素值,然后利用程序来修改这些像素(比如说ARGB各自的值),最后再把修改后的像素图绘制出来。通过直接操作图片像素,我们就获得了一种很强大的能力,用编程的方式实现出很多有趣的效果来,而不用额外制作新图片。比如说透明度渐变,颜色反转等。下面就是2个例子,分别实现透明度渐变和颜色反转的功能。
例题一: 透明度渐变效果的实现
给定一张图片,假如我们想实现这么一种效果:图片由全透明状态逐渐清晰,最后达到正常状态。要实现这一个过程,我们首先要获取该图片的所有像素值,逐步让这些像素的alpha值从0转变到正常,每改变图片的所有像素值一次,我们就请求刷屏一次,把最新的像素图画出来,这样我们就能实现透明度渐变的效果了。代码实现如下:
import java.io.IOException;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
/**
*
* @author Jagie
*
*/
public class ShadowMIDlet extends MIDlet {
......
阅读全文(2666) | 评论:0 | 复制链接
转贴 J2ME插值算法实现图片的放大缩小(2007-05-08 20:17:00)
摘要:前段时间接触了一些数字图像处理的问题,在1位师兄的指导下,在j2me平台,完成了一些基本的2D图像处理算法。就当是对这段知识做一下总结,决定把这些算法写出来,和各位朋友共同探讨。这篇文章先介绍图像放大缩小的实现,程序是以Nokia S40的机器为平台实现的。
1、实现图形缩放的基本思想:
图像的变形变换,简单的说就是把源图像每个点坐标通过变形运算转为目标图像相应点的新坐标,但是这样会导致一个问题就是目标点的坐标通常不会是整数。所以我们在做放大变换时,需要计算生成没有被映射到的点;而在缩小变换时,需要删除一些点。这里我们采用最简单的一种插值算法:“最近邻域法”。顾名思义,就是把非整数坐标作一个四舍五入,取最近的整数点。
看下面的一个图片放大的例子,左图为原始图像,右图为放大1倍的图像。里面的数字,表示所在像素的信息
1 2 1 1 2 2
5 4 5 5 4 4
2、对于图片像素的操作:
获取Image图片像素信息:
标准的midp1.0没有提供获取图片像素信息的函数,对于NOKIA的机器,我们可以采用Nokia SDK提供的API获取像素信息。具体程序如下:
g = image.getGraphics()
DirectGraphics dg = DirectUtils.getDirectGraphics(g);
dg.getPixels(short[] pixels, int offset, int scanlength, int x,int y, int width, int height, int format)
参数介绍:
short[] pixels: 用于接收像素信息的数组
int offset:这篇文章中的用到的地方,添0就可以了
int scanlength:添图片的宽度就行了
int x:添0
int y:添0
int width:图片宽度
int height:图片高度
int format:444,表示图形格式,好像Nokia S40的机器都是采用444格式表示RGB颜色的。就是红,绿,蓝各用4位表示,至于可以表示透明色ARGB的4444格式,应该是机器硬件实现的。
想具体了解Nokia SDK的信息,可以查看Nokia SD......
阅读全文(3751) | 评论:0 | 复制链接
J2ME 有关在IMAGE图片上画东西(2007-05-05 16:19:00)
摘要:im=Image.createImage("/2.png");
//Graphics g=im.getGraphics();
System.out.println("!!!11!!!!");
是可以通过的,而且出现图片
im=Image.createImage("/2.png");
//Graphics g=im.getGraphics();
System.out.println("!!!11!!!!");
g.setColor(0x009960ee);//在图片上画了东西@@@@
g.drawString("黑白两种色?",0,20,Graphics.TOP|Graphics.LEFT);//线程里面计算时间
g.drawRect(0,0,50,50);
这样就不行,
im=Image.createImage(90,90);//这里有变@@@@@
//Graphics g=im.getGraphics();
System.out.println("!!!11!!!!");
g.setColor(0x009960ee);
g.drawString("黑白两种色?",0,20,Graphics.TOP|Graphics.LEFT);//线程里面计算时间
g.drawRect(0,0,50,50);
这样却可以了,不得其解。......
阅读全文(2499) | 评论:1 | 复制链接
有关Image.createImage()图片路径问题(2007-05-05 15:32:00)
摘要:如果是用WTK,例如Image.createImage("/2.png");/2.png就放在rec文件下
如果Image.createImage("/src/2.png");创建的话,就要在rec文件下创建src文件,再将原来的图片覆盖到该文件下。
问题是如果是用了package打包后路径更加复杂!......
阅读全文(4529) | 评论:2 | 复制链接
总按钮类(2007-04-26 15:01:00)
摘要:/**
总按钮
@2007426
*/
/**
自己写个按钮类吧
*/
package com.sword;
import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.*;
public class AllButton extends GameCanvas implements Runnable{
public AllButton(){
super(true);
}
/**
创建按钮
*/
public Image CreateButton(String s){
Image im=null;
try{
im=Image.createImage(s);
}
catch(Exception e){}
return im;
}
/**
Sprite
*/
public Sprite CreateButton(String s,int x,int y){
Sprite im=null;
try{
im=new Sprite(Image.createImage(s),x,y);
}
catch(Exception e){}
return im;
&nbs......
阅读全文(2448) | 评论:0 | 复制链接
J2ME 有关package问题(2007-04-24 13:58:00)
摘要:有引用自己包内的类问题
经常忘记,不得写点东西记住一下:
WTK似乎有个设置启动类的,如果包名不相符,是引用失败,但是这次我没设置,居然也成功了,晕,以后再看看什么问题了.
//package com.sword;
import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.*;
import java.util.*;
import com.sword.a;
public class Football2007 extends MIDlet{
public void startApp(){
System.out.println("ok");
new a();
}
public void pauseApp(){}
public void destroyApp(boolean e){
notifyDestroyed();
}
}
////////////////////////////////////////////
package com.sword;
public class a{//注意要public 不然就是墨认protected,只能包内才能引用
public a(){
System.out.println("a");}
}
这样就可以了,以后再补充一下其他问题.
......
阅读全文(2603) | 评论:0 | 复制链接
Football2007(2007-04-24 13:21:00)
摘要:/**
打算做个足球类游戏
Football2007
@2007424
*/
/**
多个类,各自提交控制,注意资源
*/
//package com.sword;
import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.*;
import java.util.*;
import com.sword.FootballMenu;
public class Football2007 extends MIDlet{
Display d=Display.getDisplay(this);
public void startApp(){
System.out.println("ok");
new FootballMenu(d);
}
public void pauseApp(){}
public void destroyApp(boolean e){
notifyDestroyed();
}
}
/**
*/
package com.sword;
import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.*;
public class FootballMenu extends GameCanvas imp......
阅读全文(2396) | 评论:0 | 复制链接
[转]编写java最常见的21种错误 (2006-12-26 22:14:00)
摘要:1.Duplicated Code
代码重复几乎是最常见的异味了。他也是Refactoring的主要目标之一。代码重复往往来自于copy-and-paste的编程风格。与他相对应OAOO是一个好系统的重要标志。
2.Long method
它是传统结构化的“遗毒”。一个方法应当具有自我独立的意图,不要把几个意图放在一起。
3.Large Class
大类就是你把太多的责任交给了一个类。这里的规则是One Class One Responsibility.
4.Divergent Change
一个类里面的内容变化率不同。某些状态一个小时变一次,某些则几个月一年才变一次;某些状态因为这方面的原因发生变化,而另一些则因为其他方面的原因变一次。面向对象的抽象就是把相对不变的和相对变化相隔离。把问题变化的一方面和另一方面相隔离。这使得这些相对不变的可以重用。问题变化的每个方面都可以单独重用。这种相异变化的共存使得重用非常困难。
5.Shotgun Surgery
这正好和上面相反。对系统一个地方的改变涉及到其他许多地方的相关改变。这些变化率和变化内容相似的状态和行为通常应当放在同一个类中。
6.Feature Envy
对象的目的就是封装状态以及与这些状态紧密相关的行为。如果一个类的方法频繁用get 方法存取其他类的状态进行计算,那么你要考虑把行为移到涉及状态数目最多的那个类。
7.Data Clumps
某些数据通常像孩子一样成群玩耍:一起出现在很多类的成员变量中,一起出现在许多方法的参数中,这些数据或许应该自己独立形成对象。
8.Primitive Obsession
面向对象的新手通常习惯使用几个原始类型的数据来表示一个概念。譬如对于范围,他们会使用两个数字。对于Money,他们会用一个浮点数来表示。因为你没有使用对象来表达问题中存在的概念,这使得代码变的难以理解,解决问题的难度大大增加。好的习惯是扩充语言所能提供原始类型,用小对象来表示范围、金额、转化率、邮政编码等等。
9.Switch Statement
基于常量的开关语句是OO 的大敌,你应当把他变为子类、state或strategy.
10. Parallel Inhe......
阅读全文(2208) | 评论:0 | 复制链接
[转]小日本的GAME製作方式(2006-12-19 14:17:00)
摘要:
日本GAME製作方式
项目管理检讨
一、 现阶段问题点
(1) 组织架构
公司与项目应有不同之架构
(2) 各职务定位
各职务工作执掌与权责须划分更加清楚,特别是各部经理与总监。
(3) 项目经理与制作人的角色差异
须更进一步划分工作执掌与权责
(4) 项目管理
尚未进行,项目是否已算成立? 不清楚界定标准。
二、 附录 (参考资料)
(1) 何谓项目管理?
针对特定目标的一系列规划、组织、人事、领导与控制等活动,其目的在有效运用组织内人力、物力、财力等资源,以达成组织目标。
规划:为设定项目发展目标、制定政策、研拟策略及实施步骤,及如何达成该目标的基本过程。
设定目标:目标必须写下来。必须让所有参与者都能清楚明白它的意思。
研拟策略的要点:
1. 要把欲达到的结果,清楚地表达出来。
2. 这些结果要合理可行。设立一个难以达到的目标,会使参与的人望而却步。
3. 要把一系列的行动细节,详尽地陈述出来。
4. 必须指定负责人,使整个计划能因此而推动、进行。
5. 要提供合理的资源。
6. 计划的每一个阶段,均须有时间表。
7. 要设立工作表现的标准,以衡量所欲达到的成就。
组织:为了达成共同的目的,规定各个角色的职务,并依据一定的权限与责任的分配,决定各职务间相互的关系。
管理人必须知道自己究竟负责哪些活动,哪些人需对自己负责、自己又该对哪些人负责。此外,管理人还必须清楚整个公司的结构、自己在公司的位置、可以使用哪些沟通管道等。这些都必须以达成部门和公司的目标为主,并且定下所要完成的效果,最后再用文字陈述出来。
许多公司都把组织营建在员工身上,而不是先决定所要的结果,然后再寻找适当的人选来占据那些职位。通常,小公司并没有真正的组织架构,都是把现有人员分配去做所有的工作。不用多久,又会有另一批人被聘来分摊各部门的工作。一个简陋架构的公司,有时也能维持好几年的时间,但这样很难继续维持成长。
为了让企业成功,整个组织必须以「结果为导向」作为建筑架构的基础。公司的目标需明确且实际可行,整个管理工作也必须以达成公......
阅读全文(3604) | 评论:0 | 复制链接
转贴 我的第一个J2ME商业游戏源代码 (2006-11-07 14:49:00)
摘要:我写的个贴子被移动到了非技术区,刚才发不小心自己也发到了非技术区,现在重发,请管理员把非技术区我的帖子删除。
为了让更多同行得到原代码,再开贴,希望管理员不要移动,那样看到的人很少,不利大家共同进步。
我以前写的商业游戏原代码,原来在国外SP使用,似乎国内一直没有用,部分被重写(有些原公司不让公开),如果是BIG5版本的大家找个东东翻译一下好了,呵呵
需要的可以去下面网址看样本 ,更多代码到群里去下,这里只能发代码段不能发完整的带图片的整个程序
http://L999.68ab.com
QQ群:8294554
龙王J2ME游戏制作,交流技术,共同进步
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import java.util.*;
import com.nokia.mid.ui.*;
import com.nokia.mid.sound.*;
public class csbw extends MIDlet
{
private Display dp;
//re1,rz2是人质,dr1,dr2是敌人,xue1:血条值,qiang1:枪,qiang2;枪(太久或雷,我忘了);yyx1也忘了
Image ftu,rz1,rz2,dr1,dr2,xue1,qiang1,qiang2,yyx1;
Timer tm,tm2;
private Fca fca;
//声音单音
Sou......
阅读全文(4163) | 评论:1 | 复制链接