2013-02-16 5 views
0

나는 게임을하고 있으며 일부 문제가 있습니다. 클래스 MovementUtils 모두 보유하는 데 사용됩니다 (... 그것은 분명 아니었다면)다른 클래스의 메서드를 사용하여 활동에서 변수 조작

클래스 GameView 내 표면에 비트 맵을 그리는 데 사용 클래스 GameLoopThread 내 게임 루프를 구현하는 데 사용됩니다 : 내 아키텍처는이 같은 것입니다 움직이는 물체와 관련된 나의 유틸리티들

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; 
    } 
} 

}

+0

http://www.javaworld.com/javatips/jw-javatip10.html – Simon

답변

0

는 경우의 I 니가 제대로하고있는 걸 이해하고, 너는 GameView 클래스는 중력 함수에 의해 수정되었습니다. 문제는 float이 원시이므로 값에 따라 달라지며 로컬 복사본 만 수정됩니다. 대신 객체를 전달하면 객체가 수정됩니다.

gravity()을 Y 위치로 변경하는 대신 하나의 해결책은 아마도 새로운 Y 위치를 반환하는 것입니다.

또 다른 해결책은 GameViewMovementUtils으로 전달하고 MovementUtils을 수정하는 것입니다. 즉

, 당신은이 new MovementUtils(this);

처럼 GameView를 통과 할 것 그리고 중력 기능은 GameView에서 void setCharY(int y);을 부를 것이다.

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); 
     } 
    } 
} 
+0

감사합니다. 나는 이미 GameView 클래스에서 "중력"을 적용하여 성공적으로이 작업을 수행했지만 구성하려고했습니다. 왜 내가 이것을 생각하지 않았는지 모르겠다. Btw, 당신은 가속도계 사용법에 대해 아무 것도 몰라요? – vulgarknight

+0

도움이 되니 기쁩니다. 전에는 가속도계로 일한 적이 없지만 온라인에서 많은 자습서가 있다는 것을 알고 있습니다. – gsingh2011

+0

개체를 선언 할 때 실제 센서로 문제가 많지 않습니다. 이미 내 주 활동에 센서를 등록 할 수 있도록 컨스트럭터를 설정했지만 motionutils에서 값을 변경할 수 있도록 생성자를 다시 실행해야했습니다. 그래도 여전히 주요 액티비티에서 accelerometerUtil 클래스에 액세스 할 수 있어야합니다. 개체를 사용할 수있게 만드는 방법을 모르겠습니다. – vulgarknight

0

자바는 단지 당신이, 예를 들어, moveutil.gravity(charY, isFalling);

를 호출하고 함수 내에서 변경하는 경우 passing by value

그래서 지원

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

이러한 변화 변수 charY의 로컬 복사본에 발생

이 문제를 해결하려면로 변수를 정의 할 수 있습니다 하지GameView 클래스에 정의 charY 변수 인스턴스에 영향을 미치지 않습니다 객체뿐만 아니라 함수에 대한 인수 (예 :또한

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

, 당신이 당신의 GameView 클래스의 인스턴스를 전달하거나 (안드로이드에서 Context 객체 유사) ValueObject 클래스를 생성하고 인수를 전달하는 데 사용할 수 있습니다 :

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

그리고 당신의 GameView 클래스