基于《仙剑奇侠传柔情版》Java的简单实现(二)

2018-12-02 by Kris


需要上次的GameFrame.class中窗口框架承载:https://www.cnblogs.com/louis6575/p/10051873.html

  1. package firstDemo;
  2.  
  3. import java.applet.Applet;
  4. import java.applet.AudioClip;
  5. import java.awt.Color;
  6. import java.awt.Font;
  7. import java.awt.Graphics;
  8. import java.awt.Image;
  9. import java.awt.event.KeyEvent;
  10. import java.awt.event.KeyListener;
  11. import java.awt.image.BufferedImage;
  12. import java.io.File;
  13. import java.io.IOException;
  14. import java.net.MalformedURLException;
  15. import java.net.URI;
  16. import java.net.URL;
  17.  
  18. import javax.imageio.ImageIO;
  19. import javax.swing.JPanel;
  20.  
  21. /**
  22. * 本类文件表示游戏案例的自定义画板类,也就是游戏的界面
  23. * @author Louis
  24. *
  25. */
  26. //2 游戏的静态界面
  27. //2.1 编写自定义画板类,添加绘画方法
  28. //JAVA中,遵循单继承(类)、多实现(接口)
  29. @SuppressWarnings("serial")
  30. public class GamePanel extends JPanel implements Runnable,KeyListener{
  31. //声明图片路径变量名称
  32. //2.2.1.定义图片素材的相关内容
  33. Image startImage,mengjImage,resumeImage,findxyImage,mengjToljcImage;
  34. Image[] startButtonImages,resumeButtonImages,lxytImages,lightImages;
  35. Image[] ToScDoorImages,ToLjcDoorImages,mengjDoorImages,scMapImages;
  36. Image[] splgifImages,welcomeImages;
  37.  
  38. Image ljcImage,lxyImage;//用来表示李逍遥当前图片(移动时,需要更新)
  39. Image dialogImage;
  40. Image[] lxyUpImages,lxyDownImages,lxyLeftImages,lxyRightImages;
  41. BufferedImage splImage;
  42. Image[] awsImages,henImages,ropeImages,azhuImages,chickImages,lchickImages,wcsImages;
  43.  
  44. private int start_DIST = 120,resume_DIST = 109,limUP = 240,limDOWN = 566,limRIGHT = 250,limLEFT = 10;
  45. private int LXYX,LXYY,LXYDIR;
  46. boolean ISLJC,ISSC;
  47. int ToScDoorX,ToLjcDoorX,mengjDoorX,scMapX,startX,startButtonX,welcomeX,mengjX,lightX,resumeX,resumeButtonX,findxyX;
  48. int ToScDoorY,ToLjcDoorY,mengjDoorY,scMapY,startY,startButtonY,welcomeY,mengjY,lightY,resumeY,resumeButtonY,findxyY;
  49.  
  50. int ToScDoorIndex,ToLjcDoorIndex,mengjDoorIndex,scMapIndex,startButtonIndex,resumeButtonIndex,lxytIndex,lightIndex,welcomeIndex;
  51.  
  52. boolean isStartShow,isstartButtonShow,isResumeShow,isResumeButtonShow,isLxyShow,isLjcShow,isScMapShow;
  53. boolean isSave,isWelcome,isMengjShow,isLxytShow,isSBNH;
  54.  
  55. int lxyDir;
  56. int ljcX,lxyX,lxytX,awsX,henX,ropeX,azhuX,chickX,lchickX,wcsX,dialogX,ChatX,splX;
  57. int ljcY,lxyY,lxytY,awsY,henY,ropeY,azhuY,chickY,lchickY,wcsY,dialogY,ChatY,splY;
  58. int awsIndex,henIndex,ropeIndex,azhuIndex,chickIndex,lchickIndex,wcsIndex,lxyIndex,splgifImagesIndex; //表示阿旺婶当前下标
  59. String[] ChatMessages1,ChatMessages2,ChatMessages3;
  60. int ChatIndex1,ChatIndex2,ChatIndex3;
  61. boolean isChatShow1,isChatShow2,isChatShow3,isSpeedShift;//用来表示聊天内容是否该出现的当前状态值
  62. BufferedImage ljcRedMap;//李家村红色地图
  63. BufferedImage scRedMap;//市场红色地图
  64. private int ClothCode = 0;
  65. private int UpEdge = 0;
  66. private int LeftEdge = 0;
  67. private int MoveSpeed;
  68.  
  69. //构造方法,一般用来做初始化操作
  70.  
  71. public GamePanel(){ //获取路径并初始化绘画位置
  72. ToScDoorImages = new Image[6];ToLjcDoorImages = new Image[6];mengjDoorImages = new Image[6];welcomeImages = new Image[3];
  73. scMapImages = new Image[3];lxytImages = new Image[2];lightImages = new Image[2];
  74. startButtonImages = new Image[3];resumeButtonImages = new Image[4];splgifImages = new Image[13];
  75.  
  76. splgifImages = new Image[13];
  77.  
  78. awsImages = new Image[17];henImages = new Image[6];ropeImages = new Image[4];azhuImages = new Image[6];
  79. chickImages = new Image[2];lchickImages = new Image[2];wcsImages = new Image[14];
  80. lxyUpImages = new Image[8];lxyDownImages = new Image[8];lxyLeftImages = new Image[8];lxyRightImages = new Image[8];
  81. //初始化数组内容
  82. isstartButtonShow = true;
  83. isResumeButtonShow = true;
  84. isStartShow = true;
  85. isSBNH = true;
  86. isMengjShow = false;
  87. isLxytShow = true;
  88. isResumeShow = false;
  89. isWelcome = true;
  90. isLxyShow = false;
  91. isChatShow1 = false;isChatShow2 = false;isChatShow3 = false;
  92. isSpeedShift = false;
  93. isScMapShow = false;
  94. isLjcShow = false;
  95.  
  96. //李家村背景音乐
  97. File file = new File("仙剑奇侠传游戏素材/素材/music/0.mid");
  98. URL url = null;
  99. try {
  100. URI uri = file.toURI();
  101. url = uri.toURL();
  102. }
  103. catch (MalformedURLException ex) {
  104. }
  105. AudioClip clip = Applet.newAudioClip(url);
  106. clip.loop();
  107.  
  108. //也就是将阿旺婶的第i张图片内容读取保存到阿旺婶的数组第i下标位置上
  109. try {
  110. //两种路径:绝对路径(以盘符或根目录(/)开始的路径)、相对路径(在java代码中,)
  111. startImage = ImageIO.read(new File("仙剑奇侠传游戏素材/开始游戏/start0.png"));
  112. mengjImage = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/梦境/梦境.png"));
  113. mengjToljcImage = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/梦境过渡李家村/0.png"));
  114. resumeImage = ImageIO.read(new File("仙剑奇侠传游戏素材/返回游戏/resume.png"));
  115. ljcImage = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李家村/0.png"));
  116. dialogImage = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/对话框/1.png"));
  117. //splImage = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/杀破狼静/0.png"));
  118. } catch (IOException e) {
  119. e.printStackTrace();
  120. }
  121. for(int i = 0;i< welcomeImages.length;i++){
  122.  
  123. try {
  124. welcomeImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/欢迎界面/"+i+".png"));
  125. } catch (IOException e) {
  126. // TODO 自动生成的 catch 块
  127. e.printStackTrace();
  128. }
  129. }
  130. for(int i = 0;i < lxytImages.length;i++){
  131. try {
  132. lxytImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥躺下/"+i+".png"));
  133. lightImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/梦境/"+i+".png"));
  134. } catch (IOException e) {
  135. // TODO 自动生成的 catch 块
  136. e.printStackTrace();
  137. }
  138. }
  139. for(int i = 0;i < startButtonImages.length;i++){
  140. try {
  141. startButtonImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/开始游戏/"+i+".png"));
  142. } catch (IOException e) {
  143. e.printStackTrace();
  144. }
  145. }
  146. for(int i = 0;i < resumeButtonImages.length;i++){
  147. try {
  148. resumeButtonImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/返回游戏/"+i+".png"));
  149. } catch (IOException e) {
  150. // TODO 自动生成的 catch 块
  151. e.printStackTrace();
  152. }
  153. }
  154. for(int i = 0;i < scMapImages.length;i++){
  155. try {
  156. scMapImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李家村市场/"+i+".png"));
  157. } catch (IOException e) {
  158. e.printStackTrace();
  159. }
  160. }
  161. for(int i = 0;i < awsImages.length;i++){
  162. try {
  163. awsImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/阿旺婶/"+i+".png"));
  164. } catch (IOException e) {
  165. e.printStackTrace();
  166. }
  167. }
  168. for(int i = 0;i < henImages.length;i++){
  169. try {
  170. henImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/母鸡/"+i+".png"));
  171. } catch (IOException e) {
  172. e.printStackTrace();
  173. }
  174. }
  175. for(int i = 0;i < ropeImages.length;i++){
  176. try {
  177. ropeImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/跳绳/"+i+".png"));
  178. } catch (IOException e) {
  179. e.printStackTrace();
  180. }
  181. }
  182. for(int i = 0;i < azhuImages.length;i++){
  183. try {
  184. azhuImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/阿朱喂鸡/"+i+".png"));
  185. } catch (IOException e) {
  186. e.printStackTrace();
  187. }
  188. }
  189. for(int i = 0;i < chickImages.length;i++){
  190. try {
  191. chickImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/小鸡/"+i+".png"));
  192. } catch (IOException e) {
  193. e.printStackTrace();
  194. }
  195. }
  196. for(int i = 0;i < lchickImages.length;i++){
  197. try {
  198. lchickImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/小小鸡/"+i+".png"));
  199. } catch (IOException e) {
  200. e.printStackTrace();
  201. }
  202. }
  203. for(int i = 0;i < wcsImages.length;i++){
  204. try {
  205. wcsImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/旺财嫂/"+i+".png"));
  206. } catch (IOException e) {
  207. e.printStackTrace();
  208. }
  209. }
  210. for(int i = 0;i < lxyDownImages.length;i++){
  211. try{ //0:李逍遥初始装扮 1:绿色
  212. if(ClothCode == 0){
  213. lxyUpImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥初始装扮/李逍遥上/"+i+".png"));
  214. lxyDownImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥初始装扮/李逍遥下/"+i+".png"));
  215. lxyLeftImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥初始装扮/李逍遥左/"+i+".png"));
  216. lxyRightImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥初始装扮/李逍遥右/"+i+".png"));
  217. }else if(ClothCode == 1){
  218. lxyUpImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥绿色套装/李逍遥上/"+i+".png"));
  219. lxyDownImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥绿色套装/李逍遥下/"+i+".png"));
  220. lxyLeftImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥绿色套装/李逍遥左/"+i+".png"));
  221. lxyRightImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥绿色套装/李逍遥右/"+i+".png"));
  222. }
  223. } catch (IOException e) {
  224. e.printStackTrace();
  225. }
  226. }
  227.  
  228. for(int i = 0;i < ToScDoorImages.length;i++){
  229. try {
  230. ToScDoorImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/华丽传送阵/"+i+".png"));
  231. ToLjcDoorImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/华丽传送阵/"+i+".png"));
  232. mengjDoorImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/华丽传送阵/"+i+".png"));
  233. } catch (IOException e) {
  234. e.printStackTrace();
  235. }
  236. }
  237.  
  238. for (int i = 0;i < splgifImages.length;i++){
  239. try {
  240. splgifImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/杀破狼/"+i+".png"));
  241. } catch (IOException e) {
  242. e.printStackTrace();
  243. }
  244. }
  245. //初始化坐标
  246. startX = 0;startY = 0;
  247. resumeX = -8;resumeY = -40;
  248.  
  249. startButtonX = 250;startButtonY = 125;
  250. resumeButtonX = 348;resumeButtonY = 240;
  251. welcomeX = 115;welcomeY = 145;
  252. lxytX = 450;lxytY = 450;
  253. lightX = 400;lightY = 40;
  254.  
  255. findxyX = 0;findxyY = 0;
  256. splX = 40;splY = 400;
  257. ljcX = -200;ljcY = -200;
  258. lxyX = 175;lxyY = 720;
  259. awsX = 612;awsY=520;
  260. henX = 740;henY = 320;ropeX = 900;ropeY = 680;azhuX = 770;azhuY = 350;
  261. chickX=820;chickY = 350;lchickX=805;lchickY = 340;wcsX = 800;wcsY = 600;
  262.  
  263. scMapX = -200 - scMapX;ToScDoorX = 1600;ToLjcDoorX = 15;mengjDoorX = 750;
  264. scMapY = -200 - scMapY;ToScDoorY = 990;ToLjcDoorY = 620;mengjDoorY = 500;
  265.  
  266. lxyIndex = 0;
  267. lxyImage = lxyDownImages[lxyIndex];
  268.  
  269. ChatMessages1 = new String[] { "李逍遥:阿旺婶,最近村子里有发生了什么有趣的事情吗?","阿旺嫂:是逍遥啊,也没什么,就是从别处来了个富贵人家的公子哥",
  270. "李逍遥:这样的啊,那公子长什么样","阿旺嫂:就是衣服上都好似镶了金,还随身带着精美的武器",
  271. "李逍遥:武器? 是这样的武器 剑吗?","阿旺嫂:我也不是很清楚啊,你可以去问问旺财嫂!"};
  272. ChatMessages2 = new String[] { "阿朱:逍遥,你来的正好,我正要去找你呢","李逍遥:阿朱姐姐,找我什么事啊","阿朱:村里来了个人,他其实是蜀山的长老",
  273. "李逍遥:蜀山是什么地方啊,很厉害吗","阿朱:你从小就在村子里,自然不知道,蜀山可是一个很大的门派呢","李逍遥:门派,是不是可以教人功法,然后可以让人行侠仗义啊",
  274. "阿朱:嗯,他是来收徒的,你可以去码头看看","李逍遥:嗯,我这就去!"};
  275.  
  276. ChatMessages3 = new String[] { "李逍遥:旺财嫂子,听说村里来了个外人","旺财嫂:对啊,那人长得真的俊啊!","李逍遥:听说他还带着很精美的武器啊","旺财嫂:对,好像是猎户用的弓,还会放光呢!","李逍遥:那他到底是来干什么的啊","阿旺嫂:这个你到时可以问问阿朱妹子,他们聊了好久","李逍遥:好吧,谢谢嫂子"};
  277.  
  278. //2.2.2.初始化图片素材的相关内容
  279. try{
  280. ljcRedMap = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李家村/RedMap.png"));
  281. }catch (IOException e) {
  282. e.printStackTrace();
  283. }
  284. try {
  285. scRedMap = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李家村市场/RedMap.png"));
  286. } catch (IOException e) {
  287. // TODO 自动生成的 catch 块
  288. e.printStackTrace();
  289. }
  290.  
  291. }
  292.  
  293. //绘画方法
  294. public void paint(Graphics g){ //绘画
  295. super.paint(g); //清空原有画面,重新画dialogImage
  296.  
  297. for(int i = 0;i < lxyDownImages.length;i++){
  298. try{ //0:李逍遥初始装扮 1:绿色
  299. if(ClothCode == 0){
  300. lxyUpImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥初始装扮/李逍遥上/"+i+".png"));
  301. lxyDownImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥初始装扮/李逍遥下/"+i+".png"));
  302. lxyLeftImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥初始装扮/李逍遥左/"+i+".png"));
  303. lxyRightImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥初始装扮/李逍遥右/"+i+".png"));
  304. }else if(ClothCode == 1){
  305. lxyUpImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥绿色套装/李逍遥上/"+i+".png"));
  306. lxyDownImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥绿色套装/李逍遥下/"+i+".png"));
  307. lxyLeftImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥绿色套装/李逍遥左/"+i+".png"));
  308. lxyRightImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥绿色套装/李逍遥右/"+i+".png"));
  309. }
  310. } catch (IOException e) {
  311. e.printStackTrace();
  312. }
  313. }
  314. try {
  315. findxyImage = ImageIO.read(new File("仙剑奇侠传游戏素材/定位.png"));
  316. } catch (IOException e1) {
  317. // TODO 自动生成的 catch 块
  318. e1.printStackTrace();
  319. }
  320.  
  321. if(isLjcShow){
  322. ljcX = (this.getWidth() - lxyImage.getWidth(null))/2-lxyX;
  323. ljcY = (this.getHeight() - lxyImage.getHeight(null))/2-lxyY;
  324.  
  325. if(ljcY >= UpEdge){
  326. ljcY = UpEdge;
  327. }
  328. if(ljcY <= this.getHeight()-ljcImage.getHeight(null)){
  329. ljcY = this.getHeight()-ljcImage.getHeight(null);
  330. }
  331. if(ljcX >= LeftEdge){
  332. ljcX = LeftEdge;
  333. }if(ljcX <= this.getWidth()-ljcImage.getWidth(null)){
  334. ljcX = this.getWidth()-ljcImage.getWidth(null);
  335. }
  336.  
  337. g.drawImage(ljcImage,ljcX,ljcY,this);//g 可以理解成一只画笔 坐标原点是窗口或画板左上角
  338. //g.drawImage(lxyRightImage,lxyX,lxyY,this); //第一次的静态图
  339. g.drawImage(awsImages[awsIndex],awsX + ljcX,awsY + ljcY,this);
  340. g.drawImage(henImages[henIndex], henX + ljcX,henY + ljcY,this);
  341. g.drawImage(ropeImages[ropeIndex],ropeX + ljcX,ropeY + ljcY,this);
  342. g.drawImage(azhuImages[azhuIndex],azhuX + ljcX,azhuY + ljcY,this);
  343. g.drawImage(chickImages[chickIndex],chickX + ljcX,chickY + ljcY,this);
  344. g.drawImage(lchickImages[lchickIndex],lchickX + ljcX,lchickY + ljcY,this);
  345. g.drawImage(wcsImages[wcsIndex],wcsX + ljcX,wcsY + ljcY,this);
  346. g.drawImage(ToScDoorImages[ToScDoorIndex],ToScDoorX + ljcX,ToScDoorY + ljcY,this);
  347. dialogX = (this.getWidth() - dialogImage.getWidth(null))/2;
  348. dialogY = this.getHeight() - dialogImage.getHeight(null);
  349. g.drawImage(lxyImage,lxyX + ljcX,lxyY + ljcY,this); //主角最后画
  350. if(isSBNH){ //十八年后
  351. g.drawImage(mengjToljcImage,0,0,this);
  352. }
  353. if(isChatShow1){
  354. g.drawImage(dialogImage,dialogX,dialogY,this);
  355. g.setColor(Color.WHITE);
  356. g.setFont(new Font("楷体",Font.BOLD,30));
  357. g.drawString(ChatMessages1[ChatIndex1], dialogX + 80, dialogY + 200);
  358. //g.drawImage(lxyUpImage[lxyIndex],lxyX,lxyY,this);
  359. //2.2.绘画静态界面(1个场景+7个配角+1个主角)
  360. //2.2.将素材文件夹导入工程
  361. //2.2.3.绘画图片素材的相关内容
  362.  
  363. }
  364. else if(isChatShow2){
  365. g.drawImage(dialogImage,dialogX,dialogY,this);
  366. g.setColor(Color.WHITE);
  367. g.setFont(new Font("楷体",Font.BOLD,30));
  368. g.drawString(ChatMessages2[ChatIndex2], dialogX + 80, dialogY + 200);
  369. }
  370. else if(isChatShow3){
  371. g.drawImage(dialogImage,dialogX,dialogY,this);
  372. g.setColor(Color.WHITE);
  373. g.setFont(new Font("楷体",Font.BOLD,30));
  374. g.drawString(ChatMessages3[ChatIndex3], dialogX + 80, dialogY + 200);
  375. }
  376.  
  377. }
  378. //System.out.println(LXYDIR+","+LXYX+","+LXYY+isSave);
  379.  
  380. //传送门
  381. if(isMengjShow && Math.abs(lxyX + lxyImage.getWidth(null)/2 - (mengjDoorX + mengjDoorImages[0].getWidth(null)/2)) < 70
  382. && Math.abs(lxyY + lxyImage.getHeight(null) - (mengjDoorY + mengjDoorImages[0].getHeight(null)/2)) < 70){ //梦境传送至李家村
  383. isMengjShow = !isMengjShow;
  384. lxyX = 200;lxyY = 690;
  385. ClothCode = 0;
  386. //3.2.3.休息停顿操作
  387.  
  388. try {
  389. Thread.sleep(80);
  390. } catch (InterruptedException e) {
  391. e.printStackTrace();
  392. }
  393. }else if(isLjcShow == true && Math.abs(lxyX + lxyImage.getWidth(null)/2 - (ToScDoorX + ToScDoorImages[0].getWidth(null)/2)) < 70
  394. && Math.abs(lxyY + lxyImage.getHeight(null) - (ToScDoorY + ToScDoorImages[0].getHeight(null)/2)) < 70){ //李家村传送至市场
  395. isLjcShow = !isLjcShow;
  396. isScMapShow = !isScMapShow;
  397. lxyX = 200;lxyY = 645;
  398. //3.2.3.休息停顿操作
  399. try {
  400. Thread.sleep(80);
  401. } catch (InterruptedException e) {
  402. e.printStackTrace();
  403. }
  404. }else if(isScMapShow == true && Math.abs(lxyX +lxyImage.getWidth(null)/2 - (ToLjcDoorX + ToLjcDoorImages[0].getWidth(null)/2)) < 70
  405. && Math.abs(lxyY + lxyImage.getHeight(null) - (ToLjcDoorY + ToLjcDoorImages[0].getHeight(null)/2)) < 70){ //市场传送至李家村
  406. isLjcShow = !isLjcShow;
  407. isScMapShow = !isScMapShow;
  408. lxyX = 1580;lxyY = 990;
  409. //3.2.3.休息停顿操作
  410. try {
  411. Thread.sleep(80);
  412. } catch (InterruptedException e) {
  413. e.printStackTrace();
  414. }
  415. }
  416. //System.out.println(lxyX+","+lxyY); //找坐标
  417.  
  418. //市场边界限制
  419. if(isScMapShow){
  420. scMapX = (this.getWidth() - lxyImage.getWidth(null))/2-lxyX;
  421. scMapY = (this.getHeight() - lxyImage.getHeight(null))/2-lxyY;
  422.  
  423. if(scMapY >= UpEdge){
  424. scMapY = UpEdge;
  425. }
  426. if(scMapY <= this.getHeight()-scMapImages[0].getHeight(null)){
  427. scMapY = this.getHeight()-scMapImages[0].getHeight(null);
  428. }
  429. if(scMapX >= LeftEdge){
  430. scMapX = LeftEdge;
  431. }if(scMapX <= this.getWidth()-scMapImages[0].getWidth(null)){
  432. scMapX = this.getWidth()-scMapImages[0].getWidth(null);
  433. }
  434. //System.out.println(isResumeShow+","+isLjcShow+","+isScMapShow);
  435. g.drawImage(scMapImages[scMapIndex],scMapX,scMapY,this);
  436. g.drawImage(ToLjcDoorImages[ToLjcDoorIndex],ToLjcDoorX + scMapX,ToLjcDoorY + scMapY,this);
  437. g.drawImage(splgifImages[splgifImagesIndex],splX +200+ scMapX,splY + 20+scMapY,this);
  438. g.drawImage(lxyImage,lxyX + scMapX,lxyY + scMapY,this); //主角最后画
  439. }
  440. if(isMengjShow){
  441. g.drawImage(mengjImage,0,0,this);
  442. g.drawImage(lxytImages[lxytIndex],lxytX,lxytY,this);
  443. g.drawImage(lightImages[lightIndex],lightX,lightY,this);
  444. g.drawImage(mengjDoorImages[mengjDoorIndex],mengjDoorX,mengjDoorY,this);
  445. g.drawImage(lxyImage,lxyX,lxyY,this);
  446. }
  447. if(isWelcome){
  448. welcomeY = this.getHeight() - welcomeImages[welcomeIndex].getHeight(null);
  449. welcomeX = (this.getWidth() - welcomeImages[welcomeIndex].getWidth(null))/2;
  450.  
  451. g.drawImage(welcomeImages[welcomeIndex],welcomeX,welcomeY,this);
  452. }
  453. if(isStartShow){
  454. g.drawImage(startImage,startX,startY,this);
  455. if(isstartButtonShow){
  456. g.drawImage(startButtonImages[startButtonIndex],startButtonX,startButtonY,this);
  457. }
  458. }
  459. if(isResumeShow){
  460. //super.paint(g);
  461. g.drawImage(resumeImage,resumeX,resumeY,this);
  462. if(isResumeButtonShow){
  463. g.drawImage(resumeButtonImages[resumeButtonIndex],resumeButtonX,resumeButtonY,this);
  464. }
  465. }
  466. //g.drawImage(splImage,splX + ljcX,splY + ljcY,this);
  467.  
  468. //g.drawImage(findxyImage, findxyX, findxyY,this);
  469. //System.out.println(findxyX+","+findxyY); //找坐标
  470. }
  471.  
  472. //@Overridee
  473. public void run() {
  474. // 3.2.实现配角运动
  475. while(true){
  476. //3.2.1.修改图片数组下标
  477. awsIndex++;henIndex++;ropeIndex++;azhuIndex++;chickIndex++;lchickIndex++;wcsIndex++;
  478. scMapIndex++;ToScDoorIndex++;ToLjcDoorIndex++;lxytIndex++;lightIndex++;
  479. splgifImagesIndex++;mengjDoorIndex++;
  480.  
  481. if(splgifImagesIndex > splgifImages.length - 1){
  482. splgifImagesIndex = 0;
  483. }
  484. if(lxytIndex > lxytImages.length - 1){
  485. lxytIndex = 0;
  486. }
  487. if(lightIndex > lightImages.length - 1){
  488. lightIndex = 0;
  489. }
  490. if(ToLjcDoorIndex > ToLjcDoorImages.length-1){
  491. ToLjcDoorIndex = 0;
  492. }
  493. if(mengjDoorIndex > mengjDoorImages.length - 1){
  494. mengjDoorIndex = 0;
  495. }
  496. if(ToScDoorIndex > ToScDoorImages.length-1){
  497. ToScDoorIndex = 0;
  498. }
  499. if(scMapIndex > scMapImages.length-1){
  500. scMapIndex = 0;
  501. }
  502. if(awsIndex > awsImages.length-1){
  503. awsIndex = 0;//补充:判断处理下标边界问题
  504. }
  505. if(henIndex > henImages.length-1){
  506. henIndex = 0;//补充:判断处理下标边界问题
  507. }
  508. if(ropeIndex > ropeImages.length-1){
  509. ropeIndex = 0;//补充:判断处理下标边界问题
  510. }
  511. if(azhuIndex > azhuImages.length-1){
  512. azhuIndex = 0;//补充:判断处理下标边界问题
  513. }
  514. if(chickIndex > chickImages.length-1){
  515. chickIndex = 0;//补充:判断处理下标边界问题
  516. }
  517. if(lchickIndex > lchickImages.length-1){
  518. lchickIndex = 0;//补充:判断处理下标边界问题
  519. }
  520. if(wcsIndex > wcsImages.length-1){
  521. wcsIndex = 0;//补充:判断处理下标边界问题
  522. }
  523. //3.2.3.休息停顿操作
  524. try {
  525. Thread.sleep(200);
  526. } catch (InterruptedException e) {
  527. e.printStackTrace();
  528. }
  529. //3.2.2.刷新界面操作
  530. repaint(); //重新调用执行paint();
  531. }
  532. }
  533.  
  534. @Override
  535. public void keyTyped(KeyEvent e) {
  536.  
  537. }
  538.  
  539. @Override
  540. public void keyPressed(KeyEvent e) {
  541.  
  542. //System.out.println("您按下了按键");
  543.  
  544. //对话框切换
  545. if(isChatShow1){
  546. //聊天内容切换+聊天内容消失
  547. int KeyCode = e.getKeyCode();
  548. if(KeyCode == KeyEvent.VK_SPACE){
  549. ChatIndex1++;
  550. if(ChatIndex1 > ChatMessages1.length - 1){
  551. ChatIndex1 = 0;
  552. isChatShow1 = !isChatShow1;
  553. }
  554. repaint();
  555. }
  556.  
  557. }
  558. else if(isChatShow2){
  559. //聊天内容切换+聊天内容消失
  560. int KeyCode = e.getKeyCode();
  561. if(KeyCode == KeyEvent.VK_SPACE){
  562. ChatIndex2++;
  563. if(ChatIndex2> ChatMessages2.length - 1){
  564. ChatIndex2 = 0;
  565. isChatShow2 = !isChatShow2;
  566. }
  567. repaint();
  568. }
  569. }
  570. else if(isChatShow3){
  571. //聊天内容切换+聊天内容消失
  572. int KeyCode = e.getKeyCode();
  573. if(KeyCode == KeyEvent.VK_SPACE){
  574. ChatIndex3++;
  575. if(ChatIndex3> ChatMessages3.length - 1){
  576. ChatIndex3 = 0;
  577. isChatShow3 = !isChatShow3;
  578. }
  579. repaint();
  580. }
  581. }
  582. else{
  583. //
  584. //4.2.实现主角运动 也即是需要根据用户按下按键的情况,进行对应的操作(移动或不动)
  585. //4.2.1.获得用户按下的按键情况
  586. int KeyCode = e.getKeyCode();
  587.  
  588. //加速主角移动速度
  589. if(KeyCode == KeyEvent.VK_SHIFT){
  590. isSpeedShift = !isSpeedShift;
  591. MoveSpeed *= 3;
  592. if(MoveSpeed >= 15){
  593. MoveSpeed = 15;
  594. }
  595. }else if(!isSpeedShift){
  596. MoveSpeed = 5;
  597. }repaint();
  598.  
  599. //返回游戏界面显示,下面是所有用到F4的功能的实现
  600. if((isLxyShow && KeyCode == KeyEvent.VK_F4) || (!isStartShow && resumeButtonIndex == 0 && KeyCode == KeyEvent.VK_ENTER)){
  601. isResumeShow = !isResumeShow;
  602. }else if(isResumeShow && resumeButtonIndex == 1 && KeyCode == KeyEvent.VK_ENTER){
  603. LXYX = lxyX;LXYY = lxyY;ISLJC = isLjcShow;ISSC = isScMapShow;LXYDIR = lxyDir;
  604. isResumeShow = !isResumeShow;
  605. System.out.println(LXYDIR+","+LXYX+","+LXYY+" "+ISLJC+" "+ISSC);
  606. }else if(isResumeShow && resumeButtonIndex == 2 && KeyCode == KeyEvent.VK_ENTER){
  607. lxyX = LXYX;lxyY = LXYY;lxyDir = LXYDIR;isLjcShow = ISLJC;isScMapShow = ISSC;
  608. isResumeShow = !isResumeShow;isSave = true;
  609. }else if(isResumeShow && resumeButtonIndex == 3 && KeyCode == KeyEvent.VK_ENTER){
  610. System.exit(0);
  611. }repaint();
  612.  
  613. //开始游戏,按钮切换场景,下面时所有用到ENTER的功能实现
  614.  
  615. if(!isLxyShow && startButtonIndex == 0 && KeyCode == KeyEvent.VK_ENTER){
  616. //未进入游戏主角不可移动,//进入新游戏
  617. isStartShow = !isStartShow;
  618. isLjcShow = !isLjcShow; //startButtonIndex == 0时,显示李家村地图
  619. isLxyShow = !isLxyShow;
  620. isWelcome = !isWelcome;
  621. isMengjShow = !isMengjShow;
  622. lxyX = lxytX ;lxyY = lxytY - 100;
  623. ClothCode = 1;
  624. }else if(isSave && isStartShow && startButtonIndex == 1 && KeyCode == KeyEvent.VK_ENTER){
  625. lxyX = LXYX;lxyY = LXYY;lxyDir = LXYDIR;isLjcShow = ISLJC;isScMapShow = ISSC;isResumeShow = !isResumeShow;
  626. }repaint();
  627.  
  628. //控制方向,下面是所有用到方向键的功能的实现
  629. if(KeyCode == KeyEvent.VK_UP){
  630. isWelcome = false;
  631. findxyY -= MoveSpeed;
  632. if(isResumeShow){ //Up按钮切换返回游戏界面选项
  633. isResumeButtonShow = true;
  634. resumeButtonIndex--;
  635. resumeButtonY -= resume_DIST;
  636. if(resumeButtonIndex < 0){
  637. resumeButtonY = limDOWN;
  638. resumeButtonIndex = 3;
  639. }
  640. }repaint();
  641. //李逍遥需要向上移动一次
  642. //a.图片的位置发生改变
  643.  
  644. //当画出返回游戏窗口时,禁止主角移动
  645. if(isLxyShow && !isResumeShow){ //返回游戏界面主角不可移动
  646. lxyY -= MoveSpeed; //位置改变,行走
  647. lxyIndex++;
  648. System.out.println(isMengjShow);
  649. if(lxyIndex >= lxyUpImages.length){
  650. lxyIndex = 0;
  651. }
  652. lxyImage = lxyUpImages[lxyIndex];
  653. lxyDir = KeyEvent.VK_UP;
  654. }
  655. //补充 :判断李逍遥的障碍物功能
  656. if(!isMengjShow){ //梦境之中没有红色障碍地图
  657. int isRedX = lxyX + lxyImage.getWidth(null)/2;
  658. int isRedY = lxyY + lxyImage.getHeight(null);
  659. //上边界
  660.  
  661. if(isLjcShow){
  662. if(lxyY <= 0){
  663. lxyY = 0;
  664. }
  665.  
  666. if(ljcRedMap.getRGB(isRedX, isRedY) == -521461){
  667. lxyY += MoveSpeed;
  668. }
  669. }else if(isScMapShow){
  670. if(lxyY <= 0){
  671. lxyY = 0;
  672. }
  673. if(scRedMap.getRGB(isRedX, isRedY) == -65536){
  674. lxyY += MoveSpeed;
  675. }
  676. }repaint(); //进入绘画方法
  677. }
  678. //System.out.println(lxyX+","+lxyY); //找坐标
  679. //System.out.println(scRedMap.getRGB(isRedX, isRedY));//找红图值
  680.  
  681. }else if(KeyCode == KeyEvent.VK_DOWN){ //存档界面,DOWN按钮选择
  682. isWelcome = false;
  683. findxyY += MoveSpeed;
  684. if(isResumeShow){ //DOWN按钮切换返回游戏界面选项
  685. resumeButtonIndex++;
  686. isResumeButtonShow = true;
  687. resumeButtonY += resume_DIST;
  688. if(resumeButtonIndex > resumeButtonImages.length - 1){
  689. resumeButtonIndex = 0;
  690. resumeButtonY = limUP;
  691. }repaint();
  692.  
  693. }
  694. if(isLxyShow && !isResumeShow){
  695. lxyY += MoveSpeed;
  696. lxyIndex++;
  697. if(lxyIndex >= lxyDownImages.length){
  698. lxyIndex = 0;
  699. }repaint();
  700. lxyImage = lxyDownImages[lxyIndex];
  701. lxyDir = KeyEvent.VK_DOWN;
  702. }repaint();
  703.  
  704. if(!isMengjShow){
  705. int isRedX = lxyX + lxyImage.getWidth(null)/2;
  706. int isRedY = lxyY + lxyImage.getHeight(null);
  707.  
  708. if(isLjcShow){ //李家村红色障碍判断
  709. if(lxyY >= ljcImage.getHeight(null) - lxyImage.getHeight(null)){
  710. lxyY = ljcImage.getHeight(null) - lxyImage.getHeight(null);
  711. }
  712.  
  713. if(ljcRedMap.getRGB(isRedX, isRedY) == -521461){
  714. lxyY -= MoveSpeed;
  715. }
  716. }repaint();
  717.  
  718. if(isScMapShow){ //市场红色障碍判断
  719. if(lxyY >= scMapImages[0].getHeight(null) - lxyImage.getHeight(null)){
  720. lxyY = scMapImages[0].getHeight(null) - lxyImage.getHeight(null);
  721. }
  722. if(scRedMap.getRGB(isRedX, isRedY) == -65536){
  723. lxyY -= MoveSpeed;
  724. }
  725.  
  726. }repaint();
  727. }
  728.  
  729. }else if(KeyCode == KeyEvent.VK_LEFT){
  730. isWelcome = false;
  731. findxyX -= MoveSpeed;
  732. //LEFT按钮切换开始游戏界面选项
  733. if(isStartShow){
  734. startButtonX -= start_DIST;
  735. startButtonIndex++;
  736. if(startButtonIndex > startButtonImages.length-1){
  737. startButtonIndex = 0;
  738. startButtonX = limRIGHT;
  739. }
  740. }repaint();
  741.  
  742. if(isLxyShow && !isResumeShow){
  743. lxyX -= MoveSpeed;
  744. lxyIndex++;
  745. if(lxyIndex >= lxyLeftImages.length){
  746. lxyIndex = 0;
  747. }
  748. lxyImage = lxyLeftImages[lxyIndex];
  749. lxyDir = KeyEvent.VK_LEFT;
  750. }repaint();
  751.  
  752. if(!isMengjShow){
  753.  
  754. int isRedX = lxyX;
  755. int isRedY = lxyY + lxyImage.getHeight(null);
  756.  
  757. if(isLjcShow){
  758. if(lxyX <= LeftEdge){
  759. lxyX = LeftEdge;
  760. }
  761.  
  762. if(ljcRedMap.getRGB(isRedX, isRedY) == -521461){
  763. lxyX += MoveSpeed;
  764. }
  765. }
  766.  
  767. if(isScMapShow){
  768. if(lxyX <= LeftEdge){
  769. lxyX = LeftEdge;
  770. }
  771.  
  772. if(scRedMap.getRGB(isRedX, isRedY) == -65536){
  773. lxyX += MoveSpeed;
  774. }
  775. }
  776. repaint();
  777. }
  778. }else if(KeyCode == KeyEvent.VK_RIGHT){
  779. isWelcome = false;
  780. findxyX += MoveSpeed;
  781. if(isStartShow){ //RIGHT按钮切换开始游戏界面选项
  782. startButtonX += start_DIST;
  783. startButtonIndex--;
  784. if(startButtonIndex < 0){
  785. startButtonIndex = 2;
  786. startButtonX = limLEFT;
  787. }
  788. }
  789. if(isLxyShow && !isResumeShow){
  790. lxyX += MoveSpeed;
  791. lxyIndex++;
  792. if(lxyIndex >= lxyRightImages.length){
  793. lxyIndex = 0;
  794. }
  795. lxyImage = lxyRightImages[lxyIndex];
  796. lxyDir = KeyEvent.VK_RIGHT;
  797. }
  798.  
  799. if(!isMengjShow){
  800. int isRedX = lxyX + lxyImage.getWidth(null);
  801. int isRedY = lxyY + lxyImage.getHeight(null);
  802.  
  803. if(isLjcShow){
  804. if(lxyX >= ljcImage.getWidth(null) - lxyImage.getWidth(null)){
  805. lxyX = ljcImage.getWidth(null) - lxyImage.getWidth(null);
  806. }
  807. if(ljcRedMap.getRGB(isRedX, isRedY) == -521461){
  808. lxyX -= MoveSpeed;
  809. }
  810. }
  811. if(isScMapShow){
  812. if(lxyX >= scMapImages[0].getWidth(null) - lxyImage.getWidth(null)){
  813. lxyX = scMapImages[0].getWidth(null) - lxyImage.getWidth(null);
  814. }
  815. if(scRedMap.getRGB(isRedX, isRedY) == -65536){
  816. lxyX -= MoveSpeed;
  817. }
  818. }
  819. repaint();
  820. }
  821. }
  822. else if(KeyCode == KeyEvent.VK_SPACE){
  823. isWelcome = false;
  824. isSBNH = false;
  825.  
  826. if(isLjcShow){
  827. int x11 = lxyX + lxyImage.getWidth(null)/2;
  828. int y11 = lxyY + lxyImage.getHeight(null)/2;
  829. int x12 = awsX + awsImages[awsIndex].getWidth(null)/2;
  830. int y12 = awsY + awsImages[awsIndex].getHeight(null)/2;
  831. if(lxyDir == KeyEvent.VK_LEFT && x11 > x12-50 && x11 < x12+50 && y11 > y12-50 && y11 < y12+50){
  832. //实现空格按键控制聊天背景和内容的出现
  833. isChatShow1 = !isChatShow1;
  834. repaint();
  835. }
  836. int x21 = lxyX+lxyImage.getWidth(null)/2;
  837. int y21 = lxyY + lxyImage.getHeight(null)/2;
  838. int x22 = azhuX + azhuImages[azhuIndex].getWidth(null)/2;
  839. int y22 = azhuY + azhuImages[azhuIndex].getHeight(null)/2;
  840. if(lxyDir == KeyEvent.VK_LEFT && x21 > x22-50 && x21 < x22+50 && y21 > y22-50 && y21 < y22+50){
  841. //实现空格按键控制聊天背景和内容的出现
  842. isChatShow2 = !isChatShow2;
  843. repaint();
  844. }
  845. int x31 = lxyX+lxyImage.getWidth(null)/2;
  846. int y31 = lxyY + lxyImage.getHeight(null)/2;
  847. int x32 = wcsX + wcsImages[wcsIndex].getWidth(null)/2;
  848. int y32 = wcsY + wcsImages[wcsIndex].getHeight(null)/2;
  849. if(lxyDir == KeyEvent.VK_UP && x31 > x32-50 && x31 < x32+50 && y31 > y32-50 && y31 < y32+50){
  850. //实现空格按键控制聊天背景和内容的出现
  851. isChatShow3 = !isChatShow3;
  852. repaint();
  853. }
  854. }
  855.  
  856. }
  857. else if(KeyCode == KeyEvent.VK_1){
  858. ClothCode = 0;
  859. }else if(KeyCode == KeyEvent.VK_2){
  860. ClothCode = 1;
  861. }
  862. }
  863.  
  864. }
  865.  
  866. @Override
  867. public void keyReleased(KeyEvent e) {
  868.  
  869. }
  870. }

原素材:

背景:https://www.cnblogs.com/images/cnblogs_com/louis6575/1354506/t_start0.png

新的开始:https://www.cnblogs.com/images/cnblogs_com/louis6575/1354506/t_0.png

旧的回忆:https://www.cnblogs.com/images/cnblogs_com/louis6575/1354506/t_1.png

开发团队:https://www.cnblogs.com/images/cnblogs_com/louis6575/1354506/t_2.png

    

《仙剑奇侠传柔情版》Java的简单实现(二)的更多相关文章

  1. 基于《仙剑奇侠传柔情版》利用Java的简单实现(一)

    基于<仙剑奇侠传柔情版>利用Java的简单实现(一) 2018-12-01 23:55:36   by Louis  一,新建一个类GameFrame.class,具体代码如下: pack ...

  2. Java秒杀简单设计二:数据库表和Dao层设计

    Java秒杀简单设计二:数据库表Dao层设计 上一篇中搭建springboot项目环境和设计数据库表  https://www.cnblogs.com/taiguyiba/p/9791431.html ...

  3. Java实现简单版SVM

    Java实现简单版SVM 近期的图像分类工作要用到latent svm,为了更加深入了解svm,自己动手实现一个简单版的.         之所以说是简单版,由于没实用到拉格朗日,对偶,核函数等等.而 ...

  4. java学习-zxing生成二维码矩阵的简单例子

    这个例子需要使用google的开源项目zxing的核心jar包 core-3.2.0.jar 可以百度搜索下载jar文件,也可使用maven添加依赖 <dependency> <gr ...

  5. Java Web高性能开发(二)

    今日要闻: 性价比是个骗局: 对某个产品学上三五天个把月,然后就要花最少的钱买最多最好的东西占最大的便宜. 感谢万能的互联网,他顺利得手,顺便享受了智商上的无上满足以及居高临下的优越感--你们一千块买 ...

  6. 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  7. 20155322 2016-2017-2 《Java程序设计》实验二《Java面向对象程序设计》

    20155322 2016-2017-2 <Java程序设计>实验二<Java面向对象程序设计> 实验目的与内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承 ...

  8. java RPC系列之二 HTTPINVOKER

    java RPC系列之二  HTTPINVOKER 一.java RPC简单的汇总 java的RPC得到技术,基本包含以下几个,分别是:RMI(远程方法调用) .Caucho的Hessian 和 Bu ...

  9. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

