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