Willkommen |
|
myGully |
|
Links |
|
Forum |
|
|
|
 |
31.08.11, 16:56
|
#1
|
Anfänger
Registriert seit: May 2010
Beiträge: 14
Bedankt: 0
|
[C# XNA] Kollision nur mit bestimmten 2D Objekt
Hallo,
Ich Bin völlig neu in C# habe vorher immer Visual Basic Programmiert,
nun mach ich mit XNA Game Studios ein kleines Spiel ich will das wenn 2 bestimmte 2D Objekte sich berühren der Hintergrund seine Farbe verändert.
Das Problem ist der Hintergrund besteht auch aus einer 2D Texture und wenn ich
bool collision = true;
mache und unten ins Graphics output schreibe
if (collision)
{
spriteBatch.Draw(bg, new Rectangle(0, 0, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight), Color.Green);
}
dann wird wenn ich debugge sofort der Hintergrund Grün, weil der Hintergrund ja auch eine 2D Texture ist.
Wie kann ich es machen das ich mit "if (collision)" nur 2 bestimmte Texturen anspreche ?
|
|
|
31.08.11, 17:11
|
#2
|
Anfänger
Registriert seit: Jun 2010
Beiträge: 45
Bedankt: 12
|
ohne von xna viel ahnung zu haben: versuch doch alle 2d-objekte für die collision funktionieren soll, in einen array o.Ä. zu packen und checke dann bei der abfrage ob die beiden objekte in der liste sind.
|
|
|
31.08.11, 17:14
|
#3
|
Anfänger
Registriert seit: May 2010
Beiträge: 14
Bedankt: 0
|
ok das muss ich ma versuchen hoffe ich bekomm das hin wie gesagt kenn mich eigendlich nicht mit C# aus ist aber zimlich ähnlich wie VB.net
|
|
|
31.08.11, 18:06
|
#4
|
Anfänger
Registriert seit: May 2010
Beiträge: 14
Bedankt: 0
|
Okey ich schaffs nich :O
wie leg ich eine ArrayList an in der 2 2DTexturen sind ?
|
|
|
31.08.11, 19:37
|
#5
|
Erfahrener Newbie
Registriert seit: Apr 2010
Beiträge: 142
Bedankt: 140
|
In Java gibts ArrayList als vordefinierte Datenstruktur in der Api, vllt auch bei C#.
|
|
|
31.08.11, 19:41
|
#6
|
Erfahrenes Mitglied
Registriert seit: Jul 2010
Beiträge: 489
Bedankt: 236
|
Code:
ArrayList MyTextureList= new ArrayList();
Texture2D MyTexture= new Texture2D(graphics.GraphicsDevice,32,32);
MyTextureList.Add(MyTexture);
Ungetestet, sollte so aber eigtl gehen
|
|
|
31.08.11, 20:52
|
#7
|
Anfänger
Registriert seit: Apr 2010
Beiträge: 22
Bedankt: 9
|
Als ergänzung zu Thelvan code:
Code:
ArrayList<Texture2D> MyTextureList= new ArrayList<Texture2D>();
Texture2D MyTexture= new Texture2D(graphics.GraphicsDevice,32,32);
MyTextureList.Add(MyTexture);
Mit den generics sparst du dir die casts beim unboxing.
MFG Melfis
|
|
|
31.08.11, 22:21
|
#8
|
Newbie
Registriert seit: Apr 2009
Beiträge: 78
Bedankt: 21
|
@MetalForLive: ich glaube zu wissen wo dein problem liegt, und zwar, dass du nicht verstehst was du da überhaupt machst! lies dir mal paar tutorials zu xna durch, code beispiele nach, ändere diese! ich persönlich habe schon einiges mit xna erstellt, und finde das wirklich sehr einfach.
du übergibst doch in der draw methode doch u.a. die textur die geändert werden soll!? wo ist das problem? naja viel kann man da nicht mehr sagen, kannst evtl. dein code posten, dann werden wir schlauer!
|
|
|
01.09.11, 13:35
|
#9
|
Anfänger
Registriert seit: May 2010
Beiträge: 14
Bedankt: 0
|
ich poste ma den Code
Achso das mit der ArrayList klappt zwar aber ich weiß nicht wie ich sage das die collision nur innerhalb der Liste passieren soll
Code:
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;
using System.Collections;
namespace WindowsGame2
{
/// <summary>
/// Dies ist der Haupttyp für Ihr Spiel
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Texture2D bg, wk, mk;
bool collision = true;
ArrayList MyTextureList= new ArrayList();
public int player_X = 400;
public int player_Y = 400;
int player_speed = 4;
int player_XM = 800;
int player_YM = 400;
int playerm_speed = 4;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
/// <summary>
/// Ermöglicht dem Spiel die Durchführung einer Initialisierung, die es benötigt, bevor es ausgeführt werden kann.
/// Dort kann es erforderliche Dienste abfragen und nicht mit der Grafik
/// verbundenen Content laden. Bei Aufruf von base.Initialize werden alle Komponenten aufgezählt
/// sowie initialisiert.
/// </summary>
protected override void Initialize()
{
// TODO: Fügen Sie Ihre Initialisierungslogik hier hinzu
graphics.PreferredBackBufferHeight = 720;
graphics.PreferredBackBufferWidth = 1280;
graphics.ApplyChanges();
this.Window.Title = "Fang den Wenzel";
base.Initialize();
}
/// <summary>
/// LoadContent wird einmal pro Spiel aufgerufen und ist der Platz, wo
/// Ihr gesamter Content geladen wird.
/// </summary>
protected override void LoadContent()
{
// Erstellen Sie einen neuen SpriteBatch, der zum Zeichnen von Texturen verwendet werden kann.
spriteBatch = new SpriteBatch(GraphicsDevice);
bg = Content.Load<Texture2D>("bg");
wk = Content.Load<Texture2D>("wk");
mk = Content.Load<Texture2D>("mk");
// TODO: Verwenden Sie this.Content, um Ihren Spiel-Content hier zu laden
}
/// <summary>
/// UnloadContent wird einmal pro Spiel aufgerufen und ist der Ort, wo
/// Ihr gesamter Content entladen wird.
/// </summary>
protected override void UnloadContent()
{
// TODO: Entladen Sie jeglichen Nicht-ContentManager-Content hier
}
/// <summary>
/// Ermöglicht dem Spiel die Ausführung der Logik, wie zum Beispiel Aktualisierung der Welt,
/// Überprüfung auf Kollisionen, Erfassung von Eingaben und Abspielen von Ton.
/// </summary>
/// <param name="gameTime">Bietet einen Schnappschuss der Timing-Werte.</param>
protected override void Update(GameTime gameTime)
{
// Ermöglicht ein Beenden des Spiels
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// Player Tastatur
KeyboardState ks = Keyboard.GetState();
if (ks.IsKeyDown(Keys.W))
{
player_Y-= player_speed;
}
if (ks.IsKeyDown(Keys.S))
{
player_Y+= player_speed;
}
if (ks.IsKeyDown(Keys.D))
{
player_X+= player_speed;
}
if (ks.IsKeyDown(Keys.A))
{
player_X-= player_speed;
}
if (ks.IsKeyDown(Keys.E))
{
player_speed += 1;
}
if (ks.IsKeyDown(Keys.R))
{
player_speed -= 1;
}
//Player2 Tastatur
if (ks.IsKeyDown(Keys.Up))
{
player_YM-= player_speed;
}
if (ks.IsKeyDown(Keys.Down))
{
player_YM+= player_speed;
}
if (ks.IsKeyDown(Keys.Right))
{
player_XM+= player_speed;
}
if (ks.IsKeyDown(Keys.Left))
{
player_XM -= player_speed;
}
if (ks.IsKeyDown(Keys.RightControl))
{
playerm_speed += 1;
}
if (ks.IsKeyDown(Keys.RightAlt))
{
playerm_speed -= 1;
}
// TODO: Fügen Sie Ihre Aktualisierungslogik hier hinzu
base.Update(gameTime);
}
/// <summary>
/// Dies wird aufgerufen, wenn das Spiel selbst zeichnen soll.
/// </summary>
/// <param name="gameTime">Bietet einen Schnappschuss der Timing-Werte.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
spriteBatch.Draw(bg, new Rectangle(0, 0, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight), Color.White);
spriteBatch.Draw(wk, new Rectangle(player_X, player_Y, 40, 60 ), Color.White);
spriteBatch.Draw(mk, new Rectangle(player_XM, player_YM, 40, 60), Color.White);
Texture2D MyTexture = new Texture2D(graphics.GraphicsDevice, 32, 32);
MyTextureList.Add(wk);
MyTextureList.Add(mk);
if (collision)
{
spriteBatch.Draw(bg, new Rectangle(0, 0, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight), Color.Green);
spriteBatch.Draw(wk, new Rectangle(player_X, player_Y, 40, 60), Color.White);
spriteBatch.Draw(mk, new Rectangle(player_XM, player_YM, 40, 60), Color.White);
}
spriteBatch.End();
// TODO: Fügen Sie Ihren Zeichnungscode hier hinzu
base.Draw(gameTime);
}
}
}
Edit:
@testerws
Das Problem ist das nur 2 bestimmte Texturen bei Berührung etwas machen sollen und da der Background auch ne 2dtexture ist denkt der pc das bei berürung des BG auch die interaktion kommen soll.
|
|
|
01.09.11, 17:29
|
#10
|
Erfahrenes Mitglied
Registriert seit: Jul 2010
Beiträge: 489
Bedankt: 236
|
Die ArrayList hat eine Methode Contains. Bei jeder Kollision könntest du damit prüfen, ob das Objekt sich in der Liste befindet
|
|
|
01.09.11, 17:55
|
#11
|
Anfänger
Registriert seit: May 2010
Beiträge: 14
Bedankt: 0
|
Danke Thelvan
DAS KANN MAN AUCH NETTER SAGEN !!!!
Auserdem habe ich erwähnt das ich noch nie etwas mit C# gemacht habe.
|
|
|
01.09.11, 18:50
|
#12
|
Anfänger
Registriert seit: May 2010
Beiträge: 14
Bedankt: 0
|
Tut mir leid das ich noch nie mit VB ein Spiel Programmiert habe, weil das ja auch so gut geht O.o
|
|
|
01.09.11, 19:57
|
#13
|
Anfänger
Registriert seit: May 2010
Beiträge: 14
Bedankt: 0
|
Hallooooo
Ihr seit total "patzig" zu mir
Und wie es aussieht kann man auch mit XNA ein Spiel Programmieren wobei ich nicht sagen würde "Ohne jegliche Grundlagen"
Da VB zimlich ähnlich ist wie C#
Ich will auch garnicht weiter drauf eingehen.
|
|
|
01.09.11, 21:12
|
#14
|
Newbie
Registriert seit: Apr 2009
Beiträge: 78
Bedankt: 21
|
OH MEIN GOTT!! schade dass ich arbeiten war und erst heut abend reinschauen kann, OMG !!!!
MetalForLive, glaube mir (und den anderen) es hat NICHTS, rein garnichts mit vb,c# oder java zu tun, du hast einfach NULL verständnis für die Programmierung! Das ist jetzt nicht böse gemeint, aber lerne erstmal die grundlagen, dann schaue dir den code an, und du wirst mit an sicherheit grenzender wahrscheinlichkeit dich kaputt lachen!
|
|
|
02.09.11, 11:57
|
#15
|
Anfänger
Registriert seit: Jan 2010
Beiträge: 1
Bedankt: 0
|
Zitat:
Zitat von MetalForLive
Das Problem ist das nur 2 bestimmte Texturen bei Berührung etwas machen sollen und da der Background auch ne 2dtexture ist denkt der pc das bei berürung des BG auch die interaktion kommen soll.
|
Du musst dem Programm auch sagen wann überhaupt eine Kollision passiert, das hast du irgendwie vergessen.
Ernsthaft, in dem bisschen Code das du gepostet hast sind so viele Fehler drin dass dir hier niemand wirklich helfen kann ohne komplett bei null anzufangen. Das geht bei der gar nicht erst implementierten Kollisionsabfrage los, geht damit weiter dass sich die Spielerfiguren auf unterschiedlich schnellen Rechnern auch unterschiedlich schnell bewegen werden, die Sprites werden unnötigerweise jede Runde zweimal gezeichnet, und schließlich wird dir nach kurzer Zeit der Speicher überlaufen, weil du in jedem Draw() call zwei Texturen in die ArrayList wirfst. Und das waren jetzt nur die gröbsten Dinger.
Hör auf die Leute hier und lern erstmal die Grundlagen der Programmierung bevor du dich an Echtzeitanwendungen wie Spiele setzt, das wird sonst im Leben nichts.
|
|
|
02.09.11, 15:23
|
#16
|
Anfänger
Registriert seit: May 2010
Beiträge: 14
Bedankt: 0
|
JA mach ich ja jetz
Und auserdem habe ich erfahrung in "Programmierung" nur halt mit Windows FOrms Anwendungen und nicht mit C# XNA das sind 2 verschiedene sprachen und 2 verschiedene ich sag mal "Anwendungen"
auserdem gibt es hier im Forum ja wohl keine Regel die besagt das hier keine Anfänger ne Frage Posten dürfen oder ?
Es gibt genau so keine Regel die Besagt um hier ein Frage zu Posten muss ich super Programmierer sein und allle möglcihen sachen drauf haben.
Danke an alle Helfer ich werde mir jetz n paar Tutorials auf YT ansehen und austesten.
das war jetzt mein letztes Wort.
|
|
|
25.09.11, 15:08
|
#17
|
Anfänger
Registriert seit: Aug 2008
Beiträge: 11
Bedankt: 1
|
1.) Windows Forms ist ein schlechter witz.
2.) Wenn du wirklich programmieren könntest, dann würdest du dir 2 Wochen C# dokus angucken und wärst dann auch in der Lage C# zu programmieren. Nicht so gut wie in VB aber akzeptabel. Wenn man eine Sprache kann, kann man alle. Das einzige was dann noch im weg steht ist die Syntax oder sprachspezifisches Gedöns (Wenn man von C# auf C++ umsteigt sind Pointer z.B. sowas sprachspezifisches)
3.) XNA ist keine Sprache. XNA ist ein Framework welches Betriebssystem abhängig die die Programmierung von grafischen Applikationen ermöglicht. Nicht mehr und nicht weniger.
4.) Um Spiele zu programmieren muss man ein akzeptabler Programmierer sein. Auch nach mehreren Jahren macht mich OpenGL echt fertig, weil man sich einiges abgewöhnen und einiges neues angewöhnen muss. Man stößt auf Probleme die man in der normalen Entwicklung von Desktop Apps nicht hat. Keine Grafikframework nimmt einem Arbeit ab. XNA ist da vielleicht ein wenig netter. Aber im Endeffekt musst du trotzdem alles selber machen und ich bin mir relativ sicher, dass auch XNA dir nicht sagen kann, ob sich 2 Texturen berühren wenn du nicht selber eine Bounding Box angibst und die Boxen beider Objecte auf Kollision abfragt.
|
|
|
Forumregeln
|
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren
HTML-Code ist Aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:07 Uhr.
().
|