Month: July 2019

DiGRA (Digital Games Research Association)

“DiGRA is the association for academics and professionals who research digital games and associated phenomena. It encourages high-quality research on games, and promotes collaboration and dissemination of work by its members.”

encontrei esta associação que reúne investigadores acerca de jogos :) .. vamos lá ver no que eles partilham ;)

+infos(oficial): http://www.digra.org/

+infos(biblioteca aberta): http://www.digra.org/digital-library/

Tags : , ,

Livros :)

Retro Gaming: A Byte-sized History of Video Games – From Atari to Zelda, por Mike Diver
+infos(loja): LINK

A Brief History Of Video Games: From Atari to Virtual Reality (Brief Histories), por Rich Stanton
+infos(loja): LINK

Games, Design and Play: A Detailed Approach to Iterative Game Design por Colleen Macklin
+infos(loja): LINK

Indie Games : The Complete Introduction to Indie Gaming, por Mike Diver
+infos(loja): LINK

Tags : ,

Mais uma daquelas páginas que é para ser consultada de forma regular :) O espaço gamefromscratch.com apresenta noticias bem como o acesso a vários recursos como é o caso de referências para cursos online acerca de gameEngines :)

+infos(oficial): https://www.gamefromscratch.com/

Business of Indie Games, vídeos para aprender

Encontrei este canal no youtube que fala acerca do negócio dos Indie Games.. são entrevistadas várias pessoas que falam da sua experiência nestas áreas :) aparecem também alguns especialistas que referem umas coisas catitas.

“A channel dedicated to helping indie devs and small to mid size game dev studios master the business side of making video games. Bringing together top game developers to talk about the mistakes they’ve made, their triumphs and what they’ve learned. Focusing on how to create a hit game, get it funded and developed and then discovered.”

+infos(Business of Indie Games): LINK

Tags : , , ,

Humble learn game development bundle (uma campanha)

A malta do Humble Bundle tem a decorrer uma Bundle de vários cursos acerca do desenvolvimento de videojogos. Por 30 euros têm acesso a 8 cursos online da malta do GameDev.tv

A lista do pack completo é constituído por:
How to Get A Job in the Video Game Industry
Finish It! Motivation and Processes for Game & App Development
Blender Environment Artist
Git Smart: Learn Git The Fun Way With Unity Games
Complete C# Unity Developer 3D
RPG Core Combat Creator
Complete C# Unity Developer 2D
Learn Unity 3D Game Kit – Make Games Without Coding

+infos(a campanha): LINK

Tags : , ,

Um portal de ligação de Indie GameDevs

O develteam.com é um portal onde se podem encontrar uma série de referências acerca da malta que faz do desenvolvimento de videojogos independente um modo de vida. Podemos ter acesso e procurar/encontrar profissionais para determinadas tarefas ou até mesmo referências como é o caso do audio, gráficos entre outros que fazem parte das stuffs necessárias para esse desenvolvimento.

É mais um portal que junta uma comunidade :)

+infos(oficial): https://www.develteam.com/

ZX Spectrum what else :)

Mais um daqueles portais catitas acerca do mundo ZX Spectrum :) o worldofspectrum.org Apesar de não ser actualizado à muito tempo tem uns links interessantes e ainda a funcionar, como é o caso do acesso a roms :)

+infos(mundo spectrum): http://worldofspectrum.org/

E existe uma malta por aí que ainda deve ter uns ZX Spectrum por casa e que nada podem fazer com eles, já que precisam de umas Tvs especificas ou então aquelas cassetes já não funcionam como deve ser :) Uma malta da Holanda desenvolveu uma peça catita que permite ligar o ZX Spectrum a qualquer monitor que tenha uma entrada HDMI.

A peça em causa é a ZX-HD HDMI INTERFACE e que faz uso de um Raspberry Pi Zero para fazer a comutação para HDMI :) O preço da mesma ronda os 70 euros, mas depois é necessário adquirir também o Raspberry Pi que são mais 20 euros e pagar os portes :)

É interessante esta peça já que permite e sem andar a soldar coisas fazer uso sem mais demora do ZX Spectrum (ZX Spectrum 16K, 48K, 48K+, 128K, +2, +2A, +2B, +3)

