Sunday, 23 July 2017

Xna Moving Average


Estou tentando fazer um nível de rolagem para um jogo de teste que estou fazendo como um exercício de aprendizado. Criei um mapa contendo lotes de azulejos que são desenhados de acordo com sua posição em uma matriz. Eu basicamente quero que a câmera se deslize para baixo do nível, mas, no momento, ela simplesmente agita-se bruscamente um pouco. Eu tenho uma classe de câmera que é apenas uma classe estática em branco contendo um vetor estático2 para a localização da câmera. É apenas definido como 50, 50 como todas as telhas são 50 por 50. Em seguida, no meu método de atualização de mapas, eu tenho o seguinte: Os 300 e 18 são o número total de telhas e o número de telhas na tela (verticalmente). Estou completamente perdido por isso apreciaria qualquer ajuda ou conselho. Pointo e direção em direção a um alvo em XNA (2D) Neste tutorial abordarei como fazer algo apontar e se mover em direção a um alvo. Isso é útil para gerenciar mísseis, dirigir zumbis para o seu jogador, apontar um carro na direção que você está dirigindo ou uma arma em direção a um alvo, etc, etc. (você começa a idéia). O que iremos abordar Quais são os vetores Como obter a direção de um ponto para outro Como se mover gradualmente para um alvo específico Como apontar um Texture2D na direção correta Como escolher um centro de rotação para suas imagens Que vetores são Imagine você encontrou um Mapa do tesouro que se parece com algo assim: este mapa instrui você a quotwalk a 4 milhas a sul, a oeste de 3 milhas e ao sul de 2 milhas novamente. Então, as instruções consistem em três partes, cada uma com uma direção e uma distância. Na física, um vetor é definido como uma direção e uma força (pense na nossa distância). Então, basicamente, influenciamos nossa posição usando três vetores. Essas instruções acima irão levá-lo ao mesmo ponto final que os abaixo: Mas aqui há apenas uma instrução: quotgo em uma direção sul-sudoeste, uma direção que leva você 6 milhas a sul e 3 milhas a oeste. Em XNA temos uma classe para armazenar o movimento em 2 dimensões: a classe Vector2. Um Vector2 armazena o movimento horizontalmente (X) e verticalmente (Y), o que também o torna útil para armazenar a posição de algo. Quando você está programando em 3D, você pode usar o Vector3, o que lhe dá uma dimensão extra (o eixo Z). No XNA160, as instruções de mapas superiores seriam escritas: Observe que os operadores aritméticos quotquot, quot-quot, quotquot, quotquot todos funcionam no Vector2 - o que é muito habilidoso para calcular a força resultante em um objeto. Por exemplo, se três forças: gravidade, impulso de seus motores de foguete e colisões de meteoros, todos devem resultar em um efeito combinável confiável em sua nave espacial de confiança. Como obter a direção de um ponto para outro Vamos ver um exemplo diferente no XNA. Na ilustração abaixo, temos dois objetos Vector2 (3,2) e (4,6). Observe que, neste caso, estamos usando os objetos Vector2 como posições, não como movimento. Então, sinta-se livre para visualizá-los como dois pontos: 3 pixels para a direita e 2 pixels para baixo do canto superior esquerdo. 4 pixels para a direita e 6 pixels para baixo do canto superior esquerdo. Se você está se perguntando por que (0,0) é No canto superior esquerdo, em vez do canto inferior esquerdo, é só porque é assim que está na programação desde o início dos computadores. Agora, queremos descobrir qual é a direção do atirador para o alvo (por enquanto como vetor, não radianos). Quando queremos calcular a direção (e distância) de um objeto para outro, subtravemos a posição do objeto de segmentação da posição do alvo. Isso nos dá um vetor que contém o que faltamos para chegar ao alvo a partir do alvo. Mais tarde, veja como transformar isso em graus, para desenhar a imagem de segmentação corretamente. Em XNA, isso ajudaria você a lembrar o que resta do que se (como eu) você tem dificuldade em lembrar se deve subtrair a posição dos atiradores dos alvos ou vice-versa, faça como eu: pense em um exemplo muito simples: atirador em ( 1,1), alvo em (2,2). (Isso significa que o atirador deve disparar para baixo e para a direita (1,1)). Encontre o método correto rapidamente por tentativa e erro: atirador menos alvo. (1,1) - (2,2) (-1, -1) errado. Porque (-1, -1) está para cima e para a esquerda, longe do alvo. Outra maneira de pensar sobre isso é: quando você subtrai algo de outra coisa, a parte que você subtrair torna-se o novo quotzeroquot, quotreference pointquot ou quotworld centerquot. Torna-se a parte que você compara ou olha outras coisas em relação a. Pense em um neto (7 anos) e seu avô (67 anos). Subtraindo o neto (7) do avô (67) diz-lhe quanto mais velho o avô é comparado com o neto: 67 - 7 60. Subtraindo o avô (67) do neto (7) diz-lhe quanto mais novo o neto é Em comparação com o avô: 7 - 67 -60. Quando você segmenta algo - você quer a posição dos alvos em relação a (em comparação com) o atirador - então você subtrai o atirador do alvo (de qualquer maneira - faz sentido para mim). Como se mover gradualmente para um alvo específico: obter direção sem distância Nós ainda precisamos de mais um passo antes que possamos usar a diferença entre a posição atual e nosso destino para disparar ou mover. Se usássemos a diferença calculada como o movimento de uma orc ancestral e explosiva em nosso método Games Update (), o objeto movido chegaria ao destino ao mesmo tempo. Neste exemplo de código, imagine que temos dois Vector2s, armazenando a posição do jogador e um orco. Queremos que o orc persiga nosso jogador. Aqui é como NÃO FAZER O resultado é que nós configuramos a posição orcs para a posição de nossos jogadores em um instante: O que queremos fazer O que queremos é se mover gradualmente, então queremos mover apenas uma parte da distância. Mas na direção certa. Para obter apenas a direção de um vetor, você o normaliza, resultando no chamado quotunit vectorquot (um vetor com um comprimento de 1). Isso significa que você tem a relação entre Y e X intacta, mas se você usar o vetor de movimento, você apenas move uma unidade de qualquer escala em que seu mundo esteja. Aqui você pode ver o nosso vetor original e a versão normalizada. Aqui está o código para Normalizando um vetor em XNA: movendo-se a uma certa velocidade Quando você tem o vetor da unidade, você pode avançar e multiplicar sua velocidade nesse vetor. Isso lhe dará um vetor com o comprimento que você precisa para uma certa velocidade. Então, você pode adicionar o vetor resultante ao que deseja mover: como apontar um Texture2D na direção correta Agora que sabemos como obter um vetor de unidade apontando para um alvo específico, podemos usá-lo para desenhar uma imagem apontando para isso alvo. Calcule a direção em radian desenhe a imagem usando um dos muitos métodos SpriteBatch. Draw () sobrecarregados, que incluem uma rotação. Mas antes que possamos fazer isso, precisamos saber como converter um vector2 para XNA radian. Como os radios XNA diferem dos que você já ouviu falar em geometria. Por algum motivo, em XNA eles escolheram seguir um sistema diferente de ângulos do que você pode se lembrar da geometria. Em XNA zero graus radian é UP - tradicionalmente é certo. Em XNA, você entra em RELÓGIO quando o ângulo for maior - tradicionalmente, você faz COUNTER-CLOCKWISE. O que isso significa para você como um programador de jogo Mantenha-se no sistema de coordenadas tradicional para todos os cálculos de rotação e movimento de unidades, etc. Então antes de desenhar a textura, converta a rotação para o sistema de coordenadas XNA. Então, agora você sabe disso, o código: Como converter um vector2 para Xna radian, para desenhar uma textura Como converter o radian euclidiano para o XNA radian para desenhar uma textura Para lhe dar um exemplo de como usar isso em um jogo - Ive Fez uma pequena demo de direção de uma seta para o cursor do mouse: projeto de exemplo - direção em direção ao cursor do mouse Aqui está um pequeno vídeo que mostra o conteúdo do projeto de amostra. Rotação e movimento em direção a um Vector2 Abaixo aqui é o núcleo do código da amostra. Na parte superior do código, você pode ver as variáveis ​​que eu preciso para armazenar informações sobre a seta e o mouse. No método Update (), você pode ver como calculo a rotação da imagem usando o método Vector2ToRadian acima. Desenho da imagem Para um desenho fácil, com a rotação correta no seu jogo, é necessário ter a imagem que deseja usar, apontando para cima, pois esta é 0 graus radianos em XNA como você viu acima no capítulo, como os radios XNA diferem de Aqueles que você já ouviu falar em geometryquot. Então, se você quer que um míssil persiga alguém ou um zumbi para enfrentar alguém - encontre ou crie uma imagem onde ele está voltado para cima. Assim: Aqui está o método Draw () do aplicativo de exemplo. Os três parâmetros importantes para entender aqui são a seta - que é onde queremos que a flecha seja desenhada a flechaRotationInRadians - que é a rotação (em XNA radianos) da imagem Vector2.One 64 - que é o mesmo que um novo Vector2 (64, 64), que precisa de uma pequena explicação: como escolher um centro de rotação para suas imagens Quando você usa o método SpriteBatch. Draw () que permite rotear o Texture2D você está desenhando, você também deve passar no ponto Você está girando por aí. Por padrão, este é o canto superior esquerdo da imagem, o que raramente lhe dá o que você deseja. Aqui você pode ver como a rotação em torno de diferentes posições em uma textura dá resultados diferentes: (clique na imagem para uma versão maior). Então, você pode desenhar suas imagens giradas em torno de qualquer posição (mesmo fora do Texture2D) - espero que tenha gostado do tutorial, se você Tenha idéias para melhorá-lo - escreva-me no quotkr em rup dot dkquot Esta entrada foi postada na sexta-feira, 28 de dezembro de 2012 às 20:27 e está arquivada em Uncategorized. Você pode acompanhar as respostas a esta entrada através do feed RSS 2.0. Você pode deixar uma resposta. Ou rastreamento de seu próprio site. 4 Respostas a 8220Pointação e movendo-se em direção a um alvo em XNA (2D) 8221 Obrigado, muito legal explicou, mesmo a subtração vetorial. Obrigado novamente. Grande leitura Uma pergunta, diga se eu quero mover um objeto gradualmente de uma posição para outra e depois parar quando o objeto atingiu seu destino. Uma vez que estamos multiplicando o vetor com um flutuador, teremos realmente, muito perto, mas nunca apenas no destino exato. Estou mudando para 64,30, eu vou chegar a cerca de 63,999992, 29,999991 O que é uma maneira padrão de resolver este problema RoundingClamping. O que costumo fazer é verificar a distância até o alvo para cada atualização. Se a distância for menor do que um limite selecionado (digamos, 2 pixels ou unidades, se você quiser), movo o objeto em movimento na parte superior do alvo e paro de me mover. Isso funcionaria para você Atenciosamente - Jakob Sim, esta é exatamente a abordagem que eu fiz, eu recebo o comprimento do vetor de distância e verifique se o comprimento é menor do que a velocidade especificada. Se o comprimento for menor que a velocidade, eu retornarei o vetor de destino. Obrigado Jakob Heres o método que eu estou usando no caso de alguém acontecer de se deparar com esse problema (note que há problemas com este método se você ultrapassar o destino) public static Vector2 Move (esta posição Vector2, destino Vector2, velocidade do flutuador) var dist destination - Posição se (dist. LengthSquared () lt speed) retornar destino return position dist speed Deixe um AnswerThe Wizard - Parte 1 Fazendo um Sprite se movendo ao redor da tela Este é o primeiro de uma série de quatro partes para mostrar como adicionar algum movimento e ação Para o seu sprite. Esta primeira parte examinará os conceitos básicos de obter a entrada do teclado do jogador e usá-lo para fazer com que o Sprite se mova ao redor da tela. Criando o novo projeto de jogo: Nós vamos usar a classe quotSpritequot que criamos no tutorial quotCreating a 2D Sprite quot. Em vez de criar um novo projeto XNA Game, você pode simplesmente baixar a fonte desse projeto e começar a trabalhar com esse projeto de jogo. Se você preferir criar um novo projeto de jogo para começar, mas está tendo problemas para se lembrar de como fazer isso, siga as etapas neste tutorial aqui e volte para este tutorial depois de atualizar sua memória. Depois de ter seu novo projeto de jogo, você precisará adicionar a classe quotSpritequot criada neste tutorial aqui para o seu novo projeto. Agora, vamos adicionar a nova imagem de sprite que vamos usar neste tutorial para o projeto do jogo. Você pode baixar a imagem do Assistente usada no projeto a partir daqui. Depois de baixar a imagem, adicione a nova imagem do Assistente à pasta Conteúdo no seu jogo. Se você está tendo problemas para se lembrar de como adicionar uma imagem a um projeto XNA Game, siga as etapas deste tutorial aqui e volte para este tutorial depois de atualizar sua memória. Melhorando a classe Sprite: Para começar, vamos fazer algumas melhorias na classe Sprite. Esses aprimoramentos foram feitos no projeto QuotAdvanced Scrolling a 2D Background quot, mas nós vamos examiná-los agora. Para começar, comece adicionando os seguintes objetos ao topo da classe Sprite. O AssetName é um objeto público usado para armazenar o nome da imagem a ser carregada a partir do Content Pipeline para este sprite. O tamanho é um objeto público usado para dar o tamanho atual do sprite após a escala ter sido aplicada. MScale é um objeto privado que irá dizer ao método Draw quanto reduzir ou ampliar o sprite do tamanho original. Em seguida, iriam adicionar uma propriedade à classe. As propriedades geralmente são usadas quando você tem algumas outras coisas a fazer quando o valor de um objeto muda. No nosso caso, quando a escala do sprite é alterada, precisamos recalcular o tamanho do sprite com essa nova escala aplicada. Adicione a seguinte propriedade à classe Sprite. O método LoadContent da classe Sprite também precisa ser aprimorado. Modifique o método LoadContent da classe Sprite para se parecer com o seguinte. Adicionamos o armazenamento do nome do activo e o cálculo inicial do tamanho do Sprites. Nossos sprites precisam ser capazes de se mover, então vamos adicionar um novo método de quotUpdatequot para a classe para nos ajudar a fazer isso. Adicione o seguinte novo método de atualização à classe Sprite. O movimento é um cálculo simples de tomar a direção em que o sprite deve se mover, a velocidade que eles devem mover e multiplicar aqueles pelo tempo decorrido, em seguida, ajustando a posição original com esse resultado. TheDirection é um objeto Vector2. Um valor de -1 no valor X do Vector2 indicará que algo deve estar se movendo para a esquerda. Um valor de 0 indica que não está se movendo ao longo do eixo X. E um valor de 1 indica que o sprite deve estar se movendo para a direita. O mesmo vale para o valor Y do Vector2. A -1 indica que o sprite precisa mover-se para cima, 0 não se movendo na direção Y e 1 significa que está se movendo para baixo. Combinações de valores X, Y fazem com que o sprite se mova ao longo do eixo X, Y. TheSpeed ​​é o quão rápido o sprite deve se mover em um ao longo de um determinado eixo. O valor de 0 significa que não tem velocidade ao longo desse eixo, velocidades mais altas fazem com que o sprite se mova mais rápido ao longo do eixo dado. TheGameTime é usado para manter a rapidez com que o sprite se move consistente em diferentes computadores. Ao se deslocar sempre em quanto tempo decorrido, se uma taxa de atualização de computadores for mais rápida, o sprite ainda deve mover a mesma velocidade que em um computador com uma taxa de atualização mais lenta. Com a nossa posição de mudança de sucesso do sprite, agora é hora de desenhá-lo na tela nessa nova posição e com sua escala potencialmente nova. Modifique o método Draw da classe Sprite para se parecer com o seguinte. O objeto SpriteBatch tem várias substituições diferentes para Desenho (as substituições são o mesmo método, mas eles tomam parâmetros adicionais para dar novas funcionalidades). Nesse caso, queríamos voltar a dimensionar o sprite para cima ou para baixo de acordo com a Escala, assim passando isso. Utilizamos os padrões para todos os outros parâmetros dessa substituição particular. Eventualmente, no futuro, podemos usá-los, mas, por enquanto, queremos posicionar e dimensionar o sprite. Isso é para as mudanças para a classe Sprite por enquanto. Faça um Build Build agora agora para certificar-se de que todas as mudanças compilam corretamente. Ainda não será diferente no jogo, mas é bom certificar-se de que não tenha erros antes de chegar muito mais longe. Adicionando a classe Wizard: moveria um personagem Wizard na tela (você adicionou a imagem do Wizard ao projeto anteriormente). O Mágico vai ser um sprite, mas ele vai ter alguma funcionalidade adicional especial para ele também. Para fazer isso, iria criar uma nova classe chamada quotWizardquot e, em seguida, herdar da classe Sprite. A herança lhe dá a funcionalidade da outra classe e permite que você adicione a essa funcionalidade. É a base da programação orientada a objetos. Clique com o botão direito do mouse no projeto do jogo no Solution Explorer. Selecione, quotAddquot, então escolha quotClassquot do add sub-men. Isso abrirá a caixa de diálogo quotAdd New Itemquot. Digite o nome quotWizardquot para sua classe e clique no botão quotAddquot. Agora precisamos começar a adicionar algumas funcionalidades à classe Wizard. Comecemos pela adição de nossas frases quotusquentes do framework XNA ao topo do arquivo da classe Wizard. Adicione as seguintes instruções quotusingquot. Estes apenas ajudam com a legibilidade do nosso código, então não temos que digitar tanto para obter o objeto fornecido pelo framework XNA. Por exemplo, podemos usar o Vector2 em vez de ter que digitar Microsoft. Xna. Framework. Vector2 sempre que quisermos usar esse objeto. Agora é hora de indicar que queremos herdar da classe Sprite. Altere a declaração de classe para o Assistente para se parecer com o seguinte. A classe Wizard agora herda da classe Sprite e tem acesso a todos os seus membros e métodos públicos e protegidos. Gong estava usando alguns valores na classe uma e outra vez que não mudam. Então, fariam essas constantes da nossa classe. É uma boa prática de programação para ter o hábito de remover quotmagicquot números e cordas de seu código e movê-los em variáveis ​​e constantes. Um número mágico ou uma string é qualquer número que seja apenas magicamente no seu código, sem explicação real sobre o valor ou o valor desse valor. Adicione as seguintes constantes ao topo da classe Assistente. Agora, vamos adicionar alguns outros objetos de nível de classe que ajudarão a nos dar a funcionalidade que precisamos para mover nosso Sprite do assistente. Adicione os seguintes objetos ao topo da classe Assistente. O estado enum é usado para armazenar o quotStatequot atual do sprite. O que é o estado Você pode pensar em estado como qualquer tipo de ação que você precisa para acompanhar o sprite porque pode limitar outra ação ou quotstatequot. Então, se o sprite estivesse morto, ou subisse ou pulando ou dobrasse, etc. Aqueles podem ser quotstatesquot seu Assistente poderia estar em e você pode querer verificar se o Wizard estava em (ou não) um estado atual antes de você Faça algo ou desenhe algo na tela. Atualmente, nosso Assistente só tem um estado, quotWalkingquot. MCurrentState é usado para rastrear o estado atual do sprite e seu conjunto para quotWalkingquot quando criado. MDirection é usado para armazenar a Direção que o Assistente está se movendo e mSpeed ​​é usado para armazenar a Velocidade em que o sprite está se movendo nessas direções. MPreviousKeyboardState é usado para armazenar o estado anterior em que o teclado estava na última vez que verificamos. Isso é útil para momentos em que não queremos repetir uma ação, a menos que um jogador tenha pressionado uma tecla no teclado novamente, em vez de apenas pressioná-la. Com conhecimento do estado anterior do teclado, podemos verificar se a chave foi liberada antes, mas agora está pressionada e, em seguida, faça qualquer ação que precisemos para essa chave. O Assistente precisa carregar a nova imagem do Assistente, assim como o modelo após a classe de sprite base e adicionar um método LoadContent ao Assistente. Adicione o seguinte método LoadContent à classe Assistente. O método LoadContent para a classe Wizard não aceita um nome de recurso como a classe Sprite. Isso ocorre porque a classe Wizard já conhece o recurso que ele precisa carregar. Então, primeiro, ele define a posição inicial do Assistente (usando as constantes que declaramos para as posições x e y inicial) e então chama o método quotLoadContentquot da classe de sprite base que herda. Ele passa para o método base LoadContent o gerenciador de conteúdo que recebeu quando o método LoadContent foi chamado e, em seguida, a constante que declaramos para o nome do recurso. O método quotLoadContentquot da classe Sprite agora será executado e executará todo o seu código. Agora, precisamos adicionar um método quotUpdatequot para a classe Wizard. Este método irá cuidar de verificar a entrada e mover o sprite ao redor. Adicione o seguinte método de atualização à classe Assistente. O método Update primeiro obtém o estado atual do teclado. Isso é construído em funcionalidade do framework XNA e ao chamar quotKeyboard. GetState () quot, a estrutura XNA informará para você todas as teclas que são pressionadas e não pressionadas no teclado. Em seguida, chamamos um método quotUpdateMovementquot passando no estado atual do teclado. Nós ainda não escrevemos este método, mas nós vamos em breve. Em seguida, armazenamos o estado do teclado em nosso objeto mPreviousKeyboardState. Isso nos ajudará quando chegarmos ao ponto em que precisamos verificar que uma chave não foi lançada e depois pressionada novamente. Nós não estaremos usando essa funcionalidade para este tutorial, mas é um bom hábito para entrar para garantir que esteja disponível ao verificar a entrada do teclado porque você está obrigado a precisar dessas informações eventualmente. Finalmente, chamamos o método Update da classe Sprite da qual estamos herdando. Passamos o tempo decorrido e os valores atuais da Velocidade e Direção do Assistente. O método Update da classe Sprite usará esses valores para ajustar a posição do sprite. Isso é para o método Update, mas nela chamamos um método quotUpdateMovementquot que não existia. Vamos em frente e adicione esse método agora. Este método irá lidar com todas as verificações para ver se uma das teclas de movimento foi pressionada e depois definir as variáveis ​​de movimento para o sprite). Adicione o seguinte método quotUpdateMovementquot à classe Assistente. O método UpdateMovement é o método-chave para que nosso feiticeiro Wizard se mova. Primeiro, verifica se o Assistente está em um estado atual para andar. Nosso Assistente atualmente pode estar em um estado de caminhada, mas pode haver momentos no futuro quando não queremos movê-lo se ele não está atualmente em um estado de caminhada, então nós verificamos. Em seguida, desligamos a direção e a velocidade. Vector2.Zero é uma maneira rápida e fácil de dizer criar um novo Vector2 (0,0). Agora, começamos a verificando quais chaves são pressionadas. Primeiro verificamos se a tecla de seta para a esquerda ou a tecla de seta para a direita são pressionadas. Se eles estiverem, então nós ajustamos a Velocidade ao longo do eixo X e indicamos a direção. Então, verificamos se a seta para cima ou a seta para baixo são pressionadas. E, novamente, se eles estiverem, então definimos a Velocidade ao longo do eixo Y e indicamos a direção. Agora, quando a base. Update da classe Sprite é chamada (o que acontece no nosso método Update já), os novos valores para nossa velocidade e direção do Assistente serão aprovados e nosso Sprite Wizard se moverá apropriadamente. Faça um Build rápido para garantir que a classe Wizard compila corretamente sem erros. Você não verá o Assistente na tela ainda (se você estiver construindo isso fora do quotCriar um projeto 2D Spritequot, você ainda deve ver os sprites desenhados na tela e você não poderá movê-los. Então, ainda temos algumas mudanças finais para fazer . Precisamos alterar a classe Game1.cs para usar nossa nova classe Wizard em vez da classe Sprite. Modificando a classe Game1.cs: Queremos remover referências para apenas usar a classe Sprite e, em vez disso, usar a nossa classe Assistente. Então, para fazer Que iriam eliminar algum código e depois adicionar algum código novo para substituí-lo. Exclua as seguintes linhas de código do topo da classe Game1.cs Agora, adicione a seguinte linha de código ao topo da classe Game1.cs. Agora, modifique o método Initialize, para se parecer com o seguinte. Isso criará uma nova instância do nosso sprite do Assistente (e removemos as antigas linhas de código que estavam criando novas instâncias da classe Sprite). Agora precisamos carregar o conteúdo Do nosso Assistente. Modifique o método LoadContent do Game1. Classe cs para se parecer com o seguinte. Com o nosso conteúdo do Sprite do assistente carregado, vamos adicionar a habilidade para a classe Game1.cs quotUpdatequot o Assistente. Modifique o método Update para se parecer com o seguinte. Finalmente, queremos desenhar o nosso Assistente. Modifique o método Draw da classe Game1.cs para se parecer com o seguinte. Agora que modificamos adequadamente a classe Game1.cs para usar nossa nova classe Wizard, faça um Build e veja seus resultados. O assistente deve agora ser desenhado para a tela e você deve poder movê-lo com as teclas de seta para cima, para baixo, para a esquerda e para a direita. Parabéns Você descobriu com sucesso como fazer um sprite se mover em torno da tela em seu jogo. Você pode pensar em algumas coisas que você pode mudar. Você pode adicionar os velhos Sprites de volta e desenhá-los para a tela. O que você acha que aconteceria se você tentasse adicionar dois assistentes ao jogo Jogue com ele, experimente e faça perguntas. Acima de tudo certifique-se de que você se divirta

No comments:

Post a Comment