LibGDX_7.5: 网络资源的访问(Net)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xietansheng/article/details/50188187

本文链接: http://blog.csdn.net/xietansheng/article/details/50188187

LibGDX 基础教程(总目录)

1. 概述

LibGDX 提供了一些跨平台的网络操作相关的类,这些类均通过 LibGDX 的网络模块(Net / Gdx.net)来操作。

2. Gdx.net

com.badlogic.gdx.Net 是一个接口,不同平台有着不同的实现,运行时实例为 Gdx.net。Net 接口提供了跨平台执行网络操作的方法,比如简单的 HTTP get 和 post 请求,TCP 服务端/客户端 socket 通信。

创建一个 TCP 客户端 Socket:

Socket socket = Gdx.net.newClientSocket(Protocol protocol, String host, int port, SocketHints hints);

创建一个 TCP 服务端 Socket:

ServerSocket server = Gdx.net.newServerSocket(Protocol protocol, int port, ServerSocketHints hints);

注意: TCP Socket 不支持 GWT 平台,这里的 Socket 和 ServerSocket 类在 com.badlogic.gdx.net 包中(不是 Java 原生的类),获取到 Socket 对象后,对 Socket 的具体使用和 Java 原生 TCP Socket 相似。

发送一个 HTTP 请求:

HttpRequestBuilder requestBuilder = new HttpRequestBuilder();
HttpRequest httpRequest = requestBuilder.newRequest().method(HttpMethods.GET).url("http://www.baidu.com").build();
Gdx.net.sendHttpRequest(httpRequest, httpResponseListener);

发送一个带参数的 HTTP GET 请求:

HttpRequestBuilder requestBuilder = new HttpRequestBuilder();
HttpRequest httpRequest = requestBuilder.newRequest().method(HttpMethods.GET).url("http://www.baidu.com/s").content("wd=libgdx&example=example").build();
Gdx.net.sendHttpRequest(httpRequest, httpResponseListener);

使用系统浏览器打开一个链接:

Gdx.net.openURI(String URI);

3. 代码示例: 从网络加载一张图片

注意: Android 平台访问网络,需要在 Android 工程的 AndroidManifest.xml 中添加网络访问权限。

package com.libgdx.test;

import com.badlogic.gdx.Application;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Net;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.net.HttpRequestBuilder;
import com.badlogic.gdx.net.HttpStatus;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.utils.viewport.StretchViewport;

/**
 * 游戏主程序的启动入口类
 */
public class MainGame extends ApplicationAdapter {

    private static final String TAG = MainGame.class.getSimpleName();

    // 视口世界的宽高统使用 480 * 800, 并统一使用伸展视口(StretchViewport)
    public static final float WORLD_WIDTH = 480;
    public static final float WORLD_HEIGHT = 800;

    // 舞台
    private Stage stage;

    // 纹理
    private Texture texture;

    // 演员(这里直接使用 Image 来表示演员)
    private Image actor;

	@Override
	public void create() {
        // 设置 Log 输出级别
        Gdx.app.setLogLevel(Application.LOG_DEBUG);

        // 使用伸展视口(StretchViewport)创建舞台
        stage = new Stage(new StretchViewport(WORLD_WIDTH, WORLD_HEIGHT));

        // 从网络中加载一张图片
        loadImageFromNet();
    }

    /**
     * 从网络中加载一张图片
     */
    private void loadImageFromNet() {
        /*
         * 图片链接, 最好先把链接复制到浏览器地址栏, 先用浏览器访问看看链接还是否有效, 如有意外, 建议多试几个链接。
         */
        // String url = "https://libgdx.badlogicgames.com/img/logo.png";
        String url = "http://h.hiphotos.baidu.com/image/w%3D310/sign=8eaa413779ec54e741ec1c1f89399bfd/9d82d158ccbf6c812f9fe0e1be3eb13533fa400b.jpg";

		// 1. 创建请求构建器
        HttpRequestBuilder requestBuilder = new HttpRequestBuilder();

		// 2. 构建请求对象
        Net.HttpRequest httpRequest = requestBuilder.newRequest().method(Net.HttpMethods.GET).url(url).build();

		// 3. 发送请求, 监听结果回调
        Gdx.net.sendHttpRequest(httpRequest, new Net.HttpResponseListener() {

            @Override
            public void handleHttpResponse(Net.HttpResponse httpResponse) {
                // 获取响应状态
                HttpStatus httpStatus = httpResponse.getStatus();

                if (httpStatus.getStatusCode() == 200) {
                    // 请求成功
                    Gdx.app.log(TAG, "请求成功");

                    // 以字节数组的方式获取响应内容
                    final byte[] result = httpResponse.getResult();

                    // 还可以以流或字符串的方式获取
                    // httpResponse.getResultAsStream();
                    // httpResponse.getResultAsString();

                    /*
                     * 在响应回调中属于其他线程, 获取到响应结果后需要
                     * 提交到 渲染线程(create 和 render 方法执行所在线程) 处理。
                     */
                    Gdx.app.postRunnable(new Runnable() {
                        @Override
                        public void run() {
                            // 把字节数组加载为 Pixmap
                            Pixmap pixmap = new Pixmap(result, 0, result.length);

                            // 把 pixmap 加载为纹理
                            texture = new Texture(pixmap);
							
							// pixmap 不再需要使用到, 释放内存占用
                            pixmap.dispose();

                            // 使用纹理创建演员
                            actor = new Image(texture);

                            // 添加演员到舞台
                            stage.addActor(actor);
                        }
                    });

                } else {
                    Gdx.app.error(TAG, "请求失败, 状态码: " + httpStatus.getStatusCode());
                }
            }

            @Override
            public void failed(Throwable throwable) {
                Gdx.app.error(TAG, "请求失败", throwable);
            }

            @Override
            public void cancelled() {
                Gdx.app.log(TAG, "请求被取消");
            }

        });

    }

	@Override
	public void render() {
		// 红色清屏
		Gdx.gl.glClearColor(1, 0, 0, 1);
		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        // 更新舞台逻辑
        stage.act();
        // 绘制舞台
        stage.draw();
	}

	@Override
	public void dispose() {
		// 当应用退出时释放资源
		if (stage != null) {
            stage.dispose();
		}
        if (texture != null) {
            texture.dispose();
		}
	}

}

运行结果:

sy_result.png


展开阅读全文

没有更多推荐了,返回首页