Is there anyone here who is pretty good with C# and network programming? I need help with my current project and I don't want to clutter up the thread or not get answered. It'd be far easier if I could talk one on one with a person who could help. Hit me up a PM if you can.
[QUOTE=Gnomical;40447356]Is there anyone here who is pretty good with C# and network programming? I need help with my current project and I don't want to clutter up the thread or not get answered. It'd be far easier if I could talk one on one with a person who could help. Hit me up a PM if you can.[/QUOTE]
Take a look at [url=https://code.google.com/p/lidgren-network-gen3/]lidgren[/url]
error X4506: ps_4_0_level_9_3 input limit (8) exceeded, shader uses 10 inputs.
I have run out of shader inputs on my DirectX 11 project!
I want to do multiple lights, normal mapping and things like that. Unfortunately, I cannot compress all the required information down into less than 8 inputs, so I need an alternative.
Is there a way of splitting this up into multiple shaders and running one after the other to get the same end result?
[QUOTE=Goz3rr;40448932]Take a look at [url=https://code.google.com/p/lidgren-network-gen3/]lidgren[/url][/QUOTE]
I'm using basic socket connections, as my server is being connected to via telnet. Using Lidgren would require me to make a client, and that is not part of my project. The "client" is any telnet capable device.
[editline]27th April 2013[/editline]
I figured out my major problem. Turns out having two users logged in at the same time under the same account confuses the fuck out of the server. Now it will check if that user is logged in and deny access to the person trying to log in under that user if that user is already connected. Time to fix the many crashes, and the weird backspace bug.
Any of you know about that last one? When you type in something, then backspace all the way back to type in something else, it will not remove the characters from before. In the case of my stuff it messes with it so that it doesn't recognize the command entered any further. Is there maybe a way I could see if backspace is being used and then completely delete the input so far? or is that not possible using telnet. It's not a major concern right now, but it's just an annoyance.
[QUOTE=Gnomical;40449669]I'm using basic socket connections, as my server is being connected to via telnet. Using Lidgren would require me to make a client, and that is not part of my project. The "client" is any telnet capable device.
[editline]27th April 2013[/editline]
I figured out my major problem. Turns out having two users logged in at the same time under the same account confuses the fuck out of the server. Now it will check if that user is logged in and deny access to the person trying to log in under that user if that user is already connected.[/QUOTE]
Maybe tie your interaction state to the user and socket? If the backend gets confused you need transactions, you can do that (to some extend) by queueing Tasks with .ContinueWith(...).
[QUOTE=Tamschi;40451989]Maybe tie your interaction state to the user and socket? If the backend gets confused you need transactions, you can do that (to some extend) by queueing Tasks with .ContinueWith(...).[/QUOTE]
I currently have a user class that contains user variables, the socket, and the streams. They are referenced in the program by the username (which, along with the password and a few other things come from a database), so it is supposed to be unique anyway. I don't know why I thought logging in two users at the same time was a good idea. It's fixed now though.
I am following [URL="http://roguebasin.roguelikedevelopment.org/index.php?title=Complete_Roguelike_Tutorial,_using_python%2Blibtcod"]this[/URL] tutorial for python, creating a Rouge Like.
So far it has gone well. But I have run into a problem:
If my "hp" is full, it prints the correct message, but as soon as I use it below "max_hp" it crashes. Weirdest thing is, I even separately ran the copied code from the tutorial and it has the same issue.
[CODE]PS C:\Users\Conor\desktop\current\rougey> python ex1.py
24 bits font.
key color : 0 0 0
24bits greyscale font. converting to 32bits
Traceback (most recent call last):
File "ex1.py", line 663, in <module>
player_action = handle_keys()
File "ex1.py", line 574, in handle_keys
chosen_item.use()
File "ex1.py", line 190, in use
if self.use_function() != 'cancelled':
File "ex1.py", line 607, in cast_heal
player.fighter.heal(HEAL_AMOUNT)
AttributeError: Fighter instance has no attribute 'heal'[/CODE]
I'm not really sure what an "instance" is.
Code:
[CODE]import libtcodpy as libtcod
import math
import textwrap
#actual size of the window
SCREEN_WIDTH = 80
SCREEN_HEIGHT = 50
#size of the map
MAP_WIDTH = 80
MAP_HEIGHT = 43
#sizes and coordinates relevant for the GUI
BAR_WIDTH = 20
PANEL_HEIGHT = 7
PANEL_Y = SCREEN_HEIGHT - PANEL_HEIGHT
MSG_X = BAR_WIDTH + 2
MSG_WIDTH = SCREEN_WIDTH - BAR_WIDTH - 2
MSG_HEIGHT = PANEL_HEIGHT - 1
INVENTORY_WIDTH = 50
#parameters for dungeon generator
ROOM_MAX_SIZE = 10
ROOM_MIN_SIZE = 6
MAX_ROOMS = 30
MAX_ROOM_MONSTERS = 3
MAX_ROOM_ITEMS = 2
#spell values
HEAL_AMOUNT = 4
FOV_ALGO = 0 #default FOV algorithm
FOV_LIGHT_WALLS = True #light walls or not
TORCH_RADIUS = 10
LIMIT_FPS = 20 #20 frames-per-second maximum
color_dark_wall = libtcod.Color(0, 0, 100)
color_light_wall = libtcod.Color(130, 110, 50)
color_dark_ground = libtcod.Color(50, 50, 150)
color_light_ground = libtcod.Color(200, 180, 50)
class Tile:
#a tile of the map and its properties
def __init__(self, blocked, block_sight = None):
self.blocked = blocked
#all tiles start unexplored
self.explored = False
#by default, if a tile is blocked, it also blocks sight
if block_sight is None: block_sight = blocked
self.block_sight = block_sight
class Rect:
#a rectangle on the map. used to characterize a room.
def __init__(self, x, y, w, h):
self.x1 = x
self.y1 = y
self.x2 = x + w
self.y2 = y + h
def center(self):
center_x = (self.x1 + self.x2) / 2
center_y = (self.y1 + self.y2) / 2
return (center_x, center_y)
def intersect(self, other):
#returns true if this rectangle intersects with another one
return (self.x1 <= other.x2 and self.x2 >= other.x1 and
self.y1 <= other.y2 and self.y2 >= other.y1)
class Object:
#this is a generic object: the player, a monster, an item, the stairs...
#it's always represented by a character on screen.
def __init__(self, x, y, char, name, color, blocks=False, fighter=None, ai=None, item=None):
self.x = x
self.y = y
self.char = char
self.name = name
self.color = color
self.blocks = blocks
self.fighter = fighter
if self.fighter: #let the fighter component know who owns it
self.fighter.owner = self
self.item = item
if self.item: #let the item component know who owns it
self.item.owner = self
self.ai = ai
if self.ai: #let the ai component know who owns it
self.ai.owner = self
def move(self, dx, dy):
#move by the given amount, if the destination is not blocked
if not is_blocked(self.x + dx, self.y + dy):
self.x += dx
self.y += dy
def move_towards(self, target_x, target_y):
#vector from this object to the target, and distance
dx = target_x - self.x
dy = target_y - self.y
distance = math.sqrt(dx ** 2 + dy ** 2)
#normalize it to length 1 (preserving direction), then round it and
#convert to integer so the movement is restricted to the map grid
dx = int(round(dx / distance))
dy = int(round(dy / distance))
self.move(dx, dy)
def distance_to(self, other):
#return the distance to another object
dx = other.x - self.x
dy = other.y - self.y
return math.sqrt(dx ** 2 + dy ** 2)
def send_to_back(self):
#make this object be drawn first, so all others appear above it if they're in the same tile.
global objects
objects.remove(self)
objects.insert(0, self)
def draw(self):
#only show if it's visible to the player
if libtcod.map_is_in_fov(fov_map, self.x, self.y):
#set the color and then draw the character that represents this object at its position
libtcod.console_set_default_foreground(con, self.color)
libtcod.console_put_char(con, self.x, self.y, self.char, libtcod.BKGND_NONE)
def clear(self):
#erase the character that represents this object
libtcod.console_put_char(con, self.x, self.y, ' ', libtcod.BKGND_NONE)
class Fighter:
#combat-related properties and methods (monster, player, NPC).
def __init__(self, hp, defense, power, death_function=None):
self.max_hp = hp
self.hp = hp
self.defense = defense
self.power = power
self.death_function = death_function
def attack(self, target):
#a simple formula for attack damage
damage = self.power - target.fighter.defense
if damage > 0:
#make the target take some damage
message(self.owner.name.capitalize() + ' attacks ' + target.name + ' for ' + str(damage) + ' hit points.')
target.fighter.take_damage(damage)
else:
message(self.owner.name.capitalize() + ' attacks ' + target.name + ' but it has no effect!')
def take_damage(self, damage):
#apply damage if possible
if damage > 0:
self.hp -= damage
#check for death. if there's a death function, call it
if self.hp <= 0:
function = self.death_function
if function is not None:
function(self.owner)
class Item:
#an item that can be picked up and used.
def __init__(self, use_function=None):
self.use_function = use_function
def pick_up(self):
#add to the player's inventory and remove from the map
if len(inventory) >= 26:
message('Your inventory is full, cannot pick up ' + self.owner.name + '.', libtcod.red)
else:
inventory.append(self.owner)
objects.remove(self.owner)
message('You picked up a ' + self.owner.name + '!', libtcod.green)
def use(self):
#just call the "use_function" if it is defined
if self.use_function is None:
message('The ' + self.owner.name + ' cannot be used.')
else:
if self.use_function() != 'cancelled':
inventory.remove(self.owner) #destroy after use, unless it was cancelled for some reason
class BasicMonster:
#AI for a basic monster.
def take_turn(self):
#a basic monster takes its turn. if you can see it, it can see you
monster = self.owner
if libtcod.map_is_in_fov(fov_map, monster.x, monster.y):
#move towards player if far away
if monster.distance_to(player) >= 2:
monster.move_towards(player.x, player.y)
#close enough, attack! (if the player is still alive.)
elif player.fighter.hp > 0:
monster.fighter.attack(player)
def is_blocked(x, y):
#first test the map tile
if map[x][y].blocked:
return True
#now check for any blocking objects
for object in objects:
if object.blocks and object.x == x and object.y == y:
return True
return False
def create_room(room):
global map
#go through the tiles in the rectangle and make them passable
for x in range(room.x1 + 1, room.x2):
for y in range(room.y1 + 1, room.y2):
map[x][y].blocked = False
map[x][y].block_sight = False
def create_h_tunnel(x1, x2, y):
global map
#horizontal tunnel. min() and max() are used in case x1>x2
for x in range(min(x1, x2), max(x1, x2) + 1):
map[x][y].blocked = False
map[x][y].block_sight = False
def create_v_tunnel(y1, y2, x):
global map
#vertical tunnel
for y in range(min(y1, y2), max(y1, y2) + 1):
map[x][y].blocked = False
map[x][y].block_sight = False
def make_map():
global map, player
#fill map with "blocked" tiles
map = [[ Tile(True)
for y in range(MAP_HEIGHT) ]
for x in range(MAP_WIDTH) ]
rooms = []
num_rooms = 0
for r in range(MAX_ROOMS):
#random width and height
w = libtcod.random_get_int(0, ROOM_MIN_SIZE, ROOM_MAX_SIZE)
h = libtcod.random_get_int(0, ROOM_MIN_SIZE, ROOM_MAX_SIZE)
#random position without going out of the boundaries of the map
x = libtcod.random_get_int(0, 0, MAP_WIDTH - w - 1)
y = libtcod.random_get_int(0, 0, MAP_HEIGHT - h - 1)
#"Rect" class makes rectangles easier to work with
new_room = Rect(x, y, w, h)
#run through the other rooms and see if they intersect with this one
failed = False
for other_room in rooms:
if new_room.intersect(other_room):
failed = True
break
if not failed:
#this means there are no intersections, so this room is valid
#"paint" it to the map's tiles
create_room(new_room)
#add some contents to this room, such as monsters
place_objects(new_room)
#center coordinates of new room, will be useful later
(new_x, new_y) = new_room.center()
if num_rooms == 0:
#this is the first room, where the player starts at
player.x = new_x
player.y = new_y
else:
#all rooms after the first:
#connect it to the previous room with a tunnel
#center coordinates of previous room
(prev_x, prev_y) = rooms[num_rooms-1].center()
#draw a coin (random number that is either 0 or 1)
if libtcod.random_get_int(0, 0, 1) == 1:
#first move horizontally, then vertically
create_h_tunnel(prev_x, new_x, prev_y)
create_v_tunnel(prev_y, new_y, new_x)
else:
#first move vertically, then horizontally
create_v_tunnel(prev_y, new_y, prev_x)
create_h_tunnel(prev_x, new_x, new_y)
#finally, append the new room to the list
rooms.append(new_room)
num_rooms += 1
def place_objects(room):
#choose random number of monsters
num_monsters = libtcod.random_get_int(0, 0, MAX_ROOM_MONSTERS)
for i in range(num_monsters):
#choose random spot for this monster
x = libtcod.random_get_int(0, room.x1+1, room.x2-1)
y = libtcod.random_get_int(0, room.y1+1, room.y2-1)
#only place it if the tile is not blocked
if not is_blocked(x, y):
if libtcod.random_get_int(0, 0, 100) < 80: #80% chance of getting an orc
#create an orc
fighter_component = Fighter(hp=10, defense=0, power=3, death_function=monster_death)
ai_component = BasicMonster()
monster = Object(x, y, 'o', 'orc', libtcod.desaturated_green,
blocks=True, fighter=fighter_component, ai=ai_component)
else:
#create a troll
fighter_component = Fighter(hp=16, defense=1, power=4, death_function=monster_death)
ai_component = BasicMonster()
monster = Object(x, y, 'T', 'troll', libtcod.darker_green,
blocks=True, fighter=fighter_component, ai=ai_component)
objects.append(monster)
#choose random number of items
num_items = libtcod.random_get_int(0, 0, MAX_ROOM_ITEMS)
for i in range(num_items):
#choose random spot for this item
x = libtcod.random_get_int(0, room.x1+1, room.x2-1)
y = libtcod.random_get_int(0, room.y1+1, room.y2-1)
#only place it if the tile is not blocked
if not is_blocked(x, y):
#create a healing potion
item_component = Item(use_function=cast_heal)
item = Object(x, y, '!', 'healing potion', libtcod.violet, item=item_component)
objects.append(item)
item.send_to_back() #items appear below other objects
def render_bar(x, y, total_width, name, value, maximum, bar_color, back_color):
#render a bar (HP, experience, etc). first calculate the width of the bar
bar_width = int(float(value) / maximum * total_width)
#render the background first
libtcod.console_set_default_background(panel, back_color)
libtcod.console_rect(panel, x, y, total_width, 1, False, libtcod.BKGND_SCREEN)
#now render the bar on top
libtcod.console_set_default_background(panel, bar_color)
if bar_width > 0:
libtcod.console_rect(panel, x, y, bar_width, 1, False, libtcod.BKGND_SCREEN)
#finally, some centered text with the values
libtcod.console_set_default_foreground(panel, libtcod.white)
libtcod.console_print_ex(panel, x + total_width / 2, y, libtcod.BKGND_NONE, libtcod.CENTER,
name + ': ' + str(value) + '/' + str(maximum))
def get_names_under_mouse():
global mouse
#return a string with the names of all objects under the mouse
(x, y) = (mouse.cx, mouse.cy)
#create a list with the names of all objects at the mouse's coordinates and in FOV
names = [obj.name for obj in objects
if obj.x == x and obj.y == y and libtcod.map_is_in_fov(fov_map, obj.x, obj.y)]
names = ', '.join(names) #join the names, separated by commas
return names.capitalize()
def render_all():
global fov_map, color_dark_wall, color_light_wall
global color_dark_ground, color_light_ground
global fov_recompute
if fov_recompute:
#recompute FOV if needed (the player moved or something)
fov_recompute = False
libtcod.map_compute_fov(fov_map, player.x, player.y, TORCH_RADIUS, FOV_LIGHT_WALLS, FOV_ALGO)
#go through all tiles, and set their background color according to the FOV
for y in range(MAP_HEIGHT):
for x in range(MAP_WIDTH):
visible = libtcod.map_is_in_fov(fov_map, x, y)
wall = map[x][y].block_sight
if not visible:
#if it's not visible right now, the player can only see it if it's explored
if map[x][y].explored:
if wall:
libtcod.console_set_char_background(con, x, y, color_dark_wall, libtcod.BKGND_SET)
else:
libtcod.console_set_char_background(con, x, y, color_dark_ground, libtcod.BKGND_SET)
else:
#it's visible
if wall:
libtcod.console_set_char_background(con, x, y, color_light_wall, libtcod.BKGND_SET )
else:
libtcod.console_set_char_background(con, x, y, color_light_ground, libtcod.BKGND_SET )
#since it's visible, explore it
map[x][y].explored = True
#draw all objects in the list, except the player. we want it to
#always appear over all other objects! so it's drawn later.
for object in objects:
if object != player:
object.draw()
player.draw()
#blit the contents of "con" to the root console
libtcod.console_blit(con, 0, 0, MAP_WIDTH, MAP_HEIGHT, 0, 0, 0)
#prepare to render the GUI panel
libtcod.console_set_default_background(panel, libtcod.black)
libtcod.console_clear(panel)
#print the game messages, one line at a time
y = 1
for (line, color) in game_msgs:
libtcod.console_set_default_foreground(panel, color)
libtcod.console_print_ex(panel, MSG_X, y, libtcod.BKGND_NONE, libtcod.LEFT, line)
y += 1
#show the player's stats
render_bar(1, 1, BAR_WIDTH, 'HP', player.fighter.hp, player.fighter.max_hp,
libtcod.light_red, libtcod.darker_red)
#display names of objects under the mouse
libtcod.console_set_default_foreground(panel, libtcod.light_gray)
libtcod.console_print_ex(panel, 1, 0, libtcod.BKGND_NONE, libtcod.LEFT, get_names_under_mouse())
#blit the contents of "panel" to the root console
libtcod.console_blit(panel, 0, 0, SCREEN_WIDTH, PANEL_HEIGHT, 0, 0, PANEL_Y)
def message(new_msg, color = libtcod.white):
#split the message if necessary, among multiple lines
new_msg_lines = textwrap.wrap(new_msg, MSG_WIDTH)
for line in new_msg_lines:
#if the buffer is full, remove the first line to make room for the new one
if len(game_msgs) == MSG_HEIGHT:
del game_msgs[0]
#add the new line as a tuple, with the text and the color
game_msgs.append( (line, color) )
def player_move_or_attack(dx, dy):
global fov_recompute
#the coordinates the player is moving to/attacking
x = player.x + dx
y = player.y + dy
#try to find an attackable object there
target = None
for object in objects:
if object.fighter and object.x == x and object.y == y:
target = object
break
#attack if target found, move otherwise
if target is not None:
player.fighter.attack(target)
else:
player.move(dx, dy)
fov_recompute = True
def menu(header, options, width):
if len(options) > 26: raise ValueError('Cannot have a menu with more than 26 options.')
#calculate total height for the header (after auto-wrap) and one line per option
header_height = libtcod.console_get_height_rect(con, 0, 0, width, SCREEN_HEIGHT, header)
height = len(options) + header_height
#create an off-screen console that represents the menu's window
window = libtcod.console_new(width, height)
#print the header, with auto-wrap
libtcod.console_set_default_foreground(window, libtcod.white)
libtcod.console_print_rect_ex(window, 0, 0, width, height, libtcod.BKGND_NONE, libtcod.LEFT, header)
#print all the options
y = header_height
letter_index = ord('a')
for option_text in options:
text = '(' + chr(letter_index) + ') ' + option_text
libtcod.console_print_ex(window, 0, y, libtcod.BKGND_NONE, libtcod.LEFT, text)
y += 1
letter_index += 1
#blit the contents of "window" to the root console
x = SCREEN_WIDTH/2 - width/2
y = SCREEN_HEIGHT/2 - height/2
libtcod.console_blit(window, 0, 0, width, height, 0, x, y, 1.0, 0.7)
#present the root console to the player and wait for a key-press
libtcod.console_flush()
key = libtcod.console_wait_for_keypress(True)
#convert the ASCII code to an index; if it corresponds to an option, return it
index = key.c - ord('a')
if index >= 0 and index < len(options): return index
return None
def inventory_menu(header):
#show a menu with each item of the inventory as an option
if len(inventory) == 0:
options = ['Inventory is empty.']
else:
options = [item.name for item in inventory]
index = menu(header, options, INVENTORY_WIDTH)
#if an item was chosen, return it
if index is None or len(inventory) == 0: return None
return inventory[index].item
def handle_keys():
global key;
if key.vk == libtcod.KEY_ENTER and key.lalt:
#Alt+Enter: toggle fullscreen
libtcod.console_set_fullscreen(not libtcod.console_is_fullscreen())
elif key.vk == libtcod.KEY_ESCAPE:
return 'exit' #exit game
if game_state == 'playing':
#movement keys
if key.vk == libtcod.KEY_UP:
player_move_or_attack(0, -1)
elif key.vk == libtcod.KEY_DOWN:
player_move_or_attack(0, 1)
elif key.vk == libtcod.KEY_LEFT:
player_move_or_attack(-1, 0)
elif key.vk == libtcod.KEY_RIGHT:
player_move_or_attack(1, 0)
else:
#test for other keys
key_char = chr(key.c)
if key_char == 'g':
#pick up an item
for object in objects: #look for an item in the player's tile
if object.x == player.x and object.y == player.y and object.item:
object.item.pick_up()
break
if key_char == 'i':
#show the inventory; if an item is selected, use it
chosen_item = inventory_menu('Press the key next to an item to use it, or any other to cancel.\n')
if chosen_item is not None:
chosen_item.use()
return 'didnt-take-turn'
def player_death(player):
#the game ended!
global game_state
message('You died!', libtcod.red)
game_state = 'dead'
#for added effect, transform the player into a corpse!
player.char = '%'
player.color = libtcod.dark_red
def monster_death(monster):
#transform it into a nasty corpse! it doesn't block, can't be
#attacked and doesn't move
message(monster.name.capitalize() + ' is dead!', libtcod.orange)
monster.char = '%'
monster.color = libtcod.dark_red
monster.blocks = False
monster.fighter = None
monster.ai = None
monster.name = 'remains of ' + monster.name
monster.send_to_back()
def cast_heal():
#heal the player
if player.fighter.hp == player.fighter.max_hp:
message('You are already at full health.', libtcod.red)
return 'cancelled'
message('Your wounds start to feel better!', libtcod.light_violet)
player.fighter.heal(HEAL_AMOUNT)
#############################################
# Initialization & Main Loop
#############################################
libtcod.console_set_custom_font('arial10x10.png', libtcod.FONT_TYPE_GREYSCALE | libtcod.FONT_LAYOUT_TCOD)
libtcod.console_init_root(SCREEN_WIDTH, SCREEN_HEIGHT, 'python/libtcod tutorial', False)
libtcod.sys_set_fps(LIMIT_FPS)
con = libtcod.console_new(MAP_WIDTH, MAP_HEIGHT)
panel = libtcod.console_new(SCREEN_WIDTH, PANEL_HEIGHT)
#create object representing the player
fighter_component = Fighter(hp=30, defense=2, power=5, death_function=player_death)
player = Object(0, 0, '@', 'player', libtcod.white, blocks=True, fighter=fighter_component)
#the list of objects with just the player
objects = [player]
#generate map (at this point it's not drawn to the screen)
make_map()
#create the FOV map, according to the generated map
fov_map = libtcod.map_new(MAP_WIDTH, MAP_HEIGHT)
for y in range(MAP_HEIGHT):
for x in range(MAP_WIDTH):
libtcod.map_set_properties(fov_map, x, y, not map[x][y].block_sight, not map[x][y].blocked)
fov_recompute = True
game_state = 'playing'
player_action = None
inventory = []
#create the list of game messages and their colors, starts empty
game_msgs = []
#a warm welcoming message!
message('Welcome stranger! Prepare to perish in the Tombs of the Ancient Kings.', libtcod.red)
mouse = libtcod.Mouse()
key = libtcod.Key()
while not libtcod.console_is_window_closed():
#render the screen
libtcod.sys_check_for_event(libtcod.EVENT_KEY_PRESS|libtcod.EVENT_MOUSE,key,mouse)
render_all()
libtcod.console_flush()
#erase all objects at their old locations, before they move
for object in objects:
object.clear()
#handle keys and exit game if needed
player_action = handle_keys()
if player_action == 'exit':
break
#let monsters take their turn
if game_state == 'playing' and player_action != 'didnt-take-turn':
for object in objects:
if object.ai:
object.ai.take_turn()[/CODE]
(we need syntax highlighting for python)
[QUOTE=Chris220;40449511]error X4506: ps_4_0_level_9_3 input limit (8) exceeded, shader uses 10 inputs.
I have run out of shader inputs on my DirectX 11 project!
I want to do multiple lights, normal mapping and things like that. Unfortunately, I cannot compress all the required information down into less than 8 inputs, so I need an alternative.
Is there a way of splitting this up into multiple shaders and running one after the other to get the same end result?[/QUOTE]
I don't know the limits of either any more but it could be to do with creating the shader with d3d9.3 compatibility.
[url]http://msdn.microsoft.com/en-us/library/windows/desktop/ff819065%28v=vs.85%29.aspx[/url] This is all I could find.
[QUOTE=whatthe;40453272]I am following [URL="http://roguebasin.roguelikedevelopment.org/index.php?title=Complete_Roguelike_Tutorial,_using_python%2Blibtcod"]this[/URL] tutorial for python, creating a Rouge Like.
So far it has gone well. But I have run into a problem:
If my "hp" is full, it prints the correct message, but as soon as I use it below "max_hp" it crashes. Weirdest thing is, I even separately ran the copied code from the tutorial and it has the same issue.
[CODE]PS C:\Users\Conor\desktop\current\rougey> python ex1.py
24 bits font.
key color : 0 0 0
24bits greyscale font. converting to 32bits
Traceback (most recent call last):
File "ex1.py", line 663, in <module>
player_action = handle_keys()
File "ex1.py", line 574, in handle_keys
chosen_item.use()
File "ex1.py", line 190, in use
if self.use_function() != 'cancelled':
File "ex1.py", line 607, in cast_heal
player.fighter.heal(HEAL_AMOUNT)
AttributeError: Fighter instance has no attribute 'heal'[/CODE]
I'm not really sure what an "instance" is.
Code:
[CODE]#code[/CODE]
(we need syntax highlighting for python)[/QUOTE]
An instance is an actual manifestation of something memory. So player.fighter is an instance (of the class Fighter).
And the problem is, that you're attempting to access a field 'heal', which you did not define in the class or set for the instance.
How do I use a sprite sheet? Currently I only have a picture for each character in my java program " private String craft = "pleft.png";" but I'm not sure how to go about doing it where after responding to a key press the next frame plays.
[code]package main;
import java.util.ArrayList;
import java.awt.Image;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
public class P1 {
private String craft = "pleft.png";
private int dx;
private int dy;
private int x;
private int y;
private Image image;
private ArrayList missiles;
private final int CRAFT_SIZE = 20;
public P1() {
ImageIcon ii = new ImageIcon(this.getClass().getResource(craft));
image = ii.getImage();
missiles = new ArrayList();
x = 50;
y = 87;
}
public void move() {
x += dx;
y += dy;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public Image getImage() {
return image;
}
public ArrayList getMissiles() {
return missiles;
}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_INSERT) {
fire();
}
if (key == KeyEvent.VK_LEFT) {
dx = -1;
}
if (key == KeyEvent.VK_RIGHT) {
dx = 1;
}
if (key == KeyEvent.VK_UP) {
dy = -1;
}
if (key == KeyEvent.VK_DOWN) {
dy = 1;
}
}
public void fire() {
missiles.add(new Gun1(x + CRAFT_SIZE, y + CRAFT_SIZE/2));
}
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
dx = 0;
}
if (key == KeyEvent.VK_RIGHT) {
dx = 0;
}
if (key == KeyEvent.VK_UP) {
dy = 0;
}
if (key == KeyEvent.VK_DOWN) {
dy = 0;
}
}
}[/code]
[QUOTE=ZeekyHBomb;40454075]An instance is an actual manifestation of something memory. So player.fighter is an instance (of the class Fighter).
And the problem is, that you're attempting to access a field 'heal', which you did not define in the class or set for the instance.[/QUOTE]
[CODE]class Fighter:
#combat-related properties and methods (monster, player, NPC).
def __init__(self, hp, defense, power, heal, death_function=None):
self.max_hp = hp
self.hp = hp
self.defense = defense
self.power = power
self.heal = cast_heal
self.death_function = death_function[/CODE]
Ok, so I defined it within the class, but I am not sure what I would put in the instance, which I gather is
[CODE]#create object representing the player
fighter_component = Fighter(hp=30, defense=2, power=5, death_function=player_death)
player = Object(0, 0, '@', 'player', libtcod.white, blocks=True, fighter=fighter_component)[/CODE]
before the main loop?
I don't think a member variable would be fit. A method with functionality similar to the take_damage method is probably what you want.
Well I'm working with Alien Swarm engine, and I have found an issue with viewmodels stuff.
Viewmodel stuff works fine but ShouldReceiveProjectedTextures doesn't work at all!
I have tried to use [url]https://developer.valvesoftware.com/wiki/Env_projectedtexture/fixes#Enabling_shadow_receiving_on_the_view_model[/url]
but it doesn't enable projected texture on my viewmodels at all. Maybe someone knows how to fix it?
So can some people help me with Java work?
The problem I have is that
I have a complete HashSet code
but I want to modify it after the iterator is set that
it throws off a ConcurrentModificationException..
[code]import java.util.Iterator;
import java.util.NoSuchElementException;
/**
* This class implements a hash set using separate chaining.
*/
public class HashSet
{
private Node[] buckets;
private int currentSize;
/**
* Constructs a hash table.
*
* @param bucketsLength
* the length of the buckets array
*/
public HashSet(int bucketsLength)
{
buckets = new Node[bucketsLength];
currentSize = 0;
}
/**
* Tests for set membership.
*
* @param x
* an object
* @return true if x is an element of this set
*/
public boolean contains(Object x)
{
int h = x.hashCode();
if (h < 0)
{
h = -h;
}
h = h % buckets.length;
Node current = buckets[h];
while (current != null)
{
if (current.data.equals(x))
{
return true;
}
current = current.next;
}
return false;
}
/**
* Adds an element to this set.
*
* @param x
* an object
* @return true if x is a new object, false if x was already in the set
*/
public boolean add(Object x)
{
int h = x.hashCode();
if (h < 0)
{
h = -h;
}
h = h % buckets.length;
Node current = buckets[h];
while (current != null)
{
if (current.data.equals(x))
{
return false;
}
// Already in the set
current = current.next;
}
Node newNode = new Node();
newNode.data = x;
newNode.next = buckets[h];
buckets[h] = newNode;
currentSize++;
return true;
}
/**
* Removes an object from this set.
*
* @param x
* an object
* @return true if x was removed from this set, false if x was not an element
* of this set
*/
public boolean remove(Object x)
{
int h = x.hashCode();
if (h < 0)
{
h = -h;
}
h = h % buckets.length;
Node current = buckets[h];
Node previous = null;
while (current != null)
{
if (current.data.equals(x))
{
if (previous == null)
{
buckets[h] = current.next;
} else
{
previous.next = current.next;
}
currentSize--;
return true;
}
previous = current;
current = current.next;
}
return false;
}
/**
* Returns an iterator that traverses the elements of this set.
*
* @return a hash set iterator
*/
public Iterator iterator()
{
return new HashSetIterator();
}
/**
* Gets the number of elements in this set.
*
* @return the number of elements
*/
public int size()
{
return currentSize;
}
class Node
{
public Object data;
public Node next;
}
class HashSetIterator implements Iterator
{
private int bucketIndex;
private Node current;
/**
* Constructs a hash set iterator that points to the first element of the
* hash set.
*/
public HashSetIterator()
{
current = null;
bucketIndex = -1;
}
/** Need to add ConcurrentModificationException stuff*/
public boolean hasNext()
{
if (current != null && current.next != null)
{
return true;
}
for (int b = bucketIndex + 1; b < buckets.length; b++)
{
if (buckets[b] != null)
{
return true;
}
}
return false;
}
/** Need to add ConcurrentModificationException stuff*/
public Object next()
{
if (current != null && current.next != null)
{
current = current.next; // Move to next element in bucket
} else
// Move to next bucket
{
do
{
bucketIndex++;
if (bucketIndex == buckets.length)
{
throw new NoSuchElementException();
}
current = buckets[bucketIndex];
} while (current == null);
}
return current.data;
}
/**
Removes the last object returned by a call to next() in the iterator.
At least one call to next() must be made before each call to remove(),
otherwise an IllegalStateException is thrown. If the underlying
HashSet is modified in any way (directly, or by remove() in another
Iterator), thows a ConcurrentModificationException. (This would
happen even before the IllegalStateException gets thrown.
*/
public void remove()
{
throw new UnsupportedOperationException();
}
}
}
[/code]
TESTER
[code]import java.util.ConcurrentModificationException;
import java.util.Iterator;
public class HashSetDraftTester
{
public static void main(String[] args)
{
HashSet h = new HashSet(10);
h.add("first");
h.add("second");
h.add("third");
Iterator it = h.iterator();
while(it.hasNext())
it.next();
Iterator it2 = h.iterator();
it = h.iterator();
it2.next();
it.next();
it2.next();
it.next();
System.out.println("Made it past no exception cases");
System.out.println("Expected: Made it past no exception cases");
h.add("fourth");
try
{
it.next();
} catch (ConcurrentModificationException ex)
{
System.out.println("ConcurrentModificationException");
}
System.out.println("Expected: ConcurrentModificationException");
it = h.iterator();
h.remove("ninth");
it.next();
h.remove("second");
try
{
it.next();
} catch (ConcurrentModificationException ex)
{
System.out.println("ConcurrentModificationException");
}
System.out.println("Expected: ConcurrentModificationException");
}
}[/code]
Hi guys!
I'm trying to run a Slick2D example in Netbeans on Linux.
I have this:
[code]package slick2dexperimenting;
import org.newdawn.slick.*;
public class HelloWorld extends BasicGame
{
public HelloWorld()
{
super("Hello World");
}
@Override
public void init(GameContainer gc) throws SlickException
{
}
@Override
public void update(GameContainer gc, int delta) throws SlickException
{
}
@Override
public void render(GameContainer gc, Graphics g) throws SlickException
{
g.drawString("Hello World", 100, 100);
}
public static void main(String[] args) throws SlickException
{
AppGameContainer app = new AppGameContainer(new HelloWorld());
app.setDisplayMode(800, 600, false);
app.start();
}
}[/code]
When I try to run it, it gives me this exception:
[quote]Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
at java.lang.Runtime.loadLibrary0(Runtime.java:845)
at java.lang.System.loadLibrary(System.java:1084)
at org.lwjgl.Sys$1.run(Sys.java:73)
at java.security.AccessController.doPrivileged(Native Method)
at org.lwjgl.Sys.doLoadLibrary(Sys.java:66)
at org.lwjgl.Sys.loadLibrary(Sys.java:95)
at org.lwjgl.Sys.<clinit>(Sys.java:112)
at org.lwjgl.opengl.Display.<clinit>(Display.java:135)
at org.newdawn.slick.AppGameContainer$1.run(AppGameContainer.java:37)
at java.security.AccessController.doPrivileged(Native Method)
at org.newdawn.slick.AppGameContainer.<clinit>(AppGameContainer.java:34)
at slick2dexperimenting.Slick2DExperimenting.main(Slick2DExperimenting.java:32)
Java Result: 1[/quote]
It took me an hour to try and get the natives to be read so I could actually run the thing, but now it's giving me more exceptions! D:
This is what I've got in my VM Options when I run the program:
-Djava.library.path=/home/Pilapodapostache/Slick2Dlibs/lwjgl-2.9.0/native/linux/
Any help would be appreciated,
Thanks.
super quick question that google wasn't able to answer, for some reason.
i'm in C++
so i'm basically writing a program to search a linked list of DVDs (each node has title, genre, actor, supp actor, year it came out, and IMDB rating). I'll display a menu and the user can pick what to search by. I have a feeling I can do all the searches in one function, but the one thing I'm having an issue with is...how. In the interests of not being incredibly redundant, I'm wondering if I could basically just use the same search but change one or two things.
Normally I'd search for genre with movPtr->genre or something. Can I do movPtr->[I]variable[/I] and just change variable to genre/actor/title? Or does that not work?
Overload your search method. Have the main body change the search parameter based on a parameter passed to the main body, and your overloads should pass the parameter. Or just have the main method parameterized and explicitly cased, and have methods like "SearchByGenre" that invoke your main search procedure and its search parameter.
Your search will still be explicitly coded for each search type, but it will still be consolidated to one main search method. The extra methods just help make it more readable in the main body of your code.
i can code an example if you're still confused.
I...uh. Say what now?
[editline]30th April 2013[/editline]
I'm just passing through intSearch or stringSearch depending on which search they choose and then searching for that via a switch statement. It's clunky but it works.
yeah that's probably the best you're going to get
Guys, I got an opportunity for a job as a Junior~ish level programmer, but they work mostly with C#. I have experience with Python, HTML, and CSS. I have a month or so to try my best to prove myself.
Could anyone recommend me some tried and trusted learning resources please?
This is a bit of a broad question, but:
What is it called when you store a file inside another file, like mdl files or vtf files inside of a valve gcf, and how do I achieve this in C++? Does anybody know of a tutorial?
[QUOTE=dylanb5123;40478496]This is a bit of a broad question, but:
What is it called when you store a file inside another file, like mdl files or vtf files inside of a valve gcf, and how do I achieve this in C++? Does anybody know of a tutorial?[/QUOTE]
Archive/archiving
Take a look at [url=https://icculus.org/physfs/]PhysicsFS[/url].
[QUOTE=Protocol7;40473185]yeah that's probably the best you're going to get[/QUOTE]
i hate myself but i finished it
it's bulky and i want to delete it just to purge the world of a shitty file, but it works so fuck it
I could have accomplished everything just using more functions, but I wanted to try and do all the searches within one loop and a switch statement.
another question about pointers and shit. i asked this already but i don't think you noticed it.
say i'm using movPtr to point to movie nodes or something, and each node has title, actor, genre, year, etc.
Do i HAVE to do movPtr->genre, movPtr->title, etc, or could I theoretically do like movPtr->variable and then just replace variable with whatever i'm searching for in the node? like variable = genre, then movPtr->variable will be movPtr->genre.
I'm trying to make my code more flexible and it seems like that'd certainly help.
[editline]30th April 2013[/editline]
i should probably explain what i'm doing. so basically i'm writing a code to search through a linked list. I've got a list of like 1000 movies, and then I need to give the option to search by genre, title, actor, rating, or year, and then output to whatever output file they want.
the only way i can think to do it is either write the entirety of the search AND the output within the switch statement, which will look completely stupid, or I write a function that will count and output the results and call it. problem with that is i need to pass in what they're looking for so i can use the same function for each option, otherwise it's no different than writing it inside the switch.
if i can figure out how to pass through like genre and then have the function search for genre and output it, and then pass through title and have it search for and output titles, etc., then I'll be gold
otherwise i don't know what to do
help
[editline]30th April 2013[/editline]
nevermind i'm an idiot there's no limit on number of functions to add, i'll just write one for each search
Sounds like something you'd want to use SQLite for tbh.
Anyway, as long as their type matches you can do that. Otherwise you could still fall back to a variant type.
And in general, prefer references to pointers (if you're coding in C++ and not C). References have a higher safety guarantee.
I don't really know what those are. :< I'm still learning this.
Anyone got an idea why in SFML.Net (C#) I cannot use the move() function on CircleShapes? Doesn't seem to exist, but in C++ I can do it fine...
[QUOTE=Zinayzen;40481779]I don't really know what those are. :< I'm still learning this.[/QUOTE]
[code]void byRef(int &i)
{
i = 5;
}
void byPtr(int *i)
{
*i = 4;
}
int main()
{
int a;
byPtr(&a);
//a is now 4
byRef(a);
//a is now 5
}[/code]
There is no NULL for reference. You cannot re-assign references (because you will just assign to whatever the reference references).
How do you make a splash screen appear first and then open a different window after a couple of seconds in JAVA?
Alrite, so I am trying to create objects and alter them in a class but I am having trouble getting and setting shit with them, here is an example which I want to do, but the objects don't exist in the part where I try and edit them.
[code]class cheese
{
string name;
public cheese(string nm)
{
name = nm;
}
}
class cheeses
{
public void Create()
{
cheese cheese1 = new cheese("Blue");
cheese cheese2 = new cheese("Orange");
cheese cheese3 = new cheese("Cheddar");
object[] cheeseArray = { cheese1, cheese2, cheese3 };
}
public void Alter()
{
foreach (object cheese in cheeseArray)
{
cheese.name += "Old";
}
}
}[/code]
[QUOTE=JakeAM;40484345]Alrite, so I am trying to create objects and alter them in a class but I am having trouble getting and setting shit with them, here is an example which I want to do, but the objects don't exist in the part where I try and edit them.
[/QUOTE]
"cheeseArray" doesn't exist outside of the scope of Create()
[code]class cheese
{
string name;
public cheese(string nm)
{
name = nm;
}
}
class cheeses
{
public object[] cheeseArray;
public void Create()
{
cheese cheese1 = new cheese("Blue");
cheese cheese2 = new cheese("Orange");
cheese cheese3 = new cheese("Cheddar");
cheeseArray = { cheese1, cheese2, cheese3 };
}
public void Alter()
{
foreach (object cheese in cheeseArray)
{
cheese.name += "Old";
}
}
}[/code]
Sorry, you need to Log In to post a reply to this thread.