Gå til innhold

Anbefalte innlegg

Videoannonse
Annonse

Vel, har oppdatert wavestudio litt, etter litt beta testing av Jørn (takker :)), fant vi ut at det ikke var så veldig intuitivt.

 

Dette er blitt endret, pluss at normalisering er lagt til, og det spiller ikke lenger noen rolle om man skriver store eller små bokstaver i uttrykk.

 

OBS! Man må fortsatt skrive desimaltall med avsluttende "f" og med punktum, ikke komma.

 

0.5f - Riktig!

0.5 - Feil, dette er double

0,5 - Feil

0,5f - Feil

 

Har også skrudd på igjen muligheten til å skrive wav filer

Dette blir 48 KHz 16-bit mono filer, gidder ikke å endre på dette, men legger kanskje til støtte for 24-bit filer etterhvert.

WaveStudio.zip

Endret av GeirGrusom
Lenke til kommentar
  • 1 måned senere...

Hahahaha! :D nydelig kommentar.

 

Nå har jeg en litt oppdatert versjon av framework/spill hvor jeg har lagt til flere modeller (men ikke rettet på stjernene enda :p), samt at tekstur-filnavnet blir lest fra .3ds filen, istedet for at den var hardkodet.

Det er også lagt til en lite vellykket kollidering, og at du kan skyte prosjektiler.

 

Er det noen som har en litt mer velfungerende metode å få til kollidering på?

 

edit:

 

Jeg vil legge til at jeg nå også har fått til OpenAL og skal til å legge til dekoding av Ogg Vorbis for musikk, foreløpig leser den bare ukompimert wav (siden wav er et helvetes drittformat vil ikke alle wav filer du finner på harddisken eller nettet være støttet, rekkefølgen må være RIFF, WAVE "fmt " "data " og wFormatTag må være 1, og støtter 8 eller 16 bit, stereo eller mono)

Men jeg har ikke uploaded dette, siden det er noen bugs og slikt enda.

Kommer etterhvert.

Herregud ! Jeg elsker deg ! Helt sykt ! Åssen klarte du å importere en 3ds fil til spillet ditt ?

Dere folk er jo helt syk i programmering! Jeg har lagt med det eneste "spillet" jeg har klart å skrive. Ironisk nok er det også det første spillet jeg prøvde å skrive.

Har også et program med en cube laget av customvertex med normaler og 3 lys. Cuben spinner sakte langs Y axis... Ikke så spennende akkurat, men veldig realistisk. 6 samples multi sampling.

 

PS: string Dere_folk = Jorn79 + "\r\n" + GeirGrusom :p

 

SPILLET: Dere legger sikkert merke til at når dere skalerer til fullskjerm går ballen tregere og tregere :D Dette gjorde jeg med vilje, for det gav følelsen av at ballen var en diger kampestein eller no sett langt vekke fra.

Ganske artig å skalere vinduet opp/ned hehe. Ballen kan også trykkes på av venstre og høyre museknapp for å skifte farge :p

2D_game_01.zip

Endret av dahwan
Lenke til kommentar

Hehe :)

 

Ikke så ille da, den fungerer jo som den skal (wasd fant jeg ut) selvom det ikke skjer så mye enda...

 

Jeg har funnet ut at high resolution timer er den beste måten å få et spill til å gå "glatt" med.

Hvis man sier at hver vector-unit er i pixels per sekund e.l. ligende kan man multiplisere med Instruksjoner / Instruksjoner_per_sekund (QueryPerformanceFrequency & QueryPerformanceTimer)

 

3ds er btw en temmelig simpelt format hvis du ser på det, samme med lwo, som er nesten identisk, untatt det IDIOTISKE padding byte saken som de driver med.

Hva i helvete er grunnen til at en chunk må være oddetall i størrelse??!! fatter bare ikke hva noen tenker med innimellom.

Lenke til kommentar

hehehe... Jeg har et stort problem med 3D programmering. DirectX eller ikke. Det jeg vet er at jeg trenger en "device" som er selve kjernen i game prorammering. Men problemet er jo at en device tar jo bare en modell eller en tekstur. Det er jo helt idiotisk. Jeg har lett lenge, leeeeenge etter en måte å få mer enn en modell inn i programmet mitt på. Foresten så har jeg heller ikke klart å importere en modell. Det eneste formatet som directX har en egen import "metode" på er .x, og det formatet kan ikke 3Ds max exportere =/

 

