Рисованный и интерактивный текст для визуального романа

#java #eclipse #applet

#java #eclipse #апплет

Вопрос:

Это не дубликат. Все остальные решения, которые я пробовал, устарели.

Итак, сначала взгляните на это Изображение

введите описание изображения здесь

Я сделал это сегодня в eclipse на Java. Это похоже на визуальный роман.

Дело в том, что я хочу нарисовать некоторый текст на экране, но не знаю, как это сделать. Сначала я только хочу знать:

  1. Как нарисовать текст на экране и изменить его
  2. Сделайте что-нибудь, например изображение или какой-нибудь текст, кликабельным для перехода к следующей сцене

Вот мой текущий код:

 package textboxes;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.net.URL;


public class test extends Applet implements Runnable, KeyListener {

private Image Image, Background;
private Image actor1, actor2;
private Image textbox;
private Graphics graphics;
private URL base;
private static testbg bg;

@Override
public void init(){
    setSize(960, 540);
    setBackground(Color.LIGHT_GRAY);
    setFocusable(true);
    Frame frame = (Frame)this.getParent().getParent();
    frame.setTitle("School Scene");
    try{
        base = getDocumentBase();
    }catch(Exception e){};

    //getImages from disk
    Background = getImage(base, "res/background.jpg"); 
    actor1 = getImage(base, "res/actor1.jpg");
    actor2 = getImage(base, "res/actor2.jpg");
    textbox = getImage(base, "res/textbox.jpg");
}

public test(){

}

@Override
public void start(){
    bg = new testbg();
Thread thread = new Thread(this);
thread.start();
}
@Override
public void keyPressed(KeyEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void keyReleased(KeyEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void keyTyped(KeyEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void run() {
    bg.update();
    repaint();
    try{
        Thread.sleep(17);
    }catch(InterruptedException e){
        e.printStackTrace();
    }

}

@Override
public void update(Graphics g){
    if(Image == null){
        Image = createImage(this.getWidth(), this.getHeight());
        graphics = Image.getGraphics();
    }

    graphics.setColor(getBackground());
    graphics.fillRect(0, 0, getWidth(), getHeight());
    graphics.setColor(getForeground());
    paint(graphics);

    g.drawImage(Image, 0, 0, this);
}

@Override
public void paint(Graphics g){
    super.paint(g);

g.drawImage(Background, bg.getBgX(), bg.getBgY(), this);
g.drawImage(actor2, 40, 20, this);
g.drawImage(textbox, 80, 350, this);
}

public static testbg getBg() {
    return bg;
}

}
  

Этот фрагмент кода выше — это то, что я называю test.java

если вам интересно узнать о фоновой части

следующий фрагмент кода — это то, что я называю testbg.java

 package textboxes;

public class testbg {

private int bgX, bgY;

public testbg(){
    bgX = 0;
    bgY = 0;
}

public void update(){

}

public int getBgX(){
    return bgX;
}

public int getBgY(){
    return bgY;
}

public void setBgX(int bgX) {
    this.bgX = bgX;
}

public void setBgY(int bgY) {
    this.bgY = bgY;
}

}
  

Спасибо, что дочитали это до конца…Итак, могу ли я узнать, как это сделать??

Комментарии:

1. Просто переходите к сути. Итак, из того, что я прочитал, вы хотите: 1) Нарисовать некоторый текст на экране и сделать его доступным для нажатия. Вам не нужна кнопка. 2) Прочитайте файл, что является совершенно другим вопросом.

2. Похоже, я тебя запутал

3. сегодня достаточно нарисовать текст и сделать изображения интерактивными для выполнения определенных действий … спасибо

4. Я внес некоторые изменения в вопрос, надеюсь, вы согласны с ними.

5. Я не знаю, как вы это сделали. Но я думаю, что это помогает мне, спасибо

Ответ №1:

Что касается текста, у меня есть два решения, но для того, что вы хотите (и для того, что я знаю о компьютерных играх), я думаю, что первое является лучшим.

Это первое решение, которое я нашел давным-давно для моей проблемы в StackOverflow (извините, не помню где), в котором используется совместное использование нескольких классов для рисования непосредственно на панели.

