Diskuze: Generace bludiště v políčkové grafice
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tak opět sám.
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using System;
public class MazeGenerator
{
private Random r = new Random();
public List<Vector2> GenerateMaze(Rectangle bounds)
{
List<Vector2> paths = new List<Vector2>() { new Vector2(0, 0) };
Dictionary<Vector2, int> potential = new Dictionary<Vector2,int>();
Vector2[] neighbors = new Vector2[] { new Vector2(1, 0), new Vector2(-1, 0), new Vector2(0, 1), new Vector2(0, -1) };
for (int index = 0; index < 4; index++)
potential.Add(neighbors[index], index);
while (paths.Count < 1000)
{
Vector2
oldItem = new Vector2(),
newItem = new Vector2();
int
index = r.Next(potential.Count),
direction = 0;
foreach (Vector2 item in potential.Keys)
if (index == 1)
{
oldItem = item;
direction = potential[item];
newItem = oldItem + neighbors[direction];
break;
}
else
index--;
if (!paths.Contains(newItem))
{
paths.Add(oldItem);
paths.Add(newItem);
for (int index2 = 0; index2 < 4; index2++)
if (!paths.Contains(newItem + neighbors[index2]) && !potential.ContainsKey(newItem + neighbors[index2]))
potential.Add(newItem + neighbors[index2], index2);
}
potential.Remove(oldItem);
}
return paths;
}
}
Já sám jsem to nechápal - proto jsem se obrátil sem...
Nyní mi to je již jasné - bral jsem to tak, že si z každého volného konce vyberu náhodného souseda (nikam nezasahujícího) a toho přidám do proměnné s cestami v bludišti. Ale je to tak že každý volný konec má jen jeden směr - vstoupí-li mu někdo jiný do cesty, tak se jednoduše vymaže. Tím tedy každý konec má svůj pevně daný směr - a v něm stačí kontrolovat každé příští políčko...
Jediné co mi vrtá hlavou - jak mám zařídit, aby se mi vyplnila určitá plocha?
A tohle ti nestačí? http://www.itnetwork.cz/…eho-bludiste
Vždyť to již mám - a způsobů je snad nekonečně mnoho... (A ten můj je pro mě lepší -
potřebuji alespoň jednu 100% průchozí cestu...) A snad jsem i vymyslel, jek
jím vyplnit předem zadanou plochu...
Tuhle věc jsem řešil i tak, že jsem naházel na plochu několik obdélníkových místností a ty poté propojil náhodně generovanou chodbou. Bylo to jako had, který se náhodně pohybuje (ale nemůže dozadu) a kolem něj se staví zdi. Dělalo to docela hezké dungeony, bohužel jsem to nikdy nedodělal.
Cyklus se mi nechce ukončit - přitom podmínky jsou myslím správně:
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using System;
public class MazeGenerator
{
private Random r = new Random();
public List<Vector2> GenerateMaze(Rectangle bounds)
{
List<Vector2> paths = new List<Vector2>() { new Vector2(0, 0) };
Dictionary<Vector2, int> potential = new Dictionary<Vector2, int>() { { new Vector2(1, 0), 0 }, { new Vector2(0, 1), 2 } };
Vector2[] neighbors = new Vector2[] { new Vector2(1, 0), new Vector2(-1, 0), new Vector2(0, 1), new Vector2(0, -1) };
while (potential.Count > 0)
{
Vector2
oldItem = new Vector2(),
newItem = new Vector2();
int
index = r.Next(potential.Count),
direction = 0;
foreach (Vector2 item in potential.Keys)
if (index == 1)
{
oldItem = item;
direction = potential[item];
newItem = oldItem + neighbors[direction];
break;
}
else
index--;
if (!paths.Contains(newItem))
{
paths.Add(oldItem);
paths.Add(newItem);
for (int index2 = 0; index2 < 4; index2++)
{
Vector2 total = newItem + neighbors[index2];
if (!paths.Contains(total) && !potential.ContainsKey(total) && total.X > 0 && total.Y > 0 && total.X < (bounds.Width / 32) && total.Y < (bounds.Height / 32))
potential.Add(total, index2);
}
}
potential.Remove(oldItem);
}
return paths;
}
}
V čem vidíš problém? Děkuji.
A jak bych to měl naklonit podle X - asi to mám správně:
using System;
using Microsoft.Xna.Framework;
public class Camera2D
{
public float Zoom { get; set; }
public float Rotation { get; set; }
public Vector2 Position { get; set; }
public Camera2D()
{
Zoom = 2;
Rotation = 0.001F;
Position = new Vector2(-400, 240);
}
public void Move(Vector2 amount)
{
Position += amount;
}
public Matrix GetTransformation(Microsoft.Xna.Framework.Graphics.GraphicsDevice graphicsDevice)
{
return Matrix.CreateTranslation(
new Vector3(Position.X, -Position.Y, 0))
*
Matrix.CreateRotationX(Rotation)
*
Matrix.CreateScale(new Vector3(Zoom, Zoom, 1))
*
Matrix.CreateTranslation(new Vector3(graphicsDevice.Viewport.Width * 0.5f, graphicsDevice.Viewport.Height * 0.5f, 0));
}
}
Ale problém vidím ve vykreslení 3D objektu - místo 2D. Tak jako tak bych ty zdi 3D mít chtěl - zatím bez textury. Ovšem Texture3D se vykreslit nedá - co jsem nejčastěji viděl - dělá se to přes postupné vykreslování Meshů. Ovšem dává mi to dost zabrat - dát do dokupy - jak píši - zatím by to bylo jen v nějaké modré barvě. Děkuji za případnou pomoc.
Zobrazeno 10 zpráv z 10.