Må jeg da lade en egen device for hver ***** modell i hele spillet mitt? Det blir jo tusenvis av devicer, så jeg vet jo at det ikke er løsningen.

 

Hvis du vet om en bra bok eller tutorial (eller din msn adresse) du kunne linket til meg hadde det vert utrolig hjelpende.

 

Takk på forhånd =)

 

Dahwan

Endret av dahwan
Lenke til kommentar

Ah hehe.

 

Det er ikke noe problem.

 

Du lager Direct3D devicen (som du beholder som en forholdsvis tilgjengelig variabel)

 

Deretter kan du bruke import funksjonene til X for å importere en .x fil.

 

For å importere f.eks. en 3ds fil må du først lese dokumentasjonen til .3ds file (som du finner på http://www.wotsit.org) deretter må du fylle in ett eller flere VertexBuffer objekter med dataene du får, og et eller flere IndexBuffer (dette er klasser i Direct3D, du kan sikkert bruke Mesh også)

 

Devicen trenger du kun å lage én gang.

Lenke til kommentar
Hva er indexbuffer til?

Nå kan ikke jeg så mye om dette. Men jeg regner med at index buffer er en som indekserer opp i mot vertex bufferen. Sånn at du ikke trenger å fylle minne opp med vertex info. Siden du da ved hjelp av Index bufferen kan henvise til en vertex info flere ganger når du lager modellen din. Vertex info for noe i 3D består vel av en X, Y og Z verdi av typen float hvis jeg ikke tar feil og det tar vel mer plass i minnet en et integer tall i index bufferen.

Endret av ialu
Lenke til kommentar
  • 2 uker senere...
  • 1 måned senere...

Så var det min tur å publisere mitt "første" program.

 

Det er en screen shot applikasjon, som det finnes ganske mange av ute på nettet. Det denne derimot gjør er å ta bilde av skjermen og lagrer det som en jpg fil på disk som brukeren spesifiserer. Dette gjør det kjappere å få tak i selve bildet som du ønsker. Poenget er også å kunne ta flere screenshots hurtig etter hverandre.

 

Funksjoner:

Kan velge å ta screenshot av hele skjerm, hele skjerm minus taskbar eller kun aktivt vindu. Global hurtigtast er CTRL + F11. Kan sette opp en timer som gjør at programmet tar screenshots basert på intervall og lengde angitt av bruker. Mulighet for å avbryte timeren.

 

Mapper som er åpne i programmet når du lukker lagres til en xml fil. Når starter programmet igjen så lese alle jpg bilder i mappene inn i programmet.

 

Det er også implementert en watermarking av bildene. Sletting av filer i programmet, men får ikke lov å slette mappen den legger bildene i (sikkerhetshensyn så ikke bruker sletter f.eks c:) Sletting av filer på disk oppdateres i programmet live (ufikset bug oppdaget nettopp når du sletter mappen på disk).

 

Vurderer også en egen global hurtigtast for screenshot av aktivt vindu (så man slipper å velge det i programmet). Men ikke funnet ut hvordan man registrerer flere hurtigtaster enda.

 

Tar gjerne i mot kommentarer på alt siden det er mer eller mindre første applikasjonen min i C# :)

PrintScreen.zip

Lenke til kommentar

Fint program, men du har noen litt rare løsninger, spesielt på timer dialogen din.

Bruk float.Parse istedet, og multipliser med 1000 for deretter å konvertere til int.

Da kan brukeren skrive inn et hvilket som helst desimaltall, istedet for bare .25 og .5.

 

Watermark kan du også rendre enklere med en stringformat og en rektangel istedet for å bruke MeasureString.

Lenke til kommentar

hmmm

 

Har laget et IDE for D nå, det støtter debugging, og det har en autocomplete funksjon på imports (altså hvis du skriver import og mellomrom, så kommer den med en liste over hele Phobos biblioteket)

 

OK! installasjonen på dette er ikke like enkel som med de andre programmene jeg har laget, så derfor en kjapp veivisning:

 

- last ned IDE-en fra linken i posten

ShowMeTheCode.zip

- last ned dmd (D Compileren) fra http://ftp.digitalmars.com/dmd.1.026.zip

- last ned dmc (linker og litt utils) fra http://ftp.digitalmars.com/dmc.zip

- last ned D debugger fra http://ddbg.mainia.de/Ddbg-0.11.2-beta.zip

 

 

 

fiks det gjerne slik at mappen til IDE-et inneholder dette:

dm [dir]

dmd [dir]

ShowMeTheCode.exe

ddbg.exe

 

OK

 

Vær oppmerksom på at programmet ikke fungerer skikkelig uten dmd, eller debuggeren.

 

Programmet brukes som en teksteditor, det finnes en del bugs, men ingen kritiske som jeg vet om.

 

debuggeren MÅ ligge i samme mappe som .exe filen til IDE-en.

 

Hello World! i D:

import std.stdio;

int main(char[][] args)
{
 writefln("Hello World!");
}

 

Dokumentasjon til D finner man på Help->Documentation

 

Det som kan være litt plundrete som jeg har sett, er at New lager et nytt prosjekt, Open, Save og Save As lagrer prosjektet.

 

Når du trykker Build, lagrer den også alle filer.

Den lagrer også automatisk et dokument om du lukker det.

 

edit2: siden dette er tips og triks, kan jeg kanskje forklare hvordan jeg fikk til syntax highlighting.

 

Syntax Highlighting

 

Dette er RegEx-en som jeg bruker

(\\/\\/\\/.*)|(\\/\\/.*)|(\'.*\')|(\".*\")|([ \\t{}():;,\\+\\-\\*\\/\\[\\]])

Altså den leter ette \\\ (som er dokumentasjon i D)

// som er kommentarer

deretter ser den etter tekst som starter med ' og slutter med '

og deretter " og "

etter det skiller den ord med mellomrom tab {}():;,+-*/ og []

 

Så er det å bruke RegEx.Split funksjonen på en linje i RichTextEditor

 

Bruk funksjonen LockWindowUpdate sålenge man endrer på teksten i richtextbox (dette gjør at vinduet ikke tegnes på nytt)

Bruk SelectionColor, SelectedText for å dele det opp.

Det som er best når man laster fila, er å laste hele fila inn i tekstboksen, og deretter tar SelectionStart = LinjeStar, SelectionLength = LinjeLengde, og deretter tar det derfra.

 

Klikk for å se/fjerne innholdet nedenfor
/// <summary>
/// Updates syntax highlighting on line[index]
/// </summary>
/// <param name="index">Line index to update</param>
public void UpdateLine(int index)
{

 // If syntax highlighting is disabled, do not perform syntax highlighting
 if (!m_syntax_highlighting)
return;

 // If index is out of bounds, return from function
 if (index < 0 || index >= Lines.Length)
return;

 string line = Lines[index];

 // Remember old selection index
 int sel_start = SelectionStart;

 // Start selection at line start
 SelectionStart = GetFirstCharIndexFromLine(index);

 // Select all text in the line, we will overwrite this line entirely
 SelectionLength = line.Length;

 // Split line into tokens using the regex pattern
 string[] tokens = Regex.Split(line);

 foreach (string token in tokens)
 {
// Ignore empty tokens
if (token != "")
{
  if (token.Length > 1 && (token.StartsWith("\"") && token.EndsWith("\"")) || (token.StartsWith("'") && token.EndsWith("'")))
	// String or character
	SelectionColor = Color.SlateBlue;
  else if (token.StartsWith("///"))
	// Documentation line
	SelectionColor = Color.DarkGray;
  else if (token.StartsWith("//"))
	// Commented line
	SelectionColor = Color.DarkGreen;
  else
  {
	SelectionColor = Color.Black;
	// This may be a keyword
	foreach (string s in keywords1)
	  if (s == token)
	  {
		SelectionColor = Color.Blue;
		break;
	}
  }

  // Insert token at cursor
  SelectedText = token;
  // Reset selection length
  SelectionLength = 0;
}
 }

 // Retrieve old selection
 SelectionStart = sel_start;
}

Endret av GeirGrusom
Lenke til kommentar
  • 2 måneder senere...

Jeg skrev en kontroll for å legge til tabs i et program (som tabbed browsing)

Plasser den på en MDI form så vil den fungere automatisk.

Klikk for å se/fjerne innholdet nedenfor

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace HandyUserControls
{
public partial class WindowTabs : UserControl
{
	private int m_button_width;
	private EventHandler m_mdi_activate;
	private List<IconCacheItem> m_icon_cache;

	[System.ComponentModel.DefaultValue(96)]
	public int TabWidth { get { return m_button_width; } set { m_button_width = value; } }

	public WindowTabs()
	{
		m_mdi_activate = new EventHandler(ParentForm_MdiChildActivate);
		m_button_width = 96;
		m_icon_cache = new List<IconCacheItem>();
		InitializeComponent();
		HScroll = true;
		VScroll = false;
		AutoScroll = false;


	}

	protected Bitmap GetBitmap(Icon icon)
	{
		foreach (IconCacheItem item in m_icon_cache)
			if (item.Icon == icon)
				return item.Bitmap;
		m_icon_cache.Add(new IconCacheItem(icon));
		return m_icon_cache[m_icon_cache.Count - 1].Bitmap;
	}
	protected virtual Control CreateButton(Point pos, Form frm)
	{
		// Form is not one of the tabs, add it
		RadioButton chk = new RadioButton();
		// Set the tag variable to point to form
		chk.Tag = frm;
		chk.CheckedChanged += new EventHandler(FormClick);
		chk.AutoEllipsis = true;
		chk.Text = frm.Text;
		chk.Location = pos;
		chk.Size = new Size(m_button_width, ClientSize.Height - System.Windows.Forms.SystemInformation.HorizontalScrollBarHeight);
		chk.Appearance = Appearance.Button;
		chk.FlatStyle = FlatStyle.Popup;
		chk.Image = GetBitmap(frm.Icon);
		chk.ImageAlign = ContentAlignment.TopLeft;
		chk.TextImageRelation = TextImageRelation.ImageBeforeText;
		chk.TextAlign = ContentAlignment.MiddleLeft;

		return chk;

	}
	public void UpdateTabs()
	{

		List<RadioButton> removes = new List<RadioButton>();

		// Add buttons that should be removed to temporary list
		foreach(RadioButton btn in Controls)
			// Check if form associated with button is in the MDI children list
			if (Array.Find<Form>(ParentForm.MdiChildren, delegate (Form f) { return f == (btn.Tag as Form); }) == null)
				removes.Add(btn);


		// Remove items
		removes.ForEach(delegate(RadioButton rem) { Controls.Remove(rem); });

		// Clear remove list
		removes.Clear();

		int x = 0;
		foreach(Form frm in ParentForm.MdiChildren)
		{
			bool found = false;
			// Search for form in buttons
			foreach(RadioButton btn in Controls)
			{
				if(btn.Tag as Form == frm)
				{
					btn.Location = new Point(x, 0);
					found = true;
					break;
				}
			}
			if(!found)
			{
				Controls.Add(CreateButton(new Point(x, 0), frm));
			}
			x += m_button_width + 4;
		}

		foreach (RadioButton btn in Controls)
			if ((btn.Tag as Form) == ParentForm.ActiveMdiChild)
				btn.Checked = true;


	}

	protected void FormClick(object sender, EventArgs e)
	{
		RadioButton btn = sender as RadioButton;
		if (btn.Checked && (ParentForm.ActiveMdiChild != btn.Tag as Form))
			(btn.Tag as Form).Activate();
	}


	protected override void OnParentChanged(EventArgs e)
	{
		base.OnParentChanged(e);
		if (ParentForm != null)
			ParentForm.MdiChildActivate += m_mdi_activate;
	}

	void ParentForm_MdiChildActivate(object sender, EventArgs e)
	{
		UpdateTabs();	
	}
}

public struct IconCacheItem
{
	private Icon m_icon;
	private Bitmap m_bitmap;

	public Icon Icon { get { return m_icon; } }
	public Bitmap Bitmap { get { return m_bitmap; } }

	public IconCacheItem(Icon icon)
	{
		m_icon = icon;
		m_bitmap = icon.ToBitmap();
	}
}
}

 

Og den ser slik ut i programmet den brukes i:

post-31659-1207032234_thumb.png

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...