+infos(oficial): https://www.bytedelight.com/

+infos (a ZX-HD): LINK

Tags : ,

Um DevBlog tuga :)

Não é todos os dias que encontramos um DevBlog e ainda por cima de alguém que é português e que está a desenvolver projetos para múltiplas plataformas (videojogo).

Tão bom que é ler isto (2016):
“Hi!

We are starting a development blog for Decay of Logos, our first independent game. It will be available on desktops and consoles, it’s made with Unity and powered by Amplify Creations leading post-processing and texture virtualization tech. We will post as often as possible and we would love to hear from you, feedback and questions are welcome.

Decay of Logos is an immersive action/adventure third-person RPG influenced by Nordic folklore and by J. R. R. Tolkien’s high fantasy. The gameplay is heavily inspired by Dark Souls and The Legend of Zelda, with focus on exploration, combat and resource management. It draws its visual inspiration from movies like Princess Mononoke and games like Shadow of the Colossus.

You play as a girl on a journey with her companion, a mystical Elk. They fatefully meet after her village is destroyed by one of the King’s sons. Battered and oblivious of the culprit behind the attack, the girl will not rest until she has her revenge. During her quest she will unveil secrets about the King and his sons, slowly realizing that all is not what it seems.

André Constantino, our game designer and programmer, started a prototype back in 2014 as a personal project in his spare time. Later that year, he had the chance to demo it at ComicCon Portugal and the reception was great and inspiring.

In 2015, Amplify Creations gave him a chance to have a team by his side, and they are currently working hard together to make Decay of Logos a reality.”

O jogo tem de nome Decay of Logos e vai estar em breve disponivel para múltiplas plataformas.

+infos(o blog): https://decayoflogos.com/

+infos(o jogo): LINK

+infos(o estúdio): http://www.amplify.pt/

Tags : , ,

Command & Conquer, com uma nova roupagem

A malta da Electronic Arts decidiu ir buscar ao baú uma das lendas dos jogos de estratégia em tempo real (RTS). Relembro que esta marca/jogo foi comprado pela EA após vários negócios com o estúdio da Westwood Studios, e acabaram por deitar ao chão um produto que tinha imensos fans, dos quais eu era um deles.

Existem a agora várias promessas que começam com o envolvimento de vários elementos das equipas originais como é o caso de: Joe Bostic (co-criador do CnC), Steve Tall (programador), Mike Legg (audio) e Frank Klepacki (audio).

+infos(noticia): LINK

Tags : , ,

Emuladores de jogos e muito mais

Há uns tempos surgiu no mercado uma versão actualizada da PlayStation1, a PlayStation Classic, mais pequena, mais em conformidade com a utilização de porta HDMI, e com um conjunto de jogos. Infelizmente esse conjunto de jogos não poderia ser actualizado, mas entretanto a comunidade resolveu esta situação e ficou disponivel o emulador BleemSync.

Já o caso do RetroArch é um software que funciona como frontpage e que vai permitir jogar uma série de jogos de diferentes consolas em equipamentos mais recentes, de forma bastante intuitiva.

+infos(BleemSync): https://modmyclassic.com/bleemsync/

+infos(RetroArch): https://www.retroarch.com/

Tags : , ,

A Compendium of ZX Spectrum Games – Volume One por Kieren Hawken

Vai ficar disponível este mês o livro A Compendium of ZX Spectrum Games – Volume One por Kieren Hawken, que resulta do compêndio de outros textos do mesmo autor. É um livro de apresentação de vários jogos que sairam para este fantástico computador :)

+infos(loja): LINK

Tags : , , ,

C, exercício de análise

assunto: vetor dinâmico de estruturas, ficheiro de texto, ficheiro binário

