001 package com.croftsoft.apps.ajgp.http;
002
003 import java.awt.*;
004 import java.awt.event.*;
005 import java.net.*;
006 import javax.swing.*;
007
008 import com.croftsoft.core.CroftSoftConstants;
009 import com.croftsoft.core.animation.AnimatedApplet;
010 import com.croftsoft.core.animation.AnimationInit;
011 import com.croftsoft.core.animation.animator.TextAnimator;
012 import com.croftsoft.core.animation.painter.ColorPainter;
013 import com.croftsoft.core.io.StringCoder;
014 import com.croftsoft.core.net.http.msg.HttpMessagePusher;
015 import com.croftsoft.core.util.queue.ListQueue;
016 import com.croftsoft.core.util.queue.Queue;
017
018 /*********************************************************************
019 * Applet that downloads high score from server.
020 *
021 * @version
022 * $Date: 2008/04/19 21:30:59 $
023 * @since
024 * 2003-06-01
025 * @author
026 * <a href="https://www.croftsoft.com/">David Wallace Croft</a>
027 *********************************************************************/
028
029 public final class ScoreApplet
030 extends AnimatedApplet
031 //////////////////////////////////////////////////////////////////////
032 //////////////////////////////////////////////////////////////////////
033 {
034
035 // applet constants
036
037 private static final String VERSION
038 = "2003-06-04";
039
040 private static final String TITLE
041 = "CroftSoft ScoreApplet";
042
043 private static final String APPLET_INFO
044 = "\n" + TITLE
045 + "\n" + "Version " + VERSION
046 + "\n" + CroftSoftConstants.COPYRIGHT
047 + "\n" + CroftSoftConstants.HOME_PAGE
048 + "\n" + CroftSoftConstants.DEFAULT_LICENSE
049 + "\n";
050
051 private static final Font FONT
052 = new Font ( "Arioso", Font.BOLD, 30 );
053
054 private static final Color BACKGROUND_COLOR = Color.BLACK;
055
056 private static final Color FOREGROUND_COLOR = Color.GREEN;
057
058 private static final int DELTA_X = 1;
059
060 private static final int DELTA_Y = 1;
061
062 // network constants
063
064 private static final String CHAR_SET_NAME = StringCoder.UTF_8;
065
066 private static final String CONTENT_TYPE = "text/plain";
067
068 private static final String DEFAULT_HOST = "localhost";
069
070 private static final String SERVLET_PATH = "servlet";
071
072 private static final String DEFAULT_PATH = "/score/" + SERVLET_PATH;
073
074 private static final int DEFAULT_PORT = 8080;
075
076 private static final String REQUEST_GET = "get";
077
078 private static final String REQUEST_SET = "set ";
079
080 private static final String USER_AGENT = "Score/1.0";
081
082 //
083
084 private final TextAnimator textAnimator;
085
086 private final Queue outgoingQueue;
087
088 private final Queue incomingQueue;
089
090 //
091
092 private HttpMessagePusher httpMessagePusher;
093
094 private long score;
095
096 private long highScore;
097
098 private boolean gameOver;
099
100 //////////////////////////////////////////////////////////////////////
101 //////////////////////////////////////////////////////////////////////
102
103 public static void main ( String [ ] args )
104 //////////////////////////////////////////////////////////////////////
105 {
106 launch ( new ScoreApplet ( ) );
107 }
108
109 public static AnimationInit createAnimationInit ( )
110 //////////////////////////////////////////////////////////////////////
111 {
112 AnimationInit animationInit = new AnimationInit ( );
113
114 animationInit.setAppletInfo ( APPLET_INFO );
115
116 animationInit.setBackgroundColor ( BACKGROUND_COLOR );
117
118 animationInit.setFont ( FONT );
119
120 animationInit.setForegroundColor ( FOREGROUND_COLOR );
121
122 animationInit.setFrameTitle ( TITLE );
123
124 animationInit.setShutdownConfirmationPrompt ( null );
125
126 return animationInit;
127 }
128
129 //////////////////////////////////////////////////////////////////////
130 //////////////////////////////////////////////////////////////////////
131
132 public ScoreApplet ( )
133 //////////////////////////////////////////////////////////////////////
134 {
135 super ( createAnimationInit ( ) );
136
137 textAnimator = new TextAnimator ( );
138
139 textAnimator.setDeltaX ( DELTA_X );
140
141 textAnimator.setDeltaY ( DELTA_Y );
142
143 outgoingQueue = new ListQueue ( );
144
145 incomingQueue = new ListQueue ( );
146 }
147
148 //////////////////////////////////////////////////////////////////////
149 //////////////////////////////////////////////////////////////////////
150
151 public void init ( )
152 //////////////////////////////////////////////////////////////////////
153 {
154 super.init ( );
155
156 addComponentPainter ( new ColorPainter ( ) );
157
158 addComponentAnimator ( textAnimator );
159
160 URL codeBaseURL = null;
161
162 try
163 {
164 codeBaseURL = getCodeBase ( );
165 }
166 catch ( Exception ex )
167 {
168 }
169
170 URL servletURL = null;
171
172 try
173 {
174 if ( codeBaseURL != null )
175 {
176 servletURL = new URL ( codeBaseURL, SERVLET_PATH );
177 }
178 else
179 {
180 servletURL = new URL (
181 "http", DEFAULT_HOST, DEFAULT_PORT, DEFAULT_PATH );
182 }
183 }
184 catch ( MalformedURLException ex )
185 {
186 ex.printStackTrace ( );
187 }
188
189 StringCoder stringCoder = new StringCoder ( CHAR_SET_NAME );
190
191 httpMessagePusher = new HttpMessagePusher (
192 outgoingQueue,
193 incomingQueue,
194 servletURL,
195 USER_AGENT,
196 CONTENT_TYPE,
197 stringCoder,
198 stringCoder );
199
200 httpMessagePusher.init ( );
201
202 outgoingQueue.append ( REQUEST_GET );
203
204 animatedComponent.addMouseListener (
205 new MouseAdapter ( )
206 {
207 public void mousePressed ( MouseEvent mouseEvent )
208 {
209 gameOver = true;
210 }
211 } );
212 }
213
214 public void start ( )
215 //////////////////////////////////////////////////////////////////////
216 {
217 super.start ( );
218
219 httpMessagePusher.start ( );
220 }
221
222 public void stop ( )
223 //////////////////////////////////////////////////////////////////////
224 {
225 httpMessagePusher.stop ( );
226
227 super.stop ( );
228 }
229
230 public void destroy ( )
231 //////////////////////////////////////////////////////////////////////
232 {
233 httpMessagePusher.destroy ( );
234
235 super.destroy ( );
236 }
237
238 //////////////////////////////////////////////////////////////////////
239 //////////////////////////////////////////////////////////////////////
240
241 public void update ( JComponent component )
242 //////////////////////////////////////////////////////////////////////
243 {
244 super.update ( component );
245
246 String highScoreString = ( String ) incomingQueue.poll ( );
247
248 if ( highScoreString != null )
249 {
250 try
251 {
252 highScore = Long.parseLong ( highScoreString );
253 }
254 catch ( NumberFormatException ex )
255 {
256 System.err.println (
257 "Unexpected server response: " + highScoreString );
258 }
259 }
260
261 if ( gameOver )
262 {
263 gameOver = false;
264
265 if ( score > highScore )
266 {
267 highScore = score;
268
269 outgoingQueue.append ( REQUEST_SET + highScore );
270 }
271
272 score = 0;
273 }
274 else
275 {
276 score++;
277 }
278
279 textAnimator.setText (
280 "Score: " + score + " High Score: " + highScore );
281 }
282
283 //////////////////////////////////////////////////////////////////////
284 //////////////////////////////////////////////////////////////////////
285 }