2011-12-29 4 views
-2

Создание приложения для скретч-карт для лотереи на Java. Имейте это в виду, просто нужна помощь в функциональности царапин.Java Scratch Card demo

В основном программа работает следующим образом:

  1. создать изображение для фона (прямо сейчас его просто белый фон, но потом, очевидно, быть скретчкарты изображения с лото символов)
  2. создать card_surface, который это просто зеленый слой, чем должен раскрыть изображение позади при поцарапании.
  3. 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

То, что вы пытаетесь сделать, это выявить основные изображения, когда пользователь «царапины» сверху изображение, правильно?

На самом деле вам понадобятся два изображения здесь: сначала исходное изображение, а во-вторых, пустое изображение с серым фоном, которое проходит первое изображение, скрывая его. Когда пользователь «царапает» верхнее изображение, вам нужно нарисовать прозрачный цвет поверх серого изображения, показывая основное изображение.

Так шаги:

Draw исходного изображения с пустым над ним Когда пользователем Жеребьевка «царапины» с прозрачным цветом на верхнем изображении перекрасить изображения, с верхней теперь образом, имеющими прозрачными участками Repeat

Это звучит сложно, но я не думаю, что это будет слишком сложно, вам просто нужно разделить два изображения и нарисовать один над другим, используя буфер. См. Это сообщение How to make a color transparent in a BufferedImage and save as PNG для получения информации о работе с прозрачными буферизованными изображениями.

Надеюсь, это поможет.

+0

Хорошо спасибо - я посмотрю и вернусь к вам позже. Мне плохо нужно спать прямо сейчас! – aubreybourke

+0

Отлично, я думаю, это сработает, я сделал что-то вроде этого года назад в игре, поэтому теория прочная. Реализация будет сложнее, но это определенно выполнимо. – Ewald

+0

Ahhh, Got it.- Я читаю код и вижу, как это работает! Хороший для помощника. – 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