JAVA游戏编程之二----j2me MIDlet 手机游戏入门开发--贪吃蛇
作者:雷神
QQ:38929568
QQ群:28048051JAVA游戏编程(满) 28047782(将满)
与前一款扫雷比较,这个游戏多了一个 类,用来显示动画,也是蛇要吃的物品类, 也有了代码包,图片包,结构清晰,代码量500行,地图生成的简单算法,和播放动画的简单算法!有矩形碰撞,升级就是增加蛇的移动速度,简单做法就是把刷新速度提高了,每次刷新蛇要移动一个格子,出现的物品有的是增加蛇长度的,有的是减少蛇长度的。
本文给出的是程序代码,需要图片才能编译程序,
工程文件如附件所示,地址如下: 贪吃蛇
Gif.java 这个类是绘制动画的类,也是蛇的食物类
- package code;
- import javax.microedition.lcdui.Image;
- import javax.microedition.lcdui.Graphics;
- public class Gif
- ...{
- public String name = "gif";
- public int life = 1;
- public int pos_x = 0;
- public int pos_y = 0;
- public int w = 10;
- public int h = 10;
- public int form = 1;
- private int allTime;
- private int currForm;
- private long startTime;
- public boolean isShow=true;
- public int[] formTime=...{100};
- private Image[] img;
- public Gif( String _name, int _form, int _w, int _h )
- ...{
- w = _w;
- h = _h;
- setGif( _name, _form );
- startTime = System.currentTimeMillis();
- setPos();
- }
- public void setGif( String _name, int _form )
- ...{
- try
- ...{
- name = _name;
- form = _form;
- formTime= new int[form];
- img = new Image[form];
- for( int i=0; i<form; i++ )
- ...{
- formTime[i] = 100;
- allTime += formTime[i];
- img[i] = Image.createImage("/pics/"+name+"_"+i+".png");
- }
- // Image temp = Image.createImage("/pics/"+name+".png");
- // form = temp.getWidth()/w;
- // formTime = new int[form];
- // img = new Image[form];
- // Graphics gn;
- // for( int i=0; i<img.length; i++ )
- // {
- // formTime[i] = 100;
- // allTime +=formTime[i];
- // img[i] = Image.createImage(w, h);
- // gn = img[i].getGraphics();
- // gn.drawImage(temp, -i*w, 0, gn.LEFT|gn.TOP);
- // }
- // gn = null;
- // temp = null;
- // System.gc();
- }catch(Exception e)...{ e.printStackTrace(); }
- }
- public void setPos()
- ...{
- pos_x = cGame.rand.nextInt(cGame.s_width-w) + ( w>>1 );
- pos_y = cGame.rand.nextInt(cGame.s_height-h) + ( h>>1 );
- startTime = System.currentTimeMillis();
- }
- public void setFormTime(int[] _formTime)
- ...{
- formTime = _formTime;
- allTime = 0;
- for( int i=0; i<formTime.length; i++ )
- ...{
- allTime +=formTime[i];
- }
- startTime = System.currentTimeMillis();
- }
- public void paint(Graphics g)
- ...{
- if( isShow )
- ...{
- long now = System.currentTimeMillis();
- long time= (now-startTime)%allTime;
- for(int i=0; i<form; i++)
- ...{
- time -= formTime[i];
- if( time<=0 )
- ...{
- g.drawImage(img[i], pos_x, pos_y, g.HCENTER|g.VCENTER);
- break;
- }
- }
- }
- }
- }
cGame.java 这个类已经不陌生了, 作用功能和上一个游戏雷同
- //
- // cGame.java
- //
- // Project: Minesweeper
- // Author(s): Gao Lei
- // Create: 2007-10-12
- package code;
- import java.util.Random;
- import javax.microedition.lcdui.*;
- class cGame extends Canvas implements Runnable
- ...{
- private static final int STATEPLAY = 0;
- private static final int STATELOST = 1;
- private static final int STATEWIN = 2;
- private static final int KEY_UP = 1;
- private static final int KEY_DOWN = 2;
- private static final int KEY_LEFT = 3;
- private static final int KEY_RIGHT = 4;
- private static final int KEY_FIRE = 5;
- public static int s_width = 0;
- public static int s_height = 0;
- public static long updates = 0;
- public static Random rand;
- private int maxRand = 1000;
- private int map_x = 10;
- private int map_y = 10;
- private int map_w = 16;
- private int map_h = 16;
- private int key_x = map_x / 2;
- private int key_y = map_y / 2;
- private int snake_w = 8;
- private int snake_h = 8;
- private int pos_x = map_x / 2;
- private int pos_y = map_y / 2;
- private int aspect_x= 0;
- private int aspect_y= 1;
- private int snake_max = 100;
- private int snake_n = 5;
- private int gameState = STATEPLAY;
- private int level = 1;
- private long sleepTime =160;
- private int[] snake_x = new int[ snake_max ];
- private int[] snake_y = new int[ snake_max ];
- private int[][] map;
- private boolean isShowInfo = false;
- private Font font = Font.getFont( Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_LARGE );
- private Thread thread;
- private Image[] imgGameBg = new Image[4];
- private Image[] imgItem = new Image[3];
- private Gif[] gold = new Gif[5];
- private Gif[] dung = new Gif[2];
- private Gif fungus;
- cGame()
- ...{
- setFullScreenMode(true);
- s_width = getWidth();
- s_height= getHeight();
- rand = new Random( System.currentTimeMillis() );
- try
- ...{
- for( int i=0; i<gold.length; i++ )
- ...{
- gold[i]= new Gif("gold", 5, 19, 15 );
- }
- for( int i=0; i<dung.length; i++ )
- ...{
- dung[i]= new Gif("dung", 6, 21, 30 );
- dung[i].life = -2; // --life
- }
- fungus = new Gif("fungus", 12, 25, 23 );
- fungus.setFormTime
- (
- new int[] ...{ 2000, 150, 150, 150,
- 150, 200, 100, 100,
- 200, 150, 200, 200
- }
- );
- fungus.life = 5; // --life +5
- for( int i=0; i<imgItem.length; i++ )
- ...{
- imgItem[i]=Image.createImage("/pics/item_16_"+i+".png");
- }
- Image temp = Image.createImage("/pics/bg_tile_0.png");
- Graphics gn;
- for( int i=0; i<imgGameBg.length; i++ )
- ...{
- imgGameBg[i] = Image.createImage(16, 16);
- gn = imgGameBg[i].getGraphics();
- gn.drawImage(temp, -i*16, 0, gn.LEFT|gn.TOP);
- }
- gn = null;
- temp = null;
- System.gc();
- }catch(Exception e)...{ e.printStackTrace(); }
- rePlay( level );
- thread = new Thread(this);
- thread.start();
- }
- public void run()
- ...{
- while( true )
- ...{
- try
- ...{
- updates++;
- repaint();
- serviceRepaints();
- thread.sleep(sleepTime);
- }catch(Exception e)
- ...{
- e.printStackTrace();
- }
- }
- }
- public void paint(Graphics g)
- ...{
- g.setClip(0, 0, s_width, s_height);
- g.setColor(0x000000);
- g.fillRect(0, 0, s_width, s_height);
- for( int i=0; i<map_x; i++ )
- ...{
- for( int j=0; j<map_y; j++ )
- ...{
- g.drawImage(imgGameBg[ map[i][j] ], j*map_h, i*map_w, g.LEFT|g.TOP);
- }
- }
- for( int i=0; i<gold.length; i++ )
- ...{
- gold[i].paint(g);
- }
- for( int i=0; i<dung.length; i++ )
- ...{
- dung[i].paint(g);
- }
- if( snake_n>20 )
- fungus.paint( g );
- paintSnake( g );
- if( isShowInfo || gameState != STATEPLAY )
- ...{
- g.setColor(0xFFFFFF);
- for( int i=0; i<=map_y; i++ ) // |||
- ...{
- g.drawLine(i*map_w, 0, i*map_w, map_h*map_x);
- }
- for( int i=0; i<=map_x; i++ ) // ===
- ...{
- g.drawLine(0, i*map_h, map_y*map_w, i*map_h);
- }
- g.setFont( font );
- }
- g.setColor( 0xff0000 );
- g.setFont( font );
- g.drawString( "life:"+snake_n, 2, 2, 0 );
- g.drawString( "level:"+level, 2, 18, 0 );
- }
- void paintSnake( Graphics g )
- ...{
- g.setColor(0x0000FF);
- for( int i=snake_n; i>0; i-- )
- ...{
- snake_x[i] = snake_x[i-1];
- snake_y[i] = snake_y[i-1];
- g.fillRect(snake_x[i]-snake_w/2, snake_y[i]-snake_h/2, snake_w, snake_h);
- }
- snake_x[0] += aspect_x*8;
- snake_y[0] += aspect_y*8;
- g.setColor(0x6666FF);
- g.fillRect(snake_x[0]-snake_w/2, snake_y[0]-snake_h/2, snake_w, snake_h);
- if( snake_x[0]<0 || snake_x[0]>s_width || snake_y[0]<0 ||snake_y[0]>s_height )
- ...{
- rePlay(level);
- }
- for( int i=snake_n; i<snake_n; i++ )
- ...{
- if( isIntersect(snake_x[0], snake_y[0], snake_w, snake_h,
- snake_x[i], snake_y[i], snake_w, snake_h )
- )
- ...{
- rePlay(level);
- }
- }
- for( int i=0; i<gold.length; i++ )
- ...{
- if( isIntersect(snake_x[0], snake_y[0], snake_w, snake_h,
- gold[i].pos_x, gold[i].pos_y, gold[i].w, gold[i].h )
- )
- ...{
- addSnake( gold[i].life );
- gold[i].setPos();
- }
- }
- for( int i=0; i<dung.length; i++ )
- ...{
- if( isIntersect(snake_x[0], snake_y[0], snake_w, snake_h,
- dung[i].pos_x, dung[i].pos_y, dung[i].w, dung[i].h )
- )
- ...{
- addSnake( dung[i].life );
- dung[i].setPos();
- }
- }
- if( isIntersect(snake_x[0], snake_y[0], snake_w, snake_h,
- fungus.pos_x, fungus.pos_y, fungus.w, fungus.h )
- )
- ...{
- addSnake( fungus.life );
- // fungus.isShow =false;
- fungus.setPos();
- }
- }
- boolean isIntersect(int x1,int y1, int w1, int h1, int x2, int y2, int w2, int h2)
- ...{
- if( Math.abs(x2-x1) < (w1+w2)/2 && Math.abs(y2-y1) < (h1+h2)/2 )
- ...{
- return true;
- }
- else
- return false;
- }
- public void keyPressed(int key)
- ...{
- key = Math.abs(key);
- System.out.println("key="+key);
- switch( key )
- ...{
- case KEY_NUM2:
- case KEY_UP:
- if( gameState != STATEPLAY )
- break;
- else
- ...{
- if( aspect_y <= 0)
- ...{
- aspect_x = 0;
- aspect_y = -1;
- }
- }
- break;
- case KEY_NUM8:
- case KEY_DOWN:
- if( gameState != STATEPLAY )
- break;
- else
- ...{
- if( aspect_y >= 0)
- ...{
- aspect_x = 0;
- aspect_y = +1;
- }
- }
- break;
- case KEY_NUM4:
- case KEY_LEFT:
- if( gameState != STATEPLAY )
- break;
- else
- ...{
- if( aspect_x <= 0)
- ...{
- aspect_y = 0;
- aspect_x = -1;
- }
- }
- break;
- case KEY_NUM6:
- case KEY_RIGHT:
- if( gameState != STATEPLAY )
- break;
- else
- ...{
- if( aspect_x >= 0)
- ...{
- aspect_y = 0;
- aspect_x = +1;
- }
- }
- break;
- case KEY_FIRE:
- case KEY_NUM5:
- if( gameState == STATEPLAY )
- ...{
- // addSnake();
- // System.out.println("snake_n="+snake_n);
- }
- break;
- case KEY_NUM1:
- break;
- case KEY_NUM3:
- isShowInfo = !isShowInfo;
- break;
- case KEY_NUM0:
- rePlay( level );
- break;
- }
- this.repaint();
- }
- private void addSnake(int life)
- ...{
- snake_n += life;
- if( snake_n > snake_max )
- ...{
- snake_n = snake_max;
- level++;
- rePlay(level);
- }
- if( snake_n < snake_n ) //game over
- ...{
- rePlay(level);
- snake_n = snake_n;
- }
- }
- public void rePlay( int level )
- ...{
- sleepTime = 150-level*20;
- map_x = s_height/16;
- map_y = s_width/16;
- key_x = map_x>>1;
- key_y = map_y>>1;
- gameState = STATEPLAY;
- map = new int[map_x][map_y];
- isShowInfo = false;
- snake_n = 5;
- aspect_x = 0;
- aspect_y = 0;
- for( int i=0; i<map_x; i++ ) //draw bg
- ...{
- for( int j=0; j<map_y; j++ )
- ...{
- int r = rand.nextInt(maxRand);
- for( int k=0; k<imgGameBg.length; k++ )
- ...{
- if( r < maxRand>>k+1 )
- ...{
- map[i][j] = k;
- }
- }
- }
- }
- for( int i=0; i<snake_n; i++ ) //init snake
- ...{
- snake_x[i] = s_width>>1;
- snake_y[i] = (s_height>>1)-(i*snake_h);
- }
- }
- }
Snake.java这个类是之前的 Minesweeper.java这个类 基本上就该个名字,其他什么都不用改!
- ///
- //
- // Snake.java
- //
- // Project: Snake
- // Author(s): Gao Lei
- // Create: 2007-10-08
- ///
- package code;
- import javax.microedition.midlet.*;
- import javax.microedition.lcdui.*;
- ///
- public class Snake extends MIDlet
- ...{
- static Snake s_midlet;
- static Display s_display = null;
- static cGame s_game = null;
- public Snake()
- ...{
- s_midlet = this;
- }
- public void startApp()
- ...{
- if (s_display == null)
- ...{
- s_display = Display.getDisplay(this);
- }
- if (s_game == null)
- ...{
- s_game = new cGame();
- s_display.setCurrent(s_game);
- }
- else
- ...{
- s_display.setCurrent(s_game);
- }
- }
- public void pauseApp()
- ...{
- }
- public void destroyApp(boolean unconditional)
- ...{
- notifyDestroyed();
- }
- }
这次代码上的注释比较少的原因是我的IDE不支持中文输入!所以即便是加注释也是英文的!就没加了
大多数函数方法和上个游戏没多大变化!
转载于:https://blog.51cto.com/kome2000/578507
相关文章:

DllMain中不当操作导致死锁问题的分析——线程中调用GetModuleFileName、GetModuleHandle等导致死锁
之前的几篇文章已经讲解了在DllMain中创建并等待线程导致的死锁的原因。是否还记得,我们分析了半天汇编才知道在线程中的死锁位置。如果对于缺乏调试经验的同学来说,可能发现这个位置有点麻烦。那么本文就介绍几个例子,它们会在线程明显的位置…
如何从菜鸡变成收割机,大厂面试的算法,你懂了吗?
是什么?让大厂面试显得逼格很高,是算法和数据结构吗?是的!!!Google工程师曾总结过,大厂之所以爱考察算法和数据结构是因为:算法能力能够准确辨别一个程序员的技术功底是否扎实&#…

Ejabberd源码解析前奏--配置
一、基本配置 配置文件将在你第一次启动ejabberd时加载,从该文件中获得的内容将被解析并存储到内部的ejabberd数据库中,以后的配置将从数据库加载,并且任何配置文件里的命令都会被添加到数据库里。 需要注意的是:ejabberd从不编辑…

DllMain中不当操作导致死锁问题的分析——DllMain中要谨慎写代码(完结篇)
之前几篇文章主要介绍和分析了为什么会在DllMain做出一些不当操作导致死锁的原因。本文将总结以前文章的结论,并介绍些DllMain中还有哪些操作会导致死锁等问题。(转载请指明出于breaksoftware的csdn博客) DllMain的相关特性 首先列出…
滴滴叶杰平:年运送乘客百亿次,AI如何“服务”出行领域?| BDTC 2019
出品 | AI科技大本营(ID:rgznai100)“如果把北京一天滴滴的轨迹数据放在一起,要覆盖北京所有道路差不多四百次,数据非常大、非常完整。”超5.5亿用户,年运送乘客100亿人次,除了中国地区,滴滴也在…

分析部署无线局域网的关键要素
在部署无线局域网时需要考虑的关键问题包括:确定单个接入点的RF覆盖,保证足够的支持所有用户的容量,以及考虑RF信号损耗因素。 单个AP的覆盖 网络设计师必须通过研究AP的服务范围来决定单个AP的覆盖。数据速率是一种距离函数ÿ…

Delphi调用java开发的WebService,传入参数出错
http://www.cnblogs.com/zhangzhifeng/p/3397053.html 调用没有参数的服务正常,当调用有参数的服务出现以下错误java.util.concurrent.ExecutionException: java.lang.NullPointerException 另外加了RIO.HTTPWebNode.UseUTF8InHeader : True;InvRegistry.RegisterInvokeOptions…
B站收藏6.1w+!这门课拯救你薄弱的计算机基础
作者 | Rocky0429来源 | Python空间大家好,我是 Rocky0429,一个对计算机基础一无所知的蒟蒻...作为一个所谓的计算机科班出身的人来说,特别难为情的是自己的计算机基础很差,比如计算机网络当年一度差点挂掉,多亏当时…

一种不会导致资源泄露的“终止”线程的方法
在项目工程中,我们可能会使用第三方开发的模块。该模块提供一个接口用于完成非常复杂和耗时的工作。我们一般不会将该API放在UI线程中执行,而是启动一个线程,用工作线程去执行这个耗时的操作。(转载请指明出于breaksoftware的csdn…

TCP/IP详解学习笔记(9)-TCP协议概述
终于看到了TCP协议,这是TCP/IP详解里面最重要也是最精彩的部分,要花大力气来读。前面的TFTP和BOOTP都是一些简单的协议,就不写笔记了,写起来也没啥东西。TCP和UDP处在同一层---运输层,但是TCP和UDP最不同的地方是&…

在windows程序中嵌入Lua脚本引擎--使用VS IDE编译Luajit脚本引擎
前些天听到一个需求:某业务方需要我们帮忙清理用户电脑上的一些废弃文件。同事完成这个逻辑的方案便是在我们程序中加入了一个很“独立”的业务逻辑:检索和删除某个程序产生的废弃文件。试想,该“独立”的逻辑之后会如何?被删掉&a…
优酷智能档在大型直播场景下的技术实践
作者 | 阿里文娱高级技术专家 肖文良 本文为阿里文娱高级技术专家肖文良在【阿里文娱2019双11猫晚技术沙龙】中的演讲,主要内容为如何通过优酷智能档,降低用户卡顿尤其是双11直播场景下,提升用户观看体验。具体包括智能档的落地挑战、算法架…

主题:CS0016: 未能写入输出文件“c:#92;WINDOWS#92;Microsoft.NET#92;***.dll”错误处理...
刚装完.NET环境,在编译时出现了如下错误: 编译器错误信息:CS0016: 未能写入输出文件“c:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\***\*****.dll”--“拒绝访问。” 错误的处理: 出现CS0016的原因一般是…

关于 android 加载 res 图片 out of memory 问题 解决 同样适用于 sd卡图片
2019独角兽企业重金招聘Python工程师标准>>> 发现android 加载res图片如果过多也会崩溃 android 也是使用 Bitmap bm BitmapFactory.decodeResourceStream(res, value, is, pad, opts); 来加载图片,不同他一般不会释放,如果图片太多就崩溃了 不过解决方法就更简…
近期必读的6篇NeurIPS 2019零样本学习论文
来源 | 专知(ID:Quan_Zhuanzhi) 【导读】NeurIPS 是全球最受瞩目的AI、机器学习顶级学术会议之一,每年全球的人工智能爱好者和科学家都会在这里聚集,发布最新研究。NIPS 2019大会已经在12月8日-14日在加拿大温哥华举行,…

在windows程序中嵌入Lua脚本引擎--建立一个简易的“云命令”执行的系统
在《在windows程序中嵌入Lua脚本引擎--使用VS IDE编译Luajit脚本引擎》开始处,我提到某公司被指责使用“云命令”暗杀一些软件。本文将讲述如何去模拟一个简易的“云指令”执行系统。(转载请指明出于breaksoftware的csdn博客) 首先我们思考下…

oracle9i.rar下载
甲骨文数据库9I转载于:https://blog.51cto.com/263054/46968

每天一道算法题(24)——自定义幂函数pow
double myPower(double base, int exponent){if(exponent0)return 1;if(exponent1)return base;if(exponent-1)//当为是负数的情况return 1.0/base;double result1.0;resultmyPower(base,exponent>>1);result*result;if(exponent&1)//绝对值为奇数result*base;return…
在windows程序中嵌入Lua脚本引擎--编写自己的Lua库
在《在windows程序中嵌入Lua脚本引擎--建立一个简易的“云命令”执行的系统》一文中,我提到了使用Lua的ffi库,可以让我们像写C代码一样写lua程序。这是个非常令我们这些C程序员激动的事。但是我们使用ffi库写出来的程序往往比较大,因为我们可…

我的C#学习笔记(1)
1.基本类型:基本与C\C相同decimal decimal是一个128位的高精度浮点数。bool 注意的是bool类型只有true和faulse两个可取值,在C#中,不能将bool值强制转换为值。如,将true转换为1或将1,0转换为bool值都是不行的。Parse和…
区块链人才月均薪酬1.6W?
01在上周,我国宣布将重点推动区块链技术的发展,这个消息无疑是为区块链开发者们打了一针强心剂,简直是喜大普奔啊 !因为之前区块链这个技术虽然一直在圈内很火,但是却没有得到国家的全面认可和推广,所以很多…

javascript通过json数据按格式生成一个按字母分类排序的分类信息表
效果图如下 1.json数据格式 var _people[{name:朱瑞,url:aaaaaa,nick:zhu},{name:刘桂清,url:aaaaa,nick:liu}];这里按姓氏排序借用了nick,不用nick的话,需要加载一个汉字拼音对照数组,判断匹配2.javascript代码 1 (function ($){2 funct…

(1)学习数组,集合,IEnumerable接口,引申学习迭代器
发展:数组-->集合-->泛型 (1)数组 1. 数组数据结构是System.Array类的一个实例. 2. System.Array类的语法为 [SerializableAttribute] [ComVisibleAttribute(true)] public abstract class Array : ICloneable, IList, ICollection, IEnumerable 3. 下面看一个使用数组…
人工智能尴尬的2019:需要钱却没钱可烧了
作者 | 余洋洋编辑 | 张丽娟来源 | CV智识(ID:CVAI2019)【导读】正需要钱的时候,钱却不够用了,人工智能领域缺钱与亟需钱的矛盾在今年集中体现了出来。2019年,中国人工智能领域的投融资热情大幅降低,交易量随之急剧下降…

WMI技术介绍和应用——WMI概述
今天,我要开始一系列关于微软WMI技术的介绍。通过之后若干节的介绍,我想WMI技术将为在windows平台上从事开发的朋友开启另外一扇窗。(转载请指明出于breaksoftware的csdn博客) 第一次接触WMI技术是在一年前,当时我接到…

综合技术 --@Autowired和@Resource
2019独角兽企业重金招聘Python工程师标准>>> 1.Autowired和Resource 的作用一样,都是自动注入 2.Autowired是按照byType自动注入,而Resource默认是按照byName自动注入。 3.Resource有两个属性比较重要,分别是name和type࿰…

CowNew开源团队新书《自己动手写开发工具》隆重上市
《自己动手写开发工具--基于Eclipse的工具开发》本书系统地介绍了SWT、Draw2D、GEF、JET等与Eclipse插件开发相关的基础知识,并且以实际的开发案例来演示这些知识的实战性应用,通过对这些实际开发案例的学习,读者可以非常轻松地掌握Eclipse插…
4000个“不会数学”的程序员出现大反转!居然能学AI,玩算法,搞逻辑!背后原因首次曝光...
不懂数学的程序员,尤其是在工作之后的一些瞬间,有多少次让你感受到数学的重要性?我们来看2个例子:写一行代码会用数学的程序员:我能分析除代码算法的时间复杂度与空间复杂度,不用写就知道这个算法的优缺点。…

WMI技术介绍和应用——VC开发WMI应用的基本步骤
在《WMI技术介绍和应用——WMI概述》中介绍了我们可以使用C、.net或者支持ActiveX技术的脚本语言来使用WMI。但是各种语言对WMI的控制能力是不同的,比如脚本语言只能用来从WMI获取数据或者接收事件通知。而C还可以编写WMI提供者和发送消息。和脚本语言相比ÿ…

WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类
在《WMI技术介绍和应用——VC开发WMI应用的基本步骤》文中,我们介绍了VC使用WMI技术的基本框架。本节我将讲解封装和实现一个用于半同步查询WMI的类。(转载请指明出于breaksoftware的csdn博客) 我曾思考过如何编写一个比较有用的类࿰…