ここから本文です

Java(Eclipse Helios 2)でメソッドか配列を使って同じ機能のまま一部を書き換えた...

kus********さん

2017/12/1512:24:25

Java(Eclipse Helios 2)でメソッドか配列を使って同じ機能のまま一部を書き換えたいのですがなかなか思いつきません。

どう書き換えればよいでしょうか?
public class Own_machine extends Turtle {

// 起動処理
public static void main(String[] args) {
Turtle.startTurtle(new Own_machine());
}

// タートルを動かす処理
public void start() {

ImageTurtle haikei2 = new ImageTurtle("haikei3.jpg");
double time = 0;
int hitpoint = 150;
TextTurtle timeBoard = new TextTurtle(time);
TextTurtle text = new TextTurtle("HP:" + hitpoint);

int x1;
int x2;
int x3;
int x4;
int level;
int check = 0;

// int x5;
// int x6;

int y;
// プレイヤーを生成
ImageTurtle player = new ImageTurtle("Own_machine.png");
ImageTurtle gameOverScreen = new ImageTurtle("Gameover.jpg");// ゲームオーバー画面

// ゲームオーバー画面の調整
gameOverScreen.warp(500, 400);// 中央に移動する
gameOverScreen.scale(3);
gameOverScreen.hide();// 開始時は隠す

// オブジェクトの生成
ImageTurtle object1 = new ImageTurtle("obstacles.png");
ImageTurtle object2 = new ImageTurtle("obstacles2.png");
ImageTurtle object3 = new ImageTurtle("obstacles3.png");
ImageTurtle object4 = new ImageTurtle("obstacles4.png");
// ImageTurtle object5 = new ImageTurtle("obstacles5.png");
// ImageTurtle object6 = new ImageTurtle("obstacles6.png");

// タートルを消す
hide();
double xSpeed;// プレイヤーの横方向の速度
// double qSpeed;// objectの縦方向のスピード
// 初期スピードは0
xSpeed = 0;
// qSpeed = -4;

// 画面の大きさと位置を調整
window.size(1000, 800);
window.warp(100, 100);
// timeBoard.warp(50, 25);
haikei2.warp(500, 380);
haikei2.scale(0.7);
timeBoard.warp(55, 25);
text.warp(65, 70);
// プレイヤーの位置と大きさを調整
player.warp(500, 50);
player.scale(0.2);
// obstacleの位置等

double playerXSpeed = 0;// プレイヤーの横方向の速度
x1 = (int) (Math.random() * 1000); // 1~100
x2 = (int) (Math.random() * 1000); // 1~100
x3 = (int) (Math.random() * 1000); // 1~100
x4 = (int) (Math.random() * 1000); // 1~100

y = 800;
level = 5; // レベルがあがると速度が上がる

// アニメーションループ
while (true) {
if (time > 10 && y == 800) {
level = 10;
}
if (y != -60 && check == 0) {
y -= level;
} else {
x1 = (int) (Math.random() * 1000); // 1~100
x2 = (int) (Math.random() * 1000); // 1~100
x3 = (int) (Math.random() * 1000); // 1~100
x4 = (int) (Math.random() * 1000); // 1~100
/*
* x5 = (int) (Math.random() * 1000); x6 = (int) (Math.random()
* * 1000);
*/

y = 800;

object1.warp(x1, y);
object2.warp(x2, y);
object3.warp(x3, y);
object4.warp(x4, y);

}

// --- 待つ ---
sleep(0.025);

// --- 処理 ---

// プレイヤーの横方向の速度に基づいて横方向に動かす
player.x(player.x() + playerXSpeed);
// player.warp(player.x() + xSpeed, player.y());

// 左右のキー操作で動かす
if (key() == 37) { // 左
if (playerXSpeed > -15) {
playerXSpeed = -15;
} else {
playerXSpeed = -15;
}

} else if (key() == 39) { // 右
if (playerXSpeed < 15) {
playerXSpeed = +15;
} else {
playerXSpeed = 15;
}
} else {
playerXSpeed = playerXSpeed * 0.9;
}
// もし,playerが右端だったら
if (player.x() > 970) {
player.warp(970, player.y());// 右端にワープ
}
// もし,playerが左端だったら
if (player.x() < 10) {
player.warp(10, player.y());// 左端にワープ
}

// 物体
object1.warp(x1, y);
object2.warp(x2, y);
object3.warp(x3, y);
object4.warp(x4, y);

if (object1.intersects(player) || object2.intersects(player)
|| object3.intersects(player) || object4.intersects(player)) {
hitpoint--;
text.text("HP:" + (int) hitpoint);
if (hitpoint == 0) {
check = 1;
gameOverScreen.show();// ゲームオーバー画面を表示
}
}

print(xSpeed);
// 時間表示
time = time + 0.025;// タイムを増やす

// タイマー表示を更新
timeBoard.text("Time:" + (int) time);

// --- 再描画 ---
print(playerXSpeed);
update();
}
}
}