pergunta: Um banco armazena num ficheiro binário informação sobre os seus clientes. Os dados de cada cliente são guardados em estruturas do tipo pessoa. Além disso, um ficheiro de texto tem armazenados vários valores inteiros relativos a alguns números de conta (um inteiro em cada linha). Escreva uma função que crie um vetor dinâmico de estruturas do tipo pessoa, para onde devem ser copiadas todas as estruturas do ficheiro que não têm um número de conta que surja no ficheiro de texto. A função tem o seguinte protótipo:
pessoa* criaVetor(char* nomeB, char* nomeF, int *total);
Recebe como parâmetros os nomes dos ficheiros e o endereço de uma variável inteira onde deve colocar o tamanho do vetor criado. Devolve o endereço inicial do vetor dinâmico. Se ocorrer algum erro, deve devolver NULL.
Ao responder a esta questão, não deve assumir que a ordem pela qual a informação surge nos 2 ficheiros é igual. Além disso, podem surgir números de conta no ficheiro de texto que não se encontram nas estruturas do ficheiro binário.

typedef struct cliente pessoa;
struct cliente{
    char nome[200];      // Nome do cliente
    char morada[200];    // Morada do cliente
    int nConta;         // Número de conta
    int montante;       // Saldo da conta
};

resposta:

pessoa* criaVetor(char* nomeB, char* nomeF, int *total) {
    FILE *f, *g;
    int n = 0, i, flag;
    int tab[n], *auxT;
    pessoa clt[*total], *auxC, *lista;
    *total = 0;
    lista = &clt[*total];
    f = fopen(nomeB, "rb");
    if(f == NULL) {
        printf("Erro a abrir para leitura o ficheiro binario [%s]\n", nomeB);
        return NULL;
    }
    g = fopen(nomeF, "rt");
    if(g == NULL) {
        printf("Erro a abrir para leitura o ficheiro de texto [%s]\n", nomeF);
        fclose(f);
        return NULL;
    }
    auxT = malloc(sizeof(int));
    if(auxT == NULL) {
        printf("Erro na alocacao de memoria\n");
        return NULL;
    }
    while(fscanf(g, "%d", auxT) == 1) {
        tab[n] = *auxT;
        n++;
        auxT = malloc(sizeof(int));
        if(auxT == NULL) {
            printf("Erro na alocacao de memoria\n");
            return NULL;
        }
        tab[n] = *auxT;     
    }
    auxC = malloc(sizeof(pessoa));
    if(auxC = NULL) {
        printf("Erro na alocacao de memoria\n");
        return NULL;
    }
    while(fread(auxC, sizeof(pessoa), 1, f) == 1) {
        flag = 1;
        for(i = 0; i < n; i++)
            if(auxC->nConta == tab[i]) {
                flag = 0;
                break;
            }
        if(flag == 1) {
            clt[*total] = *auxC;
            (*total)++;
            auxC = malloc(sizeof(pessoa));
                if(auxC = NULL) {
                    printf("Erro na alocacao de memoria\n");
                    return NULL;
                }
        }
    }
    return lista;
}

Tags : , ,

C, exercício de análise

assunto: um vetor dinâmico de estruturas
pergunta: lidar com um vetor (vector) dinâmico de estruturas, e ficheiro binário

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct cliente pessoa;

struct cliente {
    char nome[200]; // Nome do cliente
    char morada[200]; // Morada do cliente
    int nConta; // Número de conta
    int montante; // Saldo da conta
};

void guarda_dados_binario(pessoa * exame, int totalC) {
    FILE *f;

    f = fopen("bancoBinario.bin", "wb");
    if (f == NULL) {
        printf("\n erro no acesso ao ficheiro \n");
        return;
    } else {
        fwrite(&totalC, sizeof (int), 1, f);
        fwrite(exame, sizeof (pessoa), totalC, f);
        fclose(f);
    }
}

pessoa * ler_dados_binario(int totalC) {
    FILE *f;
    pessoa * auxc;

    f = fopen("bancoBinario.bin", "rb");
    if (f == NULL) {
        printf("\n erro no acesso ao ficheiro \n");
        return 0;
    } else {
        fread(&totalC, sizeof (int), 1, f);
        auxc = malloc(sizeof (pessoa) * totalC);
        fread(auxc, sizeof (pessoa), totalC, f);
    }
    fclose(f);
    return auxc;
}

