sexta-feira, 30 de julho de 2010

Velocidade

Wellington Moreira da Silva

Vou postar hoje os scripts para calcular a velocidade e depois passá-la para um objeto do tipo Text, e fazer uma espécie de velocímetro:

#calcular velocidade
import GameLogic
import math

controlador = GameLogic.getCurrentController()
Velocidade = controlador.owner
Vetor = Velocidade.getLinearVelocity(True)
GameLogic.ModuloV= math.sqrt(Vetor[0]*Vetor[0]+Vetor[1]*Vetor[1]+Vetor[2]*Vetor[2])*2

#passar para o velocimetro
import GameLogic

controlador = GameLogic.getCurrentController()
velocimetro = controlador.owner
velocidade = round(GameLogic.ModuloV,1)
velocimetro.Text= str(velocidade)

Iphone 4 apresenta problemas

Vinicius Sato Jacintho

Antena e 'ponte'
O problema na recepção é causado principalmente por conta do design do iPhone. A armação externa do aparelho, que faz a função de antena, é repartida em três partes. Em alguns casos, principalmente com usuários canhotos ou que usam a mão esquerda para segurar o telefone, a própria mão faz uma "ponte" entre a parte da armação que serve para transmitir os sinais de voz e o setor inferior da armação. Quando isso acontece, a transmissão é afetada. A capa de borracha isola a armação, evitando o problema.
Outro recurso para minimizar a falha, segundo Jobs, é atualizar o sistema operacional do iPhone 4 para a versão 4.0.1, lançada na quinta-feira (15). Ela apresenta um novo algoritmo que calcula a recepção do sinal do aparelho, impedindo que as barras de sinal caíssem conforme a posição da mão do usuário ao segurar o aparelho.
Jobs afirmou que a empresa trabalhou durante 22 dias para tentar resolver o problema de recepção do sinal de celular. O executivo afirmou que o problema ocorre com outros aparelhos similares fabricados por empresas concorrentes. Em vídeo exibido durante o evento, smartphones como o BlackBerry Bold 9700, HTC Droid Eris e Samsung Omnia II, apresentaram o mesmo problema na barra que identifica a intensidade do sinal do celular.

Movimentação do carro

Maria Luíza Santinho Lima Monteiro

Bom dia!
Como disse no meu post anterior, esta semana retornamos às aulas e o projeto não para!
Ontem fiz a movimentação de um carro por controladores lógicos. Primeiro criamos um sensor, é onde escolhemos a tecla que vai fazer determinada ação. Então, ligamos o sensor com um controlador, que será ligado com um atuador, que é quem descreve qual ação será feita.
Abaixo é possível ver o vídeo, feito no Camtasia, do carrinho sendo movimentado através das teclas de setas do teclado.

Desenvolvimento do site do grupo

Karl Schiewaldt

Olá!
Começamos de vez o desenvolvimento do site do nosso grupo!

Estamos desenvolvendo o site utilizando a tecnologia de TableLess, que procura desenvolver todo o layout utilizando somente DIVs e definindo seus estilos pelo CSS.
Depois que nós definimos o layout a ser utilizado, começou a codificação. E finalmente, conseguimos terminar o layout do site, feito primeiramente todo na página inicial do site.

Aqui vai uma imagem da nossa home, já que o site ainda não foi colocado em nenhum servidor:


Em breve colocaremos o site no servidor da escola, assim postaremos o link aqui.

Até mais! (:

Arquivos .ui

Isabella Fontes

Olá,

Quando criamos uma interface por uma ferramenta, como exemplo que usamos, QtDesigner, no nosso projeto para que ela nos forneça as informações necessárias são precisos alguns passos.

Passo 1:
Compilar o arquivo de extensao .ui para gerar o código em Python:

#!/usr/bin/env python
import os

command = "pyuic4 -o NOME DO ARQUIVO PYTHON.py NOME DO ARQUIVO.ui"
os.system(command)


Passo 2:
Criar arquivo "principal" e importar a classe do arquivo python traduzido do .ui:

import sys
from PyQt4.QtGui import QApplication
from ui_python import Window

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())


E depois é só começar a programar as classes!

Arquivo traduzido em python de .ui (Exemplo: Tela de Login):

from PyQt4 import QtCore, QtGui
class Ui_mainWindowFundo(object):
    def setupUi(self, mainWindowFundo):
        mainWindowFundo.setObjectName("mainWindowFundo")
        mainWindowFundo.resize(797, 601)
        mainWindowFundo.setCursor(QtCore.Qt.ForbiddenCursor)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("login/logo_empresa.png"),
QtGui.QIcon.Normal, QtGui.QIcon.Off)
        mainWindowFundo.setWindowIcon(icon)
        mainWindowFundo.setStyleSheet("background-image:
url(login/background.png);")
        mainWindowFundo.setLocale(QtCore.QLocale(QtCore.QLocale.Portuguese, QtCore.QLocale.Brazil))
        self.centralwidget = QtGui.QWidget(mainWindowFundo)
        self.centralwidget.setObjectName("centralwidget")
        self.wdgTelaLoginBox = QtGui.QWidget(self.centralwidget)
        self.wdgTelaLoginBox.setGeometry(QtCore.QRect(120, 80, 541, 421))
        self.wdgTelaLoginBox.setStyleSheet("background-image:
url(login/box.png);")
        self.wdgTelaLoginBox.setLocale(QtCore.QLocale(QtCore.QLocale.Portuguese, QtCore.QLocale.Brazil))
        self.wdgTelaLoginBox.setObjectName("wdgTelaLoginBox")
        self.btnLogin = QtGui.QPushButton(self.wdgTelaLoginBox)
        self.btnLogin.setGeometry(QtCore.QRect(250, 300, 71, 31))
        self.btnLogin.setCursor(QtCore.Qt.PointingHandCursor)
        self.btnLogin.setAutoFillBackground(False)
        self.btnLogin.setStyleSheet("image: url(login/btnlogin.png);")
        self.btnLogin.setText("")
        self.btnLogin.setObjectName("btnLogin")
        self.txtLogin = QtGui.QTextEdit(self.wdgTelaLoginBox)
        self.txtLogin.setGeometry(QtCore.QRect(210, 120, 191, 31))
        self.txtLogin.setStyleSheet("background-image:
url(login/txtbox_pw.png);")
        self.txtLogin.setInputMethodHints(QtCore.Qt.ImhUppercaseOnly)
        self.txtLogin.setObjectName("txtLogin")
        self.lblLogin = QtGui.QLabel(self.wdgTelaLoginBox)
        self.lblLogin.setGeometry(QtCore.QRect(100, 100, 81, 61))
        self.lblLogin.setStyleSheet("background-image: url(login/login.png);")
        self.lblLogin.setText("")
        self.lblLogin.setObjectName("lblLogin")
        self.lblSenha = QtGui.QLabel(self.wdgTelaLoginBox)
        self.lblSenha.setGeometry(QtCore.QRect(110, 190, 61, 61))
        self.lblSenha.setStyleSheet("background-image:
url(login/chave.png);")
        self.lblSenha.setText("")
        self.lblSenha.setObjectName("lblSenha")
        self.txtSenha = QtGui.QTextEdit(self.wdgTelaLoginBox)
        self.txtSenha.setGeometry(QtCore.QRect(210, 210, 191, 31))
        self.txtSenha.setStyleSheet("background-image:
url(login/txtbox_pw.png);")
        self.txtSenha.setObjectName("txtSenha")
        self.txtSenha.setProperty("cursor", QtCore.Qt.IBeamCursor)
        self.lblLogoSpectrum = QtGui.QLabel(self.centralwidget)
        self.lblLogoSpectrum.setGeometry(QtCore.QRect(690, 510, 111, 91))
        self.lblLogoSpectrum.setStyleSheet("background-image:
url(login/logo_empresa.png);")
        self.lblLogoSpectrum.setText("")
        self.lblLogoSpectrum.setObjectName("lblLogoSpectrum")
        mainWindowFundo.setCentralWidget(self.centralwidget)
        self.actionLogar = QtGui.QAction(mainWindowFundo)
        self.actionLogar.setObjectName("actionLogar")
        self.retranslateUi(mainWindowFundo)
        QtCore.QObject.connect(self.btnLogin, QtCore.SIGNAL("clicked()"),
self.btnLogin.click)
        QtCore.QMetaObject.connectSlotsByName(mainWindowFundo)
        
        mainWindowFundo.setTabOrder(self.txtLogin, self.txtSenha)
        mainWindowFundo.setTabOrder(self.txtSenha, self.btnLogin)
        QtCore.QObject.connect(self.closeButton,
QtCore.SIGNAL("clicked()"), Window.close)
        QtCore.QObject.connect(self.termsEdit,
QtCore.SIGNAL("returnPressed()"), self.searchButton.animateClick)
        QtCore.QMetaObject.connectSlotsByName(Window)
        Window.setTabOrder(self.fieldCombo, self.termsEdit)
        Window.setTabOrder(self.termsEdit, self.treeWidget)
    def retranslateUi(self, mainWindowFundo):
        mainWindowFundo.setWindowTitle(QtGui.QApplication.translate
("mainWindowFundo", "Jogo - Empresa Spectrum", None,
QtGui.QApplication.UnicodeUTF8))
        self.txtLogin.setHtml(QtGui.QApplication.translate("mainWindowFundo",
"\n"
"\n"
", None, QtGui.QApplication.UnicodeUTF8))
        self.actionLogar.setText(QtGui.QApplication.translate("mainWindowFundo", "logar", None, QtGui.QApplication.UnicodeUTF8))

Prédio

Ananda Brasolotto De Santis

Abaixo está um prédio que eu modelei e pintei no blender. Ele é básico, e pode ser modificado, inclusive texturas diferentes o dariam uma nova cara, para que ele seja usado repetidamente no cenário da cidade, com uma aparência bastante diferente.

sexta-feira, 23 de julho de 2010

Movimentação do veículo

Wellington Moreira da Silva

Bom dia, hoje vou postar o script para a movimentação do carro.

def main():

controlador = GameLogic.getCurrentController()
carroID = ConstraintID(controlador)
freios = Freios(carroID, controlador)
Aceleracao( carroID, controlador, freios)
Virar(carroID, controlador)

def Freios(carroID, controlador):

re = controlador.sensors["MarchaRe"]
freio = controlador.sensors["Freio"]
if freio.positive == True and re.positive == False:
    FreioDianteiro = 10.0
    FreioTraseiro = 10.0
    freios = True
else:
    FreioDianteiro = 0.0
    FreioTraseiro = 0.0
    freios = False
    carroID.applyBraking( FreioDianteiro, 0)
    carroID.applyBraking( FreioDianteiro, 1)
    carroID.applyBraking( FreioTraseiro, 2)
    carroID.applyBraking( FreioTraseiro, 3)
return freios

def Aceleracao( carroID, controlador, freios):

frente = controlador.sensors["Frente"]
re = controlador.sensors["MarchaRe"]
if freios == True:
    aceleracao = 0.0
elif re.positive == True:
    aceleracao = 100.0
elif frente.positive == True:
    aceleracao = -200.0
else:
    aceleracao = 0.0
carroID.applyEngineForce( aceleracao, 0)
carroID.applyEngineForce( aceleracao, 1)
carroID.applyEngineForce( aceleracao, 2)
carroID.applyEngineForce( aceleracao, 3)

def Virar( carroID, controlador):

    virarEsquerda = controlador.sensors["Esquerda"]
    virarDireita = controlador.sensors["Direita"]
    if virarEsquerda.positive == True:
       carroID.setSteeringValue(0.4,0)
       carroID.setSteeringValue(0.4,1)
   elif virarDireita.positive == True:
       carroID.setSteeringValue(-0.4,0)
       carroID.setSteeringValue(-0.4,1)
   else:
   carroID.setSteeringValue(0.0,0)
   carroID.setSteeringValue(0.0,1)

def ConstraintID(controlador):

carro = controlador.owner
carroID = carro["carroID"]
return carroID

main()

Lembrando que os botões têm que ser definidos pelo editor lógico do Blender.
Até mais!

Kindle DX

Vinicius Sato Jacintho

Apenas quatro meses depois de colocar em sua loja virtual o Kindle 2, a Amazon apresentou ao mundo uma nova versão de seu leitor-eletrônico, o Kindle DX. Steven Levy testou o aparelho para a revista Wired e apresentou as qualidades e defeitos do e-reader.
Segundo ele, o ponto alto do Kindle DX é o tamanho. A tela, com 9,7″ (24 cm, na diagonal), é 2,5 vezes maior que a do Kindle 2. Com isso, abarca uma maior quantidade de texto, ou fontes maiores, permitindo mais tempo de leitura sem a necessidade de "virar" a página.
Mesmo com o tamanho maior, a Wired garante que o DX é muito confortável de segurar e “se torna tão invisível quando o Kindle 2 quando você fica hipnotizado pela magia do escritor”. Ele é tão fino quanto o modelo anterior e pesa apenas meio quilo. O teclado é um pouco menor que o do Kindle 2, o que significa que quase toda a superfície do DX é coberta pela tela.
A habilidade de ler arquivos pdf é muito elogiada no artigo, uma vez que esse formato é extremamente popular na web e responde por boa parte do arquivo do Google Books.

Retorno das aulas

Maria Luíza Santinho Lima Monteiro

Boa noite!
Na próxima segunda feira (26/07), o recesso escolar termina e as aulas voltam ao normal.
E durante as aulas continuaremos firmemente com o desenvolvimento do projeto.
Até semana que vem. :)

FCC diz que menos de 4 mbps não é banda larga

Karl Schiewaldt

Olá!
Estava eu hoje passando por alguns blogs de tecnologia, até que achei esta notícia, que achei interessante compartilhá-la, já que no nosso projeto, sou eu que estou mexendo com a parte web. Aqui está a notícia:

A FCC é uma agência que regula, dentre outras coisas, a Internet nos EUA. É ela que determina algumas das regras para as operadoras de telecomunicações americanas. E hoje ocorreu uma atualização na norma que diz o que tais operadoras podem chamar de banda larga. A agência decidiu que a partir de hoje qualquer conexão nos EUA que tiver velocidade de download de menos de 4 mbps e upload de menos de 1 mpbs não pode ser considerada banda larga.
A velocidade mínima anterior, que valia desde 1999, era de 200 kbps. Enquanto isso, no Brasil, a nossa versão mais relaxada da FCC, a Anatel, ainda não determinou qual a velocidade mínima para que uma conexão ser considerada banda larga. Espera-se que agora que já existem mais provedores brasileiros com maior capacidade de banda vendendo velocidades maiores do que antes, a agência de telecomunicações finalmente crie uma norma nessa área.
Resta saber se a nossa agência vai copiar a regra da americana e colocar os valores da velocidade mínima lá no alto. Assim, os atuais provedores brasileiros não vão poder anunciar uma conexão de 300 kbps como banda larga. Talvez eles possam criar uma categoria 'banda mais ou menos larga' ou 'banda estreita' para tais velocidades.


Créditos ao TecnoBlog

Até a próxima!

Create table - Sqlite3

Isabella Fontes

Olá,

Hoje vou postar os scripts essenciais ao nosso projeto.
Detalhe: Também colocarei os imports necessários.

Imports:
#!/usr/bin/env python
import sqlite3
import logging
import configuracoes


Sabendo disso, segue abaixo, o script de criação.
Nome do arquivo: database.py

def criar_banco_de_dados():
    """ Cria o banco de dados no local onde ja definimos, no arquivo
        configuracoes.py
    """

    logging.debug("Executando criar banco de dados")
    #{ CP - Cadastrar Pessoa , EP- Excluir Pessoa, CCF - Cadastrar
Configuracao, });
    sql = """
            CREATE TABLE [usuario] ([id]INTEGER PRIMARY KEY ASC ON
CONFLICT ROLLBACK AUTOINCREMENT,
            [login] VARCHAR (250), [senha] VARCHAR(10), [id_pessoa]
INTEGER, [id_grupo] INTEGER, [data_ultimo_login] INTEGER);
            CREATE TABLE [grupo] ([id]INTEGER PRIMARY KEY ASC ON
CONFLICT ROLLBACK AUTOINCREMENT,
            [nome] VARCHAR(20), [id_permissao] INTEGER);
            CREATE TABLE [permissao] ([id]INTEGER PRIMARY KEY ASC
ON CONFLICT ROLLBACK AUTOINCREMENT,
            [nome] VARCHAR(20),[acoes] VARCHAR(3));
            CREATE TABLE [pessoa] ([id]INTEGER PRIMARY KEY ASC ON
CONFLICT ROLLBACK AUTOINCREMENT,
            [nome] VARCHAR(50), [data_nascimento] INTEGER);
            CREATE TABLE [configuracao] ([id]INTEGER PRIMARY KEY ASC
ON CONFLICT ROLLBACK AUTOINCREMENT,
            [velocidade] BOOLEAN, [cinto] BOOLEAN, [semaforo] BOOLEAN);
            CREATE TABLE [pontuacao] ([id]INTEGER PRIMARY KEY ASC
ON CONFLICT ROLLBACK AUTOINCREMENT,
            [id_usuario] INTEGER, [valor] INTEGER, [data_ultima_missao]
DATE , [versao_ultima_missao] INTEGER)
          """
       
    logging.warn("o banco de dados sera RECRIADO!")
    conn = conectar_banco_de_dados()
    queries = sql.split(';')
    for query in queries:
        conn.execute(query)
    conn.commit()

Observação: O código poderá ser alterado de acordo com a necessidade do banco.

Continuação do cenário

Ananda Brasolotto De Santis

O primeiro protótipo de cidade estava pequeno, e com ruas muito largas. O Wellington reformulou-o e eu continuei acrescentando os objetos. Agora a cidade é bem grande, tem faixas de pedestres em todos os cruzamentos e postes de luz. Ainda estou trabalhando no cenário para adicionar os outros elementos que já temos e deixá-los proporcionais a todo o resto.

sexta-feira, 16 de julho de 2010

Script de suspensão

Wellington Moreira da Silva

Estou postando hoje o script que define os valores da suspensão do veículo. É uma suspensão bem simples, mas que dará mais realismo ao nosso jogo, durante os eventos de colisões.

def main():

    controlador = GameLogic.getCurrentController()
    carroID = ConstraintID(controlador)
    Aderencia(carroID)
    Compressao(carroID)
    Amortecimento(carroID)
    Rigidez(carroID)

def ConstraintID(controlador):

    carro = controlador.owner
    carroID = carro["carroID"]
    return carroID

def Aderencia(carroID):

    carroID.setTyreFriction(10.0, 0)
    carroID.setTyreFriction(10.0, 1)
    carroID.setTyreFriction(10.0, 2)
    carroID.setTyreFriction(10.0, 3)

def Compressao(carroID):

    carroID.setSuspensionCompression(20.0, 0)
    carroID.setSuspensionCompression(20.0, 1)
    carroID.setSuspensionCompression(20.0, 2)
    carroID.setSuspensionCompression(20.0, 3)

def Amortecimento(carroID):

    carroID.setSuspensionDamping(5.0, 0)
    carroID.setSuspensionDamping(5.0, 1)
    carroID.setSuspensionDamping(5.0, 2)
    carroID.setSuspensionDamping(5.0, 3)

def Rigidez(carroID):

    carroID.setSuspensionStiffness(30, 0)
    carroID.setSuspensionStiffness(30, 1)
    carroID.setSuspensionStiffness(30, 2)
    carroID.setSuspensionStiffness(30, 3)

main()

Chip de probabilidade

Vinicius Sato Jacintho


Os chips atuais para computador passam muito tempo para calcular probabilidades, desde recomendações de lojas online a algoritmos que determinam compras fraudulentas de cartão de crédito. Usando probabilidades em vez dos uns e zeros, esses cálculos estatísticos podem ser realizados de forma mais fácil, eficiente e rápida.
A Lyric Semiconductor reescreveu completamente a funcionalidade do microchip. Em vez de construir um chip usando portas digitais lógicas NAND, o chip deles usará probabilidades como inputs de uma porta NAND bayesiana. A saída de uma porta NAND bayesiana representa a chance de os dois sinais de entrada serem iguais.
Mas o que isso tudo significa? Menos portas necessárias, menos cálculos necessários... Um chip menor faria o trabalho dos chips de hoje, e bem mais rápido.
Para memória flash (encontrada em gadgets portáteis como smartphones e tablets), chips para verificação de erros são uns dos maiores gargalos de desempenho e capacidade. O chip da Lyric ocuparia 1/30 do espaço e usaria 1/12 da energia de um chip de correção de erros típico atual.
Um protótipo de uso geral, o GP5, deve ser lançado nos próximos 3 anos, e a Lyric espera ver seu chip de correção de erros implementado em dispositivos em geral nos dois anos seguintes. A DARPA, agência americana responsável por pesquisas voltadas para as forças militares, está interessada em usar esta tecnologia para trabalhar com informações que não sejam claras - sinais de rádio distorcidos e outras aplicações à la James Bond. Para nós, mortais, poderemos ver os benefícios deste chip nas gerações futuras de smartphones.
Claro, haverá bugs e problemas à medida que os engenheiros aprendem a escrever código para estes novos chips e testar a qualidade deles. E uma nova onda de estudantes universitários pode ficar ansiosa pelo uso disseminado deste chip no futuro.

JavaScript - A saga (parte 2)

Karl Schiewaldt

Olá!

Como nos meus posts anteriores, dessa vez postarei mais dois scripts desenvolvidos para aprendizado que fiz esta semana. Eles fazem parte de uma calculadora.
Eles fazem, na prática, a mesma coisa, porém procurei fazer de dois modos diferentes para me familizariar com a estrutura do JavaScript, mesmo ela sendo similar ao PHP/C.

Primeiro, uma função que, além de pegar os valores digitados, coloca as opções dos botões rádio (múltipla escolha) em um vetor, e faz a escolha da operação em um Switch, onde ele diferenciará a opção escolhida pelo usuário:

function calcswitch(){
    var v1=parseInt(document.getElementById('v1').value);
    var v2=parseInt(document.getElementById('v2').value);
    var radios=document.getElementsByClassName('radios');
    var x;
    for(var i=0;i<=3;i++)
        if(radios[i].checked) break;
    switch (i){
        case 0:
            x=v1+v2;
            break;
        case 1:
            x=v1-v2;
            break;
        case 2:
            x=v1*v2;
            break;
        case 3:
            x=v1/v2;
            break;
    }
    alert("valor: "+x);
}

E o segundo, que calcula de um jeito mais simples, somente testando a operação escolhida através de IFs:

function calcif(){
    var v1=parseInt(document.getElementById('v1').value);
    var v2=parseInt(document.getElementById('v2').value);
    var a=document.getElementById('a');
    var s=document.getElementById('s');
    var m=document.getElementById('m');
    var d=document.getElementById('d');
    var x;
    if(a.checked)
        x=v1+v2;
    else
        if(s.checked)
            x=v1-v2;
        else
            if(m.checked)
                x=v1*v2;
            else
                if(d.checked)
                    x=v1/v2;
    alert("valor: "+x);
}

Ambos em sua página html, há 2 inputs do tipo texto, 4 botões de rádio onde será escolhida a operação, e dois botões, um que limpa os campos e o outro que envia, pelo evento OnClick, os valores digitados e a operação escolhida.

Até a próxima!

Bugatti

Ananda Brasolotto De Santis

Abaixo está uma imagem da renderização de um Bugatti baixado da internet:

sexta-feira, 9 de julho de 2010

Script para união das rodas com o corpo do carro

Wellington Moreira da Silva

Bom dia, vou postar hoje o script que junta as rodas com o corpo do veículo, em tempo de execução. Isso tem que ser feito porque a movimentação do carro é controlada através das rodas.

def main():
   carro = Carro_Objeto()
   carroID = Carro_Constraint(carro)
   rodaObj = Rodas()
   rodaPos = RodasPosicao()
   rodaRadius = RodasRadius()
   rodaAlturaSuspensao = RodasAlturaSuspensao()
   rodaAnguloSuspensao = RodasAnguloSuspensao()
   rodaEixo = RodasEixo()
   rodaVirar = RodasVirar()
   Add_Rodas(carroID, rodaObj, rodaPos, rodaAnguloSuspensao, rodaEixo,
rodaAlturaSuspensao, rodaRadius, rodaVirar)

def Carro_Objeto():

   controlador = GameLogic.getCurrentController()
   carro = controlador.owner
   return carro

def Carro_Constraint(carro):

   import PhysicsConstraints
   carro_PhysicsID = carro.getPhysicsId()
   carro_Constraint = PhysicsConstraints.createConstraint(carro_PhysicsID,
0, 11)
   constraint_ID = carro_Constraint.getConstraintId()
   carroID = PhysicsConstraints.getVehicleConstraint(constraint_ID)
   carro["carroID"] = carroID
   return carroID

def Rodas():

   import GameLogic
   cena = GameLogic.getCurrentScene()
   roda0 = cena.getObjectList()["OBRodaFE"]
   roda1 = cena.getObjectList()["OBRodaFD"]
   roda2 = cena.getObjectList()["OBRodaTE"]
   roda3 = cena.getObjectList()["OBRodaTD"]
   return (roda0, roda1, roda2, roda3)

def RodasPosicao():

   roda0 = [ -2.0, 3.0, 0.0]
   roda1 = [ 2.0, 3.0, 0.0]
   roda2 = [ -2.0, -3.0, 0.0]
   roda3 = [ 2.0, -3.0, 0.0]
   return (roda0, roda1, roda2, roda3)

def RodasRadius():

   return (0.75,0.75,0.75,0.75)

def RodasAlturaSuspensao():

   return (0.2,0.2,0.2,0.2)

def RodasAnguloSuspensao():

   return ([0.0,0.0,-1.0],[0.0,0.0,-1.0],[0.0,0.0,-1.0],[0.0,0.0,-1.0])

def RodasEixo():

   return ([ -1.0, 0.0, 0.0], [ -1.0, 0.0, 0.0], [ -1.0, 0.0, 0.0], [ -1.0, 0.0, 0.0])

def RodasVirar():

   return (True, True, False, False)

def Add_Rodas(carroID, rodaObj, rodaPos, rodaAnguloSuspensao,
rodaEixo, rodaAlturaSuspensao, rodaRadius, rodaVirar):

   for x in range(0,4):
     carroID.addWheel( rodaObj[x], rodaPos[x], rodaAnguloSuspensao[x],
rodaEixo[x], rodaAlturaSuspensao[x], rodaRadius[x], rodaVirar[x] )

main()

Interface de Login

Vinicius Sato Jacintho


Comecei a fazer a interface do jogo, e terminei a primeira tela, que seria a do login. Tentei deixá-la simples e intuitiva, por que senão ficaria muito difícil para fazer o posicionamento das imagens quando fosse programar no python. O software utilizado foi o photoshop CS3.

Classes - Python

Maria Luíza Santinho Lima Monteiro

Bom dia!
Essa semana desenvolvi as classes em Python que serão utilizadas para o vínculo com o banco de dados. Estas classes foram definidas durante a reunião. Segue abaixo o código de uma delas:


class Pessoa (DatabaseClasse):


  def __init__(self,pessoa_id = None):
      DatabaseClasse.__init__(self)
      self.id = pessoa_id
      self.name=None
      self.data_nascimento = None
      self.listaPessoas = {}
      self.load()

  def load(self):
   """
   retorna um dicionario (id: (nome, data_nascimento, ...)) de todos
do banco
   """

      cursor = self.connection.cursor()
      cursor.execute('SELECT nome, data_nascimento FROM pessoa
WHERE id=?',(self.id,))
      row = cursor.fetchone()
      if row:
         self.name = row['nome']
         self.data_nascimento = row['data_nascimento']
         self.loaded = True

      return self.loaded

  def get_all_pessoas(self):
   """
   Retorna uma lista de todas as pessoas do banco - O objeto Pessoa Se
encontrado, as instancia e retorna seus objetos
   """

      cursor = self.connection.cursor()
      sql = 'SELECT id FROM pessoa'
      cursor.execute(sql)
      pessoas = []
      for row in cursor:
         pessoas.append(Pessoa(row['id']))
      return pessoas

  def get_dict_all_pessoas(self,params=()):
   """
   params = ()
   retorna dicionario (id da pessoa : (nome, data de nascimento) de todas as
pessoas do banco
   """

      cursor = self.connection.cursor()
      cursor.execute("SELECT id,nome,data_nascimento FROM pessoa")
      for row in cursor:
         self.listaPessoas[str(row['id'])] = ([row['nome']],
str(row['data_nascimento']))
      return self.listaPessoas

  def get_name(self):
      return self.name

  def get_data_nascimento(self):
      return self.data_nascimento

  def get_id(self):
      return self.id

  def save(self):
      cursor = self.connection.cursor()
      if self.loaded:
         sql = 'UPDATE pessoa SET nome = ?, data_nascimento=? WHERE
id=?'
         cursor.execute(sql,(self.name,self.data_nascimento,self.id))
      else:
         sql = 'INSERT INTO pessoa (nome,data_nascimento,id) VALUES
(?,?,?)'
         cursor.execute(sql,(self.name,self.data_nascimento,self.id))
      self.connection.commit()

  def set_name(self,name):
      self.name = name

  def set_data_nascimento(self, data_nascimento):
      self.data_nascimento = data_nascimento

  def set_id(self,id):
   #pegar do banco o ultimo id e acrescentar
      self.id = id

Observação: As classes poderão sofrer algumas alterações.

JavaScript - A saga (parte 1)

Karl Schiewaldt

Olá.
Bom, como no meu post anterior, comecei a estudar e aprender sobre JavaScript. Pois bem, aqui está o primeiro exemplo que fiz, que é um script que calcula fatorial:

function calcfat(){
    var i=document.getElementById('fat').value;
    var x=1;
    for (i;i>=1;i--)
        x=x*i;
    alert('fatorial é: '+x);
}

E junto, a página html que interage com o usuário, há somente um input do tipo texto, que recebe o valor a ser calculado, e um botão, que passa para a função o valor digitado, calcula, e o apresenta na tela na forma de um alert.

Lembrando que eu utilizei uma página externa para armazenar o script, fazendo referência a esse documento na sessão HEAD da página html.

Então é isso, em breve mais! :)

Blender - Semáforo

Isabella Fontes

Olá,

Nesta semana procurei executar os scripts do semáforo, item essencial em nossa aplicação.
Aqui, há um exemplo de como ler e buscar os objetos na cena, sendo que neste exemplo a preocupação maior se deve ao fato de sincronizar as cores de 2 semáforos, e encontrei bastante dificuldade pois há uma lentidão nestes processos.

Exemplo:

import sys
import time
import os
import Blender
import Blender.Image
from Blender import Mesh
import Blender.Object
import Blender.Scene
from Blender import Material

print Material.Get()

print '\n \n'
matAmarelo = "materialAmarelo"
ma = Material.Get(matAmarelo)
matVermelho = "materialVermelho"
mvm = Material.Get(matVermelho)
matVerde = "materialVerde"
mvd = Material.Get(matVerde)

semaforos = {mvm:True,ma:False,mvd:False}

for sinal in semaforos:
      print ma.rgbCol
      print Material.ColorbandMethod.COLOR
      print 'Cor antes'
      print sinal
      print sinal.getRGBCol()
      if sinal.getName() == matAmarelo:
            print 'Trocando a cor do amarelo'
            sinal.setRGBCol([1.0,0.6,0.0])
      time.sleep(9)
      print sinal.getRGBCol()

while True:
      print 'semaforo 1 - verde'
      print 'semaforo 2 - vermelho'
      time.sleep(6)
      print 'semaforo 1 - amarelo'
      print 'semaforo 2 - vermelho'
      time.sleep(3)
      print 'semaforo 1 - vermelho'
      print 'semaforo 2 - verde'
      time.sleep(6)
      print 'semaforo 1 - vermelho'
      print 'semaforo 2 - amarelo'
      time.sleep(3)

print Blender.Get("datadir")
print dir(Blender)
lista_objetos=Blender.Object.Get()

print lista_objetos

lista_objetos = Blender.Mesh.Get()
print "eba"
print '\n \n \n',lista_objetos
meshName = "meshAmarelo"
me = Blender.Mesh.Get(meshName)
ma = Blender.Material.Get("materialAmarelo")
print '\t \n'
print dir(ma)

for x in lista_objetos:
      print (x)
      print str(x.getProperty())
      print (x.game_properties)
      print '\t \n \n'
      print dir(x)
      print x.materials
      print x.getColorLayerNames()
      print '\n \n'

lista_semaforo = {'amarelo':False,'verde':True,'vermelho':False}
print lista_semaforo
for semaforo in lista_semaforo:
      print 'abrindo semaforo',semaforo
      lista_semaforo[semaforo] = True
      time.sleep(3)
      lista_semaforo[semaforo] = False
      print 'fechando semaforo'

print lista_semaforo

Construção da cidade

Ananda Brasolotto De Santis

Estou começando a montar os elementos do cenário para a cidade fictícea onde o jogo se passará. Abaixo está uma imagem do trabalho sendo feito no blender, adicionando textura aos objetos que representam as faixas de pedestres.

sexta-feira, 2 de julho de 2010

zBrush

Vinicius Sato Jacintho

O ZBrush é um software de modelagem tridimensional usado em filmes, animações, etc... Ele chegou a ser utilizado no filme "O Senhor dos Anéis: O Retorno do Rei". O ZBrush é conhecido por sua simplicidade, e por ser voltado ao leigo, já que até mesmo este pode obter excelentes resultados. Criado inicialmente para fins ilustrativos, o ZBrush começa a chamar a atenção e abrir os olhos de desenvolvedores de games e animações 3D.

No nosso projeto ele poderia ser usado para fazer a textura dos carros, árvores, enfim, os objetos do cenário, de forma extremamente realista, mas mantendo o programa leve.

Reuniões das férias

Maria Luíza Santinho Lima Monteiro

Boa tarde!
Nesta primeira semana de recesso, aproveitamos para descansar um pouco e a partir da semana que vem continuaremos firmemente com o projeto. Iremos marcar uma reunião inicial para organizar as tarefas a serem feitas durante esse mês e a cada reunião separaremos o que cada integrante do grupo deverá adiantar em sua casa para reunião seguinte.
Até mais.

JavaScript - uma breve introdução

Karl Schiewaldt

Olá!

Pra começo de férias, resolvi dar uma estudada em JavaScript, que utilizaremos no nosso site, para o menu e para a página de contato.


Mas, para começo de conversa, o que é o JavaScript? Nosso amigo Wikipedia responde:
"JavaScript é uma linguagem de programação criada por Brendan Eich para a Netscape em 1995, que a princípio se chamava LiveScript. A Netscape, após o sucesso inicial desta linguagem, recebeu uma colaboração considerável da Sun, a qual possibilitou posteriormente dizer que o JavaScript é uma linguagem compatível com a linguagem Java, por esta razão, a semelhança dos nomes "JavaScript"."

Agora que já sabemos a definição de JavaScript, podemos entrar mais a fundo nas suas funcionalidades.
O JavaScript é muito utilizado por webdesigners e programadores web para, principalmente, validar formulários de cadastro e contato (este será o formulário que possivelmente necessitaremos validar em nosso site). Também é utilizado para a interação do usuário com a página, sem a necessidade da utilização de um servidor.
O JavaScript é altamente dinâmico, ou seja, uma variável pode assumir diversos tipos durante a execução do script, além de não necessitar a declaração do tipo da variável. Outro ponto forte do JavaScript é que seus scripts não precisam ser compilados, o que agiliza o processo e dispensa o uso de um servidor.

Para o começo, procurarei algumas apostilas e tutoriais, para estudar e começar a desenvolver scripts simples, com a finalidade de aprendizado. Assim, em breve, colocarei aqui os scripts que serão desenvolvidos.

Até a próxima! ;D

Classes do Projeto

Isabella Fontes

Olá,

Hoje postarei sobre as classes do projeto.
Obs.: Para compreender, há uma pasta chamada spectrum na qual são colocados arquivos comuns, compartilhados entre as demais classes. E é deste modulo que sempre importo as classes.

Imports:

import logging
from spectrum.database import Pessoa
from spectrum.database import Usuario
from spectrum.database import Configuracao
from spectrum.database import Grupo
from spectrum.database import Permissao
from spectrum.database import Pontuacao


################################
#  FUNCOES QUE SAO CHAMADAS DA APLICACAO
#

    def btn_logar_clicked_cb(self,widget):
        """
            Usuario insere seu login e senha. [OK]
            Efetuar conexao e busca se usuario existe. [OK]
            Chamar proxima tela, desaparecer esta. [OK]
        """

        logging.debug("Nome do Usuario : %s . Senha do Usuario: %s"%(self.txt_name.get_text(),self.txt_senha.get_text()))
       
        print 'Executando pedido de conexao para ', self.txt_name.get_text(), self.txt_senha.get_text()
        u = Usuario()
        usuario = u.findUsuarioPorNomePorSenha (self.txt_name.get_text(), self.txt_senha.get_text())
        if usuario.get_id() and usuario.get_id_pessoa():
            pessoa = Pessoa (usuario.get_id_pessoa())
            print 'Seja Bem-Vindo %s'%(pessoa.get_name())
        self.txt_senha.set_text("")
        self.txt_name.set_text("")

Detalhes do cenário

Ananda Brasolotto De Santis

Olá, pessoal.
Abaixo estão algumas imagens de detalhes do cenário do jogo: um hidrante, encontrado por acaso e baixado da internet, apenas para decoração e uma placa de velocidade, que é necessária para cumprir objetivos do jogo, e que foi modelada.




A imagem da placa selecionada para ser postada foi um print da própria tela do blender, também para que as pessoas que não o conhecem vejam um pouco do programa com o qual trabalhamos para a modelagem em 3D.