Day: September 3, 2021

PIXEL: Concurso europeu

Está a decorrer um concurso Europeu, sobre a sigla “9th edition of Poland’s largest indie gamedev competition”, e com as seguintes categorias:
Big Fish Grand Prix
Indie Grand Prix
Best Gameplay
Best Art
Best Audio
Warsaw Excellence
Festival Audience Special Award
Best Audio
Best Story
Retro Roots
Big Bang!
Best Student
Total Blackout (best board game)

As regras são simples, e uma das referências é que não podem ser jogos que foram publicados antes de 31/dez/2020 não podem entrar a concurso. O prazo de submissão termina no próximo dia 17/setembro.

+infos(oficial): LINK

Tags : ,

Proposta de trabalho (em Bradford, UK)

Não pretendo publicar aqui anúncios “avulso” que surgem pelo mundo relacionados com o mundo dos videojogos, gosto de ir observando e analisando as propostas que vão sendo publicas e sobre empresas portuguesas ou então que estão com escritórios em Portugal.

Mas este é diferente, achei a proposta de trabalho muito interessante:
“Job description
Do you have a broad knowledge of gaming and gaming history or culture? Do you have experience of communicating history and STEM topics to non-specialist audiences?

Collectively gaming development and gaming technologies are the UK’s largest creative industry. The Science Museum Group (SMG) is developing a group-wide public programme to celebrate gaming and gaming culture and wants to fully explore how this media can help engage our visitors and non-visitors with STEM.

To help lead this work, we are now recruiting for a Curator of Game Technologies to be based at our National Science & Media Museum (NSMM) in Bradford (but with some travel to other sites). In this role, you will play a critical role in the development and support of the season of gaming across SMG, including group-wide exhibitions on gaming, events and programming including on site and digital elements, between 2023 and 2024, whilst also leading on collections research and development in this emergent area helping SMG to understand how this area fits strategically within the group. As Curator of Game Technologies you will work with colleagues across SMG to explore the history, development and use of gaming technologies. This role will explore how SMG defines and collects in this area and will seek to engage visitors through our collections, public exhibition programme, festivals and events.

Joining us, you will have broad knowledge of gaming and gaming history/culture. You will hold strong research skills; you’ll be able to find interesting stories related to our collection and will be able to communicate these to non-specialist audiences through exhibitions, articles, blogs, outreach or teaching. You’ll be able to bring stakeholders together and lead collaborative working and will be proactive and organised in your approach to work.

The Science Museum Group (SMG) is here to inspire futures. As the world’s leading group of science museums, we share our unparalleled collection spanning science, technology, engineering, mathematics and medicine with over five million visitors each year. Joining us as an employee, you will have the opportunity to develop your career in a world-class museum group. We know work/life balance and wellbeing is crucial to our colleagues, so we currently offer up to 25 days annual leave in addition to bank holidays; BUPA medical and dental care; employee assistance programme; enhanced contributory pension; enhanced occupational sick, maternity, paternity and adoption leave and career breaks.

‘Open for All’ is one of the Science Museum Group’s five core values and sets out our important aspiration to be a place for everyone. As a national museum group, we have an ability to reach a wide and diverse population of audiences, colleagues and partners through our geography and scale.

We are working hard to understand our organisation better and to foster a culture that recognises and values different backgrounds, mindsets, skills, experience, knowledge and expertise. By having greater diversity, we believe that we will be a stronger and better organisation and ultimately will be able to inspire more futures. We therefore welcome applications from those who bring difference.”

+infos(oficial): LINK

Tags :

Retromagazine World, uma revista

A Retromagazine World é uma revista online acerca do mundo retro dos videojogos. Originalmente é em italiano mas também tem uma edição em inglês que recomendo a leitura. É possivel descarregar os PDFs sem qualquer custo

+infos(a revista): LINK

Tags :

Um português que trabalha no mundos dos videojogos

Encontrei esta entrevista de mais um português que tem desenvolvido o seu trabalho também na área dos videojogos, neste caso mais especificamente na construção de musicas.

“Fans of certain beloved Sega franchises should be very familiar with this composer’s name by now. Tee Lopes started out on the VGM scene releasing remixed and reimagined versions of some of gaming’s most beloved music, with a special focus on one blue hedgehog in particular, and his compositions and arrangements now sit alongside those of series legends such as Masato Nakamura, Jun Senoue and Yuzo Koshiro in the Sonic canon.
His talent and passion garnered the attention of the right people over the last decade, and in recent years he’s supplied the soundtrack for the brilliant Sonic Mania (a game that’s now four-years-old!) as well as the Mr. X Nightmare DLC for Streets of Rage 4, and his work will also be heard in the upcoming Teenage Mutant Ninja Turtles: Shredder’s Revenge and Metal Slug Tactics. If you’ve got a retro revival in the works and want to capture the spirit of a treasured series while also taking the audio to new and exciting places, it seems Tee Lopes is your go-to composer.
We kick off the Nintendo Life Video Game Music Fest — a season of VGM-focused features and interviews — with an email chat with Tee where we asked him about how he started out, how he goes about crafting new music for retro-inspired titles, and his first experience with the Sonic series…
(…)
I come from a small town in Portugal, and growing up, my access to music was very limited. We only had four TV channels and a local radio station, which mostly played whatever was popular at the time, and there wasn’t a music store for miles. Because of this, video games were like a dimensional portal that allowed me to discover music I wouldn’t have heard anywhere else. Especially Japanese music, which I immediately identified with.
My list of influences is long, but I’ll mention a few names: Jun Senoue, Michiru Yamane, Nobuo Uematsu, Harumi Fujita, Takenobu Mitsuyoshi, Yuzo Koshiro, Shusaku Uchiyama, and many others. I can’t say my tastes have changed (and I’ve put that to the test), but they’ve certainly evolved and expanded. A lot of the stuff I find interesting nowadays probably would’ve sounded too odd to me some years ago.
(…)”

+infos(fonte): LINK

Tags : , ,

POO, introdução IV

………..enumerações
enum class Letras {a,b,c,d,e};
para se usar ou atribuir
Letras x = Letras::A;
x = Letras::C;
if (x == Letras::C) cout << ” x == C \n”;

………..conversões explicitas
para Conversões implícitas
double d = 0.0;
int x = static_cast<int>(d); // Mais explícita

………..Excepções
O tratamento de exceções geralmente é usado quando uma parte de um programa detecta um problema (excepção) que não pode resolver e …
ou precisa de uma maneira de sinalizar que algo aconteceu e que não pode continuar;
ou depois de sinalizar a condição excepcional, pára o processamento.

assim:
a instrução throw que a parte de um programa que detecta a excepção utiliza para lançar a excepção – sinalizar a situação que não consegue resolver
blocos try e cláusulas catch – as excepções lançadas do código executado dentro de um bloco try geralmente são tratadas por uma das cláusulas catch.

em que:
quando é lançado um throw o bloco de código fica interrompido (será lançada e não é tratada)
mas pode ser usado algo similar ao seguinte:
try {
// …
// Código que pode gerar excepções
// …
} catch( Erro1 e1 ) {
// Trata excepções do tipo Erro1
} catch( Erro2 e2 ) {
// Trata excepções do tipo Erro2
} catch( Erro3 e3 ) {
// Etc…
} catch( ErroN eN ){
// Trata excepções do tipo ErroN
}
// Continua a execução “normal”…
se existir pelo menos uma cláusula catch que possa corresponder ao tipo da excepção lançada
se não existir nenhuma cláusula catch que possa corresponder ao tipo da excepção lançada, a situação de erro continua
quando temos um try:
no throw nome(), nome() siginfica para procurar um catch com esse nome()
o catch (…), significa qualquer outro erro que não seja dos contemplados

p.e.:
class Excep {
public:
string what()const { return string(“Excep\n”); }
};
class A {
public:
A() { cout << “Construtor de A\n”; }
~A() { cout << “Destrutor de A\n”; }
};
void f() {
A obF;
cout << “–>f: antes de lancar a excepcao\n”;
throw Excep();
cout << “–>f: depois de lancar a excepcao\n”;
}
int main() {
try {
cout << “main:antes de chamar f()\n”;
f();
cout << “main:depois de chamar f()\n”;
}
catch (Excep & ex) { //é criado menos um objecto, porque a passagem é por referência
cout << ex.what();
}
cout << “main:depois de tratar a excepcao\n”;
}

Para relançar uma excepção capturada numa cláusula catch, utiliza-se a instrução throw sem argumentos. As cláusulas catch seguintes (correspondendo ao mesmo bloco try) são ultrapassadas apesar deste relançamento, sendo a excepção remetida para o próximo contexto envolvente.
Mesmo com o relançamento de uma excepção, nunca é executada mais do que uma cláusula catch de entre as que correspondem a um mesmo bloco try.
p.e.:
throw;

p.e.:
class Avaria {
string mensagem;
public:
Avaria(const char* msg = “”) :mensagem(msg) {}
string what() const { return mensagem; }
};
class AvariaLigeira : public Avaria {
public:
AvariaLigeira() : Avaria(“Avaria ligeira:\n”) {}
};
class AvariaGrave : public Avaria {
public:
AvariaGrave() : Avaria(“Avaria grave:\n”) {}
};
void assistenciaEmViagem(int avaria) {
try {
cout << “\n…assistencia em viagem…\n”;
switch (avaria) {
case 0: cout << “tudo em ordem!\n”;
break;
case 1: throw AvariaLigeira();
break;
case 2: throw AvariaGrave();
break;
}
}
catch (AvariaLigeira & e) {
cout << e.what() << “…resolvida no local\n”;
}
catch (AvariaGrave & e) {
cout << e.what() << “…rebocar para a oficina\n”;
throw; //relançar a excepção
}
cout << “…fim de etapa!\n”;
}

int main() {
try {
assistenciaEmViagem(0);
assistenciaEmViagem(1);
assistenciaEmViagem(2); //chamada à função que termina em erro
assistenciaEmViagem(0);
}
catch (AvariaGrave& e) {
cout << “\nmain()-> ” << e.what() << ” -> Avaria reparada na oficina\n” << ” -> canceladas etapas seguintes\n”;
}
}

………..Smart pointers
Permitem gerir de forma mais fácil e segura objectos em memória dinâmica.
Encapsulam ponteiros de tipo primitivo.

tres tipos:
unique_ptr (posso exclusiva do objecto apontado)
shared_ptr (objectos apontados por mais do que um ponteiro)
weak_ptr ()

exemplo de unique_ptr:
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
#include <regex>
#include <initializer_list>
#include <fstream>

using namespace std;

class Produto
{
string nome;
int preco;
public:

Produto(string nome0, const int preco0)
: nome(nome0),
preco(preco0)
{
cout << ” construtor ” << getAsString() << endl;
}
~Produto()
{
cout << ” destrutor ” << getAsString() << endl;
}
string getAsString() const
{
ostringstream oss;
oss << nome + ” preco: ” + to_string(preco);
return oss.str();
}
};

int main()
{
//smart pointer
unique_ptr<Produto> prod = make_unique<Produto>(“Arroz”,1);
//make_unique cria o objecto em mem dinamica
//make_unique cria o smart_pointer na stack
cout << prod->getAsString();

//versao2, dá erro porque não tem construtor por cópia nem atribuir
//unique_ptr<Produto> prod2 = make_unique<Produto>(“Maria”, 22);
//unique_ptr<Produto> prod3(prod2);
//cout << prod2->getAsString();

cout << “\nfim do main” << endl;
}

mas o unique_ptr Não dispõe de:
Construtor por cópia
Operador atribuição

o unique_ptr pode ser movido mas não copiado, existe um construtor move

exemplo de unique_ptr semantica move:
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
#include <regex>
#include <initializer_list>
#include <fstream>

using namespace std;

class Produto
{
string nome;
int preco;
public:

Produto(string nome0, const int preco0)
: nome(nome0),
preco(preco0)
{
cout << ” construtor ” << getAsString() << endl;
}
~Produto()
{
cout << ” destrutor ” << getAsString() << endl;
}
string getAsString() const
{
ostringstream oss;
oss << nome + ” preco: ” + to_string(preco);
return oss.str();
}
};

unique_ptr<Produto> cria_Produto() {
unique_ptr<Produto> local_ptr = make_unique<Produto>(“Bolachas”, 2);
return local_ptr; // local_ptr entrega a posse do objecto
}
void f() {
cout << “constr move:\n”;
unique_ptr<Produto> p1(cria_Produto()); // constructor move,
// recebe um objeto retornado por valor, um rvalue
// p1 tem agora a posse do objecto
cout << “atribuicao move:\n”;
unique_ptr<Produto> p2; // constructor por omissão, p2 não possui nada
p2 = cria_Produto(); // atribuição move
// o segundo membro da atribuicao é um objeto retornado por valor, um rvalue
// p2 tem agora a posse do objecto, o segundo objecto criado
}

int main()
{
unique_ptr<Produto> a = make_unique<Produto>(“Cafe”, 2); // a possui um objecto Produto
unique_ptr<Produto> b; // b não possui nada
// invocar atribuição move explicitamente
b = std::move(a); // move retorna uma referência rvalue para a
// funciona o operador atribuição move
// agora b possui o objecto Produto, a não possui nada
// invocar construção move explicitamente
unique_ptr<Produto> c(std::move(b)); // move retorna uma referência rvalue para b
cout << b->getAsString();

cout << “\nfim do main” << endl;
}

Tags : , , , , ,