void mostra_todos(pessoa * exame, int totalC) {
    if (totalC == 0) {
        printf("nao existem clientes\n");
    } else {
        printf("\ntotal: %d", totalC);
        for (int i = 0; i < totalC; i++) {
            printf("\n%s", exame[i].nome);
        }
    }
}

pessoa * adiciona_pessoa(int * auxtotalC) {
    int auxTotal = 0, totalC = 0;

    pessoa * auxc;

    printf("\nquantas pessoas quer adicionar?");
    scanf("%d", &totalC);
    * auxtotalC = totalC;

    auxc = malloc(sizeof (pessoa) * totalC);
    do {
        printf("Qual o nome?");
        scanf(" %99[^\n]", auxc[auxTotal].nome);
        printf("Qual a morada?");
        scanf(" %99[^\n]", auxc[auxTotal].morada);
        printf("Qual o numero da conta?");
        scanf("%d", &(auxc[auxTotal].nConta));
        printf("Qual o montante?");
        scanf("%d", &(auxc[auxTotal].montante));
        auxTotal++;
    } while (auxTotal < totalC);
    return auxc;
}
int main(int argc, char** argv) {
    pessoa * listaPessoas = NULL; // um vetor dinâmico de estruturas 
    pessoa * listaPessoas2 = NULL; // um vetor dinâmico de estruturas, para testes
    int total = 0;

    listaPessoas = adiciona_pessoa(&total);
    mostra_todos(listaPessoas, total);
    guarda_dados_binario(listaPessoas, total);

    //auxliar/verificar/para testes
    listaPessoas2 = ler_dados_binario(total);
    mostra_todos(listaPessoas2, total);

    return (EXIT_SUCCESS);
}
Tags : , ,

C, exercício de análise

assunto: lista ligada simples
pergunta: Escreva a função pdados troca(pdados p); Esta função recebe o endereço do primeiro elemento de uma lista ligada simples, constituída por nós do tipo dados. Se a lista tiver menos de três elementos, ou se o nome armazenado no primeiro nó começar por Z, a função não faz nenhuma alteração. Caso contrário, troca o primeiro com o último elemento: o primeiro passa a ser o último e o último passa a ser o primeiro. Devolve o endereço do primeiro elemento da lista depois da alteração

typedef struct t dados, *pdados;
struct t{
   char nome[100];
   int id;
   pdados prox; 
};

resposta:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct t dados, *pdados;

struct t {
    char nome[100];
    int id;
    pdados prox;
};
int totalElementos(pdados exame) {
    int conta = 0;
    if (exame == NULL) {
        printf("\n[erro] lista vazia");
        return conta;
    } else {
        while (exame != NULL) {
            conta++;
            exame = exame->prox;
        }
    }
    printf("\nexistem %d pessoas da lista", conta);
    return conta;
}

int letraZ(pdados exame) {
    if (exame->nome[0] == 'Z' || exame->nome[0] == 'z') {
        printf("\nsim existe um Z na primeira letra do primeiro nome da lista");
        return 1;
    }
    return 0;
}

pdados troca(pdados t) {
    pdados copiaPrimeiraPosicao;
    pdados copiaUltimaPosicao;
    pdados aux;
    aux = t;


    pdados ajudaUltimaPosicao;

    pdados ajudaPrimeiraPosicao;
    copiaPrimeiraPosicao = NULL;
    copiaUltimaPosicao = NULL;
    ajudaUltimaPosicao = NULL;
    ajudaPrimeiraPosicao = NULL;

    if (totalElementos(t) > 3 || letraZ(t) == 1) {
        printf("\nvou trocar");
        //estou na primeira posição
        if (t->prox == NULL) {
            //mas é o unico elemento, não existe troca
            return t;
        } else {
            //vou para a ultima posicao
            while (aux->prox != NULL) {
                aux = aux->prox;
            }

            //fazer uma copia da primeira posicao
            copiaPrimeiraPosicao = malloc(sizeof (dados));
            copiaPrimeiraPosicao->id = t->id;
            strcpy(copiaPrimeiraPosicao->nome, t->nome);
            copiaPrimeiraPosicao->prox = NULL;

            //fazer uma copia da ultima posicao
            copiaUltimaPosicao = malloc(sizeof (dados));
            copiaUltimaPosicao->id = aux->id;
            strcpy(copiaUltimaPosicao->nome, aux->nome);


            //organizar
            t->id = copiaUltimaPosicao->id;
            strcpy(t->nome, copiaUltimaPosicao->nome);
            t->prox = t->prox;

            aux->id = copiaPrimeiraPosicao->id;
            strcpy(aux->nome, copiaPrimeiraPosicao->nome);
            aux->prox = copiaPrimeiraPosicao->prox;
        }
    } else {
        printf("\nnao troquei nada\n");
        return t;
    }
    return t;
}

