Ich möchte gerne eine Art Laufschrift machen
Ein Text der von oben Mitte nach unten Mitte geht und dann soll sich der Text ändern
Das ganz soll dan 4 mal wiederholt werden nätürlich soll jeder Ablauf mit einem anderen Text sein
Ich habe da noch nicht die große Ahnung von aber ich möchte das gerne in mein Programm einbauen
PS:Kann man das auch so machen das sich etwas in "Sand" auflöst??
Du kannst eine Direct3D-Schrift machen und diese in deiner OnPaint() (oder Render() ) Methode aufrufen:
private Microsoft.DirectX.Direct3D.Font font = null;
...
// in InitalizeGraphics():
font = new Microsoft.DirectX.Direct3D.Font( device, new System.Drawing.Font ("Arial", 10.0f, FontStyle.Regular) );
...
// in Render:
font.DrawText(....)
...
Und dadurch, dass deine Schrift quasi permanent neu gezeichnet wird, kannst du sie auch laufend verändern (z.B. über eine Schleife die Position verändern, auflösen etc.). Die Änderungen sind fliessend, da der Bildschirm seeehr oft neu gezeichnet wird... g (es sei denn, der PC ist lahm) 😉
Ich habe jetzt folgendes da stehen:
public class schrift : System.Windows.Forms.Form
{
/// <summary>
/// Erforderliche Designervariable.
/// </summary>
private System.ComponentModel.Container components = null;
private Microsoft.DirectX.Direct3D.Font font= null;
Device device = null;
Sprite sp=null;
PresentParameters presentParams = new PresentParameters();
public schrift()
{
//
// Erforderlich für die Windows Form-Designerunterstützung
//
InitializeComponent();
//
// TODO: Fügen Sie den Konstruktorcode nach dem Aufruf von InitializeComponent hinzu
//
}
/// <summary>
/// Die verwendeten Ressourcen bereinigen.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Vom Windows Form-Designer generierter Code
/// <summary>
/// Erforderliche Methode für die Designerunterstützung.
/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.Size = new System.Drawing.Size(300,300);
this.Text = "schrift";
}
#endregion
public bool InitializeGraphics()
{
try
{
presentParams.Windowed=true;
presentParams.SwapEffect = SwapEffect.Discard;
device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
sp=new Sprite(device);
font=new Microsoft.DirectX.Direct3D.Font(device, new System.Drawing.Font ("Arial", 10.0f, FontStyle.Regular) );
return true;
}
catch (DirectXException)
{
return false;
}
}
private void Render()
{
if (device == null)
return;
//Clear the backbuffer to a blue color
device.Clear(ClearFlags.Target, System.Drawing.Color.Blue, 1.0f, 0);
//Begin the scene
device.BeginScene();
font.DrawText(sp,"Hallo",new System.Drawing.Point(2),4);
device.EndScene();
device.Present();
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
this.Render();
}
static void Main()
{
using (schrift frm = new schrift())
{
if (!frm.InitializeGraphics()) // Initialize Direct3D
{
MessageBox.Show("Could not initialize Direct3D. This tutorial will exit.");
return;
}
frm.Show();
while(frm.Created)
{
frm.Render();
Application.DoEvents();
}
}
}
}
Aber das einzige was kommt ist ein blauer Bildschirm 🙁
Hi,
ich habe deinen Code mal ein klein wenig umgebaut, so läuft er zumindest (jedenfalls bei mir) 😁 :
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
namespace Schrift
{
public class Schrift : System.Windows.Forms.Form
{
private Device device = null;
private Microsoft.DirectX.Direct3D.Font font = null;
public Schrift()
{
InitializeComponent();
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
}
public void InitializeGraphics()
{
PresentParameters presentParams = new PresentParameters();
presentParams.Windowed = true;
presentParams.SwapEffect = SwapEffect.Discard;
presentParams.AutoDepthStencilFormat = DepthFormat.D16;
presentParams.EnableAutoDepthStencil = true;
device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
font = new Microsoft.DirectX.Direct3D.Font( device, new System.Drawing.Font ("Arial", 14.0f, FontStyle.Regular) );
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Blue, 1.0f, 0);
device.BeginScene();
font.DrawText(null, string.Format("Hallo"), new Rectangle(10,10,0,0), DrawTextFormat.NoClip, Color.White);
device.EndScene();
device.Present();
this.Invalidate();
}
#region Windows Form Designer generated code
private void InitializeComponent()
{
this.Size = new System.Drawing.Size(300,300);
this.Text = "schrift";
}
#endregion
static void Main()
{
using (Schrift s = new Schrift())
{
s.Show();
s.InitializeGraphics();
Application.Run(s);
}
}
}
}
Danke das sieht doch schon mal nach was aus 🙂
Jetzt ist nur noch die Frage wie ich das zum "laufen" bekomme
In dem du einfach immer deine Kameraeinstellungen veränderst, wo die X-, Y- und Z-Achse verlaufen dürfte die bekannt sein und das es eine Kameramatrix gibt, auch. Also einfach mal ausprobieren und drauflos skalieren etc. 👍