2011-12-29 8 views
-2

Javaで宝くじスクラッチカードアプリを構築しています。それを済ませて、傷つきやすい機能に助けが必要なだけです。Java Scratch Cardデモ

基本的プログラムは、このように動作します:

  1. (そのちょうど白背景、今が、その後明らかに宝くじのシンボルとスクラッチカードの画像になります)背景に画像を作成したcard_surfaceを作成傷がついたときの背後にあるイメージを明らかにするよりも緑のレイヤーです。
  2. onMouseDragged()ストロークを使用して、現在のマウス座標から新しいマウス座標に線を描画しました。私は、このストロークでAlphacompositeを設定してみると、その下にイメージが現れると思っていました。残念ながらそうではありません。

任意の助けに感謝 ...

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.RenderingHints; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 

import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.ImageIcon; 

import java.awt.Stroke; 
import java.awt.BasicStroke; 
import java.awt.AlphaComposite; 


public class Main { 
    public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    final DrawPad drawPad = new DrawPad(); 
    frame.add(drawPad, BorderLayout.CENTER); 
    JButton clearButton = new JButton("New Scratch-Card"); 
    clearButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
     drawPad.clear(); 
     } 
    }); 
    frame.add(clearButton, BorderLayout.SOUTH); 
    frame.setSize(500, 300); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    } 

} 
class DrawPad extends JComponent { 
    Image image; 
    Image card_surface; 

    Graphics2D graphics2D; 
    int currentX, currentY, oldX, oldY; 



    public DrawPad() { 
    final Stroke stroke = new BasicStroke (17.0F, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL); 
    //image = new ImageIcon("iPhone-4-Pattern-Wallpaper-07.jpg").getImage(); 
    setDoubleBuffered(false); 
    addMouseListener(new MouseAdapter() { 
     public void mousePressed(MouseEvent e) { 
     oldX = e.getX(); 
     oldY = e.getY(); 
     } 
    }); 
    addMouseMotionListener(new MouseMotionAdapter() { 
     public void mouseDragged(MouseEvent e) { 
     currentX = e.getX(); 
     currentY = e.getY(); 
     if (graphics2D != null){ 
     graphics2D.setStroke(stroke); 
      graphics2D.setPaint(Color.GRAY); 
      graphics2D.setComposite(makeComposite(0.5F)); 
      graphics2D.drawLine(oldX, oldY, currentX, currentY); 
     repaint(); 
     oldX = currentX; 
     oldY = currentY; 
     } 
} 
    }); 
    } 
private AlphaComposite makeComposite(float alpha) { 
    int type = AlphaComposite.SRC_OVER; 
    return(AlphaComposite.getInstance(type, alpha)); 
    } 
public void clear() { 
    image=null; 
    card_surface=null; 

    repaint(); 
    } 
    public void paintComponent(Graphics g) { 
    if (image == null) { 

     image = createImage(getSize().width, getSize().height); 
     graphics2D = (Graphics2D) image.getGraphics(); 
     graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 



    graphics2D.setPaint(Color.white); 
     graphics2D.fillRect(0, 0, getSize().width, getSize().height); 
     graphics2D.setPaint(Color.black); 

    repaint(); 

    } 

    if (card_surface == null) { 
    card_surface = createImage(getSize().width, getSize().height); 
     graphics2D = (Graphics2D) card_surface.getGraphics(); 
     graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
     RenderingHints.VALUE_ANTIALIAS_ON); 

    graphics2D.setPaint(Color.green); 
     graphics2D.fillRect(0, 0, getSize().width, getSize().height); 

    repaint(); 
} 


    g.drawImage(image, 0, 0, null); 
    g.drawImage(card_surface, 0, 0, null); 

    } 


} 
+0

あなたは、あなたの問題が何であるかを私たちに伝える必要があります。あなたがしたいことを言っているだけでは、あまりにも多くの助けはありません。何がうまくいかない、何か(もしあれば)例外などを教えてください。 –

+0

