将XNA中的类设置为';talk';彼此之间

本文关键字:talk 彼此之间 设置 XNA | 更新日期: 2023-09-27 18:25:01

我在XNA中有两个类。

maingame.csplayer.cs

在我的maingame.cs中,我有一个矩形,它被绘制在鼠标所在的任何位置,我用它来点击。

我的player.cs有一个矩形用于玩家精灵。

我不知道如何让这两个班互相"交谈",这样我就可以拥有类似的东西

if (ButtonState.Pressed == mouseState.LeftButton && mouseRectangle.Intersects(playerRectangle))
            {
                //draw something
            }

问题是playerRectangle在Player.CS中,而mouseRectangle则在主游戏中。CS

我该如何让这两个人互相交谈?我已经在谷歌上搜索了好几个小时了,但运气不好。

Player.CS看起来像

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;
namespace PlanetDefence
{
    class Battleship
{
//Textures
Texture2D playerBattleshipTexture;
//Rectangles
 Rectangle playerBattleshipRectangle;
//Integers
public Battleship(Texture2D newPlayerBattleshipTexture, Rectangle newPlayerBattleshipRectangle)
{
    playerBattleshipTexture = newPlayerBattleshipTexture;
    playerBattleshipRectangle = newPlayerBattleshipRectangle;
    newPlayerBattleshipRectangle = new Rectangle(100, 100, 100, 100);
}
public void Update()
{
}
public void Draw(SpriteBatch spriteBatch)
{
    //Draw the player Battleship
    spriteBatch.Draw(playerBattleshipTexture, playerBattleshipRectangle, Color.White);
}

}

}

我正在努力让我在MainGame.CS中的鼠标矩形能够通过点击它

    if (ButtonState.Pressed == mouseState.LeftButton && mouseRectangle.Intersects(playerBattleshipRectangle))
    {
        playerBattleship.Draw(spriteBatch);
    }

将XNA中的类设置为';talk';彼此之间

我不确定我是否在这里说明了显而易见的内容,但你需要一个公共访问器来访问你的战舰类中的矩形。如果你不明白这意味着什么,那么你需要阅读一些面向对象编程的基础知识。不过,现在,如果你修改战舰等级的代码,说

public Rectangle playerBattleshipRectangle;

然后,您可以使用从您的maingame.cs对玩家对象的引用中访问它

player.playerBattleshipRectangle

(假设你的玩家是一个战舰类。如果不是,那么你需要在你的问题中更加清楚,并发布你的玩家的类源代码。你说"player.cs",但发布了职业战舰——是哪艘?如果文件名是player.cs,但类名实际上是战列舰,则应该更改其中一个,使它们相同。练习好,易于理解的类名和变量名;尽可能具有描述性,但不要太冗长)。

默认情况下,如果在类中的成员字段之前不包含作用域修饰符(public、private、protected、internal…),则它们将设置为private,其他类无法访问。

您还可以使用属性对类成员字段的访问进行更多控制。例如,

private int health;
public int Health
{
    get { return health; }
    set { health = MathHelper.Clamp(health, 0, 100); }
}

这段代码包含一个对象运行状况的私有定义(只有这个类可以访问它)。它还为其他类提供了一种公共方式来"查看"该对象的运行状况并更改此运行状况。正如您在"set"部分中看到的,当另一个类设置此对象的运行状况时,它会自动夹在0和100之间。你也可以完全省略"set",没有其他类可以改变健康状况,他们只能看到它

这是C#中面向对象编程的所有基础知识。如果你不了解基础知识,我强烈鼓励你从基础知识开始。如果不了解范围、属性、继承、对象实例和引用,就无法成功创建游戏。

这篇文章中一些相关定义的快速总结:

  • 字段-也称为变量;作为"成员"存储在类中的基本特征。即"health"或"boundingBox"
  • 属性-字段的访问器,用于定义外部类如何查看和修改字段
  • instance—存储在内存中的"真实"对象。类只定义对象的行为;它必须成为一个实例,对象才能真正存在。像战列舰这样的类可以用来在记忆中制造无限的战列舰实例。当你说Battleship player=new Battleship()时,你正在创建一个名为"player"的Battleship实例
  • private-将"private"放在字段之前意味着只有这个类才能看到它
  • public-将"public"放在字段之前意味着所有类都可以看到它
  • protected-将"protected"放在字段之前意味着只有这个类和从这个类继承的任何类才能看到它
  • internal-将"internal"放在字段之前意味着只有该类命名空间中的类才能看到它

如果我低估了你对这个问题的了解,我深表歉意。

其中一个类需要保存对另一个类的引用。

有了这样的引用,它可以调用上面的方法,设置属性等。

您可以通过在构造函数中传递实例或将实例作为属性来实现这一点。

public Maingame(Player player)
{
  // use the Player instance
}

要在构造函数之外访问它,您应该使用一个字段并在构造函数(或属性设置器,无论您决定使用哪个)中分配它:

Player myPlayer;
public Maingame(Player player)
{
  myPlayer = player;
  // use the myPlayer field in the class
}

为了避免紧密耦合,您可能需要使用事件进行调查。