實作思路
1.如何分析?
第一步:發現類(物件)
人物-小丑(敵方-友方)
子彈-帽子
墻體
爆炸物
第二步:發現屬性
小丑: 寬高 , 位置(x y), 移動速度
帽子: 寬高 , 位置(x y), 移動速度
墻體: 寬高 , 位置(x y)
爆炸物:寬高 , 位置(x y)
第三步:發現方法
小丑: 移動 , 攻擊 , 人物撞邊界 ,
子彈: 移動 , 子彈撞墻 , 子彈撞邊界 ,
墻體: 靜止不動
爆炸物: 爆炸物消失
2.難點在哪里?
1 如何將圖片加載到表單里
- 背景圖片加載
- 人物-小丑加載
- 發射物-帽子加載 Missile
- 墻體-加載 Wall
- 爆炸物-加載 Explode
2 如何創建表單
3 如何發射子彈(如何使用鍵盤觸發事件)
3.二期版本
- 接入網路,多人作戰
第一天的實作
1.創建一個專案(ylm)
2.匯入需要使用到的圖片檔案到Java
3.在專案的src(源代碼)中創建游戲包(com.ytzl.ylm)
4.在游戲包(com.ytzl.ylm)下創建客戶端類GameClient并繼承Farme類
public class GameClient extends Frame {}
關于Farme類:
1.Farme類是Java自帶的一個系統類
2.Farme類的作用是可以制作出帶有標題和邊框的頂層視窗
5.實作游戲視窗的顯示
public void start(){
//啟動游戲時在控制臺輸出顯示"游戲開始"
System.out.println("游戲開始");
//視窗的標題設定
this.setTitle("原諒帽帶戰");
/*
*表單的大小以及位置設定——呼叫Frame類中的setBounds方法
* setBounds方法具體內容:setBounds(int橫坐標,int縱坐標,int長,int寬);
* 引數中橫縱坐標為0,表示視窗從計算機螢屏左上角開始鋪開顯示(視窗中心點)
*/
this.setBounds(0,0,700,500);
//讓表單顯示出來
this.setVisible(true);
//點擊視窗x關閉鍵回應關閉
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent windowEvent) {
//退出游戲后在控制臺輸出顯示"游戲結束"
System.out.println("游戲結束");
//呼叫System類中的exit方法以實作視窗關閉按鈕(X)的生效
System.exit(0);
}
});
}
//游戲入口
public static void main(String[] args) {
// 創建本類物件
GameClient gameClient = new GameClient();
// 使用本類物件呼叫start方法,開始游戲
gameClient.start();
}
6.給表單添加背景圖片
6.1在com.ytzl.ylm包下創建工具包util并且創建工具類CommonUtils
6.2在工具類(CommonUtils)中寫讀取圖片的方法
public class CommonUtils {
//讀取圖片方法getImage
public static Image getImage(String imgPath) {
//引數為圖片路徑地址
ImageIcon imageIcon = new ImageIcon(imgPath);
return imageIcon.getImage();
}
}
6.3在客戶端類中完成背景圖片的插入
// 將背景圖片的路徑賦值給常量BG_PATH
public static final String BG_PATH = "images/bg.png";
// 定義一個圖片的靜態變數(用于插入不同圖片)
private static Image image;
// 背景圖靜態塊,呼叫背景圖片路徑,所有資源(背景圖片,音頻,視頻)只需要加載一次
static {
image = CommonUtils.getImage(BG_PATH);
}
//重寫父類Frame類的paint方法以插入各種圖片
@Override
public void paint(Graphics g){
//插入背景圖定義位置和寬 高
g.drawImage(image,0,0,700,500,this);
}
插入人物-帽子-爆炸物-障礙物圖片在com.ytzl.ylm包下創建需要插入的圖片包entity
7.實作人物的顯示
7.1在圖片包(entity)下創建角色類Buffoon,定義角色屬性和方法
- 定義角色屬性
// 人物圖片路徑屬性
public static final Image buffoonImage = CommonUtils.getImage("images/body/s-left.png");
// 人物-橫坐標
private int x;
// 人物-縱坐標
private int y;
// 圖片-寬度
private int width;
// 圖片-高度
private int height;
// 人物-速度
private int speed;
// 人物-方向
private String dir;
//游戲表單屬性 因為小丑要在表單中顯示
private GameClient gameClient;
- 定義無參帶參構造以給角色的屬性賦值
//無參構造
public Buffoon() {
}
//帶參構造
public Buffoon(int x, int y, GameClient gameClient) {
this.x = x;
this.y = y;
this.width = 50;
this.height = 50;
this.speed = 3;
this.dir = "STOP";// 人物剛創建時為靜止狀態
this.gameClient = gameClient;
}
- 定義角色方法
//插入角色圖方法
public void paint(Graphics g){
g.drawImage(buffoonImage,this.x,this.y,this.width,this.height,this.gameClient);
}
//生成get set 方法
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public String getDir() {
return dir;
}
public void setDir(String dir) {
this.dir = dir;
}
public GameClient getGameClient() {
return gameClient;
}
public void setGameClient(GameClient gameClient) {
this.gameClient = gameClient;
}
7.2在客戶端中實作插入人物圖
// 創建人物-小丑,在引數中定義位置
private Buffoon buffoon = new Buffoon(200,200,this);
//重寫父類Frame類的paint方法以插入各種圖片
@Override
public void paint(Graphics g){
//用角色-小丑呼叫paint方法以給圖片寬 高 速度
buffoon.paint(g);
}
8.實作發射物的顯示
8.1在圖片包(entity)下創建發射物類Missile,定義發射物屬性和方法
- 定義發射物-帽子的屬性
//發射物圖片路徑屬性
public static final Image missileImage = CommonUtils.getImage("images/missile.png");
// 帽子-高度
private int height;
// 帽子-長度
private int width;
// 帽子-速度
private int speed;
// 帽子-橫坐標
private int x;
// 帽子-縱坐標
private int y;
//游戲表單屬性 因為帽子要在表單中顯示
private GameClient gameClient;
- 定義無參帶參構造給帽子的屬性賦值
//無參構造
public Missile(){
}
//帶參構造
public Missile(int x,int y,GameClient gameClient){
this.x=x;
this.y=y;
this.width=20;
this.height=20;
this.speed=10;
this.gameClient=gameClient;
}
- 定義帽子的方法
//插入帽子圖片的方法
public void paint(Graphics g){
g.drawImage(missileImage,this.x,this.y,this.width,this.height,this.gameClient);
}
//setget方法
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public GameClient getGameClient() {
return gameClient;
}
public void setGameClient(GameClient gameClient) {
this.gameClient = gameClient;
}
8.2在客戶端中實作插入帽子圖
// 創建發射物-帽子(missile),在引數中定義位置
private Missile missile = new Missile(300,300,this);
//重寫父類Frame類的paint方法以插入各種圖片
@Override
public void paint(Graphics g){
//用發射物-帽子呼叫paint方法以給圖片寬 高 速度
missile.paint(g);
}
9.實作爆炸物的顯示
9.1在圖片包(entity)下創建爆炸物類(Explode),定義爆炸物屬性和方法
- 定義爆炸物屬性
//爆炸物圖片路徑屬性
public static final Image explodeImage = CommonUtils.getImage("images/explode.png");
//爆炸物-高度
private int height;
//爆炸物-長度
private int width;
//爆炸物-橫坐標
private int x;
//爆炸物-縱坐標
private int y;
//爆炸物表單屬性 因為帽子要在表單中顯示
private GameClient gameClient;
- 定義無參帶參構造給爆炸物的屬性賦值
//無參構造
public Explode(){
}
//帶參構造
public Explode(int x,int y,GameClient gameClient){
this.x=x;
this.y=y;
this.width=30;
this.height=70;
this.gameClient=gameClient;
}
- 定義帽子的方法
//插入角色圖方法
public void paint(Graphics g){
g.drawImage(explodeImage,x,y,this.width,this.height,this.gameClient);
}
//生成get set方法
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public GameClient getGameClient() {
return gameClient;
}
public void setGameClient(GameClient gameClient) {
this.gameClient = gameClient;
}
9.2在客戶端中實作插入爆炸物圖
// 創建發射物-爆炸物(explode),在引數中定義位置
private Explode explode = new Explode(300,100,this);
//重寫父類Frame類的paint方法以插入各種圖片
@Override
public void paint(Graphics g){
//用爆炸物呼叫paint方法以給圖片寬 高
explode.paint(g);
}
10.實作墻體的顯示
10.1在圖片包(entity)下創建障礙物類(Wall),定義障礙物屬性和方法
- 定義障礙物屬性
//墻體圖片屬性
public static final Image wallImageZ = CommonUtils.getImage("images/wall-v.png");
//墻體-高度
private int height;
//墻體-長度
private int width;
//墻體-橫坐標
private int x;
//墻體-縱坐標
private int y;
//游戲表單屬性 因為墻要在表單中顯示
private GameClient gameClient;
- 定義無參帶參構造給障礙物的屬性賦值
//無參構造
public Wall(){
}
//帶參構造
public Wall(int x,int y,GameClient gameClient){
this.x=x;
this.y=y;
this.width=30;
this.height=70;
this.gameClient=gameClient;
}
- 定義障礙物的方法
//插入墻體圖片的方法
public void paint(Graphics g){
g.drawImage(wallImageZ,this.x,this.y,this.width,this.height,this.gameClient);
}
//生成get set 方法
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public GameClient getGameClient() {
return gameClient;
}
public void setGameClient(GameClient gameClient) {
this.gameClient = gameClient;
}
10.2在客戶端中實作插入障礙物圖
// 創建墻體(wall),在引數中定義位置
private Wall wall=new Wall(500,200,this);
第一天(完成)效果圖如下:
第二天(人物以及帽子移動方向)
public void move(String dir){
if("U".equals(dir)){
this.y-=this.speed;
}
if("R".equals(dir)){
this.x+=this.speed;
}
if("D".equals(dir)){
this.y+=this.speed;
}
if ("L".equals(dir)){
this.x-=this.speed;
}
if ("UR".equals(dir)){
this.x+=this.speed;
this.y-=this.speed;
}
if ("DR".equals(dir)){
this.x+=this.speed;
this.y+=this.speed;
}
if ("LD".equals(dir)){
this.x-=this.speed;
this.y+=this.speed;
}
if ("LU".equals(dir)){
this.x-=this.speed;
this.y-=this.speed;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/213375.html
標籤:其他
