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