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