閲覧数:
52
回答数:
1
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

prw********さん

2017/12/2122:46:07

>なかなか思いつきません

ただ単にゲーム作りに慣れてないだけですので、ビビらなくても良いです

この手のSTG系統のゲームは伝統的かつ典型的な書き方がありますので、それを徹頭徹尾真似しつつ理解しますと、ラクです

全部をまるまる思い付ける人間はそうはいません

やり方としましては、敵の配列を作って管理します

***

import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;


public class Own_machine extends Turtle {

public static void main(String[] args) {
Turtle.startTurtle(new Own_machine());// 起動処理
}

private class WindowSize {//構造体のようなもの
final public int x;
final public int y;
final public int left_bound;
final public int right_bound;

WindowSize(int x, int y, int margin_left, int margin_right){
this.x = x;
this.y = y;
this.left_bound = margin_left;
this.right_bound = x - margin_right;
}
}

private class Character extends ImageTurtle {
public int hp;//キャラクターのHP
public int vx;//キャラクターの横方向の速度
public int vy;//キャラクターの縦方向の速度
public int move_delta;//移動量

Character(String image_name, int hp, int move_delta){
image(image_name);
this.hp = hp;
this.vx = 0;
this.move_delta = move_delta;
}

boolean is_dead(){
if(this.hp <= 0){
return true;
}
return false;
}
}

private class Bullet extends Character {
Bullet(String image_name, int hp, int move_delta, WindowSize ws, Character obj){
super(image_name, hp, move_delta);

int posx = obj.getX() + ((int)obj.width() - (int)this.width())/2;
int posy = obj.getY() + (int)obj.height() + 1;
this.warp(posx, posy);
}
boolean is_over(WindowSize ws){
if(this.getY() > ws.y){
return true;
}
if(this.getY() < 0){
return true;
}
if(this.getX() > ws.x){
return true;
}
if(this.getX() < 0){
return true;
}
return false;
}
void move(){
this.warp(this.getX(), this.getY()+8);
}
}

private class Enemy extends Character {
Enemy(String image_name, int hp, int move_delta, WindowSize ws){
super(image_name, hp, move_delta);

int x = (int) (Math.random() * ws.x);
this.warp(x, ws.y);

//int speed = (int) (Math.random() * this.initial_speed);
int speed = (int) (Math.random() * move_delta) + move_delta;
this.move_delta = speed;
}

void init_position(WindowSize ws){
int x = (int) (Math.random() * ws.x);
this.warp(x, ws.y);
}

void move(WindowSize ws){
this.y(this.getY() - this.move_delta);
this.warp(getX(), getY());
}

boolean is_over(){
if (this.getY() < -60 ){
return true;
}
return false;
}
}

private class Player extends Character {
final int LEFT = 37;
final int RIGHT = 39;

Player(String image_name, int hp, int move_delta, WindowSize ws){
super(image_name, hp, move_delta);

this.warp(ws.x/2, ws.y/10);//プレイヤーの位置と大きさを調整
}



void move(WindowSize ws, final int key_code){
this.x(this.x() + this.vx);//passive:プレイヤーの横方向の速度に基づいて、横方向へと自動で(慣性によって)動く。

//active:左右のキー操作で動かす
if (key_code == LEFT) {
if (this.vx > -this.move_delta) {
this.vx = -this.move_delta;
} else {
this.vx = -this.move_delta;
}
} else if (key_code == RIGHT) {
if (this.vx < this.move_delta) {
this.vx = this.move_delta;
} else {
this.vx = this.move_delta;
}
} else {
this.vx = (int)(this.vx * 0.9);
}

if (this.x() > ws.right_bound) {
this.x(ws.right_bound);
}
if (this.x() < ws.left_bound) {
this.x(ws.left_bound);
}

this.warp(this.getX(), this.getY());
}
}

private class Timer{
final int FPS;
final double delta;
double count;//sec

double sub_count;
final double level_up_time = 10.0;
int level;

Timer(int FPS){
this.FPS = FPS;
this.delta = 1.0/FPS;
this.count = 0.0;

this.sub_count = 0.0;
this.level = 1;
}

int getInt(){
return (int)this.count;
}

void increment(){
this.count += this.delta;//タイムを増やす
}

int level_speed(){
if(this.sub_count < this.level_up_time){
this.sub_count += this.delta;
}else{
this.sub_count = 0.0;
this.level++;
}
return this.level;
}
}


public void start() {//タートルを動かす処理
hide();// タートルを消す


WindowSize ws = new WindowSize(1000, 800, 10, 30);//本番用
window.size(ws.x, ws.y);//画面の大きさと位置を調整


Timer timer = new Timer(30);//ゲーム用のタイマー


ImageTurtle background = new ImageTurtle("background.jpg");
background.scale(1.2);


Player player = new Player("Own_machine.jpg", 150, 15, ws);


TextTurtle text = new TextTurtle("");
text.warp(100, 40);

//ゲームオーバー画面
ImageTurtle gameOverScreen = new ImageTurtle("Gameover.jpg");
//gameOverScreen.warp(ws.x/2, ws.y/2);//中央に移動する
//gameOverScreen.scale(3);
gameOverScreen.hide();//開始時は隠す


//敵の生成
final int delta_speed = 5; //速度の増加量。レベルが上がると、敵全体の速度が上がる。
final int initial_speed = 5;//敵の初期速度。

final String enemy_image_name = "enemy.jpg";
final int max_enemies = 5;
ArrayList<Enemy> enemies = new ArrayList<Enemy>();
for(int i=0; i<max_enemies; i++){
enemies.add(new Enemy(enemy_image_name, 1, 5, ws));
}


//弾の生成
final int SPACE = 32;//shot

final String bullet_image_name = "bullet.png";
final int max_bullets = 3;
ArrayList<Bullet> bullets = new ArrayList<Bullet>();



while (true) {// アニメーションループ
//待つ
sleep(timer.delta);


//処理
player.move(ws, key());
if(SPACE == key()){
if(bullets.size() < max_bullets){
bullets.add(new Bullet(bullet_image_name, 1, 5, ws, player));
}
}



//bulletの配列の処理
for(Iterator<Bullet> it_blt = bullets.iterator(); it_blt.hasNext();){
Bullet blt = (Bullet)it_blt.next();
if( blt.is_over(ws) ){
blt.hide();
it_blt.remove();
}
}
for (Bullet blt : bullets){
blt.move();
}


//enemyの配列の処理
for(Iterator<Enemy> it_en = enemies.iterator(); it_en.hasNext();){
Enemy en = (Enemy)it_en.next();
if( en.is_over() | en.is_dead() ){
en.hide();
it_en.remove();
}
}
if(enemies.size() < max_enemies){
int new_speed = initial_speed + timer.level_speed();
enemies.add(new Enemy(enemy_image_name, 1, new_speed, ws));
}
for (Enemy en : enemies){
en.move(ws);
}


//当たり判定の解決
for(Enemy enemy: enemies){
if(enemy.intersects(player)){
player.hp -= 10;
enemy.hp--;
}
}

for(Iterator<Bullet> it_blt = bullets.iterator(); it_blt.hasNext(); ){
Bullet blt = (Bullet)it_blt.next();

for(Iterator<Enemy> it_en = enemies.iterator(); it_en.hasNext(); ){
Enemy en = (Enemy)it_en.next();

if( en.intersects(blt) ){
en.hp--;

blt.hide();
it_blt.remove();

break;
}
}
}


if ( player.is_dead() ) {
break;
}


timer.increment();

text.text("HP:" + player.hp + "Lv:" + timer.level_speed() + "Time:" + timer.getInt());

update();//再描画
}

gameOverScreen.show();// ゲームオーバー画面を表示
update();//再描画
}
}

この回答は投票によってベストアンサーに選ばれました!

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる