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