myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

[C# XNA] Kollision nur mit bestimmten 2D Objekt

Willkommen

myGully

Links

Forum

 
Antwort
Themen-Optionen Ansicht
Ungelesen 31.08.11, 16:56   #1
MetalForLive
Anfänger
 
Registriert seit: May 2010
Beiträge: 14
Bedankt: 0
MetalForLive ist noch neu hier! | 0 Respekt Punkte
Standard [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 ?
MetalForLive ist offline   Mit Zitat antworten
Ungelesen 31.08.11, 17:11   #2
Ccursed
Anfänger
 
Registriert seit: Jun 2010
Beiträge: 45
Bedankt: 12
Ccursed ist noch neu hier! | 0 Respekt Punkte
Standard

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.
Ccursed ist offline   Mit Zitat antworten
Ungelesen 31.08.11, 17:14   #3
MetalForLive
Anfänger
 
Registriert seit: May 2010
Beiträge: 14
Bedankt: 0
MetalForLive ist noch neu hier! | 0 Respekt Punkte
Standard

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
MetalForLive ist offline   Mit Zitat antworten
Ungelesen 31.08.11, 18:06   #4
MetalForLive
Anfänger
 
Registriert seit: May 2010
Beiträge: 14
Bedankt: 0
MetalForLive ist noch neu hier! | 0 Respekt Punkte
Standard

Okey ich schaffs nich :O
wie leg ich eine ArrayList an in der 2 2DTexturen sind ?
MetalForLive ist offline   Mit Zitat antworten
Ungelesen 31.08.11, 19:37   #5
7331
Erfahrener Newbie
 
Registriert seit: Apr 2010
Beiträge: 142
Bedankt: 140
7331 ist noch neu hier! | 0 Respekt Punkte
Standard

In Java gibts ArrayList als vordefinierte Datenstruktur in der Api, vllt auch bei C#.
7331 ist offline   Mit Zitat antworten
Ungelesen 31.08.11, 19:41   #6
Thelvan
Erfahrenes Mitglied
 
Registriert seit: Jul 2010
Beiträge: 489
Bedankt: 236
Thelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt Punkte
Standard

Code:
ArrayList MyTextureList= new ArrayList();
Texture2D MyTexture= new Texture2D(graphics.GraphicsDevice,32,32);
MyTextureList.Add(MyTexture);
Ungetestet, sollte so aber eigtl gehen
Thelvan ist offline   Mit Zitat antworten
Ungelesen 31.08.11, 20:52   #7
Melfis
Anfänger
 
Registriert seit: Apr 2010
Beiträge: 22
Bedankt: 9
Melfis ist noch neu hier! | 0 Respekt Punkte
Standard

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
Melfis ist offline   Mit Zitat antworten
Ungelesen 31.08.11, 22:21   #8
testerws
Newbie
 
Registriert seit: Apr 2009
Beiträge: 78
Bedankt: 21
testerws ist noch neu hier! | 0 Respekt Punkte
Standard

@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!
testerws ist gerade online   Mit Zitat antworten
Ungelesen 01.09.11, 13:35   #9
MetalForLive
Anfänger
 
Registriert seit: May 2010
Beiträge: 14
Bedankt: 0
MetalForLive ist noch neu hier! | 0 Respekt Punkte
Standard

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.
MetalForLive ist offline   Mit Zitat antworten
Ungelesen 01.09.11, 17:29   #10
Thelvan
Erfahrenes Mitglied
 
Registriert seit: Jul 2010
Beiträge: 489
Bedankt: 236
Thelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt PunkteThelvan erschlägt nachts Börsenmakler | 5269 Respekt Punkte
Standard

Die ArrayList hat eine Methode Contains. Bei jeder Kollision könntest du damit prüfen, ob das Objekt sich in der Liste befindet
Thelvan ist offline   Mit Zitat antworten
Ungelesen 01.09.11, 17:55   #11
MetalForLive
Anfänger
 
Registriert seit: May 2010
Beiträge: 14
Bedankt: 0
MetalForLive ist noch neu hier! | 0 Respekt Punkte
Standard

Danke Thelvan

DAS KANN MAN AUCH NETTER SAGEN !!!!

Auserdem habe ich erwähnt das ich noch nie etwas mit C# gemacht habe.
MetalForLive ist offline   Mit Zitat antworten
Ungelesen 01.09.11, 18:50   #12
MetalForLive
Anfänger
 
Registriert seit: May 2010
Beiträge: 14
Bedankt: 0
MetalForLive ist noch neu hier! | 0 Respekt Punkte
Standard

Tut mir leid das ich noch nie mit VB ein Spiel Programmiert habe, weil das ja auch so gut geht O.o
MetalForLive ist offline   Mit Zitat antworten
Ungelesen 01.09.11, 19:57   #13
MetalForLive
Anfänger
 
Registriert seit: May 2010
Beiträge: 14
Bedankt: 0
MetalForLive ist noch neu hier! | 0 Respekt Punkte
Standard

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.
MetalForLive ist offline   Mit Zitat antworten
Ungelesen 01.09.11, 21:12   #14
testerws
Newbie
 
Registriert seit: Apr 2009
Beiträge: 78
Bedankt: 21
testerws ist noch neu hier! | 0 Respekt Punkte
Standard

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!
testerws ist gerade online   Mit Zitat antworten
Ungelesen 02.09.11, 11:57   #15
PixelPunk
Anfänger
 
Registriert seit: Jan 2010
Beiträge: 1
Bedankt: 0
PixelPunk ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
Zitat von MetalForLive Beitrag anzeigen
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.
PixelPunk ist offline   Mit Zitat antworten
Ungelesen 02.09.11, 15:23   #16
MetalForLive
Anfänger
 
Registriert seit: May 2010
Beiträge: 14
Bedankt: 0
MetalForLive ist noch neu hier! | 0 Respekt Punkte
Standard

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.
MetalForLive ist offline   Mit Zitat antworten
Ungelesen 25.09.11, 15:08   #17
Pennywise1911
Anfänger
 
Registriert seit: Aug 2008
Beiträge: 11
Bedankt: 1
Pennywise1911 ist noch neu hier! | 0 Respekt Punkte
Standard

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.
Pennywise1911 ist offline   Mit Zitat antworten
Antwort


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

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:07 Uhr.


Sitemap

().