📄 stage.java
字号:
/*
* Created on 2005-3-16
*/
package jcase.lianliankan;
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Point;
import java.awt.event.*;
/**
* @author javacat
* 游戏舞台,提供绘制图片的功能
*/
public class Stage extends JComponent{
public static void main(String[] args) {
String[] lines = new String[6];
lines[0] = "------------";
lines[1] = "-BCDEFGHBAD-";
lines[2] = "-CDEFGNMHAD-";
lines[3] = "-POIDLWLSSL-";
lines[4] = "-KLMMSJKKEF-";
lines[5] = "------------";
JFrame frame = new JFrame("游戏舞台测试");
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(new Stage(Model.createModel(lines)),BorderLayout.CENTER);
Timer timer = new Timer(180);
frame.getContentPane().add(timer,BorderLayout.SOUTH);
frame.pack();
frame.show();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
timer.start();
}
int iw = Configuration.getIconWidth();
int ih = Configuration.getIconHeight();
private StageListener listener;
private Model model;
private Point[] points = new Point[2];
private boolean hintFlag;
public Stage(Model model){
this.setOpaque(false);
this.addMouseListener(new ClickListener());
resetPoints();
this.model = model;
}
public Model getModel(){
return model;
}
/**
* @return Returns the listener.
*/
public StageListener getListener() {
return listener;
}
/**
* @param listener The listener to set.
*/
public void setListener(StageListener listener) {
this.listener = listener;
}
public Dimension getMaximumSize() {
return getPreferredSize();
}
public Dimension getMinimumSize() {
return getPreferredSize();
}
/* (non-Javadoc)
* @see java.awt.Component#getPreferredSize()
*/
public Dimension getPreferredSize() {
return new Dimension(model.getColumns()*iw+getInsets().left+getInsets().right,
model.getRows()*ih+getInsets().top+getInsets().bottom);
}
/**
* empty insets
*/
public Insets getInsets() {
return new Insets(0,0,0,0);
}
/**
* 绘制图形
* @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
*/
protected void paintComponent(Graphics g) {
//Log.debug("painting stage");
g.setColor(Color.blue);
g.drawRect(0,0,getSize().width,getSize().height);
for(int y=0;y<model.getRows();y++){
for(int x=0;x<model.getColumns();x++){
char ch = model.getChar(x,y);
if(ch==Model.EMPTY) continue;
CharIcon icon=Configuration.getIcon(ch);
icon.setSelected(isSelected(x,y));
icon.paintIcon(this,g,
x*iw+getInsets().left,
y*ih+getInsets().top);
}
}
}
void hint(){
int[] next = model.getNextPair();
if(next!=null){
hintFlag = true;
new Thread(new HintThread(next)).start();
}
}
/**
* 检测当前单元是否被选中
* @param x
* @param y
* @return
*/
private boolean isSelected(int x,int y){
if(points[0].x == x && points[0].y == y){
return true;
}
if(points[1].x == x && points[1].y == y){
return true;
}
return false;
}
/**
* 处理鼠标点击事件。
* @param e
*/
private void clicked(MouseEvent e){
int x= e.getX()/iw;
int y= e.getY()/ih;
if(x>=model.getColumns() || y>=model.getRows()){
return;
}
Point p = new Point(x,y);
//System.out.println(p);
if(points[0].x<0){
points[0] = p;
}else if(points[0].equals(p)){
resetPoints();
}else{
points[1] = p;
new Thread(new LinkThread()).start();
}
repaint();
}
private void resetPoints(){
points[0] = new Point(-1,-1);
points[1] = new Point(-1,-1);
}
private void drawLine(Graphics g,int x1,int y1,int x2,int y2){
g.drawLine(x1*iw+iw/2,y1*ih+ih/2,x2*iw+iw/2,y2*ih+ih/2);
}
public void wash(boolean force){
if(force)
model.wash();
while(!model.check()){
Log.debug("washing");
model.wash();
}
repaint();
}
class LinkThread implements Runnable{
public void run(){
//TODO get the path and draw the path
int x1=points[0].x;
int y1=points[0].y;
int x2=points[1].x;
int y2=points[1].y;
int[] result = model.defuse(x1,y1,x2,y2);
if(null != result){
int x,y;
Graphics2D g = (Graphics2D)getGraphics();
g.setStroke(Configuration.getLinkStroke());
g.setColor(Color.GREEN);
if(result[0]<0){
y= result[1];
drawLine(g,x1,y1,x1,y);
drawLine(g,x1,y,x2,y);
drawLine(g,x2,y,x2,y2);
}else{
x= result[0];
drawLine(g,x1,y1,x,y1);
drawLine(g,x,y1,x,y2);
drawLine(g,x,y2,x2,y2);
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
//do nothing
}
}
//release points
resetPoints();
repaint();
if(model.isAllDefused()){
listener.congratulate();
}else{
wash(false);
listener.credit(Configuration.getCredit());
}
}
}
class HintThread implements Runnable{
int[] hints;
public HintThread(int[] pts){
hints=pts;
}
public void run(){
while(hintFlag){
if(points[0].x<0){
points[0]= new Point(hints[0],hints[1]);
points[1]= new Point(hints[2],hints[3]);
}else{
resetPoints();
}
repaint();
try{
Thread.sleep(200);
}catch(InterruptedException ie){
}
}
}
}
class ClickListener extends MouseAdapter{
public void mousePressed(MouseEvent e){
if(hintFlag){
hintFlag = false;
resetPoints();
}
}
public void mouseClicked(MouseEvent e) {
clicked(e);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -