javaでGUIを用いたアプリケーションを開発しています。
現在開発しているものは、PaintComponentの中で描画処理をし、それを数m秒単位で再描画させるものなのですが
PaintComponentの中での処理が多いのか、動作が思い通りに動きません。
例としては画面更新が非常に速く行われてしまい、なにが描画されているのかわからなくなる、等です。
**(調べたところ、AWTよりSwingのが動作が軽いことが解りましたが、SwingにはPaintComponentがないようなので、このままAWTで描画処理を作成することになりそうです。)
**
↑は間違いでした、paintComponentはSwingに含まれているものでした。失礼いたしました。
javaのGUIプログラムを組むうえで、動作が重くならないためにきをつけるべきことや、私はこうしてるよ、などのことがあればぜひ教えて頂きたいです。
補足
コメントありがとうございます。現在作成しているのは音楽ゲームで、常にノーツ(譜面のこと)や、判定時のエフェクトを描画させています。
java
1public void paintComponent(Graphics g) { 2 super.paintComponent(g); 3 //Graphics2D g2 = (Graphics2D)g; 4 //GradientPaint gp = new GradientPaint(vimani.type,10,Color.black,vimani.type,90,Color.cyan); 5 6 // レーン 7 g.setColor(new Color(153,51,51,255)); 8 g.fillRect(220,10, 30, 650); 9 g.fillRect(255,10, 30, 650); 10 g.fillRect(290,10, 30, 650); 11 g.fillRect(325,10, 30, 650); 12 13 g.setColor(new Color(255,255,255,255)); 14 g.fillRect(250,10, 5, 650); 15 g.fillRect(285,10, 5, 650); 16 g.fillRect(320,10, 5, 650); 17 18 g.setColor(new Color(255,180,0,255)); 19 g.fillRect(220,590,135,20); 20 //ノート 21 22 //押されたキーと対応するレーンを光らせる。 23 24 if(vimani.keytypeflg == true){//単押しのみの時はこっち 25 Graphics2D g2 = (Graphics2D)g; 26 GradientPaint gp = new GradientPaint(vimani.type,10,Color.black,vimani.type,90,Color.cyan); 27 g2.setPaint(gp); 28 g2.fillRect(vimani.type,10,30,580); 29 vimani.fuzecount++; 30 if(vimani.fuzecount == 5){ 31 vimani.keytypeflg = false; 32 vimani.fuzecount = 0; 33 } 34 } 35 if(vimani.keytypeflg2 == true){//同時押があったら 36 Graphics2D g3 = (Graphics2D)g; 37 GradientPaint gp2 = new GradientPaint(vimani.type2,10,Color.black,vimani.type2,90,Color.cyan); 38 g3.setPaint(gp2); 39 g3.fillRect(vimani.type2,10,30,580); 40 vimani.fuzecount2++; 41 if(vimani.fuzecount2 == 5){ 42 vimani.keytypeflg2 = false; 43 vimani.fuzecount2 = 0; 44 } 45 } 46 47 g.setColor(new Color(102,255,204,255));//ノーツの色 48 for(int i=vimani.one+1;i<vimani.y1ic;i++){ 49 if(vimani.y1[i] <640){ 50 g.fillRoundRect(220, vimani.y1[i], 30, 20, 5, 10); 51 vimani.y1[i]+=vimani.speed; 52 }else{ 53 if(vimani.playercombo > vimani.playerhighcombo){ 54 vimani.playerhighcombo = vimani.playercombo; 55 } 56 vimani.playercombo = 0; 57 vimani.y1[i] = 990; 58 vimani.one = i; 59 } 60 } 61 for(int i=vimani.two+1;i<vimani.y2ic;i++){ 62 if(vimani.y2[i] <640){ 63 g.fillRoundRect(255, vimani.y2[i], 30, 20, 5, 10); 64 vimani.y2[i]+=vimani.speed; 65 }else{ 66 if(vimani.playercombo > vimani.playerhighcombo){ 67 vimani.playerhighcombo = vimani.playercombo; 68 } 69 vimani.playercombo = 0; 70 vimani.y2[i] = 990; 71 vimani.two = i; 72 } 73 } 74 for(int i=vimani.three+1;i<vimani.y3ic;i++){ 75 if(vimani.y3[i] <640){ 76 g.fillRoundRect(290, vimani.y3[i], 30, 20, 5, 10); 77 vimani.y3[i]+=vimani.speed; 78 }else{ 79 if(vimani.playercombo > vimani.playerhighcombo){ 80 vimani.playerhighcombo = vimani.playercombo; 81 } 82 vimani.playercombo = 0; 83 vimani.y3[i] = 990; 84 vimani.three = i; 85 } 86 } 87 for(int i=vimani.four+1;i<vimani.y4ic;i++){ 88 if(vimani.y4[i] <640){ 89 g.fillRoundRect(325, vimani.y4[i], 30, 20, 5, 10); 90 vimani.y4[i]+=vimani.speed; 91 }else{ 92 if(vimani.playercombo > vimani.playerhighcombo){ 93 vimani.playerhighcombo = vimani.playercombo; 94 } 95 vimani.playercombo = 0; 96 vimani.y4[i] = 990; 97 vimani.four=i; 98 } 99 } 100 101 if(vimani.keyhitflg == true){ //判定があった時 102 try { 103 //URL url = this.getClass().getResource("./hantei/"+vimani.hantei+".png"); 104 Graphics2D g2d = (Graphics2D) g; 105 BufferedImage image = ImageIO.read(getClass().getResource("hantei/"+vimani.hantei+".png")); 106 107 g2d.drawImage(image,vimani.type-30,540,100,40,this); 108 109 } catch (IOException e) { 110 e.printStackTrace(); 111 } 112 vimani.mikucount++; 113 if(vimani.mikucount == 10){ 114 vimani.keyhitflg = false; 115 vimani.mikucount = 0; 116 } 117 } 118 if(vimani.keyhitflg2 == true){ //判定があった時 119 try { 120 Graphics2D g2e = (Graphics2D) g; 121 BufferedImage image2 = ImageIO.read(getClass().getResource("hantei/"+vimani.hantei+".png")); 122 123 g2e.drawImage(image2,vimani.type2-30,540,100,40,this); 124 125 } catch (IOException e) { 126 e.printStackTrace(); 127 } 128 vimani.mikucount2++; 129 if(vimani.mikucount2 == 10){ 130 vimani.keyhitflg2 = false; 131 vimani.mikucount2 = 0; 132 } 133 } 134 135 136 137 }
譜面の降ってくるレーンを表示し続け、その上に譜面データから読み込んだタイミングでノーツを4つのレーンに降らせ、キーが譜面にあったタイミングで押されたら、判定"good","great","pergect"等のpngの画像を押されたキーに対応したレーンに表示させています。
javaのGUIで音ゲー等の常に画面が更新されるものを作ろうとした際に、paintComponentで描画設定をして、repaint();すると良いよ、と見かけたことがあったのでそれを参考にしてプログラムしています。
知識不足、記述不足の質問失礼いたしました。
回答2件
あなたの回答
tips
プレビュー