ここからどこに行くのかわかりません。私はAlphacompositeストロークを使って下の画像をマスクしてみました。私はまた、その下の画像を切り抜くことに目を向けた。コードはコンパイルして実行するので、例外はありません。私は本当にそれを行うための最善の方法を知っていないと思うので、誰かが何かを提案するかもしれない? – aubreybourke

答えて

4

は、ユーザーの傷「トップ画像、正しい下にある画像を明らかにするために何をしようとしているのですか?

ここで実際には2つの画像が必要です。最初は元の画像、次に2番目にグレーの背景が最初の画像を覆って隠れている。ユーザーが上の画像を傷つけると、灰色の画像の上に透明な色で描画し、下にある画像を表示する必要があります。

ので、手順は以下のとおりです。ユーザーの傷「トップ画像に透明色で描画がトップ画像は、現在透明セクションに 繰り返しを持つ、画像を再描画 とき

は にブランクとオリジナル画像を描画

複雑すぎると思いますが、それほど難しくないと思いますが、2つの画像を別々にして、バッファを使用して塗りつぶすだけです。透過的なバッファリングされたイメージの操作については、この記事How to make a color transparent in a BufferedImage and save as PNGを参照してください。

こちらがお役に立てば幸いです。

+0

ありがとう - 私は見て、後であなたに戻ってきます。私はひどく今すぐ寝る必要がある! – aubreybourke

+0

素晴らしい、私はそれがうまくいくと思う、私は何年もの前にゲームで何かしたので、理論は確かです。実装はやりにくいですが、間違いなく実行可能です。 – Ewald

+0

ああ、分かりました.-私はコードを読んで、この作業を見ることができます!ヘルプメイトのための素晴らしい1つ。 – aubreybourke

0

OKは、基本は

私はエワルドからのリンクを使用し、おかげでチームメイト、作業得ることができました!

ここで作業コードは(ちょうどあなたの好みの画像に「iPhone4の」画像のパスを変更)です:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.RenderingHints; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 

import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.ImageIcon; 
import java.awt.image.BufferedImage; 
import java.awt.image.FilteredImageSource; 
import java.awt.image.ImageFilter; 
import java.awt.image.ImageProducer; 
import java.awt.image.RGBImageFilter; 
import java.awt.Toolkit; 
import java.io.File; 
import javax.imageio.ImageIO; 

import java.awt.Stroke; 
import java.awt.BasicStroke; 
import java.awt.AlphaComposite; 


public class Main { 
    public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    final DrawPad drawPad = new DrawPad(); 
    frame.add(drawPad, BorderLayout.CENTER); 
    JButton clearButton = new JButton("New Scratch-Card"); 
    clearButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
     drawPad.clear(); 
     } 
    }); 
    frame.add(clearButton, BorderLayout.SOUTH); 
    frame.setSize(500, 300); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    } 

} 
class DrawPad extends JComponent { 
    BufferedImage image; 
    BufferedImage card_surface; 

    Graphics2D graphics2D; 
    int currentX, currentY, oldX, oldY; 



