本文链接: http://blog.csdn.net/xietansheng/article/details/50188187
LibGDX 基础教程(总目录)
LibGDX 提供了一些跨平台的网络操作相关的类,这些类均通过 LibGDX 的网络模块(Net / 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);
注意: 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();
}
}
}
运行结果: