标签: allegro

将Autodesk Animator Pro移植到跨平台

我以前的相关问题是逆向工程旧油漆程序

我在这里建立了我的运营基地:http://animatorpro.org wiki即将推出.

好的,现在我有300,000行传统的MSDOS代码库.这有点"小心你想要的"情况.我不是一位经验丰富的C程序员.我也不是完全缺乏经验,但出于所有意图和目的,我对语言是一个菜鸟,特别是它的图书馆的复杂性.我特别不了解专门为MSDOS编写的C程序与跨平台程序之间差异的变幻莫测.但是我已经研究了这个代码库超过一年了,这就是我对Animator Pro的了解:

使用的编译器和工具:

  • Watcom C编译器
  • tcmake(来自Turbo C的程序)
  • 386asm,Phar Lap dos扩展器的专用汇编程序
  • 当然还有Phar Lap dos扩展器本身.
  • 一系列晦涩的dos实用程序

大部分编译似乎都是由批处理文件驱动的.虽然我已经获得了所有这些工具的副本,但我还没有成功编译它.(虽然我编译了它的哥哥,autodesk animator original.

它有一个插件系统,可以在DLL可用之前复制DLL,基于REX.插件系统处理:

  • 视频驱动程序(包含大量VESA驱动程序)
  • 输入驱动程序(包括wacom数位板和键盘)
  • 绘图工具
  • 墨水(如photoshop的滤镜或混合模式)
  • 脚本插件(本质上是编译脚本)
  • 文件格式

它有自己的脚本解释器,名为POCO,基于C语言 - 脚本语言有足够的能力来完成插件系统可以做的几乎所有事情 - 只是更慢.

鉴于此信息,这是我的发展计划.请批评这个.源代码可在上面的链接中找到,因此如果您愿意,可以轻松地自己评估情况.

  1. 使用其原始工具进行编译.
  2. 切换到使用DJGPP,并进行必要的更改以使其与原始汇编程序一起编译.
  3. 包括Allegro.cc"游戏"库,并尽可能多地切换到该库的功能 - 也许只需编写使用Allegro API的新视频和输入驱动程序.我正在考虑快速而不是SDL,因为:有一个DOS版本的Allegro,而且令人着迷的是,其核心功能之一是能够播放Animator Pro的原生格式FLIC.
  4. 希望在3之后,我将淘汰项目中的大部分或全部汇编程序.我有希望地说,因为它是一种模糊的方言,没有任何现代的免费汇编程序,无需进行重大修改.我试过了所有这些.如果我可以定义汇编程序的实际函数,那么剩下的东西将转换为在NASM中汇编,或转换为C代码.
  5. 将dos扩展器从Phar Lap切换到HX Dos http://www.japheth.de/HX.html,它承诺尽可能多地复制WIN32 api.然后进行所有必要的代码更改以使其工作.
  6. 切换到Allegro.cc的win32版本,假设win32版本可以在HXDos之上运行.进行进一步必要的更改
  7. 修改插件系统以使用某种标准的跨平台插件库.这会是什么,我不知道.也许你可以提供一些建议?我与最初编写插件系统的开发人员进行了交谈,他说由于分段限制,它在现代操作系统上所做的一些事情是不可能的.我不确定这意味着什么,但我猜这意味着所有的插件都需要从头开始重写.
  8. 奇怪的是,我完成了以上所有工作,我们可以尝试在windows,osx和linux中运行它,同时处理其他跨平台的琐事,比如长文件名,以及我没有想到的东西.

任何人都有问题吗?allegro是个不错的选择吗?如果没有,为什么?你会对这个插件系统做些什么?你会做什么不同的?这整件事是愚蠢的吗?我应该从头开始重写它,使用原始的灵感吗?(显然需要原始开发人员"大约一个月"才能做到这一点)

我上面没有提到的一件事是文本/字体系统.不知道该怎么办,但Animator Pro有自己的自定义字体格式,但也可以使用Postscript Type 1字体和其他一些格式.

c dos paint allegro

13
推荐指数
3
解决办法
4040
查看次数

在MinGW 4.7.1上与-static-libstdc ++标志链接

我尝试
使用
编译器标志在MinGW 4.7.1 (在Win 7上使用Code :: Blocks 12.11 )编译(Allegro 5)
(在Project :: Linker settings :: Other linker settings中写入它们):

-static-libgcc
-static-libstdc ++

结果:

无法识别的命令行选项'-static-libstdc ++'

怎么解决?

c++ mingw allegro codeblocks mingw32

12
推荐指数
2
解决办法
2万
查看次数

错误:获取临时[-fpermissive]的地址

我一直在研究这几个小时,但没有用.基本上我有

struct rectangle {
    int x, y, w, h;
};

rectangle player::RegionCoordinates() // Region Coord
{
    rectangle temp;
    temp.x = colRegion.x + coordinates.x;
    temp.w = colRegion.w;
    temp.y = colRegion.y + coordinates.y;
    temp.h = colRegion.h;

    return temp;
}

// Collision detect function
bool IsCollision (rectangle * r1, rectangle * r2)
{
    if (r1->x < r2->x + r2->w &&
        r1->x + r1->w > r2->x &&
        r1->y < r2->y + r2->h &&
        r1->y + r1->h > r2->y) 
        {
            return true;
        }
    return false; …
Run Code Online (Sandbox Code Playgroud)

c++ collision-detection allegro collision

12
推荐指数
3
解决办法
4万
查看次数

CMake无法使用相对文件路径找到静态库

我想玩Allegro库,但我似乎无法让我的测试项目正确链接.确切地说,我收到cannot find -l<...>错误,<...>我指定使用的文件在哪里target_link_libraries.(详见下文.)

为了记录,我并不是所有关于构建过程的知识,我通常采用的方法是"单击一个按钮,希望弹出一个可执行文件,如果没有,则依靠试错." 我在这里发现了很多类似的问题,但似乎问题或解决方案与我所遇到的不同.我希望有一个明确的"这就是你做错了什么,而这就是做什么".

那就是说,这是我的项目结构:

/include
/lib
/src
    main.cpp
CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

我从Allegro二进制包复制的include和lib目录,lib是所有.a文件所在的位置.

这是我的CMakeLists.txt所说的:

cmake_minimum_required(VERSION 3.2)
project(AllegroTest)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -static-libgcc -static-libstdc++ -fpermissive")
add_definitions( -DALLEGRO_STATICLINK )

file(GLOB SOURCES src/*.cpp)
set(SOURCE_FILES ${SOURCES})
add_executable(AllegroTest ${SOURCE_FILES})

include_directories(include)

target_link_libraries(AllegroTest
    liballegro-5.0.10-static-mt.a
    liballegro_acodec-5.0.10-static-mt.a
    liballegro_audio-5.0.10-static-mt.a
    libvorbisfile-1.3.2-static-mt.a
    libvorbis-1.3.2-static-mt.a
    liballegro_color-5.0.10-static-mt.a
    liballegro_dialog-5.0.10-static-mt.a
    liballegro_font-5.0.10-static-mt.a
    liballegro_image-5.0.10-static-mt.a
    liballegro_memfile-5.0.10-static-mt.a
    liballegro_physfs-5.0.10-static-mt.a
    liballegro_primitives-5.0.10-static-mt.a
    liballegro_ttf-5.0.10-static-mt.a
    libdumb-0.9.3-static-mt.a
    libFLAC-1.2.1-static-mt.a
    libfreetype-2.4.8-static-mt.a
    libogg-1.2.1-static-mt.a
    libzlib-1.2.5-static-mt.a
    libopenal-1.14-static-mt.a
)

target_link_libraries(AllegroTest
    libgdiplus.a
    libuuid.a
    libkernel32.a
    libwinmm.a
    libpsapi.a
    libopengl32.a
    libglu32.a
    libuser32.a
    libcomdlg32.a
    libgdi32.a
    libshell32.a
    libole32.a
    libadvapi32.a
    libws2_32.a
    libshlwapi.a …
Run Code Online (Sandbox Code Playgroud)

c++ linker allegro cmake

11
推荐指数
1
解决办法
3647
查看次数

用C++渲染矢量图形(.svg)

我和朋友正在开发2D游戏,其中图形将是.svg文件,我们将通过首先光栅化它们或者直接在曲面上渲染它们来适当地缩放它们(在某些时候仍然需要光栅化).

问题是,我一直在寻找一个能够让我获取.svg文件并最终在allegro中呈现它的库.据我所知,它会将光栅化纳入某种格式,即allegro可以阅读,然后allegro可以呈现"扁平化"的图像.

那么我可以使用哪些C++库来获取.SVG文件并"展平"它以便我可以渲染它?库显然也需要支持缩放,所以我可以缩放矢量图形然后栅格化它.

我正在使用Windows和Visual C++ Express 2010.

任何建议都会有所帮助,因为我现在很迷茫:

我试过Cairo,但它只允许写.svg文件,不允许你读.svg文件.我也研究了与Cario一起使用的librsvg,但是我在Windows上正常工作时遇到了很多麻烦(因为它有大量的GNOME依赖).如果您有任何指南可以使这些工作(在Windows上)也很好.

c++ windows allegro vector-graphics

9
推荐指数
2
解决办法
2万
查看次数

Allegro 5在调用al_clear_to_color(ALLEGRO_COLOR)时崩溃

我是从Allegro 5开始的,但很快我就陷入了第二个类似hello-world的程序中.经过一些调试后,我得出结论,程序在调用函数时崩溃了al_clear_to_color(ALLEGRO_COLOR).我已尝试静态和动态地链接allegro,但问题仍然存在.我完全迷失了.

这是代码:

#include <cstdio>
#include <allegro5/allegro.h>

int main() {
    ALLEGRO_DISPLAY         *display;
    ALLEGRO_KEYBOARD_STATE  kbState;

    if(!al_init())
        return 0;

    if(!al_install_keyboard())
        return 0;

    display = al_create_display(800, 600);
    if(!display)
        return 0;

    do {
        al_get_keyboard_state(&kbState);

        al_clear_to_color(al_map_rgb(255, 255, 255));

        al_flip_display();

        al_rest(0.5);
    } while(!al_key_down(&kbState, ALLEGRO_KEY_ESCAPE));

    al_destroy_display(display);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

替换线

al_clear_to_color(al_map_rgb(255, 255, 255));
Run Code Online (Sandbox Code Playgroud)

为线

al_clear_to_color(tempClearColor);
Run Code Online (Sandbox Code Playgroud)

声明

ALLEGRO_COLOR tempClearColor = al_map_rgb(255, 255, 255);
Run Code Online (Sandbox Code Playgroud)

在循环开始之前,它确实有效,但在函数崩溃时

al_destroy_display(display);
Run Code Online (Sandbox Code Playgroud)

叫做.

调试器返回消息:

读取C:\ Program Files(x86)\ CodeBlocks\MinGW\bin\libstdc ++ - 6.dll的共享库符号时出错:
编程接收信号SIGSEGV,分段错误.

c c++ runtime-error allegro allegro5

9
推荐指数
0
解决办法
1249
查看次数

如何判断用户是否尝试在C++中关闭窗口?

当用户点击窗口上的关闭按钮时,我需要打破一个while循环,但我不知道要检查什么.我正在使用allegro来运行GUI.

c++ allegro

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

从std:unique_ptr到bool的隐式强制转换出错

我正在使用Allegro创建一个简单的游戏.当我尝试验证我的显示指针不是null时,我收到编译器错误告诉我

错误C2664:'void validate(bool,std :: string)':无法将参数1从'std :: unique_ptr <ALLEGRO_DISPLAY,main :: <lambda_996846ce92067e506da99cad36e610cf >>转换为'bool'

这是我的代码

#include <iostream>
#include <memory>
#include <string>

#include <allegro5\allegro.h>

using namespace std;

const int WIDTH = 512;
const int HEIGHT = 512;

void validate(bool ptr, string errorMessage) {
    if (!ptr) {
        cerr << errorMessage << endl;
        exit(-1);
    }
}

int main() {
    auto deleter = [](ALLEGRO_DISPLAY* d) { al_destroy_display(d); };
    unique_ptr<ALLEGRO_DISPLAY, decltype(deleter)> display;

    validate(al_init(), "Failed to initialize Allegro");
    display = unique_ptr<ALLEGRO_DISPLAY, decltype(deleter)>(al_create_display(WIDTH, HEIGHT), deleter);
    validate(display, "Failed to create display"); …
Run Code Online (Sandbox Code Playgroud)

c++ smart-pointers allegro c++11 visual-studio-2013

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

C++:如何阻止函数接受内联分配的指针?

无法弄清楚如何准确地说出问题,所以这是一个例子:

鉴于此功能原型:

void Foo(myClass* bar);
Run Code Online (Sandbox Code Playgroud)

我想阻止这种用法:

Foo(new myClass());
Run Code Online (Sandbox Code Playgroud)

而是需要先前创建的对象:

myClass* bar = NULL;
bar = new myClass();
Foo(bar);
Run Code Online (Sandbox Code Playgroud)

要么

myClass bar;
Foo(&bar);
Run Code Online (Sandbox Code Playgroud)

谢谢.


编辑

这是一个澄清的例子:


void Mouse::SetImage(BITMAP* image, int focusX, int focusY) {
    if(_image) {
        set_mouse_sprite(NULL);
        set_mouse_sprite_focus(0, 0);
        show_mouse(NULL);
        destroy_bitmap(_image);
        _image = NULL;
    }
    if(image) {
        _image = create_bitmap(image->w, image->h);
        clear_bitmap(_image);
        blit(image, _image, 0, 0, 0, 0, image->w, image->h);
    }
    if(image == NULL) {
        focusX = 0;
        focusY = 0;
    }
    _focusX = focusX;
    _focusY = …
Run Code Online (Sandbox Code Playgroud)

c++ parameters pointers function allegro

5
推荐指数
1
解决办法
480
查看次数

使用 Allegro5 播放 C 语言的声音文件

我正在尝试用 allegro5 在 C 中播放 wav 文件,我写了下面的代码:

#include <stdio.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_audio.h>
#include <allegro5/allegro_acodec.h>

int main(int argc, char **argv){

    ALLEGRO_DISPLAY *display = NULL;


    if (!al_init()){
        fprintf(stderr, "failed to initialize allegro!\n");
        return -1;
    }

    if (!al_install_audio()){
        fprintf(stderr, "failed to initialize audio!\n");
        return -1;
    }

    if (!al_init_acodec_addon()){
        fprintf(stderr, "failed to initialize audio codecs!\n");
        return -1;
    }

    if (!al_reserve_samples(1)){
        fprintf(stderr, "failed to reserve samples!\n");
        return -1;
    }


    al_install_audio();
    al_init_acodec_addon();

    ALLEGRO_SAMPLE *sample = al_load_sample("bomb.wav"); //sample always NULL

    al_reserve_samples(1);

    if (!sample){
        printf("Audio clip sample …
Run Code Online (Sandbox Code Playgroud)

c audio allegro allegro5

5
推荐指数
1
解决办法
1255
查看次数