随机推荐

  1. 吴裕雄--天生自然KITTEN编程:飞船大战

  2. 杂谈php之什么是cgi,fastcgi,fpm,cli,mod

    杂谈PHP极少关注的问题 本话题来自于我使用PHP进行网页爬虫的一次经历.对于一个web开发者来说,PHP解释器本身却知之甚小,实在是惭愧呐! 首先这个话题要从几个提问开始. PHP是什么? 外文名: ...

  3. HTML5 file API加canvas实现图片前端JS压缩并上传

    一.图片上传前端压缩的现实意义 对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 这种体验包括两方面: 由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅 ...

  4. Java Enum 枚举的简单使用

    一.什么是枚举 值类型的一种特殊形式,它从 System.Enum 继承,并为基础基元类型的值提供备用名称.枚举类型有名称.基础类型和一组字段.基础类型必须是一个内置的有符号(或无符号)整数类型(如 ...

  5. Docker的自动构建镜像

    Dockerfile自动构建docker镜像类似ansible剧本,大小几kb手动做镜像:大小几百M+ dockerfile 支持自定义容器的初始命令 dockerfile主要组成部分: 基础镜像信息 ...

  6. Leetcode 412.FizzBuzz

    题目描述 写一个程序,输出从 1 到 n 数字的字符串表示. 1. 如果 n 是3的倍数,输出"Fizz": 2. 如果 n 是5的倍数,输出"Buzz": 3 ...

  7. Proto3:风格

    本文介绍.proto文件的编码风格.遵循下面的惯例,可以使你的protocol buffer消息定义和它们对应的类连贯且已读. 注意,protocol buffer风格随时间变化一直在进步,所以可能你 ...

  8. gitlab配置邮箱

    邮件测试Notify.test_email('xx@qq.com', 'Message Subject', 'Message Body').deliver_now 参考 https://www.cen ...

  9. 遗弃.Forsaken.2015.BluRay.720p.x264.DTS-beAst

    ◎译 名 遗弃/落日孤影(台)/赎罪◎片 名 Forsaken◎年 代 2015◎产 地 加拿大/法国/美国◎类 别 剧情/西部◎语 言 英语◎上映日期 2015-09-16(多伦多电影节)/2016 ...

  10. android使用giflib加载gif

    转载请标明出处:https:////www.cnblogs.com/tangZH/p/12356915.html 背景不多说,反正ndk加载gif比java上加载gif好很多很多,主要体现在内存占用与 ...