Kezdőoldal » Számítástechnika » Programozás » C# xna-ban készítek egy...

C# xna-ban készítek egy sokoban játékot. A pályát egy 2 dimenziós tömb segítségével építettem fel de a tömbben nem tudom hogyan kéne mozgassam a játékost, ötletek?

Figyelt kérdés
A kirajzolás megvan látom is a pályát a játékost stb. Viszont a mozgatás menetére nem tudok rájönni ebben szeretnék egy kis segítségét kérni ötletek formájában. tehát a kérdésem az lenne hogyan tudnám mozgatni a játékost ebben a tömbben?

2016. márc. 11. 13:06
1 2
 1/11 A kérdező kommentje:

int[,] mezo = new int[,]{


{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,1,0,3,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,1,0,0,2,1,0,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,1,1,1,0,1,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,1,1,0,3,0,0,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,1,0,3,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

2016. márc. 11. 13:07
 2/11 Tengor ***** válasza:

Várj egy gombnyomásra. Nézd meg, hogy az annak megfelelő pozíció szabad-e v. törölhető-e. Ha igen, akkor tedd át oda a figurád.

Ha nem szabad, akkor láda van-e ott. Ha igen, akkor nézd meg, hogy az irányban a következő mező szabad-e. Ha igen, akkor a láda menjen az üresre, figura a láda helyére.

A többi esetben ne csinálj semmit.


Miután mozdult az embered hajtsd végre a leeső dolgokat mozgató algoritmust.

2016. márc. 11. 13:15
Hasznos számodra ez a válasz?
 3/11 A kérdező kommentje:

Köszönöm a gyors választ. Az igásság az hogy fejben énis valahogy így képzelem viszont sajnos a megvalósítani nem tudom hogy kéne.itt vannak a próbálkozásaim :


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 Sokoban_starwars

{


public class Game1 : Microsoft.Xna.Framework.Game

{

GraphicsDeviceManager graphics;

SpriteBatch spriteBatch;



Texture2D palya;

Rectangle palya1;


Texture2D jatekos;

Rectangle jatekos1;


Texture2D hatter;


Texture2D lezerkard;

Rectangle lezerkard1;


Vector2 pozicio = new Vector2(230, 190);



const int meret = 10;


int[,] mezo = new int[,]{



{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,1,0,3,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,1,0,0,2,1,0,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,1,1,1,0,1,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,1,1,0,3,0,0,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,1,0,3,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},



};


public Game1()

{

graphics = new GraphicsDeviceManager(this);

Content.RootDirectory = "Content";

}



protected override void Initialize()

{


graphics.IsFullScreen = true;

graphics.ApplyChanges();

base.Initialize();

}



protected override void LoadContent()

{


spriteBatch = new SpriteBatch(GraphicsDevice);

palya = Content.Load<Texture2D>("palya1");

palya1 = new Rectangle(500, 500, 20, 20);

hatter = Content.Load<Texture2D>("hatter1");

jatekos = Content.Load<Texture2D>("jatekos");

jatekos1 = new Rectangle(74, 74, 74, 74);

lezerkard = Content.Load<Texture2D>("lezarkard");

lezerkard1 = new Rectangle(500, 500, 20, 20);


}



protected override void UnloadContent()

{


}



protected override void Update(GameTime gameTime)

{


if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)

this.Exit();

KeyboardState keybState = Keyboard.GetState();

if (keybState.IsKeyDown(Keys.Escape))

this.Exit();



/*

if (keybState.IsKeyDown(Keys.Left) && jatekos1.X >= 0)

jatekos1.X -= 74;

if (keybState.IsKeyDown(Keys.Right))

jatekos1.X += 74;

if (keybState.IsKeyDown(Keys.Up))

jatekos1.Y -= 74;

if (keybState.IsKeyDown(Keys.Down))

jatekos1.Y += 74;

*/


jatekos1 = new Rectangle((int)pozicio.X,(int)pozicio.Y, 74, 74);



if (Keyboard.GetState().IsKeyDown(Keys.D))



base.Update(gameTime);

}



protected override void Draw(GameTime gameTime)

{

GraphicsDevice.Clear(Color.CornflowerBlue);


spriteBatch.Begin();


spriteBatch.Draw(hatter, new Rectangle(0, 0, Window.ClientBounds.Width, Window.ClientBounds.Height), null, Color.White); // Pálya



for (int i = 0; i < 13; i++)

{

for (int j = 0; j <24; j++)

{

if (mezo[i, j] == 1)

{

palya1 = new Rectangle(j * 74, i * 74, 74, 74);

spriteBatch.Draw(palya, palya1, Color.White);


}

}


}

/*

for (int i = 0; i < 13; i++)

{

for (int j = 0; j < 24; j++)

{

if (mezo[i, j] == 2)

{

jatekos1 = new Rectangle(j * 74, i * 74, 74, 74);

spriteBatch.Draw(jatekos, jatekos1, Color.White);


KeyboardState keybState = Keyboard.GetState();

if (keybState.IsKeyDown(Keys.Left) && jatekos1.X =mezo[i,j] ==0)

jatekos1.X -= 10;

else if (keybState.IsKeyDown(Keys.Right))

jatekos1.X += 10;

else if (keybState.IsKeyDown(Keys.Up))

jatekos1.Y -= 10;

else if (keybState.IsKeyDown(Keys.Down))

jatekos1.Y += 10;


}

}


}


*/

for (int i = 0; i < 13; i++)

{

for (int j = 0; j < 24; j++)

{

if (mezo[i, j] == 3)

{

lezerkard1 = new Rectangle(j * 74, i * 74, 74, 74);

spriteBatch.Draw(lezerkard, lezerkard1, Color.White);


}

}


}

spriteBatch.Draw(jatekos, jatekos1, Color.White);



spriteBatch.End();


base.Draw(gameTime);

}

}

}

2016. márc. 11. 14:21
 4/11 anonim ***** válasza:

Nagyon nehézkes ez a kód, nem objektum orientált és tele van magic numberekkel.

Nem csoda, hogy nem átlátható.

2016. márc. 11. 20:13
Hasznos számodra ez a válasz?
 5/11 A kérdező kommentje:
A magyarázat sajnos lemaradt. Tehát az elején létrehoztam a pályát ebben a 2 dimenziós tömbben. létrehoztam 3 képet az egyik a pálya körvonalának szolgáló kép. a tömbben ezek az 1 essel jelölt elemek, ahol 1es van ott kirajzolódik a palya elnevezésű kép. Sok felesleges sor van a kódban tudom mert elkezdtem próbálgatni a játékos mozgatását ami sikerült is de teljesen független a tömbtől sajnos. Tehát a fő kérdésem az lenne hogy hogyan tudnám mozgatni a játékos elnevezésű képet a tömbön belül? ugy képzeltem el ha a játékos a tömbön belül olyan koordinátára megy amelynek az értéke 0 oda tud lépni. ahol az érték 1 oda nyilván nem tud lépni mert ott a fal. Ahol 3as érték van az egy lézerkard amit kéne eltolni és akkor lenne egy másik feltétel ha a játékostól pl balra 3as tehát lézerkard van akkor a lézerkardtól 1gyel balra mi található. 1es tehát fal vagy 0 tehát tolható vagy 3as még egy lézerkard és nem tolható stb stb stb. Sajnos ez igy fejben jol hangzik a kivitelezésében szeretnék segítséget kérni. Természetesen más esetleg egyszerűbb megoldás is érdekelne. A mozgatás után már a dizájn stb vel elbíbelődöm.
2016. márc. 11. 21:40
 6/11 anonim ***** válasza:
Mi a kérdés még?
2016. márc. 14. 17:23
Hasznos számodra ez a válasz?
 7/11 A kérdező kommentje:
A kérdésem továbbra is az hogy hogyan tudnám az elképzeléseimet programkóddal kifejezni. Tehát nem tudom a játékos irányítását leprogramozni úgy hogy a falaknál megálljon illetve a tolni tudjon egy másik képet. Valószínűleg a profik már találtak volna valami alternatív megoldást a google segítségével de sajnos nekem valamiért most a google nem a barátom.
2016. márc. 16. 13:59
 8/11 anonim ***** válasza:

Nem guglizni kellene, hanem gondolkozni.

Most azt nem tudod ellenőrizni, hogy falnál van-e? Vagy, hogy amerre tolni akar mi van abba az irányba?

Miért nem?

2016. márc. 16. 16:12
Hasznos számodra ez a válasz?
 9/11 A kérdező kommentje:
Igen sajnos nem tudom hogy hogyan ellenőrizzem ahogy a játékos a tömbben eltárolt 1es értéknél megálljon. Nyilván a mozgatásnál kellene egy if feltétel. A tanárom javaslatára csinálom a pályát tömbben. Viszont nem tudom hogyan hivatkozzak a tömbben lévo elemekre.Tehát ahol 1 es van ott fal van. A játékos mozgatását megtudom oldani de nem tudom hogy hogyan kössem össze a tömbben eltárolt elemekkel. Sokat gondolkodtam és angolul is rákerestem. Lehet én vagyok nagyon rá stresszelve.. de nem jutok el odáig hogy ez működjön.
2016. márc. 17. 08:35
 10/11 A kérdező kommentje:

public class Game1 : Microsoft.Xna.Framework.Game

{

GraphicsDeviceManager graphics;

SpriteBatch spriteBatch;


Texture2D palya;

Rectangle palya1;


Texture2D jatekos;

Rectangle jatekos1;


Texture2D hatter;


Texture2D lezerkard;

Rectangle lezerkard1;



const int meret = 10;


int[,] mezo = new int[,]{



{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,1,0,3,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,1,0,0,2,1,0,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,1,1,1,0,1,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,1,1,0,3,0,0,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,1,0,3,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},



};


Tehát ezen tömbön belül szeretném a "jatekost" mozgatni de hogyan?

2016. márc. 17. 08:37
1 2

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!