|
该用户从未签到
|
推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。 6 m% a) o0 H% j. N
; a, ^% H# r+ w4 z7 E9 O1 w
提起它,笔者相信没什么人会感觉到陌生,更没什么生物会连听都没听说过。它的发展历史之久远,甚至超越了俄罗斯方块(1988年电脑游戏化)。
- K% N0 O, k& B4 g2 m6 h- y+ x# B& g
这款游戏最初起源于日本,是个很难争辩的事实(我知道有人反对,但笔者确实找不到什么有力的反对证据)。他由日本人(哎……)今川宏行在1981年创立游戏规则,并于1982年经日本软件公司Thinking Rabbit正式发布。比较遗憾的是,早期的推箱子并没有PC版,笔者在网络上搜索到的老版游戏也大多为90年以前的Mac OS下程式。
3 r6 r6 p0 W6 _. D6 S+ d, B
% M5 s7 V/ n" `7 \6 s0 U9 T但说起真正令推箱子风靡于PC机的,却该感谢我们的台湾同胞李果兆先生。是他在1994年开发的仓库世家,才真正令推箱子游戏在世界各地大受推崇;仔细说来,推箱子这款小游戏之所以能有今时今日的声望与地位,固然有今川宏行的开创之功,但若说到贡献最大,承前启后的,则非中国台湾的李果兆先生莫属。% W" g- V8 \5 q
: E Z1 L+ Q' ~; e- h
推箱子游戏的规则非常简单,就是用尽量少的推动或移动把所有箱子都推到目标点上。箱子只能推动而不能拉动;一次只能推动一个箱子。然而,尽管它的规则是很简单的,但对于不同难度的关卡,所需要的脑力却是截然不同的,有些关卡可能会花费您几个小时、几天甚至几个月的时间,也正是这种简单性和复杂性的结合,最终令推箱子类游戏风靡全球!% s k! `; M3 E. I7 o. G9 Q2 O
* Q- F: {3 o* H- r t9 u8 u& I
本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。
) d$ A( L3 K1 C. s
7 |: l& Z7 o" C# {8 C4 A- o6 M9 v/ _笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。( s- H' D: h/ M3 N3 F1 s( }
& j" ?& E( ^0 ^% M目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。% ^! g2 \ @! n0 c- u
游戏截图: 6 g [7 Y% I# O- r$ n0 M
9 j7 e% R- }. n7 A' H) ?
8 |! f: G" a& z
0 Q3 O) |; h3 U2 P* v! `0 D
, N3 h" [) K8 t: d
核心代码:
2 {+ K$ E7 t/ ]0 ]) |0 lSokoban.java - package org.loon.game.simple.sokoban.control;
0 b _+ c5 L8 i - import java.awt.Color; - o6 [% u! ?, l- k
- import java.awt.Font; ! ^2 E8 A6 i5 x" H& L( W( y& a
- import java.awt.Graphics;
2 q- b3 Z# }5 R; M+ t - import java.awt.Image; 1 m8 p& Q* z& i
- import java.awt.event.KeyEvent; g, b1 }" Z& P
- import org.loon.game.simple.sokoban.GraphicsUtils;
' F6 I2 O/ T ^ - import org.loon.game.simple.sokoban.LSystem; ' F, f- ]" ~5 V% l$ z, L9 ~0 g
- import org.loon.game.simple.sokoban.SimpleControl;
% a \8 t* ~( Z$ Y2 A - /** ( L4 @% ^8 _- _. R
- * Copyright 2008 - 2009 1 T- R4 r! W, x5 a- J& j/ g
- * 2 D6 B5 A8 |, m* G
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not * w5 h8 R( }0 \- t( A g g
- * use this file except in compliance with the License. You may obtain a copy of / i2 f; w! @; C' m
- * the License at
2 K& U7 O& J2 u( l& o8 D - *
5 w0 X8 D5 _, a - * [url]http://www.apache.org/licenses/LICENSE-2.0[/url] ; c' ~' ?- _ S5 t+ V) h; @* A
- * ( \9 Y* e: o9 m* M/ \. s
- * Unless required by applicable law or agreed to in writing, software & O& e# Z u M5 x) {& o
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # X9 L' y. ~' J) p* q
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ( Y, j% p- s3 L/ }* [" a
- * License for the specific language governing permissions and limitations under : I# @: G' f' Q, m& C/ r/ C- T3 U
- * the License.
+ G1 t$ J# m6 A' z: u - * % U9 q. ]$ g2 d9 {+ ^! ~3 U+ m
- * @project loonframework
1 ~) I! k! p/ q6 N4 N; ?" ~( C x7 A' [ - * @author chenpeng 9 J ?) Z! S) \# w* L/ p
- * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn 8 O8 l4 X% c8 [
- * @version 0.1
, N* d: p& ~( w$ D, v - */ # _7 W. ?' {5 H7 I* M
- public class Sokoban extends SimpleControl { 7 f" p: Q* {) Z' N
- /**
; ^+ {5 ~5 r$ ^) V( M - * + z9 ~- g% N" `# _
- */ ) j' _2 q5 C9 W9 X9 @/ X
- private static final long serialVersionUID = 1L;
. f8 b/ C; {" N Y2 I9 U - private Image backImage = GraphicsUtils.loadImage("image/back1.jpg");
6 T5 j5 R% z+ L+ }* ^ Q& w- E9 Q - private Image screenImage;
9 F$ t3 {0 Q/ G8 i - // 墙壁图
, \: r3 h: u) L2 P+ o Q/ H - private Image floorImage[]; # @! Q a6 a3 Q8 }: r: H
- // 角色精灵
. S2 ]9 p/ z% ~) Z+ I5 d; h - private RpgSprite sprite;
1 H6 a4 R7 L; J1 c - // 窗体显示图
6 U1 j; l& o- V. f: E2 P$ E1 W - private Graphics screen;
- A) O4 Q, I. n) s - private String message = "按下 [Enter] 开始进行游戏";
) Z. o3 S& n5 G+ q" v+ f# y" J4 g. u - private String m_stageName[] = { "关卡1", "关卡2", "关卡3", "关卡4", "关卡5", "关卡6",
: ~5 [2 d" P: ~/ o3 w& S6 p - "关卡7" }; 1 {- E2 B" i- w$ n& V; |2 D4 q
- private int CS = 32;
# P6 J, t# H, `4 y! V A5 \ - private int maxX, maxY, comps; $ K! M8 r2 F' n1 w0 j5 o8 W
- private int stageNo;
) i0 b) g) D! j! t: t - private boolean complete[];
' y* e% @/ p1 _9 D& P - private boolean boxMove[][]; - e% A. C- Z0 Y( H0 n9 z( k
- private int hp[];
4 ]& S% N- p- h7 z6 G - private int stageStates[][][];
4 \1 d a* _2 e: o+ E - private int ons[][];
. s- w# g, O) ^7 S2 H2 V" [ - private int role[]; ) e0 T ~: k w6 }
- private int rolex[];
- b9 P7 _4 M7 P8 R) J% ?# g( m - private int roley[];
* ~ U0 j* p) M4 p+ n - private int mapx[];
6 f0 i8 ~/ z# ^ - private int mapy[]; _9 g6 X0 o! i6 ~( \; l: a
- private int sleep = 0; " O8 l6 u W' v6 k/ L) d
- private boolean succeed = false; Q7 o6 M; A' q# w: M* p2 S' }
- private Stage stage;
3 u5 v* T7 W7 t5 I - public Sokoban(Stage stage) {
a6 V1 k# P0 K% U1 v" {% y" U - this.stage = stage;
' x& P2 G3 v: Z' G* S - this.floorImage = new Image[4];
- m- ~7 t U3 }5 N - this.sprite = new RpgSprite("image/role1.gif"); 7 g+ A$ l. I* R, d2 [" ?1 _
- this.maxX = 16; + H2 q) \7 @/ l' Y& F6 r/ y8 c- u
- this.maxY = 13;
8 ~' }$ i! T; f8 O+ Q* z9 ~3 S - this.comps = 0;
+ i: u! h5 ^5 y# a T) t - this.complete = new boolean[stage.getMaxStageNo()];
) T" u3 p o8 X; r# K+ ? - this.boxMove = new boolean[stage.getMaxStageNo()][1500]; ; c9 c5 i# r* }; w
- this.ons = new int[stage.getMaxStageNo()][1500];
# m3 a) T: K, k0 q" H; K - this.hp = new int[stage.getMaxStageNo()];
1 P* m# T/ ~3 X, |* p+ i! ] - this.stageStates = new int[stage.getMaxStageNo()][maxY][maxX]; 7 ~. y/ J9 b" |4 j" D+ T0 w; W/ d
- this.role = new int[stage.getMaxStageNo()]; & m3 X" N3 _/ S) T0 R" c
- this.rolex = new int[stage.getMaxStageNo()]; 1 W& Y% N6 W( X( l( k9 }
- this.roley = new int[stage.getMaxStageNo()]; . X% Y6 [3 E4 a/ Y8 d$ }, o2 V. }2 s
- this.mapx = new int[stage.getMaxStageNo()]; 8 z* W2 [& c$ y; V) ?& B) J m
- this.mapy = new int[stage.getMaxStageNo()];
, t# ~5 |: c6 o$ W g9 D$ K - for (int j = 0; j < 4; j++) { 9 _0 H0 @! N0 c" W3 D
- floorImage[j] = GraphicsUtils.loadImage("image/back" + (j + 1)
+ f# f& k6 @6 @8 k! H$ G! { - + ".gif");
$ r& w$ t+ q" s) p$ J. S/ H) H - }
; A) F7 W2 a% }2 y( N# G - this.screenImage = GraphicsUtils.createImage(CS * maxX + CS, CS 7 L) E( O0 |7 u+ q$ H7 S Z3 n' U
- * (maxY + 1) + 32, true);
, `4 w, K% g: I3 I - this.screen = screenImage.getGraphics();
4 S# H% U. R% y! K) q* r0 C) K% R - for (stageNo = 0; stageNo < stage.getMaxStageNo(); stageNo++) { % v9 ~$ W7 g$ R4 |/ j
- this.setupStage();
- a; k; n: j' l7 i- b - } , N G( ]4 B* J# X0 M E
- this.stageNo = -1;
, ~$ n% Y [) b4 A$ G% G" P* R$ B9 [ - // 开场界面 2 j& j2 c' w4 ?0 C7 y
- this.openDraw(); / _: ~; W7 Z& r; A& V1 O( `2 e. |
- } ) X# @' g# F$ n5 i J
- /**
/ w- c- G* I! c) \& P& W - * 刷新关卡
$ q7 w2 ] W1 n - * 0 A- N) x; @1 B) I8 C
- */
0 L5 t3 s+ U4 r; D& F - public synchronized void reset(int stageNo) {
) V+ [% V1 S; k h - this.stageNo = stageNo; 1 g% q7 }* n( f5 G) d& t0 {7 R
- this.stage.getMode()[stageNo] = 1; * ]- W: |9 V3 X \* \# O( Z
- this.message = null;
0 x0 Y, }$ ]7 y* c - // 设定关卡 " R) |! q0 v2 A8 @4 _
- this.setupStage();
! x2 }0 j" s0 E+ b+ c - // 重绘背景 4 \ _9 k7 f+ D
- this.background(); / m& Z$ u+ l+ n
- // 重绘游戏屏幕 * C6 t, S+ M! m5 j! T J0 i4 c
- this.drawScreen();
6 s& C( e; Y: }" v& h/ ^ - }
2 ]+ b1 |" ?- [6 c% c* V) S - /** 2 E! d6 f, S0 ?' ~% p1 n5 J" O
- * 绘制屏幕背景
4 m, w8 A' \6 a7 T9 m8 b - *
+ m& ?- h1 l% M$ b# G! P2 `% G+ j - */ 3 ?, G8 H$ i% H! z# J& n. }0 Z
- public synchronized void background() { . b; L' c, I: c5 ]* [2 T4 u
- screen.drawImage(backImage, 0, 0, null); 7 j6 Y; G& i9 F I, n
- screen.setColor(Color.black);
8 ?% N( f- i! a2 A% p/ x1 x - screen.fillRect(0, LSystem.HEIGHT - 40, LSystem.WIDTH, 40);
+ h" z) c' ], D1 F - } ; ?5 I# q4 w v; M. [0 C" G
- /**
! q& F9 \, S! m9 K) j5 O- d- D - * 绘制屏幕图像 9 k; D4 U2 k8 Q0 k- z
- * 2 J, N5 A! A. z! V# n w
- */
s& C. L5 q( A1 a3 B: M1 [8 B; g - public synchronized void drawScreen() {
( e9 a" c& o; E# R - if (stageNo >= stage.getMaxStageNo()) {
) z! N) w4 P0 M, E& I% j9 G* [ - stageNo = 0;
! ~4 w5 z' V% I2 F2 L4 i2 M$ F - } ; ?6 ?! `* X: S4 q3 E0 S5 w
- for (int i = 0; i < mapy[stageNo]; i++) { - R, [/ F0 `* Z& l$ c7 |1 {
- for (int j = 0; j < mapx[stageNo];) { 4 H/ c- T: t3 L4 K
- switch (stageStates[stageNo][i][j]) {
, u/ P! v3 D9 J8 Y# t) t - case 2: + [0 E8 h& D9 o; l
- case 3: 4 N$ k3 n) @1 x; c/ s. t
- case 4:
$ W9 R% V$ o2 |' X: i+ ` - case 5: ) ^2 V, f+ y! I- w
- screen.drawImage(floorImage[1], moveX(j), moveY(i), null);
6 a6 F7 j/ v$ T4 ?. g" a& S9 q; | - default:
' ]/ G8 y# Y6 w6 u - j++;
( {1 J4 ]- K1 C - break; 9 V9 F: t) v+ S1 W. o
- }
7 O- X! h; W. b- v - }
" [3 S4 b# ?( I8 v) Q4 n - }
; V6 [" w6 k& @5 k3 _8 |& |) b - for (int n = 0; n < mapy[stageNo]; n++) { + I% Q) W; S# v, u. k
- for (int l = 0; l < mapx[stageNo]; l++) # r9 x) x( o3 }! L
- switch (stageStates[stageNo][n][l]) {
+ B$ M- F R) Y: t" G% ] - case 1: 1 k: Q1 h5 h% {+ c2 R' a9 P
- screen.drawImage(floorImage[0], moveX(l), moveY(n), null); 6 T: j- d! g4 a
- screen.setColor(new Color(32, 0, 0));
7 n: ? I% l; i' W - screen.drawLine(moveX(l), moveY(n + 1), moveX(l) + CS - 1, / P; d$ i8 O4 W ]' a
- moveY(n + 1)); ! G% j: }! h2 m& w/ a: b
- if (l == 0 || l > 0 && stageStates[stageNo][n][l - 1] != 1) {
$ L7 S7 |& e' f9 O' y: O! _( w c - screen.setColor(new Color(160, 128, 96)); 4 S. L- I" D% x$ U) E" |, |5 o# c
- screen.drawLine(moveX(l), moveY(n) + 1, moveX(l),
" H2 }# U5 R* M - moveY(n) + CS - 2);
R7 f# r' t& _' x& p$ M - }
& I) v7 r4 q$ Z - if (l == mapx[stageNo] - 1 || l < mapx[stageNo] - 1
/ N5 ~3 ~5 t1 F+ ~ - && stageStates[stageNo][n][l + 1] != 1) {
2 S, |+ G3 N1 E! L) G4 T1 `* I - screen.setColor(new Color(72, 64, 64));
" [+ Z" \' e$ X& L - screen.drawLine(moveX(l) + CS - 1, moveY(n), moveX(l)
1 \+ K3 E. l9 w' e9 z - + CS - 1, moveY(n) + CS - 2);
) k7 q( z1 @5 U7 d - }
* {# R0 V& B0 {, Q; ]- } - break; 1 n6 k3 G1 L6 c$ h, }1 f
- case 2:
% f8 K, o1 m: R3 ? - case 3: # ]5 [1 g6 a/ s& S
- case 4: : t# p/ D# }' X; D& J- w% i
- switch (stageStates[stageNo][n][l]) { \7 I S7 u4 O# M7 Z
- default:
# J# a6 |3 c2 t! z9 ^ - break;
: Q, M6 K+ N* a. a - case 2: C5 B) Y( e1 p( R! ]8 z
- case 3:
- M6 O8 d; v1 ^: v ~9 a, | - screen.drawImage(floorImage[3], moveX(l), moveY(n), - {1 r: E, B: ]9 z4 S4 u
- null);
" `, x! H: R1 z9 c8 @ - break;
/ m5 n- l2 e, N( u) F - case 4:
% [ x7 E5 O' a% ?% ^4 h6 H - break;
) E( _( G" n5 O. c - }
# T: X. l( f. f' E# |0 ?* j - if (stageStates[stageNo][n][l] != 3)
2 g3 x6 N% Q( j4 V h8 b. {+ w - screen.drawImage(floorImage[2], moveX(l), moveY(n), 8 P7 _! ~# \2 k
- null);
3 a6 v8 }$ t! Y - break;
( M7 {0 Y6 h3 M" N% S! v - default: , |& y) x$ s+ N( L& H3 F P
- break;
$ }; b6 m) j* \! ~ X4 _ - } 2 R5 K! v: E+ e4 A
- }
2 W; Z1 S* z1 |; E1 S" ^2 l) i4 a - // System.out.println(role[stageNo]);
C4 m |7 K0 R2 G# U& P - screen.drawImage(sprite.getOnlyMove(role[stageNo]), 3 h4 ?- n p: b' v5 T1 B
- moveX(rolex[stageNo]), moveY(roley[stageNo]), null); ! L+ M* r L! u, X7 t* S) j
- if (stageStates[stageNo][roley[stageNo]][rolex[stageNo]] == 4) { 0 X$ y; H, D0 p* ]' U. R2 }
- screen.drawImage(floorImage[2], moveX(rolex[stageNo]),
& {+ l. I2 T1 P2 W - moveY(roley[stageNo]), null);
! }& z' [& G# I1 T - } - {+ Z O8 c( D( E0 N# J
- setupDisplay();
8 s* ?9 X2 H# H* K8 `/ Z - }
* i9 y4 T; x/ A" D" M/ y! Z - /**
4 }6 [5 ^- M$ T9 J9 v1 U - * 定位到实际的X座标
. c8 I5 f$ x6 O/ ^6 j - * ; R4 X1 N* s* l- \. X* L
- * @param i 0 P8 v0 u+ f4 o5 k; n" `9 l- G
- * @return
. R2 O9 S# q! s! T* n - */ 8 K6 M% \7 h4 D' o+ m: w* |' z
- public int moveX(int i) { , `) V* ^* }5 y0 J
- return (CS * ((maxX - mapx[stageNo]) + 1)) / 2 + CS * i;
, L- ~/ E- M8 X' m. M' @/ U - }
* B' Y, R, F; v9 w: z - /**
: Z% B7 ^ R# t) d0 Z& p - * 定位到实际的Y座标 % b: w3 \2 S+ T: x1 O" s
- *
$ r$ K A: J7 v2 {& `" w; D" j - * @param i
2 w( j1 [0 A% q' z - * @return ; o+ u3 ]( b. u, ?7 [+ n
- */ & l, E N: q2 R; `" M
- public int moveY(int i) {
" X/ V( j8 n+ _" G) u3 H - return (CS * ((maxY - mapy[stageNo]) + 1)) / 2 + CS * i;
$ O3 ]$ r% S: J% O# \* T& v9 D - }
8 x- b: |* ]/ A5 t, A - /**
6 \8 E" \7 O3 Y2 n3 y( J' U6 M - * 执行操作
, ]# M+ r% @ x. l0 T/ K. _ - *
4 y) T, y# } ^9 o% b - */
2 m! D; P& ^( k% v7 T G - public synchronized void execute() { 2 j% P* @1 ^0 t- v2 c! D
- boolean flag = true;
( b- i2 c6 v; h: c+ p - for (int i = 0; i < mapy[stageNo]; i++) {
+ [$ y+ F q/ t# a. u( U: P - for (int j = 0; j < mapx[stageNo]; j++) {
b4 W5 t1 x- m3 Y; a - if (stageStates[stageNo][i][j] == 4) { 8 P/ |( f3 A) T' `- M3 Y9 p, I
- flag = false;
" G1 V: a4 `) H4 B3 ]/ i/ f8 L( T$ r - }
3 C7 `2 Y# D* a. j: Z b! s: ~ - } 5 P$ v. v$ z3 }/ I0 x) e2 F; y* \
- }
. S5 p2 F, p+ m2 R - if (flag) { , D7 D! t& \+ }; \2 L7 q6 n9 q
- stage.getMode()[stageNo] = 3; 3 ~' M3 `$ M) y' t% @1 ?& g
- complete[stageNo] = true; 5 v: N, P$ D D( L* w! S' r7 a
- } else if (hp[stageNo] == 0) { 4 O9 ]; Q8 d2 H; W
- stage.getMode()[stageNo] = 2; & b3 E1 i- @' P/ j! Q0 I8 @
- }
& U- [. ?5 ?3 Y: Q% P1 V" O - comps = 0; 5 p% f, V; D' P2 \; D4 p+ D
- for (int n = 0; n < stage.getMaxStageNo(); n++) {
; L. v; d- y+ h) j$ Q - if (complete[n]) { 2 h7 w7 f2 Z, p: P! I4 s& L. u
- comps++;
5 x! |! x% f$ X" F4 J- h. U9 G3 |0 G - } - j' H% p& _8 c7 j/ R
- }
- J: o! G; J: }7 G% c - } , O; O8 g6 h0 N1 H1 v$ K) [7 }
- /** 0 X2 ^. i$ J1 j1 [. z! e! g
- * 键盘事件处理
8 ^4 [) @/ F1 x4 t1 ^ - */
; t9 \4 h$ S& P) N# C, a& S. s - public void keyPressed(KeyEvent e) { 7 x8 T( H+ c& }! r- U* X0 q( y
- if (e.getKeyCode() == 10 && stageNo == -1) { 0 Q& N. {, S! L+ V0 C4 l u1 F
- // 开始关卡1
/ h- g, a( k4 Q/ p: D7 @ - reset(0);
6 {& J* M) Q, p( D! x - } else if (stageNo < 0) { 6 a0 X: q# L) t: {0 C& r
- return; 3 |% u" h: \5 u! ]! x8 J& W
- } - k! p% Y- G2 [( i3 g
- // 选关(默认为最大支持7关,更多请自行设定) $ P F6 f( [6 @ E$ W7 Q
- if (e.getKeyCode() == 97 || e.getKeyCode() == 49) {
5 d8 s1 s/ K7 c- O - stageNo = 0; , R0 J6 M, X1 `7 z; Z
- } else if (e.getKeyCode() == 98 || e.getKeyCode() == 50) {
. o: K: H, t) M - stageNo = 1; $ b/ Z5 O1 {% q h0 w1 H5 Q
- } else if (e.getKeyCode() == 99 || e.getKeyCode() == 51) { 4 C; N' G( ^. _0 x; n
- stageNo = 2; - g9 {+ A2 {- B; ]
- } else if (e.getKeyCode() == 100 || e.getKeyCode() == 52) {
) X) H' X. {+ H8 Y# h/ L& j - stageNo = 3;
$ h K1 E. W& U - } else if (e.getKeyCode() == 101 || e.getKeyCode() == 53) {
! l+ ^/ ]' k7 s6 _5 ` - stageNo = 4; # `4 c5 w9 ~4 B
- } else if (e.getKeyCode() == 102 || e.getKeyCode() == 54) {
/ [4 ?: o) k4 n( K: N3 S - stageNo = 5; & y: b. y0 f+ a( c: H
- } else if (e.getKeyCode() == 103 || e.getKeyCode() == 55) {
# z! ]* u: m9 L - stageNo = 6;
% w' F9 E" w, t; _) ?( g3 C - // ESC,重新开始 4 }8 s4 Z( V7 y" V- t# j
- } else if (e.getKeyCode() == 27) { 2 Q! x1 V* L+ G, j$ y* p
- reset(stageNo); ' S* z3 L+ O2 e( `- }- |0 r
- } else if (stage.getMode()[stageNo] == 1) { ) B& N R1 h/ V% M% k( F
- // 退步
( f* W, m" G8 E* I - if (e.getKeyCode() == 83) {
$ t! {- U) ~/ a, z/ d% @+ o3 K - nextStep(-1); % R& P7 i9 g* `2 I E3 z2 A' F
- }
7 O# K2 f5 Q8 N% F5 B - // 移动角色
: h0 e: R1 u5 l8 J& j6 W5 \ i - else if (e.getKeyCode() == 40) {
, _* m( L" e: x, A% {7 V - nextStep(0); 0 V# W; a' m8 w7 Z$ E* F0 O
- } else if (e.getKeyCode() == 37) { 7 j. n9 z# h3 `9 z
- nextStep(1);
% y( |* D+ y, j& O - } else if (e.getKeyCode() == 39) { H/ E/ N8 P# z6 t B! @+ M0 W
- nextStep(2); : f. [) E* V) G
- } else if (e.getKeyCode() == 38) { 0 g+ L5 H3 G) c% o0 o' Y0 ] d
- nextStep(3);
0 j/ |+ ?/ @% Y! M - } else {
; z: _9 u* \1 c0 G: v+ a& Z5 Z+ d - return;
6 Q8 C( d! l* i/ a0 u - } v1 X3 p+ V2 s; T: i3 `/ ?
- } else {
6 Y8 [+ g0 o4 R z U - return; ! k/ @ C0 m! {7 H0 v% T
- } + g& n8 g* y) r2 p
- // 绘制背景 1 L& x+ V3 j/ G. V; W0 p
- background(); ) @ c' j( k( ]! [
- // 绘制游戏画面
. U4 i8 N% R- u8 p! p% { - drawScreen();
& ]" t* U/ Y* ]0 d! e - } ! a& A9 I1 h% N8 {
- /** + y( P5 }: x9 H ?3 q: I
- * 切换动作
4 U2 x7 {1 |% \/ T* E - *
9 X9 P K; ~3 ?! k: s/ e! u - * @param i
7 A/ I5 P" ^# f# E# ` - */
0 i2 [3 N7 o% `' A% J4 w. q - public synchronized void nextStep(final int i) { 1 [( k9 y! v- O: S: v i
- boxMove[stageNo][hp[stageNo] - 1] = false; ; ?( A4 h# i- l: g
- switch (i) { ; t8 ?$ F, N! o+ O
- case 0:
3 D) Q0 j8 u, K `, q* p- | - if (stageStates[stageNo][roley[stageNo] + 1][rolex[stageNo]] < 2) {
) J5 V) a+ h, |! P2 ~6 D - return;
$ b# I- h/ y- G$ ~+ ^" K4 y ? - } / n0 b& H" ]- f8 l: `7 A. ?3 F
- if (stageStates[stageNo][roley[stageNo] + 1][rolex[stageNo]] < 4) {
9 x3 m+ W! T) o% z - if (stageStates[stageNo][roley[stageNo] + 2][rolex[stageNo]] < 4) { 4 p2 d. z* K# m4 Z8 |
- return;
( ^; H1 K3 s+ ^( I9 ` - } & e; I8 e( t+ A
- stageStates[stageNo][roley[stageNo] + 1][rolex[stageNo]] += 2;
# Y% p9 \" `% P, N - stageStates[stageNo][roley[stageNo] + 2][rolex[stageNo]] -= 2; " }- T0 f# s H, e- V& ~* A/ u
- boxMove[stageNo][hp[stageNo] - 1] = true; " B4 }3 @3 n; E1 E
- } 6 n! J; M0 ^* W( n# f7 d4 q4 \7 s* m
- roley[stageNo]++; 7 h5 E% |2 `( G' {4 Q+ M
- break;
) r* l& H5 [+ g' T - case 1:
, K9 M: E9 J* R - if (stageStates[stageNo][roley[stageNo]][rolex[stageNo] - 1] < 2) { + e3 @- |/ Q$ x* @& R. g
- return; # D; [3 E4 V, v4 P) ~
- } 3 m2 r, G, {4 `, |7 E( I* P6 G9 c9 j1 @
- if (stageStates[stageNo][roley[stageNo]][rolex[stageNo] - 1] < 4) { / z0 h: x1 [5 A* Q
- if (stageStates[stageNo][roley[stageNo]][rolex[stageNo] - 2] < 4) { - S g2 Z: D5 [- I7 v
- return;
( ^( R0 A0 L5 a/ t6 y, W# g ]" c. Z - } ) M B* Y. B5 q: N/ P3 }/ Y
- stageStates[stageNo][roley[stageNo]][rolex[stageNo] - 1] += 2; 2 z h% g+ Q5 ?! O8 X% S8 ^
- stageStates[stageNo][roley[stageNo]][rolex[stageNo] - 2] -= 2; , c8 j; F% }- g+ K' {
- boxMove[stageNo][hp[stageNo] - 1] = true; 0 J; n2 z& Z4 R7 _
- } 1 C3 j1 y$ Y% B1 d+ k, g! h" H
- rolex[stageNo]--; - h* a1 g8 K5 G7 W' }
- break;
5 _9 W2 U/ T, d/ w% O - case 2:
5 a, J% {$ w5 v( [/ Y - if (stageStates[stageNo][roley[stageNo]][rolex[stageNo] + 1] < 2) { & `+ E( p- D: \# m, D
- return; 4 u; i* ?7 w9 x! L# P) u
- } + s, ^ y. E# }. x
- if (stageStates[stageNo][roley[stageNo]][rolex[stageNo] + 1] < 4) { 3 [# m) A+ J5 N' [* }! w4 x$ ^# t
- if (stageStates[stageNo][roley[stageNo]][rolex[stageNo] + 2] < 4) {
1 B' U* [6 Y0 ~ u8 \" _! g - return;
1 o- Q4 c- ^8 {3 d2 w - } , j2 }: G7 q. S' B, h" G
- stageStates[stageNo][roley[stageNo]][rolex[stageNo] + 1] += 2;
/ P7 J, r9 q# o - stageStates[stageNo][roley[stageNo]][rolex[stageNo] + 2] -= 2;
- o5 _" T" h* A( A$ ] - boxMove[stageNo][hp[stageNo] - 1] = true; ' G F6 ]2 F9 ]" [
- }
3 u$ c# Q) {/ R! d; } - rolex[stageNo]++;
4 G3 q1 ^/ r6 Z: n8 t - break;
/ R7 c V/ G+ o1 h$ z( O ~3 ?6 P - case 3: ! P7 S( D/ E+ c
- if (stageStates[stageNo][roley[stageNo] - 1][rolex[stageNo]] < 2) { # i' @! z$ S6 }3 y. _7 z$ }
- return;
: ?! v$ r3 x* M r. ]: m3 z1 g - } 6 t' ?3 j" q$ m7 ~1 G. U l
- if (stageStates[stageNo][roley[stageNo] - 1][rolex[stageNo]] < 4) {
9 G- d, m, u; F& Z$ V8 w/ X" Z - if (stageStates[stageNo][roley[stageNo] - 2][rolex[stageNo]] < 4) { 1 ?2 i" z/ F6 M+ J9 F
- return;
8 s1 v2 F/ F1 R/ B6 ]* K - }
9 u. i5 v" S( I. d1 n+ I% D - stageStates[stageNo][roley[stageNo] - 1][rolex[stageNo]] += 2;
6 Q2 @7 A4 Y. ]- m - stageStates[stageNo][roley[stageNo] - 2][rolex[stageNo]] -= 2; - I H; _5 {6 d1 @8 K2 u/ V
- boxMove[stageNo][hp[stageNo] - 1] = true; d* j0 @2 f% l' Q9 H
- } + c0 l/ p& ]: h# I
- roley[stageNo]--;
# g" v2 ]5 a8 ^5 Z: I0 R - break;
# D; b* u# B; Q! a: n5 Y - default:
: U1 z8 h- c9 |6 z; g2 {) b - if (hp[stageNo] == stage.getMaxHp()[stageNo]) {
9 r( g. `6 T, w! u6 `* H - return;
& I" x. v8 b1 V - } H" k5 G* z5 y7 ]- R3 A" k# {
- switch (ons[stageNo][hp[stageNo]]) {
9 G A6 N) F% u3 m( T6 A' ? - case 0:
/ q3 ]4 O+ G1 E, @+ u$ m - if (boxMove[stageNo][hp[stageNo]]) { & o* O8 Y0 b" L+ G1 h
- stageStates[stageNo][roley[stageNo] + 1][rolex[stageNo]] += 2; ! s+ _) L% _+ L( K, f m
- stageStates[stageNo][roley[stageNo]][rolex[stageNo]] -= 2; ( c( b3 X. j$ w, |# z q* J
- } 5 n6 S# f% j( j5 v
- roley[stageNo]--; 0 Q( L, ?5 F: I7 I6 M, M
- break; 7 {# R6 @( `, A! V+ G! j9 p' s
- case 1:
5 P8 E D: M0 L: c, z - if (boxMove[stageNo][hp[stageNo]]) {
3 z7 I8 l# t; _4 Z0 X - stageStates[stageNo][roley[stageNo]][rolex[stageNo] - 1] += 2;
# y; e9 t4 G8 D L9 P! g* I - stageStates[stageNo][roley[stageNo]][rolex[stageNo]] -= 2; 3 I* w& o. t2 |' f! w" I4 F
- }
: u; {* J+ _4 Y0 U0 M3 l2 @( B! {; f - rolex[stageNo]++; ; }2 N$ O( F# n% \5 {5 E2 H# Y7 V
- break;
, F- H* G' ~: S - case 2:
4 I7 g9 v9 G# W9 U7 d, ^1 M& W2 Q - if (boxMove[stageNo][hp[stageNo]]) {
) [% V8 a4 \9 b8 g$ K: ~ m - stageStates[stageNo][roley[stageNo]][rolex[stageNo] + 1] += 2; & z" M @, v9 D* h
- stageStates[stageNo][roley[stageNo]][rolex[stageNo]] -= 2;
: a: y3 M! }" U3 w - } 3 f" W: k }6 v+ d
- rolex[stageNo]--; 0 `4 f3 L- D; i) c$ @
- break;
% o; j+ ^% f9 j3 U/ a9 H$ @6 w - default:
4 O- [, C2 }/ c# _+ S- {% _ - if (boxMove[stageNo][hp[stageNo]]) { % N7 @; o b* a9 @6 i% N/ u
- stageStates[stageNo][roley[stageNo] - 1][rolex[stageNo]] += 2;
5 Y/ Z& r& v2 J" F- Q+ S- u - stageStates[stageNo][roley[stageNo]][rolex[stageNo]] -= 2; , n, J: C# Z. _! k" [: ~
- } / v* z+ l' ]% H8 B
- roley[stageNo]++;
2 S" p( u/ h" y( U - break; 1 @% U6 Y7 I" _4 N
- } / k: W9 ?+ Z& S7 U! _4 W @2 R6 N
- break;
& k) e, I% y- T6 t - }
! z$ S, E o' s0 |! H1 [( Y - if (i != -1) {
# a% o9 D! Y9 o! ], c9 i, u - hp[stageNo]--;
- I s% n# p+ c( V. Q- ?: F - ons[stageNo][hp[stageNo]] = i;
0 z" E9 G2 k9 H6 X - }
4 f3 o0 f W' O& e, q2 j1 p* a - role[stageNo] = ons[stageNo][hp[stageNo]];
& s, O, c5 n$ V4 w0 y - if (i == -1) {
/ K0 ]& t) ~/ U4 `0 T% ]- Q - hp[stageNo]++; * T: [, D M; F. y8 ^
- } 6 Q* B6 C. n9 h+ h0 S
- execute();
. _ [, Y E1 A: C/ u - } ! y* O: J' ^/ z0 [* l6 }
- /**
5 }+ D+ m9 R* j# e/ Z - * 开场画面
3 ?9 i r8 a# ?1 z$ K, @ - * " R( G. c9 e0 c [9 b" Q# j
- */
- l( u6 ?1 l e v8 ]( @ - public synchronized void openDraw() {
6 Y6 c0 L2 T2 Z - background(); * U3 m1 s% E7 {" U2 {
- for (int i = 0; i < 5; i++) {
, R; \ R( s* f) Q5 n1 e! b - for (int j = 0; j < maxX + 1; j++) { : E( z4 [1 G& |7 v) u) M5 u
- screen.drawImage(floorImage[0], CS * j, ; o) c4 g9 o4 M1 l7 X
- (CS * i + CS / 2 * maxY) - CS * 2, null);
) I: J( ^6 N- j: { - } 3 m6 r7 @2 V& u- {
- }
# {- w9 V( j9 u# u+ Z - GraphicsUtils.setAntialias(screen, true);
8 R5 L$ F& [ ^6 U' f! @' D - String mes = "怪蜀黍传说 - 勇者推魔王";
9 [3 }. h- R4 N1 e - screen.setFont(new Font("华文新魏", 1, 35));
& r& w- |/ j% d* b4 L3 U1 y - GraphicsUtils.drawStyleString(screen, mes, (CS * maxX - screen
" l% x+ H. g+ c$ ^6 t. ^ - .getFontMetrics().stringWidth(mes)) / 2 + 13, / s" k0 B+ ]$ S7 f$ Y3 Y
- (CS * maxY) / 2 + 25, Color.black, Color.orange); / C9 g0 w$ }* V& B6 X/ r1 S3 ]* m
- mes = "Java版搬箱子游戏开发入门示例 - 0.1.0";
/ Y$ r! h) ]3 K! ` - screen.setFont(new Font("华文新魏", 0, 30));
2 |6 J) }3 O; Q6 b g - GraphicsUtils.drawStyleString(screen, mes, (CS * maxX - screen 4 K: w' t0 K% L
- .getFontMetrics().stringWidth(mes)) / 2 + 13, # X7 Y% b7 g0 u6 o2 R
- (CS * (maxY + 2)) / 2 - 55, Color.black, Color.white);
J1 v5 m8 H1 Y+ e0 } - GraphicsUtils.setAntialias(screen, false);
" g& }1 c+ Y# v* R - setupDisplay();
( c- U& e& d2 _ - } , Y' t; S' i. D) k& n( V2 R
- /**
5 P. h% i- \. d4 ?$ W! h" d c$ i - * 绘图接口实现
# i# i1 R& T8 Z - */ . Z0 K8 K/ t3 o/ ^- b8 S
- public synchronized void draw(Graphics g) { ; a6 A1 }+ T5 X
- g.drawImage(screenImage, 0, 0, null); - b* r& _( Y/ J/ }; R% ]' N
- if (succeed) { - b+ s0 c# U& S" R9 j y0 ^
- if (sleep == 100) {
2 u% |) V% `) e, d: [ - // 进入下一关
5 I: c. \9 u( i- ]4 c+ y% y - reset(++stageNo); " U9 m: G# W! z- L% s/ R
- succeed = false;
( D" C _0 O0 H% |% f& l - sleep = 0; 4 l! H$ J" a# z; c/ F
- } # @" L2 X4 [$ r7 c! [0 g8 k2 n5 h4 A
- sleep++;
, ]$ k( m. u; Q - }
0 u7 }9 v/ o9 E7 n8 [ - } . H) y& k; |7 j+ ^% V
- /** 3 R, R7 E: p( D
- * 设置基本数据 ! U: `! I0 ~& E0 ~& J* F/ a
- * : F% E/ o# x- S' }0 ]* \% A! H
- */
" z* Z4 K4 x" g7 o" e - public void setupStage() {
' v" J/ c6 F/ n3 t - for (int i = 0; i < maxY; i++) {
7 q) l) O1 J; t* b - for (int j = 0; j < maxX; j++) { , y; ~# M+ n( Z
- stageStates[stageNo][i][j] = 0; " y% t- k: p& W% `$ _+ p
- }
8 m9 r Z+ }4 I. d - }
: U6 C7 E; ]$ D7 y% j - mapx[stageNo] = stage.getConf()[stageNo][0];
|; r9 M: W: M6 W/ o - mapy[stageNo] = stage.getConf()[stageNo][1]; + T# G) |4 q0 ^# P0 s
- rolex[stageNo] = stage.getConf()[stageNo][2]; j, F2 i7 g9 C+ V S
- roley[stageNo] = stage.getConf()[stageNo][3];
2 k0 c/ L: Y0 K% j+ u4 {* l - for (int n = 0; n < mapy[stageNo]; n++) {
* y8 ^) t! L& }- C- V5 w4 F - for (int l = 0; l < mapx[stageNo]; l++) { : O+ f- w3 m& ~1 r; I6 u7 d
- stageStates[stageNo][n][l] = stage.getMapData()[stageNo][n][l];
6 H! F. k' Z' l: G) @7 _/ q+ }0 f2 L - }
6 y \' P) p8 L% i: V* { - }
+ ^/ K- r3 U H3 J7 L% x! _! n; g, i - hp[stageNo] = stage.getMaxHp()[stageNo]; - ~' P( S# K- l5 P
- role[stageNo] = 0; , ]6 L: `# v: x, `& Q# i7 o
- for (int i1 = 0; i1 < stage.getMaxHp()[stageNo]; i1++) { " Z+ L( U- l$ @1 m0 }- L: m* w
- ons[stageNo][i1] = 0; % M: W: [$ H$ R* X! ^/ z( [& ^
- }
. c+ y& O' R1 o9 E( O$ n - for (int j1 = 0; j1 < stage.getMaxHp()[stageNo]; j1++) {
- K0 [4 F6 f+ J( F - boxMove[stageNo][j1] = false; ! @0 N! t4 `" ]( }( e
- }
& I7 e g: A R0 `4 n, ?$ [ - }
0 R% Q+ B# M& t& f N9 d - /** 7 M) d2 w; Z) I# N
- * 设置显示
7 r* y$ u- [8 U6 I4 O; e5 w: i - * / s) N' M4 C$ T9 X2 X8 c7 l+ c; f- K
- */ i# D% M/ d. \0 }. M
- public void setupDisplay() { $ q( r6 U) m, J: ^1 S K$ t9 L0 p2 _9 {
- if (message == null) {
1 B* U+ k/ ]" T7 n3 f0 V' j; H - screen.setFont(new Font(LSystem.FONT, 0, 12));
, X: _+ h. J" ?, E6 l' x - int size = 0;
+ ]% k5 B7 {5 b4 {, j& T - for (int j = 0; j < stage.getMaxStageNo(); j++) { : y% M y6 m9 N' Z5 J1 j* |
- if (complete[j]) { ) M9 t# ^. N. B
- screen.setColor(Color.gray);
1 y: _, V8 J4 z1 ?: Y9 F - } else { 1 L9 Q7 y" G- V6 n$ X# u
- screen.setColor(Color.white); , V# W% e! h: ]% N
- } , \* [4 N5 k( `2 H
- if (j == stageNo) { 3 r# R$ f: `7 j' l4 i8 Y2 ?) `- U
- if (complete[j]) {
) ~' ?: L8 b7 t/ L+ o* n1 t" B5 z - screen.setColor(Color.magenta); 0 i2 ^1 [/ N) p5 z7 e1 n3 w
- } else {
. P1 k% l% F5 c' I - screen.setColor(Color.cyan);
3 u* ^* m6 k/ g% Y - }
; c; y& i1 x+ o2 T4 @5 i - }
x+ |/ [2 ~ m' R - screen.drawString(m_stageName[j], size = (10 + (screen 5 w' r2 W% S; i
- .getFontMetrics().stringWidth("关卡0") + 20)
# F! ?0 B6 v! m - * j), LSystem.HEIGHT - 50);
+ M9 x$ S( \; D( V5 K! D7 i - } + [& e) o& t n$ `0 I, ~
- screen.setColor(Color.white); 9 h+ E. ^# H. f) @
- if (stageNo == -1) { $ H0 r+ [% u" A7 P; r
- // 初始画面,无数据 2 e/ T6 @! v2 z/ }4 V( _+ A: w
- } else { # `% B, v0 X8 I3 M+ H. d* D
- // 显示状态 / R. ~; a& U0 R& J) |
- if (hp[stageNo] == 0) {
/ r- O( ~! j$ Y" t% O0 d - screen.setColor(Color.red); % k. Z: Y/ }/ H/ w5 [3 j1 L
- } else if (hp[stageNo] <= stage.getMaxHp()[stageNo] / 4) {
8 r* }% u% @. U; T* s6 B) c - screen.setColor(Color.orange);
$ g' @+ }6 }! S0 Z - } else if (hp[stageNo] <= stage.getMaxHp()[stageNo] / 2) { 9 Z9 b8 c& o4 s; f
- screen.setColor(Color.yellow); & ?/ ~3 ^1 H- f0 W5 A" Y
- }
0 o$ ^! b. J0 {, j6 V. q - screen.drawString("主角 HP " + hp[stageNo] + "/" # U$ {* B5 j5 i0 C3 z
- + stage.getMaxHp()[stageNo], size + 50, : Q" o! G! y4 W2 h& S4 m
- LSystem.HEIGHT - 50); 3 c9 h/ `; |. ]: c5 d
- switch (stage.getMode()[stageNo]) {
* p* ~' N1 V0 p, V1 i - // 生命耗尽
4 M: v' f& }$ u - case 2: " Z. m( C6 a' l3 n" c1 j& Q
- screen.setFont(new Font(LSystem.FONT, 1, 30)); , m" i, i$ i9 N w
- screen.setColor(Color.red); " \# ?, k- y7 J7 L1 f% Y& J
- GraphicsUtils.setAntialias(screen, true); * L1 ~- T* I( O5 n
- screen.drawString("The End!", 2 J. N4 ^( w5 ]: Q& F: x% N
- (CS * maxX - screen.getFontMetrics().stringWidth( ' @2 y2 B% J6 \3 L! ]
- "The End!")) / 2 + 14,
% G D- D. }9 F) [ - ((CS * (maxY + 1) + screen.getFontMetrics() 7 U) V" i% L3 A" `2 O. F: \/ Z
- .getAscent()) - screen.getFontMetrics() 4 K$ }& t9 }; I8 ]3 G+ v7 R: R
- .getDescent()) / 2); 4 s! Z( e W, t
- GraphicsUtils.setAntialias(screen, false);
% _) A% |4 e) D - break;
) y, P, R; G7 ?$ K - // 胜利 2 U6 J6 V8 D8 J" w8 ~* v* g/ `
- case 3:
( ?* j' a# Q9 w( u- w+ x# Y - screen.setFont(new Font(LSystem.FONT, 2, 40));
& E* z, b& D( S - screen.setColor(Color.darkGray);
2 X1 X C* m8 l$ t$ M - GraphicsUtils.drawStyleString(screen, "Good job!", (CS / D! d. y$ n6 a, L" ~: M1 m3 v
- * maxX - screen.getFontMetrics().stringWidth( 2 Z1 W% t; u: x# P: e9 W9 F
- "Good job!")) / 2 + 14, ((CS * (maxY + 1) + screen
( R# p* L# r# ^3 Y" M - .getFontMetrics().getAscent()) - screen . z. [, m: S* q2 a
- .getFontMetrics().getDescent()) / 2, Color.black, 2 d: t1 I4 N* H6 R( h1 _
- Color.white); - \3 z1 x9 g$ F
- // 胜利标记 5 ^! G2 w) k- t6 O
- succeed = true; 2 v+ X- R$ w4 c5 Z
- break; & N% o& k* {4 Z6 P7 ^7 g& s
- }
- ]8 c6 y, t* ?, C; ^/ Q7 W) N - }
/ {" e( w, x& |& Y- h - } - |( O* u2 _) c, ^6 E7 w3 }- P8 T
- // 存在信息时 % X. @6 T3 d1 |: K# H
- else { ( F$ i! C; k% K) ]% {: Z: a
- screen.setFont(new Font(LSystem.FONT, 0, 12)); * K x( r3 v: \( p
- int n = screen.getFontMetrics().stringWidth(message) + 16; 5 w: w( B; Z- q' `5 ^
- int l = screen.getFontMetrics().getAscent() 0 D @! b& e8 H* P1 C
- + screen.getFontMetrics().getDescent() + 8; 4 f) R5 G" Z A* k' @5 d5 `
- int i1 = (CS * (maxX + 1) - n) / 2; 3 d; _$ C) O# [3 w4 E
- int j1 = (CS * maxY + 1) - l / 2; + ]3 A e# \( i: j* y' t
- int k1 = i1 + 8; & m# ^ k$ N% T
- int l1 = CS
% W" \9 G- x3 H+ k" h - * maxY
. [8 P. P; ?; C5 A6 a' c. U7 J - + 1
* T+ u# v- [* C. ?1 K7 H+ A3 A: R$ n - + (screen.getFontMetrics().getAscent() - screen , n) l+ M; `4 A e* F; z
- .getFontMetrics().getDescent()) / 2; 9 t: r: Q: ]0 W
- screen.setColor(Color.black);
9 o# L2 q/ n# U( C! M) v' s5 @+ `, Q$ [ - screen.fillRect(i1, j1, n, l);
) B) @ a: d+ P( n' \! _ - screen.setColor(Color.white);
$ U5 `; g7 \' ?" f/ T' w - screen.drawString(message, k1, l1);
' u [0 Z% b- s1 q* t+ e - } r3 [) P$ ]4 K3 p3 k7 X
- }
' b; C2 b* e( a8 T3 ^% w& T7 v - }
复制代码
4 y$ q8 M: n) S% x! \启动类: % `) `" Q K6 b% D* Y, F
7 N6 Q8 e: h* C3 _8 U
8 i. D6 u* ~) p1 A) X* }- W% w5 }! z5 n
Main.java - package org.loon.game.simple.sokoban.main; + w' G% |4 X5 p( q2 N9 w; T+ g
- import org.loon.game.simple.sokoban.GameCursor;
) @8 o: x4 [- U* ]& y& F" Z* u+ ^ - import org.loon.game.simple.sokoban.GameFrame; ) E* s; P! S8 p. P
- import org.loon.game.simple.sokoban.control.Sokoban; 7 ^$ m1 M9 I6 b1 ~: {
- import org.loon.game.simple.sokoban.control.Stage; ( L- l3 g7 o+ c# I' r: c9 X
- import org.loon.game.simple.sokoban.control.Stage1; 3 M" @3 ^2 Q/ y( R5 S# W8 v
- /** " A9 ?1 }4 h: q+ Z$ s) ?5 f
- * Copyright 2008 - 2009 $ U- N. I6 e( j7 l& C! U; m' B+ w
- * ; @( W4 i+ \0 ]6 }
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not 7 H& K" k+ M- V4 g9 a
- * use this file except in compliance with the License. You may obtain a copy of / v* g n( N' E# I Q. L7 c
- * the License at
& ]" L, b* E3 H) l8 l; r! I - * % f. z c+ g* W- Q) x6 ~+ I
- * http://www.apache.org/licenses/LICENSE-2.0 " F' p& c& {* a
- *
& ^! l' L4 z) K+ E* K - * Unless required by applicable law or agreed to in writing, software
; S, k& ]- L0 f: ~/ k; B9 r - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
' g0 r- A& T5 u+ z" k5 Y) S; q, i - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
& c9 U& ]$ ?* B3 S$ p0 W8 G" X - * License for the specific language governing permissions and limitations under
& ~. r/ {: N6 L! }* } - * the License. . m, C6 J% D9 _, b. U
- * $ W, I3 V) j( H' H9 `1 z6 i
- * @project loonframework % m4 U- x0 h1 u# B% |
- * @author chenpeng
+ M2 ]2 g! v& F( N( \* b, m - * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn
- O6 T4 [3 x7 n6 p% K - * @version 0.1 % G) Y! B) T# Y# B" u) Z! Z
- */
1 U8 T' Q5 ^* O; ]5 K8 K - public class Main { 8 X( S" C! C$ d7 u
- public static void main(String[] args) {
+ ?- I Y% `( W- w( b5 L" H( z - java.awt.EventQueue.invokeLater(new Runnable() {
1 Z5 O+ |- @4 k, n9 i4 {5 c8 Q - public void run() { 7 k( k% `3 v. P( ^
- GameFrame frame = new GameFrame("Java版搬箱子游戏入门示例及源码-0.1.0", 540, 480); 4 z# O/ D5 n8 C% z" v
- frame.setCursor(GameCursor.getCursor("image/cursor.png")); 6 V+ W/ z k$ R" I/ b3 P: Y
- // 获得搬箱子关卡接口
5 E4 w- J. E n5 M - Stage stage = new Stage1(); - \. [: a; ]; U* n" [0 c3 U
- // 设定游戏控制器
. \7 f9 U ]& J( k; t. n( h - frame.getGame().setControl(new Sokoban(stage));
, y( O% H4 J8 b- n8 \ - // 游戏全屏 3 n* |3 D+ w/ x" I( A" N& c
- // frame.updateFullScreen();
. t- d) g1 I* ]3 J+ y5 R S1 s - // 是否显示fps
* h- z3 U$ G0 I+ A - frame.setFPS(true); 9 Z; |$ Q4 S3 ?+ ?9 w p
- // 允许的最大刷新率
# v4 i6 n( E0 X3 f# @9 V - frame.setMaxFrames(60); 6 w$ y$ f9 w! B. O; r* x2 W
- frame.mainLoop();
% O6 C# z8 _8 j9 Y - frame.showFrame(); ' f% j+ j' N0 ?! | S
- } 2 d* `6 O4 j; f6 ^ x( l! F
- }); % s ?+ c: ]; z( c) C, [
- }
6 e. j, i1 O2 ?* u - }
复制代码
/ t' L$ G! s$ j$ A& `+ {$ W* D( [; g1 I& {! o9 w) q# f
JavaSwing实现的推箱子项目源码.zip
(139.15 KB, 下载次数: 4, 售价: 1 IT币)
5 |& N0 [* {1 q9 F |
|