我有一个组织游戏循环的想法.我对性能有些怀疑.可能有更好的做事方式.
考虑一下你有一系列游戏组件.他们都被称为在每次游戏循环迭代中做一些事情.例如:
GameData data; // shared
app.registerComponent("AI", ComponentAI(data) );
app.registerComponent("Logic", ComponentGameLogic(data) );
app.registerComponent("2d", Component2d(data) );
app.registerComponent("Menu", ComponentMenu(data) )->setActive(false);
//...
while (ok)
{
//...
app.runAllComponents();
//...
}
Run Code Online (Sandbox Code Playgroud)
优点:
释疑:
嗯,这个解决方案有多好?你是否在实际项目中使用过它?
我使用下面的代码作为一个简单 Android 游戏的游戏循环。它运行得很好,但游戏中时不时会出现一些小问题。一切都冻结了一秒钟,然后向前跳得比应有的更远。我对游戏循环进行了大量阅读,但在实现平滑循环方面仍然遇到了一些麻烦。插值可以解决这个问题吗?我怎样才能使运动变得平滑?
private final static int MAX_FPS = 30;
private final static int MAX_FRAME_SKIPS = 5;
private final static int FRAME_PERIOD = 1000 / MAX_FPS;
protected Void doInBackground(Void... params) {
Log.d("MainTask", "starting game task");
Canvas canvas;
long begin; // the time when the cycle began
long delta; // the time it took for the cycle to execute
int sleep; // ms to sleep if ahead
int skipped; // number of frames being skipped
sleep = 0;
while (running) { …Run Code Online (Sandbox Code Playgroud) 我有一些关于JavaScript循环的问题.
问题:
这是自己尝试的画布代码:
<!doctype html>
<html>
<head>
</head>
<body>
<canvas id="c" width="400" height="400"></canvas>
<script type="text/javascript">
var c = document.getElementById( 'c' );
ctx = c.getContext( '2d' );
var x = 100;
ctx.fillStyle= '#f00';
function loop()
{
ctx.fillRect( x, 100, 20, 20 );
++x;
}
setInterval( loop, 1 );
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud) 我正在将一个OpenGL应用程序从win32项目移植到Qt项目.
在win32项目中,我只需要一个mainloop,一旦前一个帧完成就继续执行下一帧.
在我找到关于Qt和OpenGL的教程中,他们使用计时器来控制场景的更新.但是,我想尽可能频繁地渲染帧数 - 如何做到这一点?
(不是这样)这里的简短问题.我正在制作一个简单的roguelike,使用Swing作为UI而不是控制台(这使得它更容易在Eclipse中工作,除其他外)但我似乎遇到了障碍.
我遇到的麻烦是,当我进入游戏循环时,UI将无法正常显示.我得到一个丑陋的窗框,在整个过程中给我"单人纸牌"的效果,而在运行它时,它的RAM使用量会迅速增长.
我在这里错过了一些关于Swing的批评吗?我是否必须使用Swing的并发设置来执行此操作?如果是这样,最好的方法是什么?
完整代码如下:
package roguelike;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.LinkedList;
import javax.swing.*;
import javax.swing.text.*;
public class roguelike {
Color c_black = new Color(0x000000);
Color c_white = new Color(0xffffff);
Color c_red = new Color(0xff0000);
Color c_blue = new Color(0x0000ff);
Color c_green = new Color(0x00ff00);
UI ui = null;
Player me = null;
Map gamemap = null;
LinkedList<Character> keyqueue = new LinkedList<Character>();
int charheight = 20;
int charwidth = 80;
public static …Run Code Online (Sandbox Code Playgroud) 我是python的初学者,我正在尝试制作一个圆形游戏.到目前为止,当您单击时,它会在您的鼠标上绘制一个带有随机颜色和半径的圆圈.
接下来,我希望圆圈随机向屏幕飞出.我该怎么做呢?到目前为止,这是我的代码的主要部分:
check1 = None
check2 = None
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit
if event.type == MOUSEBUTTONDOWN:
last_mouse_pos = pygame.mouse.get_pos()
if last_mouse_pos:
global check
color1 = random.randint(0,255)
color2 = random.randint(0,255)
color3 = random.randint(0,255)
color = (color1,color2,color3)
radius = random.randint (5,40)
posx,posy = last_mouse_pos
if posx != check1 and posy != check2:
global check1, check2
screen.lock()
pygame.draw.circle(screen, color, (posx,posy), radius)
screen.unlock()
check1,check2 = posx,posy
pygame.display.update()
Run Code Online (Sandbox Code Playgroud)
同样,我希望圆圈以随机方向飞离屏幕.我做了几次尝试,但还没有成功.还有,感谢帮助我的jdi
我非常有兴趣知道,如果我将所有精灵动画/移动逻辑放在Draw方法而不是Update方法中,并且更新方法只是管理触摸和其他事件.1)游戏动画/逻辑表现的任何问题?
2)游戏画面不会按预期运行吗?
我想在Erlang中实现一个游戏循环(它充当服务器),但我不知道如何处理缺少增量变量.
我想做什么,在Java代码中描述:
class Game {
int posX, posY;
int wall = 10;
int roof = 20;
public void newPos(x,y) {
if(!collision(x,y)) {
posX = x;
posY = y;
}
}
public boolean collision(x,y) {
if(x == wall || y == roof) {
// The player hit the wall.
return true;
}
return false;
}
public sendStateToClient() {
// Send posX and posY back to client
}
public static void main(String[] args) {
// The game loop
while(true) {
// Send …Run Code Online (Sandbox Code Playgroud) 我正在尝试在网络程序集中创建一个游戏。我选择用 Rust 来准备它并使用 Cargo-Web 进行编译。我设法获得了一个有效的游戏循环,但由于 Rust 借用机制,我在添加 MouseDownEvent 侦听器时遇到了问题。我非常喜欢编写“安全”代码(不使用“不安全”关键字)
此时,游戏只需将红色框从 (0,0) 移动到 (700,500),速度取决于距离。我希望下一步使用用户单击更新目的地。
这是游戏的简化且有效的代码。
静态/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<title>The Game!</title>
</head>
<body>
<canvas id="canvas" width="600" height="600">
<script src="game.js"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
src/main.rs
mod game;
use game::Game;
use stdweb::console;
use stdweb::traits::*;
use stdweb::unstable::TryInto;
use stdweb::web::document;
use stdweb::web::CanvasRenderingContext2d;
use stdweb::web::html_element::CanvasElement;
use stdweb::web::event::MouseDownEvent;
fn main()
{
let canvas: CanvasElement = document()
.query_selector("#canvas")
.unwrap()
.unwrap()
.try_into()
.unwrap();
canvas.set_width(800u32);
canvas.set_height(600u32);
let context = canvas.get_context().unwrap();
let game: Game = Game::new();
// canvas.add_event_listener(|event: MouseDownEvent|
// { …Run Code Online (Sandbox Code Playgroud) 我试图让我的游戏的FPS转到例如100,即使我正确地打电话
Display.sync(100);
Run Code Online (Sandbox Code Playgroud)
FPS是60 ..
主循环看起来像这样:
int delta = this.getDelta();
this.update(delta);
this.drawGL();
this.updateFPS();
Display.update(); // Automatically caps FPS to 60--unwanted
Display.sync(100); // And yet FPS is 60
Run Code Online (Sandbox Code Playgroud)
我应该补充一点,完全删除Display.sync(100);对FPS没有任何影响.
game-loop ×10
java ×3
android ×1
animation ×1
architecture ×1
c# ×1
canvas ×1
components ×1
erlang ×1
events ×1
frame-rate ×1
html5 ×1
javascript ×1
lwjgl ×1
opengl ×1
performance ×1
pygame ×1
python ×1
qt ×1
random ×1
roguelike ×1
rust ×1
swing ×1
timer ×1
webassembly ×1
xna ×1
xna-4.0 ×1