`
xichao1929
  • 浏览: 40071 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

我也做雷电

阅读更多

刚做完雷电小游戏,现在总结一下。雷电小游戏中我想核心的东西就是多线程的运用,做雷电就是为了能够熟练的使用多线程,加深对线程执行过程的理解。至于现在对于多线程有了一定的了解,但不能说已经记载了血液中,能够使用多线程做出雷电,是趁热打铁的原因,如果在过几天做的话,我估计就会麻烦很多了。所以自己不看书不行。

正在执行的程序成为进程,在一个进程中,有多个线程,其中有个主线程,就是主函数,这个主线程负责启动整个程序;程序里面还存在很多其他的线程,比如负责刷新的线程,加背景音乐的线程,在雷电中有发射子弹的线程,敌机进攻的线程等。他们的启动有对象调用start();方法开始,这些线程所要执行的内容放在run();方法中。

下面说一下做雷电游戏。这个雷电中,飞机的移动和子弹的发射可以同时进行,所以每一个都应该是线程,对方的飞机(不止一个,放在一个线程里面)对方飞机发射子弹(也放在一个线程里面)。这是最初的想法,很显然是对的,后面再加一句就是,由飞机来启动子弹线程,飞机的位置就是子弹的初始位置。当然一开始就是飞机移动一下就发射一个子弹,结果就是子弹太快了,然后改进了一下,飞机移动10下在发射一个子弹,这样看起来就比较舒服。

现在说一下玩家的情况,空格键控制子弹的发射,上下左右键控制飞机的运动,当然用的就是键盘监听器,关于它的使用方式是临时问的同学很简单。里面有三个方法keyTyped();keyPressed();keyReleased();用前两个来控制子弹的发射,空格键按下去发射子弹,弹起来结束发射。

代码   

	// 重写键盘的方法
	public void keyPressed(KeyEvent e) {
		 x0=0;
		 y0=0;
		isdisappear = false;
		ImageIcon  img,img1;
	    img1=addpic1();
		img = addmypic();
		// 按空格键控制发射子弹
		if (e.getKeyCode() == KeyEvent.VK_SPACE) {
			//重写设置子弹发射的位置
			  
			//调用子弹发射的方法
			isstart=true;
//			mymis.ismisstart=false;
//			mymis.ismisdis = false;
			 
		}           
		// 按左键向左移动
		if (e.getKeyCode() == KeyEvent.VK_LEFT) {
	        x0=-8;	
			if(isLeftOutbound){  
			
		     x0=0;
			}
			if(x<=0){
				isLeftOutbound=true;
			}
			if(x>0){
				isLeftOutbound=false;
			}
			
		}
		//按右键 向右移动
		if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
			x0=+8;
			if(isRightOutbound){
			 x0=0;
			}
			if(x>=650){
				isRightOutbound=true;
			 
			}
			if(x<650){
				isRightOutbound=false;
			}
		
		}
		//向上移动
		if (e.getKeyCode() == KeyEvent.VK_UP) {
			y0 =-8;
			if (isUpOutbound) {
              y0=0;
			}
			if (y  <= 60) {
				isUpOutbound = true;
			}
			if (y > 60) {
				isUpOutbound = false;
			}

		}
		//向下移动
		if (e.getKeyCode() == KeyEvent.VK_DOWN) {
			y0 =+8;
			if (isDownOutbound) {
              y0=0;
			}
			if (y  >= 490) {
				isDownOutbound = true;
			}
			if (y < 490) {
				isDownOutbound = false;
			}

		}
	  
  		 g.drawImage(img1.getImage(), x, y, 40, 40, null);
         g.drawImage(img.getImage(), x+=x0, y+=y0,40,40, null);
        
		//用空格键控制子弹的发射
		if (isstart) {
             
			minmis pm = new minmis(g, x, y,false );
			Thread pmh = new Thread(pm);// 包装成线程
			pmh.start();// 启动线程
			mymis.add(pm);
		 
			try {
				Thread.sleep(50);
			} catch (Exception d) {
				d.printStackTrace();
			}
			
		}
	 
		
	}
   //用空格键控制子弹的发射情况
	public void keyReleased(KeyEvent e) {
	if(e.getKeyCode()==KeyEvent.VK_SPACE){
		isdisappear = false;
		Drawliskey.isstart=false;
	//	mymis.ismisstart=true;
		 
		 
	}
	
	// Esc键退出
	if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
		System.exit(0);
	}

	}

                                                        

还有就是重绘的问题,当我们用一个线程去控制界面的刷新,就会出现屏幕狂闪的情况,这时我们就要用到双缓冲,非轻量级组件不需要双缓冲,就是不用update();函数,双缓冲的顺序是updatepaintrepaint,这些方法要放在轻量级组件中。在雷电中我是把所有的东西放在了JPanel上,所以,这些方法要在JPanel 的基础去调用。

代码

// 重写绘制自己的飞机
	public void paintmyair(Graphics g) {
		// 重新绘制自己的飞机
		ImageIcon myimg = Drawliskey.addmypic();
		g.drawImage(myimg.getImage(), Drawliskey.x, Drawliskey.y, 40, 40, null);

	}

	// 重写绘制敌人的飞机的方法
	public void paintair(Graphics g) {

		ImageIcon eneair = stealPlane.addpic();
		for (int j = 0; j < nair.size(); j++) {
			g.drawImage(eneair.getImage(), nair.get(j).x, nair.get(j).y, 50,
					50, null);
		}
	}

	// 重写绘制敌人子弹的方法
	public void paintenemmis(Graphics g) {
		// 重新绘制敌机的子弹
		ImageIcon misimg = enemis.addpicmis1();
		for (int i = 0; i < airmis.size(); i++) {

			g.drawImage(misimg.getImage(), airmis.get(i).x, airmis.get(i).y,
					10, 10, null);
		}

	}

	// 重新绘制玩家子弹的方法
	public void paintmymis(Graphics g) {
		 
		// 重新绘制玩家的子弹
		ImageIcon mymisimg = minmis.addpicmis();
		for (int m = 0; m < mymis.size(); m++) {
			g.drawImage(mymisimg.getImage(), mymis.get(m).x, mymis.get(m).y,
					10, 10, null);
		}

	}

	class MyPanel extends JPanel {

		// 重写update方法,先将窗体上的图形画在图片对象上,再一次性显示
		public void update(Graphics g) {

			// URL url = this.getClass().getResource("img/15.jpg");
			// javax.swing.ImageIcon img1 = new javax.swing.ImageIcon(url);
			ImageIcon img1;
			img1 = Drawliskey.addpic1();
			g.drawImage(img1.getImage(), 0, 0, 680, 535, null);
			if (offScreenImage == null) {
				// 截取窗体所在位置的图片
				offScreenImage = this.createImage(680, 535);
			}
			// 获得截取图片的画布
			Graphics gImage = offScreenImage.getGraphics();
			// 获取画布的底色并且使用这种颜色填充画布
			// Color c = Color.BLACK;
			gImage.drawImage(img1.getImage(), 0, 0, 680, 535, null);
			// gImage.fillRect(0, 0, 780, 640); //
			// 有清除上一步图像的功能,相当于gImage.clearRect(0,
			// // 0, WIDTH, HEIGHT)
			// 将截下的图片上的画布传给重绘函数,重绘函数只需要在截图的画布上绘制即可,不必在从底层绘制
			paint(gImage);

			// 将接下来的图片加载到窗体画布上去,才能看到每次画的效果
			g.drawImage(offScreenImage, 0, 0, null);
		}

		public void paint(Graphics g) {

			URL url = this.getClass().getResource("img/15.jpg");
			javax.swing.ImageIcon img = new javax.swing.ImageIcon(url);
			ImageIcon img1;
			img1 = Drawliskey.addpic1();
			g.drawImage(img1.getImage(), 0, 0, 680, 535, null);
			if (offScreenImage == null) {
				// 截取窗体所在位置的图片
				offScreenImage = this.createImage(685, 535);
			}
			// 获得截取图片的画布
			Graphics gImage = offScreenImage.getGraphics();
			// 获取画布的底色并且使用这种颜色填充画布
			// Color c = Color.BLACK;
			// gImage.setColor(c);
			// gImage.fillRect(0, 0, 780, 640);
			// 有清除上一步图像的功能,相当于gImage.clearRect(0,
			gImage.drawImage(img1.getImage(), 0, 0, 680, 535, null);
			super.paint(gImage);

			paintair(gImage);// 重新绘制敌机
			paintenemmis(gImage);// 重新绘制敌机的子弹
			paintmymis(gImage);// 重新玩家的子弹
			paintmyair(gImage); // 重新绘制自己的飞机
			// 将接下来的图片加载到窗体画布上去,才能看到每次画的效果
			g.drawImage(offScreenImage, 0, 0, null);
		}
	}

 

分享到:
评论

相关推荐

    雷电模拟器中控源码

    总的来说,雷电模拟器中控源码的出现,不仅简化了雷电模拟器的操作和管理,也为编程爱好者和专业人士提供了学习和创新的平台。掌握这一技术,无疑能够提升我们在虚拟设备管理领域的专业能力,为日常的工作和娱乐带来...

    【Python】雷电模拟器脚本说明[附代码]

    反之,在模拟器中也可以实时地将文件同步到PC上。这种机制可以极大地提高开发效率和稳定性。 二、使用adb命令的注意事项 在使用雷电模拟器时,尽量不要使用adb命令,因为长时间运行脚本时,adb容易失效,特别是在...

    雷电模拟器3.20版本

    之前一直在雷电模拟器,费了好大劲,现在放出来方便大家使用

    雷电多开降cpu2.68.rar

    《雷电多开CPU优化详解:提升性能与降低使用率》 在当今的数字时代,模拟器成为了许多用户进行多任务处理、游戏测试或者应用测试的重要工具。雷电模拟器,作为一款广受欢迎的Android模拟器,因其强大的性能和兼容性...

    Intel nuc 雷电三驱动

    **Intel NUC 雷电三驱动详解** Intel NUC(Next Unit of Computing)是一款小型化、高性能的微型电脑,适合于需要强大计算能力但空间有限的环境。它以其小巧的体积、强大的性能和可扩展性深受用户喜爱。在Intel NUC...

    Unity做的雷电小游戏

    Unity3d做的雷电小游戏,一些基本功能都有了。可以自己扩展

    雷电VC源码 雷电VC源码 雷电VC源码

    《雷电VC源码解析与游戏开发探讨》 在IT行业中,源码是软件开发的基础,它是程序员思想的具象化表达...同时,这也是一种实践驱动的学习方式,有助于我们更好地理解和应用理论知识,为未来的游戏开发项目奠定坚实基础。

    易语言雷电模拟器操作模块

    易语言雷电模拟器操作模块

    雷电模拟器

    "雷电模拟器"是一款专为用户在个人电脑上运行安卓应用程序设计的软件,它基于Android系统,使得用户无需在手机或平板上操作,就能在PC上体验各种安卓应用和游戏。这款模拟器广泛应用于安卓开发工程师和逆向工程师的...

    雷电模拟器多开中控源码

    《雷电模拟器多开中控源码解析与应用》 在现代的移动应用测试、游戏多开或者自动化脚本编写场景中,模拟器多开技术扮演着至关重要的角色。雷电模拟器作为一款广受欢迎的安卓模拟器,其多开功能更是受到众多用户的...

    雷电声音模式识别

    雷电声音模式识别 雷电声音模式识别是计算机应用技术信息技术与信息化的重要研究方向。随着社会的发展,雷电的危害日益严重,对于雷电声音的研究具有重要的意义。通过对雷电声音的特征分析,使用一种合理的识别方法...

    雷电系列修改器 v6.00

    雷电4.04版修改器 v6.00更新内容: 1、增加第4个超级武器,自动跟踪弹。 2、雷电v4.04版天空网站下载的中文版的BOOM地址是:5D1CD8 3、雷电v4.04版游侠网下载的英文版的BOOM地址是:5D1D58 4、雷电SM2 v1.03版...

    雷电多开降CPU

    此外,内存管理和CPU调度算法的优化也是降低CPU占用的关键。通过智能分配系统资源,工具可以确保多开的模拟器能高效运行,同时避免过大的系统负担。 【兼容性和稳定性】: 由于雷电模拟器广泛应用于各种场景,因此...

    雷电模拟器微信备份恢复源码

    "雷电模拟器微信备份恢复源码" 这个标题指的是一个软件开发项目,其主要功能是利用雷电模拟器来备份和恢复微信的数据。雷电模拟器是一款流行的Android模拟器,它允许用户在电脑上运行Android应用,包括微信。此源码...

    网页版 雷电游戏

    在这个项目中,两者结合,为用户提供了在浏览器中游玩雷电小游戏的体验。 首先,我们要理解HTML在构建网页版雷电游戏中的作用。HTML用于定义页面的基本结构,包括标题、段落、图像、链接等元素。在雷电游戏中,HTML...

    雷电模拟器改真机环境(包括安装包)

    雷电模拟器是一款流行的Android模拟器,它允许用户在电脑上运行Android应用和游戏,提供了一个方便的测试和体验平台。本文将详细讲解如何使用雷电模拟器改真机环境,以及涉及到的相关技术,包括Magisk和LSPSED模块。...

    C语言仿雷电_游戏、雷电、C语言_

    标题中的"C语言仿雷电"指的是使用C语言编程实现的一款基于雷电游戏风格的小游戏。雷电游戏,通常称为飞行射击游戏,玩家控制一架飞机在屏幕中躲避敌机和子弹,同时攻击敌人。这种类型的游戏以其快节奏和刺激性而受到...

    雷电_模拟器操作模块.zip

    总结来说,雷电模拟器操作模块结合了易语言的易用性和安卓模拟器的强大功能,为开发者提供了一套便捷的工具集,使他们在桌面环境下也能高效地进行安卓应用的开发、测试和调试工作。无论是新手还是经验丰富的开发者,...

Global site tag (gtag.js) - Google Analytics