//
import render.*; import java.awt.*; ///////////////// DISPLAY SPEECH AND THOUGHT BUBBLES /////////////////// public class TextBubble { final static int NARRATION = 0; final static int SPEECH = 1; final static int THOUGHT = 2; static int W = 0, fontHeight, border, shadowX, shadowY; static Font font = null, italicFont = null; static Color shadowColor = new Color(0,0,0,80); public static void draw(Graphics g, int type, int w, int tX, int tY, String text, boolean editing) { if (w != W) { W = w; fontHeight = W / 24; font = new Font("Helvetica", Font.BOLD, fontHeight); italicFont = new Font("Helvetica", Font.ITALIC | Font.BOLD, fontHeight); border = fontHeight; shadowX = border/2; shadowY = border/4; } int sW = Math.max(2*border, border + g.getFontMetrics(font).stringWidth(text)); int sH = fontHeight + border; int sX = tX < W/3 ? 0 : tX < 2*W/3 ? (W - sW)/2 : W - sW; int sY = 0; drawTextBubble(g, type, sX, sY, sW, sH, text, editing); switch (type) { case SPEECH : drawSpeechStem (g, sX, sY, sW, sH, tX, tY); break; case THOUGHT: drawThoughtStem(g, sX, sY, sW, sH, tX, tY); break; } } static Color narrationColor = new Color(255,235,200); static void drawTextBubble(Graphics g, int type, int x, int y, int w, int h, String text, boolean editing) { g.setColor(shadowColor); g.fillRoundRect(x+shadowX,y+shadowY,w,h,border,border); g.setColor(type==NARRATION ? narrationColor : Color.white); g.fillRoundRect(x,y,w,h,border,border); g.setColor(Color.black); g.drawRoundRect(x,y,w,h,border,border); Font f = type==NARRATION ? italicFont : font; g.setFont(f); g.drawString(text, x + border/2, y + border/2 + fontHeight*9/10+1); if (editing) { g.setColor(Color.red); int tw = g.getFontMetrics(f).stringWidth(text); g.fillRect(x + border/2 + tw, y + border/2, 2, h-border); } } static int X[] = new int[3], Y[] = new int[3]; static void drawSpeechStem(Graphics g, int x, int y, int w, int h, int tx, int ty) { X[0] = x + w/2-border/2; X[1] = tx; X[2] = x + w/2+border/2; Y[0] = y + h; Y[1] = ty; Y[2] = y + h; g.setColor(Color.white); g.fillPolygon(X,Y,3); g.setColor(Color.black); g.drawLine(X[0],Y[0],X[1],Y[1]); g.drawLine(X[1],Y[1],X[2],Y[2]); } static void drawThoughtStem(Graphics g, int x, int y, int w, int h, int tx, int ty) { for (int i = 7 ; i > 0 ; i -= 2) { int b = border/2 * (16-i) / 16; int X = x+w/2 + i * i * (tx - (x+w/2)) / 8 / 8; int Y = y+h + (int)(Math.pow(i/8.,.8) * (ty - (y+h))); g.setColor(Color.white); g.fillOval(X-b,Y-b,2*b,2*b); g.setColor(Color.black); g.drawOval(X-b,Y-b,2*b,2*b); } } }