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