 private final String message;
private final java.awt.geom.Rectangle2D.Float aboutMessageBounds;
private final AttributedString aboutMessageAttributedString;
private final AttributedCharacterIterator paragraph;


// The LineBreakMeasurer used to line-break the paragraph.
private java.awt.font.LineBreakMeasurer lineMeasurer;
// index of the first character in the paragraph.
private final int paragraphStart;
// index of the first character after the end of the paragraph.
private final int paragraphEnd;

@Override
public void init(){

    (...)

    java.util.Hashtable<TextAttribute, Object> textAtributMap = 
                new java.util.Hashtable<TextAttribute, Object>();

    textAtributMap.put(TextAttribute.FAMILY, "Serif");
    textAtributMap.put(TextAttribute.SIZE, new Float(26.0));
    textAtributMap.put(TextAttribute.JUSTIFICATION, TextAttribute.JUSTIFICATION_FULL );
    textAtributMap.put(TextAttribute.WEIGHT, TextAttribute.WEIGHT_DEMIBOLD );
    textAtributMap.put(TextAttribute.LIGATURES, TextAttribute.LIGATURES_ON );

    message = "This is a sample of a message.";

    aboutMessageAttributedString = new AttributedString( aboutMessage, textAtributMap );
    paragraph = aboutMessageAttributedString.getIterator();
    paragraphStart = paragraph.getBeginIndex();
    paragraphEnd = paragraph.getEndIndex();

    (...)

}

@Override
protected void paintComponent( Graphics g ) {
    super.paintComponent( g ); //To change body of generated methods, choose Tools | Templates.

    Graphics2D g2 = (Graphics2D)g.create();
        try {

            g2.setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON );

            // Create a new LineBreakMeasurer from the paragraph.
            // It will be cached and re-used.
            if (lineMeasurer == null) {
                FontRenderContext frc = g2.getFontRenderContext();
                lineMeasurer = new java.awt.font.LineBreakMeasurer(paragraph, frc);
            }

            //You can scale it like I did. this part is not part of the code that I found.
            g2.scale( ratio.scaleDx, ratio.scaleDy );

            // Set break width to width of Component.
            //these were the measures I used for a something in a game;
            float breakWidth = 734.0f;
            float drawPosY = 90.0f;
            float posX0 = 30.0f;
            // Set position to the index of the first character in the paragraph.
            lineMeasurer.setPosition(paragraphStart);

            // Get lines until the entire paragraph has been displayed.
            while (lineMeasurer.getPosition() < paragraphEnd) {
                int next = lineMeasurer.nextOffset(breakWidth);

                int limit = next;
                if (limit <= message.length()) {
                    for (int i = lineMeasurer.getPosition(); i < next;   i) {
                        char c = aboutMessage.charAt(i);
                        if (c == 'n') {
                            limit = i   1;
                            break;
                        }
                    }
                }

                java.awt.font.TextLayout layout = lineMeasurer.nextLayout( breakWidth, limit, false );
                // Retrieve next layout. A cleverer program would also cache
                // these layouts until the component is re-sized.


                // Compute pen x position. If the paragraph is right-to-left we
                // will align the TextLayouts to the right edge of the panel.
                // Note: this won't occur for the English text in this sample.
                // Note: drawPosX is always where the LEFT of the text is placed.
                float drawPosX = layout.isLeftToRight()
                        ? posX0 : breakWidth - layout.getAdvance();
                // Move y-coordinate by the ascent of the layout.
                drawPosY  = layout.getAscent();

                // Draw the TextLayout at (drawPosX, drawPosY).
                layout.draw(g2, drawPosX, drawPosY);

                // Move y-coordinate in preparation for next layout.
                drawPosY  = layout.getDescent()   layout.getLeading();
            }

        } 
        finally {
            g2.dispose();
        }
}
  

Что касается второго решения, вы могли бы использовать JEditorPane или JTextPane . Смотрите руководство Oracle для этого материала:

https://docs.oracle.com/javase/tutorial/uiswing/components/editorpane.html

Надеюсь, я помог.

Хорошего дня. 🙂