android surface 创建按钮,如何在android surfaceview上实现和绘制自定义按钮

2023-05-16

我正在学习在android中开发2d游戏。我完全是个新手。为了实现surfaceviews、主线程和更多工具,我遵循了一些教程,一切正常。

现在我想在主菜单中放置一个开始游戏按钮,我想知道什么是最好的方法。

我可以宣布这个按钮像

private Bitmap button;

在ontouch事件中,如果用户点击的坐标在按钮内,则捕获用户点击并执行一些功能。

但我想知道我是否可以做一个自定义类,可以管理动画,函数,转换和与该按钮相关的一切。

我不需要一个代码(我正在学习自己),只需要一个如何做的解释。我正在考虑制作开始按钮扩展场景,或者扩展位图类。

我会在mainmanu类中创建一个包含ui的每个gameobject的对象列表,并在每次绘制和触摸时检查该列表。

你怎么认为?

主要活动

public class MainActivity extends Activity {

private SceneHandler _sceneHandler;

private DBCore database;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

this.requestWindowFeature(Window.FEATURE_NO_TITLE);

database = new DBCore(this, getResources().getString(R.string.db_name),

null, 1);

_sceneHandler = new SceneHandler(this);

setContentView(_sceneHandler.getContentView());

}

}

主线

public class MainThread extends Thread {

private SurfaceHolder surfaceHolder;

private GameView gameView;

private boolean running;

public static Canvas canvas;

private int targetFPS = 60;

private double averageFPS;

public MainThread(SurfaceHolder surfaceHolder, GameView gameView) {

super();

this.surfaceHolder = surfaceHolder;

this.gameView = gameView;

}

@Override

public void run() {

long startTime;

long timeMillis;

long waitTime;

long totalTime = 0;

int frameCount = 0;

long targetTime = 1000 / targetFPS;

while (running) {

startTime = System.nanoTime();

canvas = null;

try {

canvas = this.surfaceHolder.lockCanvas();

synchronized(surfaceHolder) {

this.gameView.update();

this.gameView.draw(canvas);

}

} catch (Exception e) { }

finally {

if (canvas != null) {

try {

surfaceHolder.unlockCanvasAndPost(canvas);

}

catch (Exception e) {

e.printStackTrace();

}

}

}

timeMillis = (System.nanoTime() - startTime) / 1000000;

waitTime = targetTime - timeMillis;

try {

this.sleep(waitTime);

} catch (Exception e) {}

totalTime += System.nanoTime() - startTime;

frameCount++;

if (frameCount == targetFPS) {

averageFPS = 1000 / ((totalTime / frameCount) / 1000000);

frameCount = 0;

totalTime = 0;

System.out.println(averageFPS);

}

}

}

public void setRunning(boolean isRunning) {

running = isRunning;

}

}

游戏视图(又名surfaceview)

public class GameView extends SurfaceView implements SurfaceHolder.Callback {

private MainThread thread;

public GameView(Context context) {

super(context);

getHolder().addCallback(this);

thread = new MainThread(getHolder(), this);

setFocusable(true);

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

thread.setRunning(true);

thread.start();

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

boolean retry = true;

while (retry) {

try {

thread.setRunning(false);

thread.join();

} catch (InterruptedException e) {

e.printStackTrace();

}

retry = false;

}

}

@Override

public void draw(Canvas canvas) {

super.draw(canvas);

}

public void update() {

}

}

场景处理程序(在场景之间切换并对更改进行一些逻辑处理)

public class SceneHandler {

private Canvas _canvas;

private Scene _currentScene;

private MainMenu _mainMenu;

private LoadingBattle _loadingBattle;

private Battlefield _battlefield;

public SceneHandler(Context context) {

this._mainMenu = new MainMenu(context);

this._currentScene = this._mainMenu;

}

public void changeToScene(String newScene)

{

try {

switch (newScene)

{

case "MainMenu":

this._currentScene = this._mainMenu;

break;

case "LoadingBattle":

this._currentScene = this._loadingBattle;

break;

case "Battlefield":

this._currentScene = this._battlefield;

break;

default:

throw new Exception("Unrecongnized Scene");

}

} catch (Exception e) {

//

}

}

public Scene getContentView() {

return _currentScene;

}

}

场景(扩展的主类)

public class Scene extends GameView implements View.OnTouchListener {

private Scene _currentScene;

private ArrayList _gameScenes;

public Scene(Context context) {

super(context);

}

@Override

public boolean onTouch(View v, MotionEvent event) {

return false;

}

}

主菜单(最后是我想按下按钮的场景)

public class MainMenu extends Scene {

private Bitmap background;

private Context context;

public MainMenu(Context context) {

super(context);

this.context = context;

background = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.varaldor_menu_background);

}

private Matrix getScaleTransformationMatrix() {

float originalWidth = background.getWidth();

float originalHeight = background.getHeight();

float scale = this.getScreenSize().get("width") / originalWidth;

float xTranslation = 0.0f;

float yTranslation = (this.getScreenSize().get("height") - originalHeight * scale) / 2.0f;

Matrix transformation = new Matrix();

transformation.postTranslate(xTranslation, yTranslation);

transformation.preScale(scale, scale);

return transformation;

}

@Override

public void draw(Canvas canvas) {

super.draw(canvas);

canvas.drawBitmap(background, 0, 0, null);

Paint paint = new Paint();

paint.setFilterBitmap(true);

canvas.drawBitmap(background, getScaleTransformationMatrix(), paint);

}

@Override

public boolean onTouch(View v, MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

Toast.makeText(context,

"Toast por defecto", Toast.LENGTH_SHORT);

break;

}

return true;

}

private Map getScreenSize() {

Display display = ((Activity)context).getWindowManager().getDefaultDisplay();

Point size = new Point();

display.getSize(size);

Integer width = size.x;

Integer height = size.y;

Map screenSizeArray = new HashMap();

screenSizeArray.put("width", width);

screenSizeArray.put("height", height);

return screenSizeArray;

}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android surface 创建按钮,如何在android surfaceview上实现和绘制自定义按钮 的相关文章

随机推荐