0

私はゲームに取り組んでおり、いくつかの問題に遭遇しました。私のアーキテクチャは次のようなものです:

クラス GameView は、サーフェス上にビットマップを描画するために使用されます クラス GameLoopThread は、ゲーム ループを実装するために使用されます (明らかでない場合) クラス MovementUtils は、オブジェクトの移動に関連するすべてのユーティリティを保持するために使用されます

重力や移動制御などのメソッドを MovementUtils に格納したいのですが、GameView の値を実際に更新するのに問題があります。インテントを使用してみましたが、役に立ちませんでした。コードを投稿します。誰かが私が何をすべきかを教えてくれるかもしれません。また、加速度計の行は無視してください。これはまったく別の問題です...

GameView.java

package com.example.connorgame;


import java.util.EventObject;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;


public class GameView extends SurfaceView  {
private Bitmap platform;
private Bitmap character;
private Bitmap background;
private SurfaceHolder holder;

private GameLoopThread gameLoopThread;
private MainActivity mainactivity;
private MovementUtils moveutil;

public float charX = 0;
public float charY = 0;
private boolean isFalling = true;
private boolean isJumping = false;
private float initialJumpY = 0;

private int initialFrame;
private int currentFrame;
private int frameDifference;

public GameView(Context context) {
    super(context);

    gameLoopThread = new GameLoopThread(this);
    mainactivity = (MainActivity) context;
    moveutil = new MovementUtils();

    holder = getHolder();
    holder.addCallback(new Callback() {

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub

        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            gameLoopThread.setRunning(true);
            gameLoopThread.start();
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            // TODO Auto-generated method stub

        }
    });



    platform = BitmapFactory.decodeResource(getResources(), R.drawable.platform);
    character = BitmapFactory.decodeResource(getResources(), R.drawable.character);
    background = BitmapFactory.decodeResource(getResources(), R.drawable.background);

}



    @Override 
    protected void onDraw(Canvas canvas) {

        canvas.drawColor(Color.BLACK);
        canvas.drawBitmap(background, 0, 0, null);
        canvas.drawBitmap(platform, 30, 700, null);
        canvas.drawBitmap(character, charX, charY, null);

        moveutil.gravity(charY, isFalling);

        if (charY > getHeight() - character.getHeight()) {
            initialFrame = gameLoopThread.numFrames;
            initialJumpY = charY;
            isFalling = false;
            isJumping = true;
        }

        if (isJumping == true && isFalling == false) {
            currentFrame = gameLoopThread.numFrames;
            frameDifference = (currentFrame - initialFrame);
            charY = charY - 5;

            if (charY == initialJumpY - 100) {
                isJumping = false;
                isFalling = true;
            }

        }

    }

}

MovementUtils.java

package com.example.connorgame;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;

public class MovementUtils {


public void gravity (float charY, boolean isFalling) {
    if(isFalling == true){
        charY = charY + 5;
    }
}

}

4

2 に答える 2

0

あなたが正しくやっていることを理解していればGameView、重力関数によってクラス内の charY を変更しようとしています。問題は、それfloatがプリミティブであるため、値に基づいており、ローカル コピーのみが変更されることです。代わりにオブジェクトを渡した場合、オブジェクトは変更されます。

gravity()解決策の 1 つは、Y 位置を変更しようとするのではなく、新しい Y 位置を返すことです。

別の解決策は、 to を渡してGameView変更さMovementUtilsせることです。MovementUtils

つまり、次のように GameView を渡します。new MovementUtils(this);

また、重力関数はvoid setCharY(int y);GameView で a を呼び出します。

public class MovementUtils {
    private GameView gameView;

    public MovementUtils(GameView view) {
        this.gameView = view;
    }

    public void gravity (float charY, boolean isFalling) {
        if(isFalling == true){
            charY = charY + 5;
            gameView.setCharY(charY);
        }
    }
}
于 2013-02-16T02:56:04.997 に答える
0

Java のみサポートpassing by value

だからあなたが電話するときmoveutil.gravity(charY, isFalling);

関数内で変更します。

public void gravity (float charY, boolean isFalling) {
if(isFalling == true){
    charY = charY + 5;
}

このような変更は、変数のローカル コピーでのみ発生し、クラスで定義されたインスタンス変数には影響charYしません。charYGameView

これを解決するには、変数をオブジェクトとして定義するだけでなく、関数への引数も定義できます。

public void gravity (Float charY, boolean isFalling) {}

そして、あなたの GameView クラスで:

private Float charX = 0; // why you define them public !?
private Float charY = 0;

または、クラスのインスタンスを渡すGameViewか、クラスを作成して( AndroidのオブジェクトにValueObject似ています)、それを使用して引数を渡すことができますContext

于 2013-02-16T02:56:12.543 に答える