forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   Вопросы по XNA. (http://forum.boolean.name/showthread.php?t=16854)

Nikich 31.05.2012 15:45

Вопросы по XNA.
 
Вопросов скапливается немерено, поэтому решил отписываться здесь. Просьба не кидаться помидорами, ведь я только учусь.
Как изменить x и y в Vector2?
То есть у меня есть:
Код:

Vector2 player_position=new Vector2(100,100)
И как мне изменить координаты этого вектора?
Кстати, почему это называется вектором? Ведь тут нету направления, а значит это скаляр.
UPD: Всё, разобрался.
Код:

            if (Keyboard.GetState().IsKeyDown(Keys.W))
                player_position.Y -=  5;

            if (Keyboard.GetState().IsKeyDown(Keys.S))
                player_position.Y += 5;
           
            if (Keyboard.GetState().IsKeyDown(Keys.A))
                player_position.X -= 5;

            if (Keyboard.GetState().IsKeyDown(Keys.D))
                player_position.X += 5;

Быдло код?



И ещё. Как следует работать со временем? Есть ли аналог MilliSecs()?

pax 31.05.2012 16:34

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от Nikich (Сообщение 229130)
Код:

            if (Keyboard.GetState().IsKeyDown(Keys.W))
                player_position.Y -=  5;

            if (Keyboard.GetState().IsKeyDown(Keys.S))
                player_position.Y += 5;
           
            if (Keyboard.GetState().IsKeyDown(Keys.A))
                player_position.X -= 5;

            if (Keyboard.GetState().IsKeyDown(Keys.D))
                player_position.X += 5;

Быдло код?

Думаю надо примерно так:
PHP код:

var kbState Keyboard.GetState();    
if (
kbState.IsKeyDown(Keys.W))
      
player_position.-=  5;

if (
kbState.IsKeyDown(Keys.S))
      
player_position.+= 5;
            
if (
kbState.IsKeyDown(Keys.A))
      
player_position.-= 5;

if (
kbState.IsKeyDown(Keys.D))
     
player_position.+= 5


Цитата:

Сообщение от Nikich (Сообщение 229130)
И ещё. Как следует работать со временем? Есть ли аналог MilliSecs()?

Там же есть TimeSpan

Nikich 31.05.2012 16:39

Ответ: Вопросы по XNA.
 
Спасибо. Только что значит var? В паскале так начинался блок с переменными, но вряд ли это как-то связано с паскалем.

pax 31.05.2012 16:40

Ответ: Вопросы по XNA.
 
Что такое var

moka 31.05.2012 19:13

Ответ: Вопросы по XNA.
 
Вектор обычно выражается в двух числах, и чаще всего подразумевает что первая точка находиться в 0,0.
Есть нормализованный вектор, когда длина между 0,0 и указанными x,y равна 1.0, в данном случае это не нормализованный вектор, и по сути из этих двух чисел ты можешь получить длину вектора и его направление.

Используй официальную документацию, она может быть очень полезной и само-достаточной.
http://msdn.microsoft.com/en-us/libr...2_members.aspx

Чтобы получить X или Y, просто пиши:
Код:

player_position.X;
Да и я любитель придраться, но так по мне читабельнее так:
Код:

Vector2 playerPosition = new Vector2(100, 100)

radiobutton 31.05.2012 23:03

Ответ: Вопросы по XNA.
 
А какой из этих вариантов читабельнее?
Код:

PlayerPosition(playerPosition, playerPosition + enemyPosition, playerPosition * enemyPosition - lolPosition)
Код:

PlayerPosition(player_position, player_position + enemy_position, player_position * enemy_position - lol_position)

Nikich 31.05.2012 23:06

Ответ: Вопросы по XNA.
 
Спасибо. А нет ли у кого примеров по XNA? Просто я не знаю, на что он вообще способен:) В принципе и функционал в БлитцМаксе нормальный был, но мне не кажется что это действительно максимум в 2D. Кстати, может ли кто-нибудь назвать то, чего нельзя сделать на чистом(!) Максе, но можно на XNA?

pax 01.06.2012 00:05

Ответ: Вопросы по XNA.
 
XNA это графическое АПИ (альтернатива DirectX). Можно все, на что способна видеокарта - шейдеры и т.п. И это не только 2d.

Dream 01.06.2012 13:15

Ответ: Вопросы по XNA.
 
в инете куча туториалов с XNA. а на ютубе много роликов в которых показывают его возможности

Nikich 01.06.2012 13:29

Ответ: Вопросы по XNA.
 
http://create.msdn.com/en-US/educati...etting_started
Пока что лучшее из того, что видел. Всё очень понятно, а главное показывают не только функционал XNA, а также и с самим шарпом знакомят.

Nikich 01.06.2012 21:09

Ответ: Вопросы по XNA.
 
Гм.
Решил провести тест на производительность. Выяснилось, что Макс быстрее XNA. Это я быдло-кодер на C#(хотя конечно я быдло-кодер, но до такой ли степени?), или это действительно так?

moka 01.06.2012 21:10

Ответ: Вопросы по XNA.
 
Тест в студию.
Сравнивать столь разные инструменты использующие разные GAPI немного не разумно, ну да ладно..

Nikich 01.06.2012 21:15

Ответ: Вопросы по XNA.
 
XNA
BlitzMax
Сейчас проверю на большем количестве картинок.
Могу кинуть код, если нужно.
З.Ы. В XNA пока не знаю аналога DesktopWidth\DesktopHeight, поэтому разрешение 1280 на 1024.

moka 01.06.2012 21:26

Ответ: Вопросы по XNA.
 
Не корректно выразился, я имел ввиду не сам ехе теста, а его описание (что тестируешь) и исходники.
Не тестируй тупо вывод картинок - это ничего не показывает.
Также реально готовый проект на обоих будет конкретно отличаться по многим аспектам.
Короче говоря, ты сравниваешь BMW с AUDI, разные вещи хоть и имеют по 4 колеса.

Nikich 01.06.2012 21:37

Ответ: Вопросы по XNA.
 
Чем больше картинок, тем хуже.
Кидаю код.
Max:

Код:

Global R1=DesktopWidth()
Global R2=DesktopHeight()
Graphics R1,R2,32
Global lfps,tfps,fps
Global pic=LoadImage("01.jpg")
Global pic_x,pic_y

Function Update_pic()
If KeyDown(KEY_W) pic_y=pic_y-1
If KeyDown(KEY_S) pic_y=pic_y+1
If KeyDown(KEY_D) pic_x=pic_x+1
If KeyDown(KEY_A) pic_x=pic_x-1
DrawText pic_x+"    "+pic_y,0,24
For i=0 To 10
For i1=0 To 10
DrawImage pic,pic_x+256*i,pic_y+256*i1
Next
Next
End Function

Function Update_fps()
lfps=lfps+1
If MilliSecs()-tfps>1000
 tfps=MilliSecs()
 fps=lfps
 lfps=0
EndIf
DrawText fps,0,0
End Function

While Not KeyHit(KEY_ESCAPE)
Cls
Update_pic()
Update_fps()
Flip(0)
Wend


XNA:

PHP код:

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 
WindowsGame1
{
    
/// <summary>
    /// This is the main type for your game
    /// </summary>
    
public class Game1 Microsoft.Xna.Framework.Game
    
{
        
GraphicsDeviceManager graphics;
        
        
SpriteBatch spriteBatch;

        public 
Game1()
        {
            
graphics = new GraphicsDeviceManager(this);
            

            
graphics.IsFullScreen true;
            
IsFixedTimeStep false;
            
graphics.SynchronizeWithVerticalRetrace false;
            
graphics.PreferredBackBufferHeight 1280;
            
graphics.PreferredBackBufferWidth 1024;
            
Content.RootDirectory "Content";
        }

        
/// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        /// 
        
Texture2D backgroundTexture;
        
SpriteBatch sprites;
        
Vector2 player_position = new Vector2(100100);
        
SpriteFont Font1;
        
        

        
double elapsedTime;
        
int fps;
        
int l_fps;

        protected 
override void Initialize()
        {

            
            
sprites = new SpriteBatch(graphics.GraphicsDevice);
            

            
// TODO: Add your initialization logic here
            

            
base.Initialize();
        }

        
/// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        
protected override void LoadContent()
        {
            
// Create a new SpriteBatch, which can be used to draw textures.
            
spriteBatch = new SpriteBatch(GraphicsDevice);
            
            
// TODO: use this.Content to load your game content here
            
Font1 Content.Load<SpriteFont>("arial");
            
backgroundTexture Content.Load<Texture2D>("Gert");
        }

        
/// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        
protected override void UnloadContent()
        {
            
// TODO: Unload any non ContentManager content here
        
}

        
/// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        
protected override void Update(GameTime gameTime)
        {
            
// Allows the game to exit
            
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                
this.Exit();

            if (
Keyboard.GetState().IsKeyDown(Keys.Escape))
                
this.Exit();

            if (
Keyboard.GetState().IsKeyDown(Keys.W))
                
player_position.-=  1;

            if (
Keyboard.GetState().IsKeyDown(Keys.S))
                
player_position.+= 1;
            
            if (
Keyboard.GetState().IsKeyDown(Keys.A))
                
player_position.-= 1;

            if (
Keyboard.GetState().IsKeyDown(Keys.D))
                
player_position.+= 1;
      
            
elapsedTime+=gameTime.ElapsedGameTime.TotalMilliseconds;
            
l_fps++;

            if (
elapsedTime >= 1000)
            {
                
fps l_fps;
                
l_fps 0;
                
elapsedTime 0;
            }

                
// TODO: Add your update logic here

            
base.Update(gameTime);
        }

        
/// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        
protected override void Draw(GameTime gameTime)
        {
            
GraphicsDevice.Clear(Color.Black);
            
            
sprites.Begin();
            
            for (
int i=0i<11 i++)
            {
                for (
int i1 0i1 11i1++)
                {
                    
sprites.Draw(backgroundTexture, new Vector2(player_position.256player_position.i1 256), Color.White);
                }
            }
            
sprites.DrawString(Font1Convert.ToString(player_position.X) + " " Convert.ToString(player_position.Y), Vector2.ZeroColor.White);
            
sprites.DrawString(Font1Convert.ToString(fps), new Vector2(024), Color.White);
            
sprites.End();
                
            
// TODO: Add your drawing code here

            
base.Draw(gameTime);
        }
    }



Результаты этого теста:
Max - 2160
XNA - 1816
Не знаю почему, но меня это вообще в шок повергло. А с чем именно это связано? XNA использует DirectX, Max вроде бы тоже.


Часовой пояс GMT +4, время: 18:07.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot