标签: game-development

如何在纯Haskell中编写简单的实时游戏循环?

我刚刚开始使用Haskell,并希望在不安装其他库的情况下制作简单的实时游戏.我需要编写一个扫描键盘输入的循环,但如果没有输入,游戏也必须运行.我该怎么做呢?

haskell game-development

7
推荐指数
1
解决办法
553
查看次数

Phaser3 场景转换

我是Phaser3 的新手,在开始一个疯狂的项目之前,我想知道我应该如何开始,在场景之间切换。我看到有几个功能,启动,启动,切换,运行,恢复,暂停等。

例如,假设我想要 2 个场景,一个菜单和一个游戏。我在菜单上启动,我想进入游戏场景,如果我点击一个按钮,然后回到菜单场景。

我已经通过调用启动功能实现了这一点,但我注意到,所有的,initpreloadcreate函数的调用每一次,所以我加载的所有图像,将所有听众一遍又一遍。

这似乎是错误的,我应该使用启动或切换功能并暂停和恢复吗?但是如何隐藏之前的场景呢?

提前致谢。

game-development phaser-framework

7
推荐指数
1
解决办法
5304
查看次数

阵列中的路径游戏

我正在编写一种算法,以给定的速度遍历数组的元素。我用它来遍历我发现的一系列路径中的游戏地图上的单元格。

我需要用新数组调用新函数时,最后一个函数调用停止工作。

单击鼠标,即可沿路径移动。现在,如果我们调用第一个函数,它将沿着该路径运行,但是,如果在该路径的末尾之前,使用新路径再次调用该函数,则这两个函数将继续更改当前坐标。

对象必须在第一次调用该函数时所到达的位置中断其路径,并在第二个函数调用中继续其路径。

这是它现在如何工作的示例代码:

let coord = {x:0,y:0}
 
 let goByPath = (path=[],coord={})=>{
    let i = 0;
    pathIteration(i,path,coord)
  }

  let pathIteration = (i,path,coord)=>{

    if(i++<path.length){
      setTimeout(()=>{
        coord = path[i-1];
        console.log(coord);
        pathIteration(i,path,coord);
      },500);
    }
    return i;
  };
  
path1 = [{x:0,y:1},{x:1,y:1},{x:1,y:2},{x:2,y:2}];

path2 = [{x:1,y:3},{x:1,y:4},{x:1,y:5}];

goByPath(path1, coord);

setTimeout(()=>{
    goByPath(path2, coord);  
},900);
Run Code Online (Sandbox Code Playgroud)

现在输出到控制台:

{
  "x": 0,
  "y": 1
}
{
  "x": 1,
  "y": 1
}
{
  "x": 1,
  "y": 3
}
{
  "x": 1,
  "y": 2
}
{
  "x": 1,
  "y": 4
}
{
  "x": …
Run Code Online (Sandbox Code Playgroud)

javascript game-development

7
推荐指数
1
解决办法
58
查看次数

Bevy 的默认字体无法使用吗?

当尝试打印“Hello, world!”时 使用 Bevy 到屏幕上时,文本不会显示,直到我导入第三方字体文件并将其作为资源加载以用作组件TextStyle值中的字体值Text。在使用该字体之前,我没有明确指定该字体;我刚刚使用了来自 的值Default::default(),即WeakHandle<Font>(Id(97059ac6-c9ba-4da9-95b6-bed82c3ce198, 0))。这似乎意味着 Bevy 找到了错误的字体,或者至少是默认情况下无法使用的字体。这更有可能是我的系统提供的字体问题还是 Bevy 默认字体功能的问题?

这是一个最小的可重现示例:

use bevy::prelude::*;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_startup_system(setup)
        .run();
}

fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
    commands.spawn_bundle(UiCameraBundle::default());
    commands.spawn_bundle(TextBundle {
        text: Text::with_section(
            "Hello, world!",
            TextStyle {
                font_size: 60.0,
                color: Color::WHITE,
                font: asset_server.load("FiraSans-Bold.ttf")
            },
            Default::default()
        ),
        ..Default::default()
    });
}
Run Code Online (Sandbox Code Playgroud)

该代码有效。当我将字体值从 更改为 时asset_server.load("FiraSans-Bold.ttf")Default::default()屏幕上没有显示任何内容。

game-development rust bevy

7
推荐指数
1
解决办法
1782
查看次数

Canvas 2D 上下文绘制数百或数千张图像确实很慢

我正在尝试创建一款多人拼图游戏。

我的第一个方法是使用<canvas>2D 渲染上下文,但我尝试得越多,我就越认为不切换到 WebGL 是不可能的。

这是我得到的一个例子:

全拼图

在本例中,我要渲染一个 1900x1200 像素的图像,并将其切割成 228 个部分,但我希望游戏能够以更高分辨率渲染数千个部分。

每一块都是使用具有随机变化的贝塞尔曲线和直线按程序生成的,这给了我这样的结果:

外部标签延伸到最大的拼图 外部标签延伸到最小的拼图 内部标签延伸到最大的拼图 内部标签延伸到最小的拼图

我需要独立渲染每个部分,因为玩家可以拖放它们来重建拼图。

使用剪辑()

起初,我只有一个<canvas>,我使用了该clip()方法,然后drawImage()对每个部分进行调用。

但当尝试以 60fps 渲染数百个片段时,很快就遇到了性能问题(我在一台旧笔记本电脑上运行它,但我觉得这不是问题)。

这是我正在使用的代码的缩短版本:

class PuzzleGenerator {
  public static generatePieces(
    puzzleWidth: number,
    puzzleHeight: number,
    horizontalPieceCount: number,
    verticalPieceCount: number,
  ): Array<Piece> {
    const pieceWidth = puzzleWidth / horizontalPieceCount;
    const pieceHeight = puzzleHeight / verticalPieceCount;
    const pieces: Array<Piece> = [];
    for (let x = 0; x < horizontalPieceCount; x++) {
      for (let y = 0; y < verticalPieceCount; y++) …
Run Code Online (Sandbox Code Playgroud)

javascript performance game-development html5-canvas typescript

7
推荐指数
1
解决办法
1795
查看次数

如何使LAN客户端可以发现服务器

我正在使用python中的多人游戏,它使用套接字库进行网络连接.该游戏将支持局域网上的游戏.一个玩家将设置服务器,LAN上的其他玩家将能够加入游戏.

为了实现这一点,我需要一种简单的方法让玩家发现可用服务器列表(玩家不应该被要求输入IP地址!).我首选的解决方案只使用python套接字库(以及标准库的其他部分).

我要找的是客户端和服务器代码:

  • 客户端:向在LAN上某个端口上侦听的所有计算机广播其游戏请求

  • server(s):以可用性回复客户端

根据Hans在下面的回答中提出的建议,可以使用UDP套接字来响应来自客户端的广播请求.

服务器:

#UDP server responds to broadcast packets
#you can have more than one instance of these running
import socket
address = ('', 54545)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
server_socket.bind(address)

while True:
    print "Listening"
    recv_data, addr = server_socket.recvfrom(2048)
    print addr,':',recv_data
    server_socket.sendto("*"+recv_data, addr)
Run Code Online (Sandbox Code Playgroud)

客户:

#UDP client broadcasts to server(s)
import socket

address = ('<broadcast>', 54545)
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

data = "Request"
client_socket.sendto(data, address)
while True:
    recv_data, addr = client_socket.recvfrom(2048)
    print addr,recv_data …
Run Code Online (Sandbox Code Playgroud)

python networking game-development kivy

6
推荐指数
1
解决办法
5599
查看次数

Github发布了一个特定的文件夹

我有一个包含大量文件夹的存储库,但我想为其中一个文件夹创建版本.

更简单的故事,它适用于游戏服务器,我只想为客户创建版本,作为向玩家提供客户端下载的方式.

release github game-development

6
推荐指数
1
解决办法
1147
查看次数

wgpu-native 性能与 Vulkan

我一直在阅读有关 wgpu-rs 的内容,如果用于构建本机桌面应用程序,它会使用 Vulkan、Dx12、Metal 等。鉴于此,我们是否可以期望 wgpu-rs 和直接使用 vulkan 之间具有可比的性能?我是图形编程领域的业余爱好者,但一直在 Rust 中开发一款游戏,一旦 wgpu-rs 支持就能够构建 wasm 的想法非常有吸引力。

game-development rust vulkan webgpu

6
推荐指数
0
解决办法
1933
查看次数

有没有办法在bevy游戏引擎中检测精灵的碰撞?

目前我使用两个物体(彗星和飞船)的位置来检测它们是否发生碰撞。

fn collision_detection(
    comets: Query<&Transform, With<Comet>>,
    mut ships: Query<(&Transform, &mut ShipStatus), With<Ship>>,
) {
    for comet in comets.iter() {
        for (ship, mut status) in ships.iter_mut() {
            if comet.translation.x < ship.translation.x + 80.0 && comet.translation.y < ship.translation.y + 80.0
            && comet.translation.x > ship.translation.x - 80.0 && comet.translation.y > ship.translation.y - 80.0 {
                status.dead = true;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但必须有更好的方法来做到这一点。

game-development rust bevy

6
推荐指数
1
解决办法
7424
查看次数

在 bevy rust 中创建网格后,如何修改网格?

我正在开发一个程序生成系统,并且希望能够在 bevy rust 中逐帧修改网格。

我尝试过使用,assets.get_mut()但这会导致错误:help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `bevy::prelude::Res<'_, bevy::prelude::Assets<bevy::prelude::Mesh>>

任何帮助将不胜感激。

我当前的代码大致如下:

// Function which is executed at the very start

fn setup (
    mut commands: Commands,
    mut meshes: ResMut<Assets<Mesh>>,
    mut materials: ResMut<Assets<StandardMaterial>>,
    asset_server: Res<AssetServer>
) {

    let mut mesh = Mesh::from(bevy::prelude::shape::Icosphere { radius: 0.5, subdivisions: 10 });

    commands.spawn()
            .insert_bundle(PbrBundle {
                mesh: meshes.add(mesh),
                material: materials.add(colour.into()),
                ..Default::default()
            })
            .insert(Transform::from_xyz(0.0, 0.0, 0.0));
}

// Function which is …
Run Code Online (Sandbox Code Playgroud)

rendering game-development rust bevy

6
推荐指数
1
解决办法
2508
查看次数