我刚刚开始制作一个有点像太空入侵者的游戏。
对于编程而言,我是一个完全没有经验的新手(我只是尝试这个,因为我需要在下周末有一个软件设计项目)。
无论如何,我一直关注如何发射子弹tutorial。它似乎没有起作用。我已经复制了本教程的几乎每个方面,除了'子弹'类中的'velocity'变量(我认为我不需要它,因为我只使用左右移动而不是向前/向后)。
这是下面的代码。提前致谢。 :)
主要
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
namespace Software_Design_Major_Project
{
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Texture2D ship; // Declaring the sprite
Vector2 shipposition = Vector2.Zero;
List<bullets> bullets = new List<bullets>();
KeyboardState pastkey;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
graphics.PreferredBackBufferWidth = 600;
}
protected override void Initialize()
{
base.Initialize();
}
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
ship = Content.Load<Texture2D>("ship"); // Loads the ship into the memory.
shipposition = new Vector2((graphics.GraphicsDevice.Viewport.Width / 2) -
(ship.Width / 2), 420);
}
protected override void UnloadContent()
{
}
protected override void Update(GameTime gameTime)
{
if (Keyboard.GetState(PlayerIndex.One).IsKeyDown(Keys.Left) && shipposition.X
>= 0)
{
shipposition.X -= 6;
}
if(Keyboard.GetState(PlayerIndex.One).IsKeyDown(Keys.Right) && shipposition.X <
((graphics.GraphicsDevice.Viewport.Width) - (ship.Width)))
{
shipposition.X += 6;
}
if (Keyboard.GetState().IsKeyDown(Keys.Space) && pastkey.IsKeyUp(Keys.Space))
{
shoot();
}
pastkey = Keyboard.GetState();
updatebullets();
base.Update(gameTime);
}
public void updatebullets()
{
foreach(bullets bullet in bullets)
{
if (Vector2.Distance(bullet.position, shipposition) < 0)
bullet.isvisible = false;
}
for (int i = 0; i < bullets.Count; i++)
{
if (!bullets[i].isvisible)
bullets.RemoveAt(i);
i--;
}
}
public void shoot()
{
bullets newbullet = new bullets(Content.Load<Texture2D>("bullet"));
newbullet.position = shipposition;
newbullet.isvisible = true;
if (bullets.Count < 20)
bullets.Add(newbullet);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);
spriteBatch.Draw(ship, shipposition, Color.White);
spriteBatch.End();
foreach (bullets bullet in bullets)
bullet.Draw(spriteBatch);
base.Draw(gameTime);
}
}
}
子弹
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
namespace Software_Design_Major_Project
{
class bullets // A new class needs to be created to allow for bullets.
{
public Texture2D texture;
public Vector2 position;
public Vector2 origin;
public bool isvisible;
public bullets(Texture2D newtexture)
{
texture = newtexture;
isvisible = false;
}
public void Draw(SpriteBatch spritebatch)
{
spritebatch.Draw(texture, position, null, Color.White, 0f, origin, 1f,
SpriteEffects.None, 0);
}
}
}
P.S。对不起,很长的帖子。
答案 0 :(得分:1)
我没有看到任何改变子弹位置的代码,你需要一个速度变量,并根据每帧的速度更新位置。
你可以从a = Math.Atan(Y,X)获得角度
看起来你可能已经删除了计算位置的部分,因为你认为你不需要速度的东西。我建议你尝试添加它以查看它是否有效,然后删除你不需要的部分。
答案 1 :(得分:1)
很惊讶没有人发现这一点。 在绘制项目符号之前,您将结束SpriteBatch。 调用SpriteBatch.Draw必须在Begin和End方法之间进行,因为幕后所做的所有工作都是为了尽可能快地进行绘制。 你需要做的就是进一步向下移动spriteBatch.End(),如下所示:
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);
spriteBatch.Draw(ship, shipposition, Color.White);
foreach (bullets bullet in bullets)
bullet.Draw(spriteBatch);
spriteBatch.End(); //Move to here instead
base.Draw(gameTime);
}
额外的琐事: 基本上幕后发生的事情是sprite批处理实际上使用begin描述的设置批处理纹理(是的,这些可以更改),然后当调用end时,它会找出哪些位落在屏幕外面并做出注释不要绘制它们,深度对纹理进行排序,如果被告知,它会在将它们绘制到后台缓冲区之前进行各种其他优化,然后最终在所有绘图完成后,后台缓冲区将显示在屏幕上,旧的是采取并重新用于下一次抽签。这听起来像是很多工作,但随着现代计算机的工作方式,优化往往会带来很大的改进。
答案 2 :(得分:0)
你可以在这里查看这个样本。很久以前我编写过这个东西,我想在XNA的v2.0中,现在不能重新编号。
http://gozoomin.com/media/p/69699.aspx
那里的逻辑退出简单:)
开始制作“经典”始终是一个很好的开始方式。
编辑 - 您也可以在此处获取:http://www.sendspace.com/file/r4s4um Edit2 - 我现在只是检查了代码,它记录了大部分内容的一些注释,可能你会得到一些用葡萄牙语写的东西。 PS - 不要复制过去的代码!尝试学习样本的基础知识。