    public DrawPad() { 
    final Stroke stroke = new BasicStroke (17.0F, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL); 

    setDoubleBuffered(false); 
    addMouseListener(new MouseAdapter() { 
     public void mousePressed(MouseEvent e) { 
     oldX = e.getX(); 
     oldY = e.getY(); 
     } 
    }); 
    addMouseMotionListener(new MouseMotionAdapter() { 
     public void mouseDragged(MouseEvent e) { 
     currentX = e.getX(); 
     currentY = e.getY(); 
     if (graphics2D != null){ 
     graphics2D.setStroke(stroke); 
      graphics2D.setPaint(Color.GRAY); 
      //graphics2D.setComposite(makeComposite(0.5F)); 
      graphics2D.drawLine(oldX, oldY, currentX, currentY); 
     repaint(); 
     oldX = currentX; 
     oldY = currentY; 
     } 
} 
    }); 
    } 
private AlphaComposite makeComposite(float alpha) { 
    int type = AlphaComposite.SRC_OVER; 
    return(AlphaComposite.getInstance(type, alpha)); 
    } 
private Image TransformColorToTransparency(BufferedImage image, Color c1, Color c2) 
    { 
    // Primitive test, just an example 
    final int r1 = c1.getRed(); 
    final int g1 = c1.getGreen(); 
    final int b1 = c1.getBlue(); 
    final int r2 = c2.getRed(); 
    final int g2 = c2.getGreen(); 
    final int b2 = c2.getBlue(); 
    ImageFilter filter = new RGBImageFilter() 
    { 
     public final int filterRGB(int x, int y, int rgb) 
     { 
     int r = (rgb & 0xFF0000) >> 16; 
     int g = (rgb & 0xFF00) >> 8; 
     int b = rgb & 0xFF; 
     if (r >= r1 && r <= r2 && 
      g >= g1 && g <= g2 && 
      b >= b1 && b <= b2) 
     { 
      // Set fully transparent but keep color 
      return rgb & 0xFFFFFF; 
     } 
     return rgb; 
     } 
    }; 

    ImageProducer ip = new FilteredImageSource(image.getSource(), filter); 
     return Toolkit.getDefaultToolkit().createImage(ip); 
    } 
private BufferedImage ImageToBufferedImage(Image image2, int width, int height) 
    { 
    BufferedImage dest = new BufferedImage(
     width, height, BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g2 = dest.createGraphics(); 
    //g2.drawImage(image, 0, 0, null); 
    g2.drawImage(image2, 0, 0, null); 
    //g2.dispose(); 
    return dest; 
    } 
public void clear() { 
    image=null; 
    card_surface=null; 

    repaint(); 
    } 
    public void paintComponent(Graphics g) { 



if (image == null) { 

    image = new BufferedImage(500, 300, BufferedImage.TYPE_INT_ARGB); 
    String imagePath = "iPhone-4-Pattern-Wallpaper-07.jpg"; 
    File inFile = new File(imagePath); 
    try{ 
    image = ImageIO.read(inFile); 
}catch(java.io.IOException e){System.out.println(e);} 


    graphics2D = image.createGraphics(); 

     //image = new ImageIcon().getImage(""); 
     //image = createImage(getSize().width, getSize().height); 
     //graphics2D = (Graphics2D) image.getGraphics(); 
     graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 



    //graphics2D.setPaint(Color.white); 
     // graphics2D.fillRect(0, 0, getSize().width, getSize().height); 
     // graphics2D.setPaint(Color.black); 

    repaint(); 

    } 

    if (card_surface == null) { 
    card_surface = new BufferedImage(500, 300, BufferedImage.TYPE_INT_ARGB); 
     graphics2D = (Graphics2D) card_surface.getGraphics(); 
     graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
     RenderingHints.VALUE_ANTIALIAS_ON); 

    graphics2D.setPaint(Color.green); 
     graphics2D.fillRect(0, 0, getSize().width, getSize().height); 

    repaint(); 
} 


    g.drawImage(image, 0, 0, null); 
    g.drawImage(card_surface, 0, 0, null); 
    Image transpImg2 = TransformColorToTransparency(card_surface, new Color(0, 50, 77), new Color(200, 200, 255)); 
    BufferedImage resultImage2 = ImageToBufferedImage(transpImg2, image.getWidth(), image.getHeight()); 
    g.drawImage(image, 0, 0, null); 
    g.drawImage(resultImage2, 0, 0, null); 

    /* File outFile2 = new File("map_with_transparency2.png"); 
    try{ 
    ImageIO.write(resultImage2, "PNG", outFile2); 
    }catch(Exception e){System.out.println(e);} 
    //card_surface = (BufferedImage)transpImg2; 
    */ 
    } 


} 
+0

ここでは、このコードを基にして作られたよく洗練されたアプリを見てみましょう。http://www.splashportal.net/scratchCard/ :)))))))))) – aubreybourke

関連する問題