void listar(pdados exame) {
    if (exame == NULL) {
        printf("\n[erro] lista vazia");
        return;
    } else {
        printf("\n--listagem dos elementos--\n");
        while (exame != NULL) {
            printf("\n%d\t%s", exame->id, exame->nome);
            exame = exame->prox;
        }
    }
}

pdados adicionarLista(pdados exame) {
    pdados novo = NULL;
    pdados aux = NULL;

    novo = malloc(sizeof (dados));
    if (novo == NULL) {
        printf("\nerro: alocacao de memoria");
        free(novo);
        return NULL;
    } else {
        printf("\nqual o id\n");
        scanf(" %d", &novo->id);

        printf("\nqual o nome\n");
        scanf("%s", novo->nome);
        novo->prox = NULL;

        if (exame == NULL) {
            exame = novo;
        } else {
            aux = exame;
            while (aux->prox != NULL) {
                aux = aux->prox;
            }
            aux->prox = novo;
        }
    }
    return exame;
}

int main(int argc, char** argv) {
    pdados exame = NULL;
    int continuar = 0;
    do {
        exame = adicionarLista(exame);
        listar(exame);
        printf("\nmais algum? 1-nao/0-sim\n");
        scanf("%d", &continuar);

    } while (continuar == 0);


    exame = troca(exame);
    listar(exame);


    return (EXIT_SUCCESS);
}
Tags : , ,

Realidade Aumentada (no Porto)

A empresa Darwin & Warhol procura developer com experiência em Realidade Aumentada.
Entrada imediata contato para npinto@d-w.pt

+infos(oficial): http://www.d-w.pt/

Tags : ,

SO1 – introdução_ programa

Parte teórica
Introdução ao ambiente unix/linux
_aspectos gerais do sistema: lógica de funcionamento e operação
_sistema de ficheiros, componentes, estrutura
_operação em linha de comandos
_sheel scripintg
_aspectos gerais do sistema: lógica de funcionamento interno e configuração, permissões e segurança

Modelo de programação UNIX
_criação e gestão de processos
_mecanismo de sinais
_mecanismos de comunicação: named pipes (aplicações cliente servidor com named pipes)
_programação multithreaded
_sincronização de exclusão com semáforos binários

conceitos fundamentais de sistemas operativos
_conceitos básicos. objetivos e gestão da máquina
_elementos constituintes de sistemas operativos
_gestão de processo. algoritmos de escalonamento
_gestão de memória. mecanismos de algoritmos de gestão de memória. memória real e memória virtual

Parte prática
Programação para Unix (Linux)
_gcc/gdb. processo de compilação
_criação e gestão de processos
_notificações assíncronas: sinais
_named pipes: aplicações cliente servidor
_multi-threading e semáforos binários

Operarão do sistema Unix (com Linux)
_comandos Unix de consola /linha de comandos
_Introdução a shell scripting em Bash

Bibliografia
Fundamentos de Sistemas Operativos, José Alves Marques, Paulo Guedes – 3ª edição – Editorial Presença
Sistemas Operativos, José Marques, Paulo Ferreira, Carlos Godinho, Luís Veiga, Rodrigo Rodrigues, FCA
Operating Syems Concepts – 6-º edição – Addison-Wesley
Operating Systems: internal and Design Principles (3º edição) – Prentice-Hall
Begining Linux Programming, Wrox Press
Unix curso completo João Garrot, Jorge Amador, João Castos – FCA

Tags : ,